aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2024-07-30 19:23:14 +0000
committerAlexander Smirnov <alex@ydb.tech>2024-07-30 19:23:14 +0000
commit40beacac031f579786f8b26aa16c59486dbab2b0 (patch)
tree12a1548bbf15daf6e931eaca2fcd6a9e618d0356
parentea1b205d749cc1c3e37c7ae42817534ede33e390 (diff)
parentf7ca71b582e2347ec55857b493d6bccf55bbc3df (diff)
downloadydb-40beacac031f579786f8b26aa16c59486dbab2b0.tar.gz
Merge branch 'rightlib' into mergelibs-240730-1922
-rw-r--r--build/conf/java.conf10
-rw-r--r--build/conf/licenses.json1
-rw-r--r--build/conf/proto.conf2
-rw-r--r--build/conf/ts/ts_test.conf16
-rw-r--r--build/export_generators/cmake/build/scripts/split_unittest.py10
-rw-r--r--build/export_generators/cmake/cmake/common.cmake2
-rw-r--r--build/export_generators/cmake/cmake/global_flags.compiler.msvc.cmake1
-rw-r--r--build/export_generators/cmake/cmake/global_flags.linker.gnu.cmake4
-rw-r--r--build/export_generators/cmake/cmake/protobuf.cmake6
-rw-r--r--build/export_generators/cmake/dir_targets.jinja6
-rw-r--r--build/export_generators/cmake/generator.toml16
-rw-r--r--build/export_generators/cmake/target_cmake_lists.jinja50
-rw-r--r--build/export_generators/cmake/target_links.jinja6
-rw-r--r--build/export_generators/cmake/target_options.jinja6
-rw-r--r--build/export_generators/hardcoded-cmake/build/scripts/split_unittest.py10
-rw-r--r--build/export_generators/hardcoded-cmake/cmake/common.cmake2
-rw-r--r--build/export_generators/hardcoded-cmake/cmake/global_flags.compiler.msvc.cmake1
-rw-r--r--build/export_generators/hardcoded-cmake/cmake/global_flags.linker.gnu.cmake4
-rw-r--r--build/export_generators/ide-gradle/build.gradle.kts.jinja42
-rw-r--r--build/external_resources/flake8_py3/ya.make12
-rw-r--r--build/external_resources/yexport/public.resources.json6
-rw-r--r--build/external_resources/yexport/resources.json6
-rw-r--r--build/external_resources/ymake/public.resources.json10
-rw-r--r--build/external_resources/ymake/resources.json10
-rw-r--r--build/internal/platform/clang_toolchain_info/ya.make6
-rw-r--r--build/internal/platform/macos_sdk/ya.make19
-rw-r--r--build/internal/platform/msvc/ya.make17
-rw-r--r--build/internal/scripts/gen_sbom.py45
-rw-r--r--build/internal/scripts/link_sbom.py35
-rw-r--r--build/mapping.conf.json152
-rw-r--r--build/platform/lld/lld16.json8
-rw-r--r--build/platform/test_tool/host.ya.make.inc10
-rw-r--r--build/platform/test_tool/host_os.ya.make.inc10
-rw-r--r--build/plugins/_common.py4
-rw-r--r--build/plugins/_dart_fields.py213
-rw-r--r--build/plugins/lib/nots/package_manager/__init__.py1
-rw-r--r--build/plugins/lib/nots/package_manager/base/lockfile.py5
-rw-r--r--build/plugins/nots.py440
-rw-r--r--build/plugins/pybuild.py1
-rw-r--r--build/plugins/ytest.py202
-rw-r--r--build/scripts/go_proto_wrapper.py3
-rw-r--r--build/scripts/split_unittest.py10
-rw-r--r--build/sysincl/misc.yml23
-rw-r--r--build/ymake.core.conf13
-rwxr-xr-xbuild/ymake_conf.py2
-rw-r--r--contrib/java/javax/annotation/javax.annotation-api/1.3.1/ya.make1
-rw-r--r--contrib/libs/apache/orc/c++/src/Reader.cc8
-rw-r--r--contrib/libs/apache/orc/c++/src/Statistics.hh12
-rw-r--r--contrib/libs/apache/orc/c++/src/Writer.cc12
-rw-r--r--contrib/libs/apache/orc/c++/src/sargs/PredicateLeaf.cc8
-rw-r--r--contrib/libs/backtrace/atomic.c2
-rw-r--r--contrib/libs/backtrace/backtrace-supported.h2
-rw-r--r--contrib/libs/backtrace/backtrace.c2
-rw-r--r--contrib/libs/backtrace/backtrace.h2
-rw-r--r--contrib/libs/backtrace/dwarf.c6
-rw-r--r--contrib/libs/backtrace/elf.c39
-rw-r--r--contrib/libs/backtrace/fileline.c2
-rw-r--r--contrib/libs/backtrace/internal.h2
-rw-r--r--contrib/libs/backtrace/macho.c19
-rw-r--r--contrib/libs/backtrace/mmap.c2
-rw-r--r--contrib/libs/backtrace/mmapio.c2
-rw-r--r--contrib/libs/backtrace/posix.c2
-rw-r--r--contrib/libs/backtrace/print.c2
-rw-r--r--contrib/libs/backtrace/simple.c2
-rw-r--r--contrib/libs/backtrace/sort.c2
-rw-r--r--contrib/libs/backtrace/state.c2
-rw-r--r--contrib/libs/backtrace/ya.make4
-rw-r--r--contrib/libs/c-ares/CHANGES.014
-rw-r--r--contrib/libs/c-ares/INSTALL.md27
-rw-r--r--contrib/libs/c-ares/README.md14
-rw-r--r--contrib/libs/c-ares/RELEASE-NOTES74
-rw-r--r--contrib/libs/c-ares/RELEASE-NOTES.md49
-rw-r--r--contrib/libs/c-ares/include/ares.h929
-rw-r--r--contrib/libs/c-ares/include/ares_build-linux.h5
-rw-r--r--contrib/libs/c-ares/include/ares_dns.h116
-rw-r--r--contrib/libs/c-ares/include/ares_dns_record.h1020
-rw-r--r--contrib/libs/c-ares/include/ares_nameser.h378
-rw-r--r--contrib/libs/c-ares/include/ares_rules.h21
-rw-r--r--contrib/libs/c-ares/include/ares_version.h14
-rw-r--r--contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c317
-rw-r--r--contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c250
-rw-r--r--contrib/libs/c-ares/src/lib/ares__buf.c1013
-rw-r--r--contrib/libs/c-ares/src/lib/ares__buf.h401
-rw-r--r--contrib/libs/c-ares/src/lib/ares__close_sockets.c63
-rw-r--r--contrib/libs/c-ares/src/lib/ares__get_hostent.c271
-rw-r--r--contrib/libs/c-ares/src/lib/ares__hosts_file.c1030
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable.c340
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable.h72
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_asvp.c133
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_asvp.h54
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_strvp.c198
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_strvp.h118
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_szvp.c (renamed from contrib/libs/c-ares/src/lib/ares__htable_stvp.c)122
-rw-r--r--contrib/libs/c-ares/src/lib/ares__htable_szvp.h (renamed from contrib/libs/c-ares/src/lib/ares__htable_stvp.h)54
-rw-r--r--contrib/libs/c-ares/src/lib/ares__iface_ips.c592
-rw-r--r--contrib/libs/c-ares/src/lib/ares__iface_ips.h139
-rw-r--r--contrib/libs/c-ares/src/lib/ares__llist.c188
-rw-r--r--contrib/libs/c-ares/src/lib/ares__llist.h79
-rw-r--r--contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c302
-rw-r--r--contrib/libs/c-ares/src/lib/ares__read_line.c84
-rw-r--r--contrib/libs/c-ares/src/lib/ares__readaddrinfo.c265
-rw-r--r--contrib/libs/c-ares/src/lib/ares__slist.c362
-rw-r--r--contrib/libs/c-ares/src/lib/ares__slist.h75
-rw-r--r--contrib/libs/c-ares/src/lib/ares__socket.c480
-rw-r--r--contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c521
-rw-r--r--contrib/libs/c-ares/src/lib/ares__threads.c607
-rw-r--r--contrib/libs/c-ares/src/lib/ares__threads.h60
-rw-r--r--contrib/libs/c-ares/src/lib/ares__timeval.c41
-rw-r--r--contrib/libs/c-ares/src/lib/ares_android.c325
-rw-r--r--contrib/libs/c-ares/src/lib/ares_android.h4
-rw-r--r--contrib/libs/c-ares/src/lib/ares_cancel.c38
-rw-r--r--contrib/libs/c-ares/src/lib/ares_config-linux.h125
-rw-r--r--contrib/libs/c-ares/src/lib/ares_create_query.c206
-rw-r--r--contrib/libs/c-ares/src/lib/ares_data.c230
-rw-r--r--contrib/libs/c-ares/src/lib/ares_data.h48
-rw-r--r--contrib/libs/c-ares/src/lib/ares_destroy.c108
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_mapping.c919
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_name.c676
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_parse.c1255
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_private.h263
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_record.c1449
-rw-r--r--contrib/libs/c-ares/src/lib/ares_dns_write.c1054
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event.h174
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_epoll.c198
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_kqueue.c249
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_poll.c141
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_select.c151
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_thread.c452
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c166
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_win32.c601
-rw-r--r--contrib/libs/c-ares/src/lib/ares_event_win32.h119
-rw-r--r--contrib/libs/c-ares/src/lib/ares_expand_name.c308
-rw-r--r--contrib/libs/c-ares/src/lib/ares_expand_string.c81
-rw-r--r--contrib/libs/c-ares/src/lib/ares_fds.c54
-rw-r--r--contrib/libs/c-ares/src/lib/ares_free_hostent.c15
-rw-r--r--contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c32
-rw-r--r--contrib/libs/c-ares/src/lib/ares_getaddrinfo.c1071
-rw-r--r--contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c333
-rw-r--r--contrib/libs/c-ares/src/lib/ares_gethostbyname.c392
-rw-r--r--contrib/libs/c-ares/src/lib/ares_getnameinfo.c627
-rw-r--r--contrib/libs/c-ares/src/lib/ares_getsock.c45
-rw-r--r--contrib/libs/c-ares/src/lib/ares_inet_net_pton.h2
-rw-r--r--contrib/libs/c-ares/src/lib/ares_init.c2489
-rw-r--r--contrib/libs/c-ares/src/lib/ares_ipv6.h41
-rw-r--r--contrib/libs/c-ares/src/lib/ares_library_init.c132
-rw-r--r--contrib/libs/c-ares/src/lib/ares_math.c145
-rw-r--r--contrib/libs/c-ares/src/lib/ares_mkquery.c35
-rw-r--r--contrib/libs/c-ares/src/lib/ares_nowarn.c269
-rw-r--r--contrib/libs/c-ares/src/lib/ares_nowarn.h70
-rw-r--r--contrib/libs/c-ares/src/lib/ares_options.c709
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_a_reply.c66
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c67
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c278
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c180
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c222
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c226
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c344
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c206
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c200
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c257
-rw-r--r--contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c206
-rw-r--r--contrib/libs/c-ares/src/lib/ares_platform.c21909
-rw-r--r--contrib/libs/c-ares/src/lib/ares_private.h699
-rw-r--r--contrib/libs/c-ares/src/lib/ares_process.c1630
-rw-r--r--contrib/libs/c-ares/src/lib/ares_qcache.c444
-rw-r--r--contrib/libs/c-ares/src/lib/ares_query.c187
-rw-r--r--contrib/libs/c-ares/src/lib/ares_rand.c181
-rw-r--r--contrib/libs/c-ares/src/lib/ares_search.c755
-rw-r--r--contrib/libs/c-ares/src/lib/ares_send.c212
-rw-r--r--contrib/libs/c-ares/src/lib/ares_setup.h77
-rw-r--r--contrib/libs/c-ares/src/lib/ares_str.c269
-rw-r--r--contrib/libs/c-ares/src/lib/ares_str.h (renamed from contrib/libs/c-ares/src/lib/ares_strdup.c)60
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strcasecmp.c33
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strdup.h34
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strerror.c90
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strsplit.c131
-rw-r--r--contrib/libs/c-ares/src/lib/ares_strsplit.h13
-rw-r--r--contrib/libs/c-ares/src/lib/ares_sysconfig.c1111
-rw-r--r--contrib/libs/c-ares/src/lib/ares_sysconfig_files.c811
-rw-r--r--contrib/libs/c-ares/src/lib/ares_timeout.c50
-rw-r--r--contrib/libs/c-ares/src/lib/ares_update_servers.c1195
-rw-r--r--contrib/libs/c-ares/src/lib/ares_version.c3
-rw-r--r--contrib/libs/c-ares/src/lib/bitncmp.c60
-rw-r--r--contrib/libs/c-ares/src/lib/bitncmp.h35
-rw-r--r--contrib/libs/c-ares/src/lib/config-win32.h130
-rw-r--r--contrib/libs/c-ares/src/lib/inet_net_pton.c318
-rw-r--r--contrib/libs/c-ares/src/lib/inet_ntop.c103
-rw-r--r--contrib/libs/c-ares/src/lib/setup_once.h474
-rw-r--r--contrib/libs/c-ares/src/lib/windows_port.c13
-rw-r--r--contrib/libs/c-ares/ya.make37
-rw-r--r--contrib/libs/cxxsupp/libcxxmsvc/include/__config3
-rw-r--r--contrib/libs/cxxsupp/libcxxmsvc/ya.make2
-rw-r--r--contrib/libs/dtl/ChangeLog6
-rw-r--r--contrib/libs/dtl/dtl/Diff.hpp2
-rw-r--r--contrib/libs/dtl/dtl/variables.hpp2
-rw-r--r--contrib/libs/dtl/ya.make4
-rw-r--r--contrib/libs/hyperscan/runtime_avx512/ya.make2
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/aligned_alloc.c6
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/c16rtomb.c35
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/c32rtomb.c7
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/features.h5
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/getauxval.cpp10
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/glibc.cpp111
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/glibc.h20
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/mbrtoc16.c30
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/mbrtoc32.c13
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/secure_getenv.cpp12
-rw-r--r--contrib/libs/libc_compat/ubuntu_14/timespec_get.c10
-rw-r--r--contrib/libs/lz4/README.md26
-rw-r--r--contrib/libs/lz4/lz4.c305
-rw-r--r--contrib/libs/lz4/lz4.h180
-rw-r--r--contrib/libs/lz4/lz4file.c192
-rw-r--r--contrib/libs/lz4/lz4file.h4
-rw-r--r--contrib/libs/lz4/lz4frame.c300
-rw-r--r--contrib/libs/lz4/lz4frame.h265
-rw-r--r--contrib/libs/lz4/lz4hc.c1309
-rw-r--r--contrib/libs/lz4/lz4hc.h85
-rw-r--r--contrib/libs/lz4/ya.make4
-rw-r--r--contrib/libs/postgresql/src/include/port/darwin.h8
-rw-r--r--contrib/libs/postgresql/src/include/port/linux.h22
-rw-r--r--contrib/libs/postgresql/src/include/port/win32.h79
-rw-r--r--contrib/libs/protobuf/src/google/protobuf/port_def.inc3
-rw-r--r--contrib/libs/protobuf/src/google/protobuf/port_undef.inc4
-rw-r--r--contrib/libs/protobuf/ya.make4
-rw-r--r--contrib/libs/protoc/src/google/protobuf/compiler/cpp/cpp_helpers.h1
-rw-r--r--contrib/python/Flask/py3/flask/scaffold.py3
-rw-r--r--contrib/python/Jinja2/py3/jinja2/loaders.py16
-rw-r--r--contrib/python/cachetools/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/cachetools/py3/cachetools/__init__.py6
-rw-r--r--contrib/python/cachetools/py3/cachetools/func.py4
-rw-r--r--contrib/python/cachetools/py3/cachetools/keys.py7
-rw-r--r--contrib/python/cachetools/py3/ya.make2
-rw-r--r--contrib/python/clickhouse-connect/.dist-info/METADATA26
-rw-r--r--contrib/python/clickhouse-connect/README.md24
-rw-r--r--contrib/python/clickhouse-connect/clickhouse_connect/__init__.py4
-rw-r--r--contrib/python/clickhouse-connect/clickhouse_connect/__version__.py2
-rw-r--r--contrib/python/clickhouse-connect/clickhouse_connect/driver/__init__.py78
-rw-r--r--contrib/python/clickhouse-connect/clickhouse_connect/driver/asyncclient.py663
-rw-r--r--contrib/python/clickhouse-connect/clickhouse_connect/driver/httpclient.py12
-rw-r--r--contrib/python/clickhouse-connect/ya.make3
-rw-r--r--contrib/python/fonttools/.dist-info/METADATA12
-rw-r--r--contrib/python/fonttools/README.rst3
-rw-r--r--contrib/python/fonttools/fontTools/__init__.py2
-rw-r--r--contrib/python/fonttools/fontTools/feaLib/builder.py20
-rw-r--r--contrib/python/fonttools/fontTools/misc/visitor.py7
-rw-r--r--contrib/python/fonttools/fontTools/otlLib/builder.py10
-rw-r--r--contrib/python/fonttools/fontTools/otlLib/maxContextCalc.py2
-rw-r--r--contrib/python/fonttools/ya.make2
-rw-r--r--contrib/python/google-auth/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/google-auth/py3/google/auth/external_account.py34
-rw-r--r--contrib/python/google-auth/py3/google/auth/identity_pool.py135
-rw-r--r--contrib/python/google-auth/py3/google/auth/transport/_mtls_helper.py75
-rw-r--r--contrib/python/google-auth/py3/google/auth/version.py2
-rw-r--r--contrib/python/google-auth/py3/tests/test_external_account.py161
-rw-r--r--contrib/python/google-auth/py3/tests/test_identity_pool.py129
-rw-r--r--contrib/python/google-auth/py3/ya.make2
-rw-r--r--contrib/python/hypothesis/py3/.dist-info/METADATA10
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/_settings.py2
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/control.py13
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/core.py128
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/errors.py54
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/extra/codemods.py12
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/extra/django/_fields.py4
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/extra/django/_impl.py1
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py153
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/extra/numpy.py28
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/cache.py125
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/charmap.py29
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py55
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py20
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py53
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/escalation.py28
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/intervalsets.py2
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/scrutineer.py14
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/strategies/_internal/core.py30
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py52
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/strategies/_internal/types.py17
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/strategies/_internal/utils.py5
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/vendor/pretty.py27
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/vendor/tlds-alpha-by-domain.txt3
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/version.py2
-rw-r--r--contrib/python/hypothesis/py3/ya.make2
-rw-r--r--contrib/python/jsonschema/py2/tests/ya.make7
-rw-r--r--contrib/python/jsonschema/py3/tests/ya.make6
-rw-r--r--contrib/python/prettytable/py3/.dist-info/METADATA56
-rw-r--r--contrib/python/prettytable/py3/README.md52
-rw-r--r--contrib/python/prettytable/py3/prettytable/prettytable.py62
-rw-r--r--contrib/python/prettytable/py3/tests/test_colortable.py63
-rw-r--r--contrib/python/prettytable/py3/tests/test_prettytable.py413
-rw-r--r--contrib/python/prettytable/py3/ya.make2
-rw-r--r--contrib/python/setuptools/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/setuptools/py3/_distutils_hack/__init__.py23
-rw-r--r--contrib/python/setuptools/py3/setuptools/_distutils/sysconfig.py4
-rw-r--r--contrib/python/setuptools/py3/ya.make2
-rw-r--r--contrib/python/zstandard/py3/.dist-info/METADATA3
-rw-r--r--contrib/python/zstandard/py3/c-ext/python-zstandard.h2
-rw-r--r--contrib/python/zstandard/py3/ya.make2
-rw-r--r--contrib/python/zstandard/py3/zstandard/__init__.py2
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/avltree.hpp25
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/avltree_algorithms.hpp2
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/bstree.hpp131
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/bstree_algorithms.hpp40
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/circular_list_algorithms.hpp4
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/circular_slist_algorithms.hpp20
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/common_slist_algorithms.hpp10
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/default_header_holder.hpp6
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/ebo_functor_holder.hpp48
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/equal_to_value.hpp2
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/exception_disposer.hpp2
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/generic_hook.hpp29
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/hook_traits.hpp35
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iiterator.hpp12
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iterator.hpp24
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/key_nodeptr_comp.hpp14
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/list_iterator.hpp38
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/mpl.hpp6
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/node_cloner_disposer.hpp6
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/parent_from_member.hpp23
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/simple_disposers.hpp2
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/size_holder.hpp28
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/slist_iterator.hpp41
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_iterator.hpp42
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_value_compare.hpp56
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/detail/workaround.hpp33
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/linear_slist_algorithms.hpp18
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/list.hpp113
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/pack_options.hpp6
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/pointer_traits.hpp36
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/rbtree.hpp25
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree.hpp29
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree_algorithms.hpp2
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/slist.hpp121
-rw-r--r--contrib/restricted/boost/intrusive/include/boost/intrusive/splaytree.hpp25
-rw-r--r--contrib/restricted/boost/intrusive/ya.make6
-rw-r--r--contrib/restricted/google/benchmark/README.md10
-rw-r--r--contrib/restricted/google/benchmark/include/benchmark/benchmark.h20
-rw-r--r--contrib/restricted/google/benchmark/src/benchmark.cc4
-rw-r--r--contrib/restricted/google/benchmark/src/benchmark_runner.cc59
-rw-r--r--contrib/restricted/google/benchmark/src/benchmark_runner.h5
-rw-r--r--contrib/restricted/google/benchmark/src/cycleclock.h5
-rw-r--r--contrib/restricted/google/benchmark/src/perf_counters.cc3
-rw-r--r--contrib/restricted/google/benchmark/src/sysinfo.cc8
-rw-r--r--contrib/restricted/google/benchmark/src/timers.cc12
-rw-r--r--contrib/restricted/google/benchmark/src/timers.h29
-rw-r--r--contrib/restricted/google/benchmark/tools/compare/ya.make4
-rw-r--r--contrib/restricted/google/benchmark/ya.make6
-rw-r--r--library/cpp/accurate_accumulate/benchmark/metrics/ya.make1
-rw-r--r--library/cpp/accurate_accumulate/benchmark/ya.make1
-rw-r--r--library/cpp/accurate_accumulate/ya.make1
-rw-r--r--library/cpp/balloc/setup/ya.make1
-rw-r--r--library/cpp/binsaver/ut/ya.make1
-rw-r--r--library/cpp/binsaver/ut_util/ya.make1
-rw-r--r--library/cpp/binsaver/ya.make1
-rw-r--r--library/cpp/bucket_quoter/ya.make1
-rw-r--r--library/cpp/case_insensitive_string/ut/ya.make1
-rw-r--r--library/cpp/case_insensitive_string/ya.make1
-rw-r--r--library/cpp/codecs/float_huffman_bench/ya.make1
-rw-r--r--library/cpp/codecs/greedy_dict/ut/ya.make1
-rw-r--r--library/cpp/codecs/greedy_dict/ya.make1
-rw-r--r--library/cpp/compproto/ut/ya.make1
-rw-r--r--library/cpp/compproto/ya.make1
-rw-r--r--library/cpp/comptable/usage/ya.make1
-rw-r--r--library/cpp/comptable/ut/ya.make1
-rw-r--r--library/cpp/comptable/ya.make1
-rw-r--r--library/cpp/containers/2d_array/ya.make1
-rw-r--r--library/cpp/containers/compact_vector/ut/ya.make1
-rw-r--r--library/cpp/containers/compact_vector/ya.make1
-rw-r--r--library/cpp/containers/comptrie/benchmark/ya.make1
-rw-r--r--library/cpp/containers/comptrie/ya.make1
-rw-r--r--library/cpp/containers/disjoint_interval_tree/ut/ya.make1
-rw-r--r--library/cpp/containers/disjoint_interval_tree/ya.make1
-rw-r--r--library/cpp/containers/paged_vector/ut/ya.make1
-rw-r--r--library/cpp/containers/paged_vector/ya.make1
-rw-r--r--library/cpp/containers/ring_buffer/ya.make1
-rw-r--r--library/cpp/deprecated/accessors/ut/ya.make1
-rw-r--r--library/cpp/deprecated/accessors/ya.make1
-rw-r--r--library/cpp/deprecated/enum_codegen/ya.make1
-rw-r--r--library/cpp/deprecated/split/ya.make1
-rw-r--r--library/cpp/diff/ut/ya.make1
-rw-r--r--library/cpp/diff/ya.make1
-rw-r--r--library/cpp/disjoint_sets/ya.make1
-rw-r--r--library/cpp/dwarf_backtrace/ut/ya.make1
-rw-r--r--library/cpp/dwarf_backtrace/ya.make1
-rw-r--r--library/cpp/getopt/last_getopt_demo/ya.make1
-rw-r--r--library/cpp/histogram/adaptive/ya.make1
-rw-r--r--library/cpp/html/entity/ya.make1
-rw-r--r--library/cpp/html/escape/ut/ya.make1
-rw-r--r--library/cpp/html/escape/ya.make1
-rw-r--r--library/cpp/html/pcdata/ut/ya.make1
-rw-r--r--library/cpp/html/pcdata/ya.make1
-rw-r--r--library/cpp/int128/bench/ya.make1
-rw-r--r--library/cpp/int128/ut/ya.make1
-rw-r--r--library/cpp/json/ut/ya.make1
-rw-r--r--library/cpp/json/writer/ut/ya.make1
-rw-r--r--library/cpp/l1_distance/ya.make1
-rw-r--r--library/cpp/l2_distance/ya.make1
-rw-r--r--library/cpp/lcs/ut/ya.make1
-rw-r--r--library/cpp/lcs/ya.make1
-rw-r--r--library/cpp/lfalloc/dbg/ya.make1
-rw-r--r--library/cpp/lfalloc/dbg_info/ya.make1
-rw-r--r--library/cpp/lfalloc/ya.make1
-rw-r--r--library/cpp/linear_regression/benchmark/ya.make1
-rw-r--r--library/cpp/linear_regression/ut/ya.make1
-rw-r--r--library/cpp/linear_regression/ya.make1
-rw-r--r--library/cpp/logger/global/ut/ya.make1
-rw-r--r--library/cpp/malloc/api/ut/ya.make1
-rw-r--r--library/cpp/malloc/api/ya.make1
-rw-r--r--library/cpp/malloc/jemalloc/ya.make1
-rw-r--r--library/cpp/malloc/system/ya.make1
-rw-r--r--library/cpp/monlib/dynamic_counters/ut/ya.make1
-rw-r--r--library/cpp/monlib/service/pages/resources/ya.make1
-rw-r--r--library/cpp/packers/ut/ya.make1
-rw-r--r--library/cpp/packers/ya.make1
-rw-r--r--library/cpp/protobuf/dynamic_prototype/ya.make2
-rw-r--r--library/cpp/protobuf/json/proto/ya.make1
-rw-r--r--library/cpp/protobuf/json/ya.make2
-rw-r--r--library/cpp/protobuf/runtime/ya.make9
-rw-r--r--library/cpp/protobuf/util/proto/ya.make1
-rw-r--r--library/cpp/protobuf/util/ut/ya.make1
-rw-r--r--library/cpp/protobuf/util/ya.make1
-rw-r--r--library/cpp/protobuf/yql/ya.make3
-rw-r--r--library/cpp/scheme/tests/fuzz_ops/ut/ya.make1
-rw-r--r--library/cpp/scheme/tests/ut/ya.make1
-rw-r--r--library/cpp/scheme/ut_utils/ya.make1
-rw-r--r--library/cpp/scheme/ya.make1
-rw-r--r--library/cpp/sse/ut/ya.make1
-rw-r--r--library/cpp/string_utils/csv/ya.make1
-rw-r--r--library/cpp/string_utils/indent_text/ya.make1
-rw-r--r--library/cpp/string_utils/levenshtein_diff/ut/ya.make1
-rw-r--r--library/cpp/string_utils/quote/ut/ya.make1
-rw-r--r--library/cpp/string_utils/relaxed_escaper/ut/ya.make1
-rw-r--r--library/cpp/string_utils/relaxed_escaper/ya.make1
-rw-r--r--library/cpp/string_utils/url/url.cpp34
-rw-r--r--library/cpp/string_utils/url/url.h6
-rw-r--r--library/cpp/string_utils/ztstrbuf/ya.make1
-rw-r--r--library/cpp/tdigest/ya.make2
-rw-r--r--library/cpp/terminate_handler/sample/exception/ya.make1
-rw-r--r--library/cpp/terminate_handler/sample/pure-virtual/ya.make1
-rw-r--r--library/cpp/terminate_handler/sample/rethrow/ya.make1
-rw-r--r--library/cpp/terminate_handler/sample/segv/ya.make1
-rw-r--r--library/cpp/testing/gmock_in_unittest/example_ut/ya.make1
-rw-r--r--library/cpp/testing/gmock_in_unittest/ya.make1
-rw-r--r--library/cpp/testing/gtest/matchers.h2
-rw-r--r--library/cpp/threading/future/README.md2
-rw-r--r--library/cpp/threading/future/benchmark/coroutine_traits.cpp82
-rw-r--r--library/cpp/threading/future/benchmark/ya.make11
-rw-r--r--library/cpp/threading/future/core/coroutine_traits.h99
-rw-r--r--library/cpp/threading/future/core/future-inl.h22
-rw-r--r--library/cpp/threading/future/core/future.h22
-rw-r--r--library/cpp/threading/future/future_ut.cpp4
-rw-r--r--library/cpp/threading/future/ya.make1
-rw-r--r--library/cpp/threading/hot_swap/ya.make1
-rw-r--r--library/cpp/threading/poor_man_openmp/ya.make1
-rw-r--r--library/cpp/tld/tlds-alpha-by-domain.txt2
-rw-r--r--library/cpp/yt/memory/range.h2
-rw-r--r--library/python/cyson/cyson/helpers.cpp8
-rw-r--r--library/python/cyson/cyson/unsigned_long.cpp3
-rw-r--r--library/python/monlib/encoder.pyx11
-rw-r--r--library/python/protobuf/runtime/ya.make13
-rw-r--r--library/python/retry/tests/ya.make1
-rw-r--r--library/python/retry/ya.make1
-rw-r--r--library/python/symbols/python/ut/py2/ya.make1
-rw-r--r--library/python/symbols/python/ut/py3/ya.make1
-rw-r--r--library/python/symbols/python/ut/ya.make1
-rw-r--r--library/python/symbols/python/ya.make1
-rw-r--r--library/python/testing/swag/lib/ya.make2
-rw-r--r--util/generic/strbase.h18
-rw-r--r--util/generic/strbuf.h16
-rw-r--r--util/string/strip.h4
-rw-r--r--util/system/src_root.h7
-rw-r--r--util/ya.make4
-rwxr-xr-xya20
-rw-r--r--yt/cpp/mapreduce/interface/ut/ya.make1
-rw-r--r--yt/cpp/mapreduce/interface/ya.make2
-rw-r--r--yt/cpp/mapreduce/io/ya.make2
-rw-r--r--yt/yt/client/api/queue_client.h2
-rw-r--r--yt/yt/client/chunk_client/chunk_replica-inl.h92
-rw-r--r--yt/yt/client/chunk_client/chunk_replica.h3
-rw-r--r--yt/yt/client/chunk_client/private.h16
-rw-r--r--yt/yt/client/complex_types/check_type_compatibility.cpp5
-rw-r--r--yt/yt/client/complex_types/check_type_compatibility.h10
-rw-r--r--yt/yt/client/complex_types/merge_complex_types.cpp333
-rw-r--r--yt/yt/client/complex_types/merge_complex_types.h15
-rw-r--r--yt/yt/client/object_client/helpers.h1
-rw-r--r--yt/yt/client/table_client/config.cpp5
-rw-r--r--yt/yt/client/table_client/config.h1
-rw-r--r--yt/yt/client/table_client/merge_table_schemas.cpp132
-rw-r--r--yt/yt/client/table_client/merge_table_schemas.h16
-rw-r--r--yt/yt/client/table_client/schema.cpp9
-rw-r--r--yt/yt/client/tablet_client/public.h1
-rw-r--r--yt/yt/client/unittests/mock/table_reader.cpp27
-rw-r--r--yt/yt/client/unittests/mock/table_reader.h42
-rw-r--r--yt/yt/client/unittests/mock/ya.make1
-rw-r--r--yt/yt/client/ya.make6
-rw-r--r--yt/yt/core/concurrency/async_looper.cpp76
-rw-r--r--yt/yt/core/concurrency/async_looper.h18
-rw-r--r--yt/yt/core/concurrency/unittests/async_looper_ut.cpp232
-rw-r--r--yt/yt/core/misc/memory_usage_tracker.cpp4
-rw-r--r--yt/yt/core/misc/memory_usage_tracker.h11
-rw-r--r--yt/yt/core/misc/public.h9
-rw-r--r--yt/yt/core/misc/statistic_path-inl.h29
-rw-r--r--yt/yt/core/misc/statistic_path.cpp323
-rw-r--r--yt/yt/core/misc/statistic_path.h258
-rw-r--r--yt/yt/core/misc/unittests/statistic_path_ut.cpp216
-rw-r--r--yt/yt/core/misc/unittests/ya.make1
-rw-r--r--yt/yt/core/rpc/bus/channel.cpp7
-rw-r--r--yt/yt/core/rpc/channel.h2
-rw-r--r--yt/yt/core/rpc/channel_detail.cpp2
-rw-r--r--yt/yt/core/rpc/channel_detail.h2
-rw-r--r--yt/yt/core/rpc/grpc/channel.cpp5
-rw-r--r--yt/yt/core/rpc/hedging_channel.cpp2
-rw-r--r--yt/yt/core/rpc/http/channel.cpp6
-rw-r--r--yt/yt/core/rpc/local_channel.cpp5
-rw-r--r--yt/yt/core/rpc/null_channel.cpp5
-rw-r--r--yt/yt/core/rpc/roaming_channel.cpp5
-rw-r--r--yt/yt/core/rpc/service_detail.cpp2
-rw-r--r--yt/yt/core/rpc/unittests/viable_peer_registry_ut.cpp6
-rw-r--r--yt/yt/core/test_framework/test_memory_tracker.cpp2
-rw-r--r--yt/yt/core/test_framework/test_memory_tracker.h1
-rw-r--r--yt/yt/core/test_framework/test_proxy_service.cpp4
-rw-r--r--yt/yt/core/test_framework/test_proxy_service.h3
-rw-r--r--yt/yt/core/ya.make1
-rw-r--r--yt/yt/core/ypath/stack.h2
-rw-r--r--yt/yt/core/ypath/tokenizer.cpp2
-rw-r--r--yt/yt/core/ypath/tokenizer.h8
-rw-r--r--yt/yt/core/yson/protobuf_interop.cpp11
-rw-r--r--yt/yt/core/yson/pull_parser.cpp1
-rw-r--r--yt/yt/core/yson/pull_parser_deserialize-inl.h18
-rw-r--r--yt/yt/core/yson/pull_parser_deserialize.cpp24
-rw-r--r--yt/yt/core/yson/pull_parser_deserialize.h13
-rw-r--r--yt/yt/core/yson/unittests/proto/protobuf_yson_casing_ut.proto7
-rw-r--r--yt/yt/core/yson/unittests/protobuf_yson_ut.cpp2
-rw-r--r--yt/yt/core/ytree/serialize-inl.h13
-rw-r--r--yt/yt/core/ytree/serialize.cpp12
-rw-r--r--yt/yt/core/ytree/serialize.h15
-rw-r--r--yt/yt/library/formats/arrow_parser.cpp2
-rw-r--r--yt/yt/library/oom/oom.cpp12
-rw-r--r--yt/yt/library/oom/oom.h6
-rw-r--r--yt/yt/library/oom/tcmalloc_memory_limit_handler.cpp23
-rw-r--r--yt/yt/library/oom/unittests/oom_ut.cpp4
-rw-r--r--yt/yt/library/tvm/ya.make2
541 files changed, 44889 insertions, 26675 deletions
diff --git a/build/conf/java.conf b/build/conf/java.conf
index d80c5bc29c..ad4f5f1a29 100644
--- a/build/conf/java.conf
+++ b/build/conf/java.conf
@@ -299,6 +299,8 @@ module EXTERNAL_JAVA_LIBRARY: _BASE_UNIT {
.RESTRICTED=EXTERNAL_JAR
.GLOBAL=MAVEN_EXPORT_COORDS
+ SET(MODULE_TAG JAVA)
+
PEERDIR(build/platform/java/jdk)
PEERDIR+=$JDK_RESOURCE_PEERDIR $EXTERNAL_JAVA_EXTRA_PEERDIR
when ($KOTLIN_PROTO == "yes") {
@@ -316,7 +318,7 @@ module EXTERNAL_JAVA_LIBRARY: _BASE_UNIT {
MAVEN_EXPORT_COORDS_GLOBAL=$MAVEN_EXPORT_GROUP_ID:${MODULE_PREFIX}${REALPRJNAME}:${MAVEN_EXPORT_VERSION}:
}
- PEERDIR_TAGS=JAVA_PROTO JAVA_FBS JAVA_IDL PACKAGE_UNION
+ PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_FBS JAVA_IDL PACKAGE_UNION
HAS_MANAGEABLE_PEERS=yes
DYNAMIC_LINK=yes
_PROTO_CMDLINE=$_JAVA_PROTO_CMDLINE
@@ -482,7 +484,9 @@ module _JAR_BASE: _BARE_UNIT {
.DEFAULT_NAME_GENERATOR=TwoDirNames
.RESTRICTED=WITH_JDK RESOURCE RESOURCE_FILES
- PEERDIR_TAGS=JAVA_PROTO JAVA_FBS JAVA_IDL DLL JAR_COMPILATION __EMPTY__ RESOURCE_LIB
+ SET(MODULE_TAG JAVA)
+
+ PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_FBS JAVA_IDL DLL JAR_COMPILATION __EMPTY__ RESOURCE_LIB
HAS_MANAGEABLE_PEERS=yes
DYNAMIC_LINK=yes
@@ -1988,7 +1992,7 @@ module JSRC_LIBRARY: _BARE_UNIT {
.PEERDIR_POLICY=as_include
.FINAL_TARGET=no
.ALIASES=SRCS=FILES
- PEERDIR_TAGS=JAVA_PROTO JAVA_FBS JAVA_IDL
+ PEERDIR_TAGS=JAVA JAVA_PROTO JAVA_FBS JAVA_IDL
MODULE_TYPE=LIBRARY
SET(MODULE_SUFFIX .jsrc)
SET(DONT_RESOLVE_INCLUDES yes)
diff --git a/build/conf/licenses.json b/build/conf/licenses.json
index b52d2a3e15..182bcef239 100644
--- a/build/conf/licenses.json
+++ b/build/conf/licenses.json
@@ -315,6 +315,7 @@
"SSLeay",
"Sunpro",
"Unicode",
+ "Unicode-3.0",
"Unicode-DFS-2016",
"Unicode-Icu-58",
"Unicode-Mappings",
diff --git a/build/conf/proto.conf b/build/conf/proto.conf
index c30b195e88..d68ec651d3 100644
--- a/build/conf/proto.conf
+++ b/build/conf/proto.conf
@@ -699,7 +699,7 @@ multimodule PROTO_LIBRARY {
.EXTS=.jsrc
.ALLOWED=GRPC
.SEM=JAVA_PROTO_LIBRARY_SEM
- SET(PEERDIR_TAGS JAVA_PROTO)
+ SET(PEERDIR_TAGS JAVA JAVA_PROTO)
ENABLE(JAVA_PROTO)
DISABLE(_NEED_SBOM_INFO)
PEERDIR+=$JAVA_PROTOBUF_PEERS
diff --git a/build/conf/ts/ts_test.conf b/build/conf/ts/ts_test.conf
index 69fef446b5..b4b1fc740a 100644
--- a/build/conf/ts/ts_test.conf
+++ b/build/conf/ts/ts_test.conf
@@ -208,6 +208,8 @@ macro TS_TEST_DEPENDS_ON_BUILD() {
ENABLE(_TS_TEST_DEPENDS_ON_BUILD)
}
+# TS_TYPECHECK
+
_TS_TYPECHECK_VALUE=none
_TS_TYPECHECK_TSCONFIG=
@@ -219,3 +221,17 @@ macro TS_TYPECHECK(TS_CONFG="") {
ENABLE(_TS_TYPECHECK_VALUE)
SET(_TS_TYPECHECK_TSCONFIG $TS_CONFG)
}
+
+
+# TS_STYLELINT
+
+_TS_STYLELINT_VALUE=no
+_TS_STYLELINT_CONFIG=
+_TS_STYLELINT_FILES=
+
+macro TS_STYLELINT(_CONFIG) {
+ ENABLE(_TS_STYLELINT_VALUE)
+ SET(_TS_STYLELINT_CONFIG $_CONFIG)
+
+ _GLOB(_TS_STYLELINT_FILES **/*(.css|.scss|.less) EXCLUDE $TS_EXCLUDE_DIR_GLOB $TS_COMMON_OUTDIR_GLOB $TS_GLOB_EXCLUDE_ADDITIONAL)
+}
diff --git a/build/export_generators/cmake/build/scripts/split_unittest.py b/build/export_generators/cmake/build/scripts/split_unittest.py
index 8874b8b915..7214c70fdc 100644
--- a/build/export_generators/cmake/build/scripts/split_unittest.py
+++ b/build/export_generators/cmake/build/scripts/split_unittest.py
@@ -1,4 +1,5 @@
import argparse
+import os
import tempfile
import shlex
import subprocess
@@ -31,11 +32,14 @@ def get_shuffled_chunk(tests, modulo, modulo_index):
def list_tests(binary):
- with tempfile.NamedTemporaryFile() as tmpfile:
- cmd = [binary, "--list-verbose", "--list-path", tmpfile.name]
+ # can't use NamedTemporaryFile or mkstemp because of child process access issues on Windows
+ # https://stackoverflow.com/questions/66744497/python-tempfile-namedtemporaryfile-cant-use-generated-tempfile
+ with tempfile.TemporaryDirectory() as tmp_dir:
+ list_file = os.path.join(tmp_dir, 'list')
+ cmd = [binary, "--list-verbose", "--list-path", list_file]
subprocess.check_call(cmd)
- with open(tmpfile.name) as afile:
+ with open(list_file) as afile:
lines = afile.read().strip().split("\n")
lines = [x.strip() for x in lines]
return [x for x in lines if x]
diff --git a/build/export_generators/cmake/cmake/common.cmake b/build/export_generators/cmake/cmake/common.cmake
index 6578d58ae7..4eb0fbafce 100644
--- a/build/export_generators/cmake/cmake/common.cmake
+++ b/build/export_generators/cmake/cmake/common.cmake
@@ -2,6 +2,8 @@
find_package(Python3 REQUIRED)
+add_compile_definitions(ARCADIA_ROOT=${PROJECT_SOURCE_DIR})
+add_compile_definitions(ARCADIA_BUILD_ROOT=${PROJECT_BINARY_DIR})
add_compile_definitions(CATBOOST_OPENSOURCE=yes)
# assumes ToolName is always both the binary and the target name
diff --git a/build/export_generators/cmake/cmake/global_flags.compiler.msvc.cmake b/build/export_generators/cmake/cmake/global_flags.compiler.msvc.cmake
index 9d553495e3..07aaa8ce5f 100644
--- a/build/export_generators/cmake/cmake/global_flags.compiler.msvc.cmake
+++ b/build/export_generators/cmake/cmake/global_flags.compiler.msvc.cmake
@@ -156,7 +156,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_MSVC_COMMON_C_CXX_FLAGS} \
# TODO - -DUSE_STL_SYSTEM
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_MSVC_COMMON_C_CXX_FLAGS} \
- /std:c++latest \
/Zc:__cplusplus \
")
diff --git a/build/export_generators/cmake/cmake/global_flags.linker.gnu.cmake b/build/export_generators/cmake/cmake/global_flags.linker.gnu.cmake
index 5b32a8868f..37e40ce45b 100644
--- a/build/export_generators/cmake/cmake/global_flags.linker.gnu.cmake
+++ b/build/export_generators/cmake/cmake/global_flags.linker.gnu.cmake
@@ -23,3 +23,7 @@ endif()
if (APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
endif()
+
+if (CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$")
+ add_link_options(-rdynamic)
+endif()
diff --git a/build/export_generators/cmake/cmake/protobuf.cmake b/build/export_generators/cmake/cmake/protobuf.cmake
index 3660b58758..217bff6646 100644
--- a/build/export_generators/cmake/cmake/protobuf.cmake
+++ b/build/export_generators/cmake/cmake/protobuf.cmake
@@ -1,11 +1,11 @@
include(common)
-function(target_proto_plugin Tgt Name PluginTarget)
+function(target_proto_plugin Tgt Name PluginFullPath)
set_property(TARGET ${Tgt} APPEND PROPERTY
- PROTOC_OPTS --${Name}_out=${PROJECT_BINARY_DIR}/$<TARGET_PROPERTY:${Tgt},PROTO_NAMESPACE> --plugin=protoc-gen-${Name}=$<TARGET_FILE:${PluginTarget}>
+ PROTOC_OPTS --${Name}_out=${PROJECT_BINARY_DIR}/$<TARGET_PROPERTY:${Tgt},PROTO_NAMESPACE> --plugin=protoc-gen-${Name}=${PluginFullPath}
)
set_property(TARGET ${Tgt} APPEND PROPERTY
- PROTOC_DEPS ${PluginTarget}
+ PROTOC_DEPS ${PluginFullPath}
)
endfunction()
diff --git a/build/export_generators/cmake/dir_targets.jinja b/build/export_generators/cmake/dir_targets.jinja
index be0e5fe0e5..af7320e723 100644
--- a/build/export_generators/cmake/dir_targets.jinja
+++ b/build/export_generators/cmake/dir_targets.jinja
@@ -49,13 +49,13 @@
{%- endmacro -%}
-{%- macro TargetOptions(target_name, is_fake_module, target_options, only_option, exclude_options) -%}
+{%- macro TargetOptions(target_name, is_really_fake_module, target_options, only_option, exclude_options) -%}
{%- if (target_options.interfaces is defined) -%}
{{ RenderTargetOptions(target_name, ' INTERFACE', target_options.interfaces, only_option, exclude_options) }}
{%- endif -%}
{%- if (target_options.publics is defined) -%}
-{%- if is_fake_module -%}
+{%- if is_really_fake_module -%}
{%- set prefix = ' INTERFACE' -%}
{%- else -%}
{%- set prefix = ' PUBLIC' -%}
@@ -63,7 +63,7 @@
{{ RenderTargetOptions(target_name, prefix, target_options.publics, only_option, exclude_options) }}
{%- endif -%}
-{%- if not(is_fake_module) and (target_options.privates is defined) -%}
+{%- if not(is_really_fake_module) and (target_options.privates is defined) -%}
{{ RenderTargetOptions(target_name, ' PRIVATE', target_options.privates, only_option, exclude_options) }}
{%- endif -%}
{%- endmacro -%}
diff --git a/build/export_generators/cmake/generator.toml b/build/export_generators/cmake/generator.toml
index ec271bb6f8..a3c2b54f7b 100644
--- a/build/export_generators/cmake/generator.toml
+++ b/build/export_generators/cmake/generator.toml
@@ -84,15 +84,22 @@ find_package="skip"
include="skip"
# Really used attributes
+
+# All Conan attributes make sorted_set for stability generated conanfile,
+# order has no effect for all conan options
conan-requires="sorted_set"
conan-tool_requires="sorted_set"
conan-imports="sorted_set"
-conan-options="set"
+conan-options="sorted_set"
conan-generators="sorted_set"
-project_languages="set"
+# For project languages order important only for ASM, it must be after C/CXX,
+# this special logic maked in template, here use sorted_set for stability generated vars
+project_languages="sorted_set"
vanilla_protobuf="flag"
-includes="set"
+
+# Use sorted_set for include(*.cmake) for stability generated CMakeLists.txt
+includes="sorted_set"
[attrs.platform]
platform_vars-FAT_OBJECT_PREFIX="str"
@@ -115,6 +122,9 @@ dir_macroses="list"
dir_macroses-ITEM="dict"
dir_macroses-macro="str"
dir_macroses-args="list"
+
+# This dir_includes translated to add_subdirectory(), order may be important (depends on the code),
+# that is why here use set and not sort it
dir_includes="set"
[attrs.target]
diff --git a/build/export_generators/cmake/target_cmake_lists.jinja b/build/export_generators/cmake/target_cmake_lists.jinja
index a6b84bbcf4..dc28fbfd81 100644
--- a/build/export_generators/cmake/target_cmake_lists.jinja
+++ b/build/export_generators/cmake/target_cmake_lists.jinja
@@ -2,14 +2,58 @@
{%- set name = current_target.name -%}
{%- set macro_args = current_target.macro_args -%}
+{%- if macro == 'add_library' -%}
+{%- set only_headers_like_sources_library = true -%}
+{%- set target_sources = [] -%}
+{%- if current_target.target_options.interfaces is defined -%}
+{%- set interfaces_target_sources = current_target.target_options.interfaces|selectattr('option', 'eq', 'target_sources') -%}
+{%- if interfaces_target_sources|length -%}
+{%- set target_sources = target_sources + interfaces_target_sources|map(attribute='args')|sum -%}
+{%- endif -%}
+{%- endif -%}
+{%- if current_target.target_options.publics is defined -%}
+{%- set publics_target_sources = current_target.target_options.publics|selectattr('option', 'eq', 'target_sources') -%}
+{%- if publics_target_sources|length -%}
+{%- set target_sources = target_sources + publics_target_sources|map(attribute='args')|sum -%}
+{%- endif -%}
+{%- endif -%}
+{%- if current_target.target_options.privates is defined -%}
+{%- set privates_target_sources = current_target.target_options.privates|selectattr('option', 'eq', 'target_sources') -%}
+{%- if privates_target_sources|length -%}
+{%- set target_sources = target_sources + privates_target_sources|map(attribute='args')|sum -%}
+{%- endif -%}
+{%- endif -%}
+{%- if target_sources|length -%}
+{%- for target_source in target_sources -%}
+{%- if not (target_source.endswith('.h') or target_source.endswith('.hh') or target_source.endswith('.hpp') or target_source.endswith('.i') or target_source.endswith('.inc') or target_source.endswith('.inc.d')) -%}
+{#- Any non-header clear flag only_headers_like_sources_library -#}
+{%- set only_headers_like_sources_library = false -%}
+{%- endif -%}
+{%- endfor -%}
+{%- else -%}
+{#- Without target sources flag only_headers_like_sources_library -#}
+{%- set only_headers_like_sources_library = false -%}
+{%- endif -%}
+{%- else -%}
+{%- set only_headers_like_sources_library = false -%}
+{%- endif -%}
+
+{%- set is_really_fake_module = (current_target.is_fake_module) and not(only_headers_like_sources_library) -%}
+
{{ macro }}({{ name }}
-{%- if current_target.is_fake_module %} INTERFACE{%- endif -%}
-{%- if macro_args|length > 0 %}
+{%- if current_target.is_fake_module -%}
+{%- if only_headers_like_sources_library %} STATIC{%- else %} INTERFACE{%- endif -%}
+{%- endif -%}
+{%- if macro_args|length > 0 -%}
{%- for arg in macro_args %}
{{ arg }}
-{% endfor -%}
+{%- endfor -%}
{%- endif -%}
)
+{% if (current_target.is_fake_module) and (only_headers_like_sources_library) %}
+set_property(TARGET {{ name }} PROPERTY LINKER_LANGUAGE CXX)
+{%- endif -%}
+
{% include "[generator]/target_properties.jinja" -%}
{%- include "[generator]/target_options.jinja" -%}
{%- include "[generator]/target_commands.jinja" -%}
diff --git a/build/export_generators/cmake/target_links.jinja b/build/export_generators/cmake/target_links.jinja
index 4bce4d28ac..0680fcba69 100644
--- a/build/export_generators/cmake/target_links.jinja
+++ b/build/export_generators/cmake/target_links.jinja
@@ -6,7 +6,7 @@
{%- if add_interfaces|length -%}
{%- set interfaces = interfaces + add_interfaces -%}
{%- endif -%}
-{%- if current_target.is_fake_module -%}
+{%- if is_really_fake_module -%}
{%- set add_interfaces = current_target.link|map(attribute='publics')|sum -%}
{%- if add_interfaces|length -%}
{%- set interfaces = interfaces + add_interfaces -%}
@@ -28,12 +28,12 @@
{%- endif -%}
{%- endif -%}
{%- if (current_target.allocators is defined) and (current_target.allocators|length) -%}
-{%- if (current_target.macro == "add_executable") or (current_target.macro == "add_library" and ("SHARED" in current_target.macro_args)) -%}
+{%- if (current_target.macro == "add_executable") or (current_target.macro == "add_shared_library") or (current_target.macro == "add_library" and ("SHARED" in current_target.macro_args)) -%}
{#- support allocators -#}
{%- set allocators = allocators + current_target.allocators -%}
{%- else -%}
{#- not supported allocators -#}
-{%- if current_target.is_fake_module -%}
+{%- if is_really_fake_module -%}
{%- set interfaces = interfaces + current_target.allocators -%}
{%- else -%}
{%- set publics = publics + current_target.allocators -%}
diff --git a/build/export_generators/cmake/target_options.jinja b/build/export_generators/cmake/target_options.jinja
index b6e2570f04..e8cbeb8dd3 100644
--- a/build/export_generators/cmake/target_options.jinja
+++ b/build/export_generators/cmake/target_options.jinja
@@ -2,14 +2,14 @@
{%- set OPTIONS_ORDER_AFTER_LINKS = ['target_link_options'] -%}
{%- for OPTION in OPTIONS_ORDER_BEFORE_LINKS -%}
-{{ TargetOptions(name, current_target.is_fake_module, current_target.target_options, OPTION, []) }}
+{{ TargetOptions(name, is_really_fake_module, current_target.target_options, OPTION, []) }}
{%- endfor -%}
{%- include "[generator]/target_links.jinja" -%}
{%- for OPTION in OPTIONS_ORDER_AFTER_LINKS -%}
-{{ TargetOptions(name, current_target.is_fake_module, current_target.target_options, OPTION, []) }}
+{{ TargetOptions(name, is_really_fake_module, current_target.target_options, OPTION, []) }}
{%- endfor -%}
{#- Then all other options -#}
-{{ TargetOptions(name, current_target.is_fake_module, current_target.target_options, "", OPTIONS_ORDER_BEFORE_LINKS + OPTIONS_ORDER_AFTER_LINKS) }}
+{{ TargetOptions(name, is_really_fake_module, current_target.target_options, "", OPTIONS_ORDER_BEFORE_LINKS + OPTIONS_ORDER_AFTER_LINKS) }}
diff --git a/build/export_generators/hardcoded-cmake/build/scripts/split_unittest.py b/build/export_generators/hardcoded-cmake/build/scripts/split_unittest.py
index 8874b8b915..7214c70fdc 100644
--- a/build/export_generators/hardcoded-cmake/build/scripts/split_unittest.py
+++ b/build/export_generators/hardcoded-cmake/build/scripts/split_unittest.py
@@ -1,4 +1,5 @@
import argparse
+import os
import tempfile
import shlex
import subprocess
@@ -31,11 +32,14 @@ def get_shuffled_chunk(tests, modulo, modulo_index):
def list_tests(binary):
- with tempfile.NamedTemporaryFile() as tmpfile:
- cmd = [binary, "--list-verbose", "--list-path", tmpfile.name]
+ # can't use NamedTemporaryFile or mkstemp because of child process access issues on Windows
+ # https://stackoverflow.com/questions/66744497/python-tempfile-namedtemporaryfile-cant-use-generated-tempfile
+ with tempfile.TemporaryDirectory() as tmp_dir:
+ list_file = os.path.join(tmp_dir, 'list')
+ cmd = [binary, "--list-verbose", "--list-path", list_file]
subprocess.check_call(cmd)
- with open(tmpfile.name) as afile:
+ with open(list_file) as afile:
lines = afile.read().strip().split("\n")
lines = [x.strip() for x in lines]
return [x for x in lines if x]
diff --git a/build/export_generators/hardcoded-cmake/cmake/common.cmake b/build/export_generators/hardcoded-cmake/cmake/common.cmake
index 6578d58ae7..4eb0fbafce 100644
--- a/build/export_generators/hardcoded-cmake/cmake/common.cmake
+++ b/build/export_generators/hardcoded-cmake/cmake/common.cmake
@@ -2,6 +2,8 @@
find_package(Python3 REQUIRED)
+add_compile_definitions(ARCADIA_ROOT=${PROJECT_SOURCE_DIR})
+add_compile_definitions(ARCADIA_BUILD_ROOT=${PROJECT_BINARY_DIR})
add_compile_definitions(CATBOOST_OPENSOURCE=yes)
# assumes ToolName is always both the binary and the target name
diff --git a/build/export_generators/hardcoded-cmake/cmake/global_flags.compiler.msvc.cmake b/build/export_generators/hardcoded-cmake/cmake/global_flags.compiler.msvc.cmake
index 9d553495e3..07aaa8ce5f 100644
--- a/build/export_generators/hardcoded-cmake/cmake/global_flags.compiler.msvc.cmake
+++ b/build/export_generators/hardcoded-cmake/cmake/global_flags.compiler.msvc.cmake
@@ -156,7 +156,6 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_MSVC_COMMON_C_CXX_FLAGS} \
# TODO - -DUSE_STL_SYSTEM
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_MSVC_COMMON_C_CXX_FLAGS} \
- /std:c++latest \
/Zc:__cplusplus \
")
diff --git a/build/export_generators/hardcoded-cmake/cmake/global_flags.linker.gnu.cmake b/build/export_generators/hardcoded-cmake/cmake/global_flags.linker.gnu.cmake
index 5b32a8868f..37e40ce45b 100644
--- a/build/export_generators/hardcoded-cmake/cmake/global_flags.linker.gnu.cmake
+++ b/build/export_generators/hardcoded-cmake/cmake/global_flags.linker.gnu.cmake
@@ -23,3 +23,7 @@ endif()
if (APPLE)
set(CMAKE_SHARED_LINKER_FLAGS "-undefined dynamic_lookup")
endif()
+
+if (CMAKE_SYSTEM_NAME MATCHES "^(Android|Linux)$")
+ add_link_options(-rdynamic)
+endif()
diff --git a/build/export_generators/ide-gradle/build.gradle.kts.jinja b/build/export_generators/ide-gradle/build.gradle.kts.jinja
index a1e2563878..44a6cb36f0 100644
--- a/build/export_generators/ide-gradle/build.gradle.kts.jinja
+++ b/build/export_generators/ide-gradle/build.gradle.kts.jinja
@@ -258,23 +258,41 @@ tasks.named<Test>("test") {
{% endif -%}
-{% set runs = targets|selectattr("runs") -%}
+{# run_java_program #}
+{# {% set runs = targets|selectattr("runs") -%} #}
+{% set runs = target.runs -%}
{% if runs -%}
{% for run in runs -%}
-tasks.build.dependsOn(
- task<JavaExec>("runJavaProgram") {
+
+val runJav{{ loop.index }} = task<JavaExec>("runJavaProgram{{ loop.index }}") {
group = "build"
- description = "Code generation by rub java program"
+ description = "Code generation by run java program"
- mainClass.set(mainClass)
+ mainClass.set("{{ run.args[0] }}")
{% if run.classpath -%}
- classpath = "{{ run.classpath }}"
+{% for classpath in run.classpath -%}
+{% set real_classpath = classpath|replace('@', '') -%}
+{% set real_classpath = real_classpath|replace('.run.cp', '') -%}
+{% set real_classpath = real_classpath|replace('.cplst', '') -%}
+{% set real_classpath = real_classpath|replace(export_root, '') -%}
+{% set real_gradle_classpath = real_classpath|replace('/', ':') %}
+ val classPath = "{{ real_gradle_classpath }}"
+ val classPathParts = classPath.split(":")
+ classPathParts[classPathParts.size - 2]
+ classpath = files("$project_root{{ real_classpath }}") + project(classPath.replace(":${classPathParts[classPathParts.size - 2]}.jar", "")).configurations.runtimeClasspath.get()
+{% endfor -%}
{% else -%}
classpath = sourceSets.main.get().runtimeClasspath
{% endif -%}
-{% if run.args -%}
-{# for arg in run.args #}
- args = "{{ run.args }}"
+{% set args = run.args -%}
+{% if args -%}
+ val argsList = mutableListOf(
+{% for arg in args -%}
+ "{{ arg }}",
+{% endfor -%}
+ )
+ argsList.removeAt(0)
+ args = argsList
{% endif -%}
{% if run.in_dir -%}
{% for dir in run.in_dir -%}
@@ -300,7 +318,11 @@ tasks.build.dependsOn(
#}
{% endif -%}
}
-)
+tasks {
+ build {
+ dependsOn(runJav{{ loop.index }})
+ }
+}
{% endfor -%}
{% endif -%}
diff --git a/build/external_resources/flake8_py3/ya.make b/build/external_resources/flake8_py3/ya.make
index 8d5bc966d9..be13e71045 100644
--- a/build/external_resources/flake8_py3/ya.make
+++ b/build/external_resources/flake8_py3/ya.make
@@ -12,12 +12,12 @@ ENDIF()
DECLARE_EXTERNAL_HOST_RESOURCES_BUNDLE(
FLAKE8_PY3
- sbr:6674733966 FOR DARWIN-ARM64
- sbr:6674734480 FOR DARWIN
- sbr:6674734285 FOR LINUX-PPC64LE
- sbr:6674734993 FOR LINUX
- sbr:6674733653 FOR LINUX-AARCH64
- sbr:6674734716 FOR WIN32
+ sbr:6760720256 FOR DARWIN-ARM64
+ sbr:6760720465 FOR DARWIN
+ sbr:6726869647 FOR LINUX-PPC64LE
+ sbr:6760721014 FOR LINUX
+ sbr:6760720046 FOR LINUX-AARCH64
+ sbr:6760720811 FOR WIN32
)
END()
diff --git a/build/external_resources/yexport/public.resources.json b/build/external_resources/yexport/public.resources.json
index 04a8c33ff5..3c54ee617f 100644
--- a/build/external_resources/yexport/public.resources.json
+++ b/build/external_resources/yexport/public.resources.json
@@ -1,13 +1,13 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:6693380504"
+ "uri": "sbr:6767780570"
},
"darwin-arm64": {
- "uri": "sbr:6693380132"
+ "uri": "sbr:6767778005"
},
"linux": {
- "uri": "sbr:6693379678"
+ "uri": "sbr:6767775474"
}
}
}
diff --git a/build/external_resources/yexport/resources.json b/build/external_resources/yexport/resources.json
index b4fe321431..ae1f1c8d07 100644
--- a/build/external_resources/yexport/resources.json
+++ b/build/external_resources/yexport/resources.json
@@ -1,13 +1,13 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:6693373601"
+ "uri": "sbr:6767772494"
},
"darwin-arm64": {
- "uri": "sbr:6693372415"
+ "uri": "sbr:6767770308"
},
"linux": {
- "uri": "sbr:6693371162"
+ "uri": "sbr:6767768467"
}
}
}
diff --git a/build/external_resources/ymake/public.resources.json b/build/external_resources/ymake/public.resources.json
index 1390c88da0..2b8e1738df 100644
--- a/build/external_resources/ymake/public.resources.json
+++ b/build/external_resources/ymake/public.resources.json
@@ -1,19 +1,19 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:6639828525"
+ "uri": "sbr:6758526969"
},
"darwin-arm64": {
- "uri": "sbr:6639826777"
+ "uri": "sbr:6758526691"
},
"linux": {
- "uri": "sbr:6639832402"
+ "uri": "sbr:6758527904"
},
"linux-aarch64": {
- "uri": "sbr:6639824710"
+ "uri": "sbr:6758526355"
},
"win32-clang-cl": {
- "uri": "sbr:6639830383"
+ "uri": "sbr:6758527388"
}
}
}
diff --git a/build/external_resources/ymake/resources.json b/build/external_resources/ymake/resources.json
index b438a74cb7..3d3944630d 100644
--- a/build/external_resources/ymake/resources.json
+++ b/build/external_resources/ymake/resources.json
@@ -1,19 +1,19 @@
{
"by_platform": {
"darwin": {
- "uri": "sbr:6639767425"
+ "uri": "sbr:6758513717"
},
"darwin-arm64": {
- "uri": "sbr:6639765678"
+ "uri": "sbr:6758513019"
},
"linux": {
- "uri": "sbr:6639770930"
+ "uri": "sbr:6758515488"
},
"linux-aarch64": {
- "uri": "sbr:6639763798"
+ "uri": "sbr:6758512085"
},
"win32-clang-cl": {
- "uri": "sbr:6639768880"
+ "uri": "sbr:6758514612"
}
}
}
diff --git a/build/internal/platform/clang_toolchain_info/ya.make b/build/internal/platform/clang_toolchain_info/ya.make
deleted file mode 100644
index 2ad46b1127..0000000000
--- a/build/internal/platform/clang_toolchain_info/ya.make
+++ /dev/null
@@ -1,6 +0,0 @@
-RESOURCES_LIBRARY()
-
-TOOLCHAIN(clang)
-VERSION(${CLANG_VER})
-
-END()
diff --git a/build/internal/platform/macos_sdk/ya.make b/build/internal/platform/macos_sdk/ya.make
deleted file mode 100644
index f80ecb6677..0000000000
--- a/build/internal/platform/macos_sdk/ya.make
+++ /dev/null
@@ -1,19 +0,0 @@
-RESOURCES_LIBRARY()
-
-# macOS 14.2 Sonoma SDK / Xcode 15.1 (15C65)
-DECLARE_EXTERNAL_RESOURCE(MACOS_SDK sbr:6121515192)
-
-IF (USE_STL_SYSTEM)
- SET(__XCODE_RESOURCE_NAME CPP_XCODE_TOOLCHAIN_ROOT)
- SET(__XCODE_TOOLCHAIN_VERSION ${CPP_XCODE_TOOLCHAIN_VERSION})
- INCLUDE(${ARCADIA_ROOT}/build/platform/xcode/ya.make.inc)
- CFLAGS(
- GLOBAL -isystem$MACOS_SDK_RESOURCE_GLOBAL/usr/include/c++/v1
- GLOBAL -F$MACOS_SDK_RESOURCE_GLOBAL/System/Library/Frameworks
- )
- LDFLAGS(
- -F$MACOS_SDK_RESOURCE_GLOBAL/System/Library/Frameworks
- )
-ENDIF()
-
-END()
diff --git a/build/internal/platform/msvc/ya.make b/build/internal/platform/msvc/ya.make
deleted file mode 100644
index 7472be4a00..0000000000
--- a/build/internal/platform/msvc/ya.make
+++ /dev/null
@@ -1,17 +0,0 @@
-RESOURCES_LIBRARY()
-
-IF (WINDOWS_KITS_VERSION == "10.0.10586.0")
- DECLARE_EXTERNAL_RESOURCE(WINDOWS_KITS sbr:544779014)
-ELSEIF (WINDOWS_KITS_VERSION == "10.0.16299.0")
- DECLARE_EXTERNAL_RESOURCE(WINDOWS_KITS sbr:1379398385)
-ELSEIF (WINDOWS_KITS_VERSION == "10.0.18362.0")
- DECLARE_EXTERNAL_RESOURCE(WINDOWS_KITS sbr:1939557911)
-ELSE()
- MESSAGE(FATAL_ERROR "We have no Windows Kits version ${WINDOWS_KITS_VERSION}")
-ENDIF()
-
-IF (CLANG_CL)
- DECLARE_EXTERNAL_RESOURCE(MSVC_FOR_CLANG sbr:1383387533) # Microsoft Visual C++ 2017 14.16.27023 (15.9.5)
-ENDIF()
-
-END()
diff --git a/build/internal/scripts/gen_sbom.py b/build/internal/scripts/gen_sbom.py
deleted file mode 100644
index a44a32a627..0000000000
--- a/build/internal/scripts/gen_sbom.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import argparse
-import json
-import os
-
-
-def deduce_name(path):
- name = os.path.basename(path)
- for prefix in ['contrib/libs/', 'contrib/python/py2/', 'contrib/python/py3/', 'contrib/python/']:
- if path.startswith(prefix):
- name = path[len(prefix):].replace('/', '-')
- break
- return name
-
-
-def main():
- parser = argparse.ArgumentParser(description='Generate single SBOM component JSON object for current third-party library')
- parser.add_argument('-o', '--output', type=argparse.FileType('w', encoding='UTF-8'), help='resulting SBOM component file', required=True)
- parser.add_argument('--type', choices=['library', 'toolchain'], required=True)
- parser.add_argument('--path', type=str, help='Path to module in arcadia', required=True)
- parser.add_argument('--ver', type=str, help='Version of the contrib module', required=True)
- parser.add_argument('--lang', type=str, help='Language of the library')
- parser.add_argument('--toolchain-name', type=str, help='Public name of the toolchain')
-
- args = parser.parse_args()
-
- res = {}
- res['version'] = args.ver
- res["properties"] = [
- {'name': 'arcadia_module_subdir', 'value': args.path},
- ]
- if args.type == 'library':
- res['name'] = deduce_name(args.path)
- res['type'] = 'library'
- res["properties"].append({'name': 'language', 'value': args.lang})
- elif args.type == 'toolchain':
- res['name'] = args.toolchain_name
- res['type'] = 'application'
- res["tags"] = ['toolchain']
-
- json.dump(res, args.output)
- args.output.close()
-
-
-if __name__ == '__main__':
- main()
diff --git a/build/internal/scripts/link_sbom.py b/build/internal/scripts/link_sbom.py
deleted file mode 100644
index 91769177d5..0000000000
--- a/build/internal/scripts/link_sbom.py
+++ /dev/null
@@ -1,35 +0,0 @@
-import argparse
-import json
-import os
-
-
-def main():
- parser = argparse.ArgumentParser(description='Generate SBOM data from used contribs info')
- parser.add_argument('-o', '--output', type=argparse.FileType('w', encoding='UTF-8'), help='resulting SBOM file', required=True)
- parser.add_argument('--vcs-info', type=argparse.FileType('r', encoding='UTF-8'), help='VCS information file', required=True)
- parser.add_argument('--mod-path', type=str, help='Path to module in arcadia', required=True)
- parser.add_argument('components', metavar='N', type=argparse.FileType('r', encoding='UTF-8'), nargs='*', help='dependencies info in SBOM component JSON format')
-
- args = parser.parse_args()
-
- vcs = json.load(args.vcs_info)
-
- res = {}
- res['$schema'] = "http://cyclonedx.org/schema/bom-1.6.schema.json"
- res["bomFormat"] = "CycloneDX"
- res["specVersion"] = "1.6"
- res["version"] = 1
- res["components"] = [json.load(dep) for dep in args.components]
- res["properties"] = [
- {'name': 'commit_hash', 'value': vcs['ARCADIA_SOURCE_HG_HASH']},
- {'name': 'arcadia_module_subdir', 'value': args.mod_path}
- ]
- if vcs.get('DIRTY', '') == 'dirty':
- res["properties"].append({'name': 'has_uncommitted_changes', 'value': True})
-
- json.dump(res, args.output)
- args.output.close()
-
-
-if __name__ == '__main__':
- main()
diff --git a/build/mapping.conf.json b/build/mapping.conf.json
index 6690107e8e..e67b484a8d 100644
--- a/build/mapping.conf.json
+++ b/build/mapping.conf.json
@@ -37,6 +37,37 @@
"5876857510": "https://devtools-registry.s3.yandex.net/5876857510",
"5002675116": "https://devtools-registry.s3.yandex.net/5002675116",
"3676654632": "https://devtools-registry.s3.yandex.net/3676654632",
+ "2217196829": "https://devtools-registry.s3.yandex.net/2217196829",
+ "2217197026": "https://devtools-registry.s3.yandex.net/2217197026",
+ "3359067951": "https://devtools-registry.s3.yandex.net/3359067951",
+ "3359065448": "https://devtools-registry.s3.yandex.net/3359065448",
+ "840517584": "https://devtools-registry.s3.yandex.net/840517584",
+ "840516708": "https://devtools-registry.s3.yandex.net/840516708",
+ "6072603197": "https://devtools-registry.s3.yandex.net/6072603197",
+ "6072602872": "https://devtools-registry.s3.yandex.net/6072602872",
+ "4401902018": "https://devtools-registry.s3.yandex.net/4401902018",
+ "4401902016": "https://devtools-registry.s3.yandex.net/4401902016",
+ "4401902041": "https://devtools-registry.s3.yandex.net/4401902041",
+ "4401902017": "https://devtools-registry.s3.yandex.net/4401902017",
+ "4628902574": "https://devtools-registry.s3.yandex.net/4628902574",
+ "4628902851": "https://devtools-registry.s3.yandex.net/4628902851",
+ "4628902310": "https://devtools-registry.s3.yandex.net/4628902310",
+ "4628902309": "https://devtools-registry.s3.yandex.net/4628902309",
+ "4628902847": "https://devtools-registry.s3.yandex.net/4628902847",
+ "4628902878": "https://devtools-registry.s3.yandex.net/4628902878",
+ "3096861737": "https://devtools-registry.s3.yandex.net/3096861737",
+ "3096861724": "https://devtools-registry.s3.yandex.net/3096861724",
+ "1096777023": "https://devtools-registry.s3.yandex.net/1096777023",
+ "1096776689": "https://devtools-registry.s3.yandex.net/1096776689",
+ "545709503": "https://devtools-registry.s3.yandex.net/545709503",
+ "545709491": "https://devtools-registry.s3.yandex.net/545709491",
+ "721500304": "https://devtools-registry.s3.yandex.net/721500304",
+ "3573990573": "https://devtools-registry.s3.yandex.net/3573990573",
+ "3573996018": "https://devtools-registry.s3.yandex.net/3573996018",
+ "6385637993": "https://devtools-registry.s3.yandex.net/6385637993",
+ "6385637991": "https://devtools-registry.s3.yandex.net/6385637991",
+ "1841245955": "https://devtools-registry.s3.yandex.net/1841245955",
+ "1841245849": "https://devtools-registry.s3.yandex.net/1841245849",
"5424057306": "https://devtools-registry.s3.yandex.net/5424057306",
"5424061624": "https://devtools-registry.s3.yandex.net/5424061624",
"5424033677": "https://devtools-registry.s3.yandex.net/5424033677",
@@ -66,12 +97,14 @@
"5550376885": "https://devtools-registry.s3.yandex.net/5550376885",
"5531183987": "https://devtools-registry.s3.yandex.net/5531183987",
"5695783597": "https://devtools-registry.s3.yandex.net/5695783597",
+ "6538599922": "https://devtools-registry.s3.yandex.net/6538599922",
"5453803895": "https://devtools-registry.s3.yandex.net/5453803895",
"5458408674": "https://devtools-registry.s3.yandex.net/5458408674",
"5463300202": "https://devtools-registry.s3.yandex.net/5463300202",
"5465946272": "https://devtools-registry.s3.yandex.net/5465946272",
"1966560555": "https://devtools-registry.s3.yandex.net/1966560555",
"309054781": "https://devtools-registry.s3.yandex.net/309054781",
+ "243881345": "https://devtools-registry.s3.yandex.net/243881345",
"5752310178": "https://devtools-registry.s3.yandex.net/5752310178",
"5752408289": "https://devtools-registry.s3.yandex.net/5752408289",
"5752491095": "https://devtools-registry.s3.yandex.net/5752491095",
@@ -84,9 +117,13 @@
"5709310220": "https://devtools-registry.s3.yandex.net/5709310220",
"5709435327": "https://devtools-registry.s3.yandex.net/5709435327",
"5758120203": "https://devtools-registry.s3.yandex.net/5758120203",
+ "6740818206": "https://devtools-registry.s3.yandex.net/6740818206",
"6657744758": "https://devtools-registry.s3.yandex.net/6657744758",
+ "6740512126": "https://devtools-registry.s3.yandex.net/6740512126",
"6657746696": "https://devtools-registry.s3.yandex.net/6657746696",
+ "6740582961": "https://devtools-registry.s3.yandex.net/6740582961",
"6657765589": "https://devtools-registry.s3.yandex.net/6657765589",
+ "6740765286": "https://devtools-registry.s3.yandex.net/6740765286",
"6657758332": "https://devtools-registry.s3.yandex.net/6657758332",
"360916612": "https://devtools-registry.s3.yandex.net/360916612",
"4312064267": "https://devtools-registry.s3.yandex.net/4312064267",
@@ -170,6 +207,11 @@
"6342053228": "https://devtools-registry.s3.yandex.net/6342053228",
"5257605552": "https://devtools-registry.s3.yandex.net/5257605552",
"5257606004": "https://devtools-registry.s3.yandex.net/5257606004",
+ "4351925664": "https://devtools-registry.s3.yandex.net/4351925664",
+ "4351924553": "https://devtools-registry.s3.yandex.net/4351924553",
+ "4351926887": "https://devtools-registry.s3.yandex.net/4351926887",
+ "4351922617": "https://devtools-registry.s3.yandex.net/4351922617",
+ "4351923493": "https://devtools-registry.s3.yandex.net/4351923493",
"2989597929": "https://devtools-registry.s3.yandex.net/2989597929",
"2989596911": "https://devtools-registry.s3.yandex.net/2989596911",
"2989598506": "https://devtools-registry.s3.yandex.net/2989598506",
@@ -193,21 +235,32 @@
"6603784347": "https://devtools-registry.s3.yandex.net/6603784347",
"6652224583": "https://devtools-registry.s3.yandex.net/6652224583",
"6674734480": "https://devtools-registry.s3.yandex.net/6674734480",
+ "6726871384": "https://devtools-registry.s3.yandex.net/6726871384",
+ "6760720465": "https://devtools-registry.s3.yandex.net/6760720465",
"6603781997": "https://devtools-registry.s3.yandex.net/6603781997",
"6652223452": "https://devtools-registry.s3.yandex.net/6652223452",
"6674733966": "https://devtools-registry.s3.yandex.net/6674733966",
+ "6726867988": "https://devtools-registry.s3.yandex.net/6726867988",
+ "6760720256": "https://devtools-registry.s3.yandex.net/6760720256",
"6603787904": "https://devtools-registry.s3.yandex.net/6603787904",
"6652225714": "https://devtools-registry.s3.yandex.net/6652225714",
"6674734993": "https://devtools-registry.s3.yandex.net/6674734993",
+ "6726875537": "https://devtools-registry.s3.yandex.net/6726875537",
+ "6760721014": "https://devtools-registry.s3.yandex.net/6760721014",
"6603780916": "https://devtools-registry.s3.yandex.net/6603780916",
"6652222817": "https://devtools-registry.s3.yandex.net/6652222817",
"6674733653": "https://devtools-registry.s3.yandex.net/6674733653",
+ "6726866588": "https://devtools-registry.s3.yandex.net/6726866588",
+ "6760720046": "https://devtools-registry.s3.yandex.net/6760720046",
"6603783079": "https://devtools-registry.s3.yandex.net/6603783079",
"6652224021": "https://devtools-registry.s3.yandex.net/6652224021",
"6674734285": "https://devtools-registry.s3.yandex.net/6674734285",
+ "6726869647": "https://devtools-registry.s3.yandex.net/6726869647",
"6603785992": "https://devtools-registry.s3.yandex.net/6603785992",
"6652225128": "https://devtools-registry.s3.yandex.net/6652225128",
"6674734716": "https://devtools-registry.s3.yandex.net/6674734716",
+ "6726873745": "https://devtools-registry.s3.yandex.net/6726873745",
+ "6760720811": "https://devtools-registry.s3.yandex.net/6760720811",
"3961412335": "https://devtools-registry.s3.yandex.net/3961412335",
"3961411314": "https://devtools-registry.s3.yandex.net/3961411314",
"3961413236": "https://devtools-registry.s3.yandex.net/3961413236",
@@ -290,6 +343,10 @@
"6685155231": "https://devtools-registry.s3.yandex.net/6685155231",
"6696783934": "https://devtools-registry.s3.yandex.net/6696783934",
"6696787149": "https://devtools-registry.s3.yandex.net/6696787149",
+ "6733651979": "https://devtools-registry.s3.yandex.net/6733651979",
+ "6733663069": "https://devtools-registry.s3.yandex.net/6733663069",
+ "6761602592": "https://devtools-registry.s3.yandex.net/6761602592",
+ "6761604639": "https://devtools-registry.s3.yandex.net/6761604639",
"5486731632": "https://devtools-registry.s3.yandex.net/5486731632",
"5514350352": "https://devtools-registry.s3.yandex.net/5514350352",
"5514360398": "https://devtools-registry.s3.yandex.net/5514360398",
@@ -355,6 +412,8 @@
"6556875672": "https://devtools-registry.s3.yandex.net/6556875672",
"6584574198": "https://devtools-registry.s3.yandex.net/6584574198",
"6693380504": "https://devtools-registry.s3.yandex.net/6693380504",
+ "6713117210": "https://devtools-registry.s3.yandex.net/6713117210",
+ "6767780570": "https://devtools-registry.s3.yandex.net/6767780570",
"5811823398": "https://devtools-registry.s3.yandex.net/5811823398",
"5840611310": "https://devtools-registry.s3.yandex.net/5840611310",
"5860185593": "https://devtools-registry.s3.yandex.net/5860185593",
@@ -373,6 +432,8 @@
"6556874915": "https://devtools-registry.s3.yandex.net/6556874915",
"6584572692": "https://devtools-registry.s3.yandex.net/6584572692",
"6693380132": "https://devtools-registry.s3.yandex.net/6693380132",
+ "6713113801": "https://devtools-registry.s3.yandex.net/6713113801",
+ "6767778005": "https://devtools-registry.s3.yandex.net/6767778005",
"5811822876": "https://devtools-registry.s3.yandex.net/5811822876",
"5840610640": "https://devtools-registry.s3.yandex.net/5840610640",
"5860184285": "https://devtools-registry.s3.yandex.net/5860184285",
@@ -391,6 +452,8 @@
"6556873941": "https://devtools-registry.s3.yandex.net/6556873941",
"6584571169": "https://devtools-registry.s3.yandex.net/6584571169",
"6693379678": "https://devtools-registry.s3.yandex.net/6693379678",
+ "6713110487": "https://devtools-registry.s3.yandex.net/6713110487",
+ "6767775474": "https://devtools-registry.s3.yandex.net/6767775474",
"5766172292": "https://devtools-registry.s3.yandex.net/5766172292",
"5805431504": "https://devtools-registry.s3.yandex.net/5805431504",
"5829027626": "https://devtools-registry.s3.yandex.net/5829027626",
@@ -417,6 +480,8 @@
"6608688643": "https://devtools-registry.s3.yandex.net/6608688643",
"6629093731": "https://devtools-registry.s3.yandex.net/6629093731",
"6639828525": "https://devtools-registry.s3.yandex.net/6639828525",
+ "6715755432": "https://devtools-registry.s3.yandex.net/6715755432",
+ "6758526969": "https://devtools-registry.s3.yandex.net/6758526969",
"5766171800": "https://devtools-registry.s3.yandex.net/5766171800",
"5805430761": "https://devtools-registry.s3.yandex.net/5805430761",
"5829025456": "https://devtools-registry.s3.yandex.net/5829025456",
@@ -443,6 +508,8 @@
"6608688371": "https://devtools-registry.s3.yandex.net/6608688371",
"6629093234": "https://devtools-registry.s3.yandex.net/6629093234",
"6639826777": "https://devtools-registry.s3.yandex.net/6639826777",
+ "6715754419": "https://devtools-registry.s3.yandex.net/6715754419",
+ "6758526691": "https://devtools-registry.s3.yandex.net/6758526691",
"5766173070": "https://devtools-registry.s3.yandex.net/5766173070",
"5805432830": "https://devtools-registry.s3.yandex.net/5805432830",
"5829031598": "https://devtools-registry.s3.yandex.net/5829031598",
@@ -469,6 +536,8 @@
"6608688976": "https://devtools-registry.s3.yandex.net/6608688976",
"6629094940": "https://devtools-registry.s3.yandex.net/6629094940",
"6639832402": "https://devtools-registry.s3.yandex.net/6639832402",
+ "6715757753": "https://devtools-registry.s3.yandex.net/6715757753",
+ "6758527904": "https://devtools-registry.s3.yandex.net/6758527904",
"5766171341": "https://devtools-registry.s3.yandex.net/5766171341",
"5805430188": "https://devtools-registry.s3.yandex.net/5805430188",
"5829023352": "https://devtools-registry.s3.yandex.net/5829023352",
@@ -495,6 +564,8 @@
"6608688049": "https://devtools-registry.s3.yandex.net/6608688049",
"6629092745": "https://devtools-registry.s3.yandex.net/6629092745",
"6639824710": "https://devtools-registry.s3.yandex.net/6639824710",
+ "6715753858": "https://devtools-registry.s3.yandex.net/6715753858",
+ "6758526355": "https://devtools-registry.s3.yandex.net/6758526355",
"5766172695": "https://devtools-registry.s3.yandex.net/5766172695",
"5805432230": "https://devtools-registry.s3.yandex.net/5805432230",
"5829029743": "https://devtools-registry.s3.yandex.net/5829029743",
@@ -521,6 +592,8 @@
"6608688844": "https://devtools-registry.s3.yandex.net/6608688844",
"6629094363": "https://devtools-registry.s3.yandex.net/6629094363",
"6639830383": "https://devtools-registry.s3.yandex.net/6639830383",
+ "6715756641": "https://devtools-registry.s3.yandex.net/6715756641",
+ "6758527388": "https://devtools-registry.s3.yandex.net/6758527388",
"4307890075": "https://devtools-registry.s3.yandex.net/4307890075",
"5517245192": "https://devtools-registry.s3.yandex.net/5517245192",
"4307901240": "https://devtools-registry.s3.yandex.net/4307901240",
@@ -540,6 +613,8 @@
"6133419349": "https://devtools-registry.s3.yandex.net/6133419349",
"1277521710": "https://devtools-registry.s3.yandex.net/1277521710",
"1812152858": "https://devtools-registry.s3.yandex.net/1812152858",
+ "289381370": "https://devtools-registry.s3.yandex.net/289381370",
+ "289382642": "https://devtools-registry.s3.yandex.net/289382642",
"5776380974": "https://devtools-registry.s3.yandex.net/5776380974",
"5777101734": "https://devtools-registry.s3.yandex.net/5777101734",
"5909068951": "https://devtools-registry.s3.yandex.net/5909068951",
@@ -565,6 +640,7 @@
"5909066324": "https://devtools-registry.s3.yandex.net/5909066324",
"6043998448": "https://devtools-registry.s3.yandex.net/6043998448",
"6431663364": "https://devtools-registry.s3.yandex.net/6431663364",
+ "6391354461": "https://devtools-registry.s3.yandex.net/6391354461",
"3167009386": "https://devtools-registry.s3.yandex.net/3167009386",
"3050798466": "https://devtools-registry.s3.yandex.net/3050798466",
"3064614561": "https://devtools-registry.s3.yandex.net/3064614561",
@@ -691,6 +767,37 @@
"5876857510": "JAVA_JDK_ENVIRONMENT-windows-11.0.21+9-jdk-windows-amd64.yandex.tgz",
"5002675116": "JAVA_JDK_ENVIRONMENT-windows-17.0.7+7-jdk-windows-amd64.yandex.tgz",
"3676654632": "JAVA_JDK_ENVIRONMENT-windows-19.0.1.1-jdk-windows-i686.yandex.tgz",
+ "2217196829": "JAVA_LIBRARY-none-none-checker-qual-3.12.0-sources.jar",
+ "2217197026": "JAVA_LIBRARY-none-none-checker-qual-3.12.0.jar",
+ "3359067951": "JAVA_LIBRARY-none-none-error_prone_annotations-2.14.0-sources.jar",
+ "3359065448": "JAVA_LIBRARY-none-none-error_prone_annotations-2.14.0.jar",
+ "840517584": "JAVA_LIBRARY-none-none-failureaccess-1.0.1-sources.jar",
+ "840516708": "JAVA_LIBRARY-none-none-failureaccess-1.0.1.jar",
+ "6072603197": "JAVA_LIBRARY-none-none-flatbuffers-java-24.3.25-sources.jar",
+ "6072602872": "JAVA_LIBRARY-none-none-flatbuffers-java-24.3.25.jar",
+ "4401902018": "JAVA_LIBRARY-none-none-grpc-api-1.51.0-sources.jar",
+ "4401902016": "JAVA_LIBRARY-none-none-grpc-api-1.51.0.jar",
+ "4401902041": "JAVA_LIBRARY-none-none-grpc-context-1.51.0-sources.jar",
+ "4401902017": "JAVA_LIBRARY-none-none-grpc-context-1.51.0.jar",
+ "4628902574": "JAVA_LIBRARY-none-none-grpc-protobuf-1.51.0-sources.jar",
+ "4628902851": "JAVA_LIBRARY-none-none-grpc-protobuf-1.51.0.jar",
+ "4628902310": "JAVA_LIBRARY-none-none-grpc-protobuf-lite-1.51.0-sources.jar",
+ "4628902309": "JAVA_LIBRARY-none-none-grpc-protobuf-lite-1.51.0.jar",
+ "4628902847": "JAVA_LIBRARY-none-none-grpc-stub-1.51.0-sources.jar",
+ "4628902878": "JAVA_LIBRARY-none-none-grpc-stub-1.51.0.jar",
+ "3096861737": "JAVA_LIBRARY-none-none-guava-31.1-android-sources.jar",
+ "3096861724": "JAVA_LIBRARY-none-none-guava-31.1-android.jar",
+ "1096777023": "JAVA_LIBRARY-none-none-j2objc-annotations-1.3-sources.jar",
+ "1096776689": "JAVA_LIBRARY-none-none-j2objc-annotations-1.3.jar",
+ "545709503": "JAVA_LIBRARY-none-none-javax.annotation-api-1.3.1-sources.jar",
+ "545709491": "JAVA_LIBRARY-none-none-javax.annotation-api-1.3.1.jar",
+ "721500304": "JAVA_LIBRARY-none-none-listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar",
+ "3573990573": "JAVA_LIBRARY-none-none-proto-google-common-protos-2.9.0-sources.jar",
+ "3573996018": "JAVA_LIBRARY-none-none-proto-google-common-protos-2.9.0.jar",
+ "6385637993": "JAVA_LIBRARY-none-none-protobuf-java-3.25.3-sources.jar",
+ "6385637991": "JAVA_LIBRARY-none-none-protobuf-java-3.25.3.jar",
+ "1841245955": "JAVA_LIBRARY-none-none-snakeyaml-1.27-sources.jar",
+ "1841245849": "JAVA_LIBRARY-none-none-snakeyaml-1.27.jar",
"5424057306": "OTHER_RESOURCE-none-1.21.3-y_go1.21.3.darwin-amd64.tar.gz",
"5424061624": "OTHER_RESOURCE-none-1.21.3-y_go1.21.3.darwin-arm64.tar.gz",
"5424033677": "OTHER_RESOURCE-none-1.21.3-y_go1.21.3.linux-amd64.tar.gz",
@@ -720,12 +827,14 @@
"5550376885": "OTHER_RESOURCE-none-none-clang-new.tgz",
"5531183987": "OTHER_RESOURCE-none-none-clang.tgz",
"5695783597": "OTHER_RESOURCE-none-none-clangO3.tgz",
+ "6538599922": "OTHER_RESOURCE-none-none-grpc.tgz",
"5453803895": "OTHER_RESOURCE-none-none-lld.tgz",
"5458408674": "OTHER_RESOURCE-none-none-lld.tgz",
"5463300202": "OTHER_RESOURCE-none-none-lld.tgz",
"5465946272": "OTHER_RESOURCE-none-none-lld.tgz",
"1966560555": "Ubuntu 14 x86-64 native SDK (patched, v3)",
"309054781": "Ubuntu 16 x86-64 -> Ubuntu 16 aarch64 cross SDK",
+ "243881345": "Ubuntu 16 x86_64 native SDK",
"5752310178": "bin-clang-16-yandex-darwin-arm64-c0ea5f684dc5b6ab8af3aa0d88ef50cc5b3c1de2",
"5752408289": "bin-clang-16-yandex-darwin-x86_64-c0ea5f684dc5b6ab8af3aa0d88ef50cc5b3c1de2",
"5752491095": "bin-clang-16-yandex-linux-aarch64-c0ea5f684dc5b6ab8af3aa0d88ef50cc5b3c1de2",
@@ -738,9 +847,13 @@
"5709310220": "bin-gdb-reloc-ya-linux-x86_64-70970b31ef83c56b51291cd8fe4f24449b582b59",
"5709435327": "bin-gdb-reloc-ya-linux-x86_64-70970b31ef83c56b51291cd8fe4f24449b582b59",
"5758120203": "bin-gdb-reloc-ya-linux-x86_64-b544ce3aae71e89238d6b1b85032a6b6f6412369",
+ "6740818206": "bin-lld-16-optimized-darwin-arm64-30f81a61922d8f6d21a62ad26f7a3711ec368b9f",
"6657744758": "bin-lld-16-optimized-darwin-arm64-6fcb1f9a0ea89cca05d938ce61f89490b56940c4",
+ "6740512126": "bin-lld-16-optimized-darwin-x86_64-30f81a61922d8f6d21a62ad26f7a3711ec368b9f",
"6657746696": "bin-lld-16-optimized-darwin-x86_64-6fcb1f9a0ea89cca05d938ce61f89490b56940c4",
+ "6740582961": "bin-lld-16-optimized-linux-aarch64-30f81a61922d8f6d21a62ad26f7a3711ec368b9f",
"6657765589": "bin-lld-16-optimized-linux-aarch64-6fcb1f9a0ea89cca05d938ce61f89490b56940c4",
+ "6740765286": "bin-lld-16-optimized-linux-x86_64-30f81a61922d8f6d21a62ad26f7a3711ec368b9f",
"6657758332": "bin-lld-16-optimized-linux-x86_64-6fcb1f9a0ea89cca05d938ce61f89490b56940c4",
"360916612": "binutils 2.26 for linux_ubuntu_10.04_lucid",
"4312064267": "black_linter for linux",
@@ -824,6 +937,11 @@
"6342053228": "devtools jstyle runner 10.16.0",
"5257605552": "devtools/bloat2/tools/bloat/bloat for darwin",
"5257606004": "devtools/bloat2/tools/bloat/bloat for linux",
+ "4351925664": "devtools/buildstep_tools/scriptgen/scriptgen for darwin",
+ "4351924553": "devtools/buildstep_tools/scriptgen/scriptgen for darwin-arm64",
+ "4351926887": "devtools/buildstep_tools/scriptgen/scriptgen for linux",
+ "4351922617": "devtools/buildstep_tools/scriptgen/scriptgen for linux-aarch64",
+ "4351923493": "devtools/buildstep_tools/scriptgen/scriptgen for win32",
"2989597929": "devtools/huge_python/python for darwin",
"2989596911": "devtools/huge_python/python for darwin-arm64",
"2989598506": "devtools/huge_python/python for linux",
@@ -847,21 +965,32 @@
"6603784347": "devtools/ya/test/programs/flake8/flake8 for darwin",
"6652224583": "devtools/ya/test/programs/flake8/flake8 for darwin",
"6674734480": "devtools/ya/test/programs/flake8/flake8 for darwin",
+ "6726871384": "devtools/ya/test/programs/flake8/flake8 for darwin",
+ "6760720465": "devtools/ya/test/programs/flake8/flake8 for darwin",
"6603781997": "devtools/ya/test/programs/flake8/flake8 for darwin-arm64",
"6652223452": "devtools/ya/test/programs/flake8/flake8 for darwin-arm64",
"6674733966": "devtools/ya/test/programs/flake8/flake8 for darwin-arm64",
+ "6726867988": "devtools/ya/test/programs/flake8/flake8 for darwin-arm64",
+ "6760720256": "devtools/ya/test/programs/flake8/flake8 for darwin-arm64",
"6603787904": "devtools/ya/test/programs/flake8/flake8 for linux",
"6652225714": "devtools/ya/test/programs/flake8/flake8 for linux",
"6674734993": "devtools/ya/test/programs/flake8/flake8 for linux",
+ "6726875537": "devtools/ya/test/programs/flake8/flake8 for linux",
+ "6760721014": "devtools/ya/test/programs/flake8/flake8 for linux",
"6603780916": "devtools/ya/test/programs/flake8/flake8 for linux-aarch64",
"6652222817": "devtools/ya/test/programs/flake8/flake8 for linux-aarch64",
"6674733653": "devtools/ya/test/programs/flake8/flake8 for linux-aarch64",
+ "6726866588": "devtools/ya/test/programs/flake8/flake8 for linux-aarch64",
+ "6760720046": "devtools/ya/test/programs/flake8/flake8 for linux-aarch64",
"6603783079": "devtools/ya/test/programs/flake8/flake8 for linux-ppc64le",
"6652224021": "devtools/ya/test/programs/flake8/flake8 for linux-ppc64le",
"6674734285": "devtools/ya/test/programs/flake8/flake8 for linux-ppc64le",
+ "6726869647": "devtools/ya/test/programs/flake8/flake8 for linux-ppc64le",
"6603785992": "devtools/ya/test/programs/flake8/flake8 for win32",
"6652225128": "devtools/ya/test/programs/flake8/flake8 for win32",
"6674734716": "devtools/ya/test/programs/flake8/flake8 for win32",
+ "6726873745": "devtools/ya/test/programs/flake8/flake8 for win32",
+ "6760720811": "devtools/ya/test/programs/flake8/flake8 for win32",
"3961412335": "devtools/ya/test/programs/flake8/py2/flake8 for darwin",
"3961411314": "devtools/ya/test/programs/flake8/py2/flake8 for darwin-arm64",
"3961413236": "devtools/ya/test/programs/flake8/py2/flake8 for linux",
@@ -944,6 +1073,10 @@
"6685155231": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"6696783934": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"6696787149": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "6733651979": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "6733663069": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "6761602592": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
+ "6761604639": "devtools/ya/test/programs/test_tool/bin/test_tool for linux",
"5486731632": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
"5514350352": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
"5514360398": "devtools/ya/test/programs/test_tool/bin3/test_tool3 for linux",
@@ -1009,6 +1142,8 @@
"6556875672": "devtools/yexport/bin/yexport for darwin",
"6584574198": "devtools/yexport/bin/yexport for darwin",
"6693380504": "devtools/yexport/bin/yexport for darwin",
+ "6713117210": "devtools/yexport/bin/yexport for darwin",
+ "6767780570": "devtools/yexport/bin/yexport for darwin",
"5811823398": "devtools/yexport/bin/yexport for darwin-arm64",
"5840611310": "devtools/yexport/bin/yexport for darwin-arm64",
"5860185593": "devtools/yexport/bin/yexport for darwin-arm64",
@@ -1027,6 +1162,8 @@
"6556874915": "devtools/yexport/bin/yexport for darwin-arm64",
"6584572692": "devtools/yexport/bin/yexport for darwin-arm64",
"6693380132": "devtools/yexport/bin/yexport for darwin-arm64",
+ "6713113801": "devtools/yexport/bin/yexport for darwin-arm64",
+ "6767778005": "devtools/yexport/bin/yexport for darwin-arm64",
"5811822876": "devtools/yexport/bin/yexport for linux",
"5840610640": "devtools/yexport/bin/yexport for linux",
"5860184285": "devtools/yexport/bin/yexport for linux",
@@ -1045,6 +1182,8 @@
"6556873941": "devtools/yexport/bin/yexport for linux",
"6584571169": "devtools/yexport/bin/yexport for linux",
"6693379678": "devtools/yexport/bin/yexport for linux",
+ "6713110487": "devtools/yexport/bin/yexport for linux",
+ "6767775474": "devtools/yexport/bin/yexport for linux",
"5766172292": "devtools/ymake/bin/ymake for darwin",
"5805431504": "devtools/ymake/bin/ymake for darwin",
"5829027626": "devtools/ymake/bin/ymake for darwin",
@@ -1071,6 +1210,8 @@
"6608688643": "devtools/ymake/bin/ymake for darwin",
"6629093731": "devtools/ymake/bin/ymake for darwin",
"6639828525": "devtools/ymake/bin/ymake for darwin",
+ "6715755432": "devtools/ymake/bin/ymake for darwin",
+ "6758526969": "devtools/ymake/bin/ymake for darwin",
"5766171800": "devtools/ymake/bin/ymake for darwin-arm64",
"5805430761": "devtools/ymake/bin/ymake for darwin-arm64",
"5829025456": "devtools/ymake/bin/ymake for darwin-arm64",
@@ -1097,6 +1238,8 @@
"6608688371": "devtools/ymake/bin/ymake for darwin-arm64",
"6629093234": "devtools/ymake/bin/ymake for darwin-arm64",
"6639826777": "devtools/ymake/bin/ymake for darwin-arm64",
+ "6715754419": "devtools/ymake/bin/ymake for darwin-arm64",
+ "6758526691": "devtools/ymake/bin/ymake for darwin-arm64",
"5766173070": "devtools/ymake/bin/ymake for linux",
"5805432830": "devtools/ymake/bin/ymake for linux",
"5829031598": "devtools/ymake/bin/ymake for linux",
@@ -1123,6 +1266,8 @@
"6608688976": "devtools/ymake/bin/ymake for linux",
"6629094940": "devtools/ymake/bin/ymake for linux",
"6639832402": "devtools/ymake/bin/ymake for linux",
+ "6715757753": "devtools/ymake/bin/ymake for linux",
+ "6758527904": "devtools/ymake/bin/ymake for linux",
"5766171341": "devtools/ymake/bin/ymake for linux-aarch64",
"5805430188": "devtools/ymake/bin/ymake for linux-aarch64",
"5829023352": "devtools/ymake/bin/ymake for linux-aarch64",
@@ -1149,6 +1294,8 @@
"6608688049": "devtools/ymake/bin/ymake for linux-aarch64",
"6629092745": "devtools/ymake/bin/ymake for linux-aarch64",
"6639824710": "devtools/ymake/bin/ymake for linux-aarch64",
+ "6715753858": "devtools/ymake/bin/ymake for linux-aarch64",
+ "6758526355": "devtools/ymake/bin/ymake for linux-aarch64",
"5766172695": "devtools/ymake/bin/ymake for win32-clang-cl",
"5805432230": "devtools/ymake/bin/ymake for win32-clang-cl",
"5829029743": "devtools/ymake/bin/ymake for win32-clang-cl",
@@ -1175,6 +1322,8 @@
"6608688844": "devtools/ymake/bin/ymake for win32-clang-cl",
"6629094363": "devtools/ymake/bin/ymake for win32-clang-cl",
"6639830383": "devtools/ymake/bin/ymake for win32-clang-cl",
+ "6715756641": "devtools/ymake/bin/ymake for win32-clang-cl",
+ "6758527388": "devtools/ymake/bin/ymake for win32-clang-cl",
"4307890075": "flake8_linter for linux",
"5517245192": "flake8_linter for linux",
"4307901240": "flake8_linter for linux-aarch64",
@@ -1194,6 +1343,8 @@
"6133419349": "gdb-14-linux-x86_64-b1fa9be28bbf4ee845d6a39a049c7b60018a3695",
"1277521710": "infra/kernel/tools/atop/build/atop-static.tar.gz",
"1812152858": "junk/zubchick/buf/buf for linux",
+ "289381370": "none-none-none-jsr305-3.0.2-sources.jar",
+ "289382642": "none-none-none-jsr305-3.0.2.jar",
"5776380974": "none-none-none-result_resources/jdk-darwin-aarch64.yandex.tgz",
"5777101734": "none-none-none-result_resources/jdk-darwin-aarch64.yandex.tgz",
"5909068951": "none-none-none-result_resources/jdk-darwin-aarch64.yandex.tgz",
@@ -1219,6 +1370,7 @@
"5909066324": "none-none-none-result_resources/jdk-windows-amd64.yandex.tgz",
"6043998448": "none-none-none-result_resources/jdk-windows-amd64.yandex.tgz",
"6431663364": "none-none-none-result_resources/jdk-windows-amd64.yandex.tgz",
+ "6391354461": "none-none-none-result_resources/protoc-linux-x86_64.tgz",
"3167009386": "openjdk 11.0.15 vanilla for darwin",
"3050798466": "openjdk 11.0.15 vanilla for darwin-arm64",
"3064614561": "openjdk 11.0.15 vanilla for linux",
diff --git a/build/platform/lld/lld16.json b/build/platform/lld/lld16.json
index 2eb53e6bec..d0cf6aa845 100644
--- a/build/platform/lld/lld16.json
+++ b/build/platform/lld/lld16.json
@@ -1,16 +1,16 @@
{
"by_platform": {
"darwin-arm64": {
- "uri": "sbr:6657744758"
+ "uri": "sbr:6740818206"
},
"darwin-x86_64": {
- "uri": "sbr:6657746696"
+ "uri": "sbr:6740512126"
},
"linux-aarch64": {
- "uri": "sbr:6657765589"
+ "uri": "sbr:6740582961"
},
"linux-x86_64": {
- "uri": "sbr:6657758332"
+ "uri": "sbr:6740765286"
}
}
}
diff --git a/build/platform/test_tool/host.ya.make.inc b/build/platform/test_tool/host.ya.make.inc
index 3ba13e1ec2..9f76ce6d3e 100644
--- a/build/platform/test_tool/host.ya.make.inc
+++ b/build/platform/test_tool/host.ya.make.inc
@@ -1,12 +1,12 @@
IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696781027)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761603811)
ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696778679)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761603407)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696783934)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761604639)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_AARCH64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696776741)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761603045)
ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696782382)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761604252)
ENDIF()
diff --git a/build/platform/test_tool/host_os.ya.make.inc b/build/platform/test_tool/host_os.ya.make.inc
index 973aa097a3..b80ee3059c 100644
--- a/build/platform/test_tool/host_os.ya.make.inc
+++ b/build/platform/test_tool/host_os.ya.make.inc
@@ -1,12 +1,12 @@
IF (HOST_OS_DARWIN AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696783294)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761601964)
ELSEIF (HOST_OS_DARWIN AND HOST_ARCH_ARM64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696781271)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761601833)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696787149)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761602592)
ELSEIF (HOST_OS_LINUX AND HOST_ARCH_AARCH64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696778364)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761601614)
ELSEIF (HOST_OS_WINDOWS AND HOST_ARCH_X86_64)
- DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6696785281)
+ DECLARE_EXTERNAL_RESOURCE(TEST_TOOL_HOST sbr:6761602256)
ENDIF()
diff --git a/build/plugins/_common.py b/build/plugins/_common.py
index cd1d8024a8..a2b19b5b3d 100644
--- a/build/plugins/_common.py
+++ b/build/plugins/_common.py
@@ -30,6 +30,10 @@ def listid(items):
return pathid(str(sorted(items)))
+def sort_uniq(items):
+ return sorted(set(items))
+
+
def stripext(fname):
return fname[: fname.rfind('.')]
diff --git a/build/plugins/_dart_fields.py b/build/plugins/_dart_fields.py
index 54f2427384..866821585c 100644
--- a/build/plugins/_dart_fields.py
+++ b/build/plugins/_dart_fields.py
@@ -5,13 +5,14 @@ import operator
import os
import re
import shlex
-import six
import sys
from functools import reduce
+import six
+import ymake
+
import _common
import lib.test_const as consts
-import ymake
CANON_RESULT_FILE_NAME = 'result.json'
@@ -219,15 +220,6 @@ def extract_java_system_properties(unit, args):
return props, None
-def _create_erm_json(unit):
- from lib.nots.erm_json_lite import ErmJsonLite
-
- erm_packages_path = unit.get("ERM_PACKAGES_PATH")
- path = unit.resolve(unit.resolve_arc_path(erm_packages_path))
-
- return ErmJsonLite.load(path)
-
-
def _resolve_module_files(unit, mod_dir, file_paths):
mod_dir_with_sep_len = len(mod_dir) + 1
resolved_files = []
@@ -241,26 +233,6 @@ def _resolve_module_files(unit, mod_dir, file_paths):
return resolved_files
-def _create_pm(unit):
- from lib.nots.package_manager import manager
-
- sources_path = unit.path()
- module_path = unit.get("MODDIR")
- if unit.get("TS_TEST_FOR"):
- sources_path = unit.get("TS_TEST_FOR_DIR")
- module_path = unit.get("TS_TEST_FOR_PATH")
-
- return manager(
- sources_path=unit.resolve(sources_path),
- build_root="$B",
- build_path=unit.path().replace("$S", "$B", 1),
- contribs_path=unit.get("NPM_CONTRIBS_PATH"),
- nodejs_bin_path=None,
- script_path=None,
- module_path=module_path,
- )
-
-
def _resolve_config_path(unit, test_runner, rel_to):
config_path = unit.get("ESLINT_CONFIG_PATH") if test_runner == "eslint" else unit.get("TS_TEST_CONFIG_PATH")
arc_config_path = unit.resolve_arc_path(config_path)
@@ -304,28 +276,22 @@ class BinaryPath:
KEY = 'BINARY-PATH'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def normalized(cls, unit, flat_args, spec_args):
unit_path = _common.get_norm_unit_path(unit)
- return {cls.KEY: "{}/{}".format(unit_path, unit.filename())}
+ return {cls.KEY: os.path.join(unit_path, unit.filename())}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def stripped(cls, unit, flat_args, spec_args):
unit_path = unit.path()
binary_path = os.path.join(unit_path, unit.filename())
if binary_path:
return {cls.KEY: _common.strip_roots(binary_path)}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def stripped_without_pkg_ext(cls, unit, flat_args, spec_args):
value = _common.strip_roots(os.path.join(unit.path(), unit.filename()).replace(".pkg", ""))
return {cls.KEY: value}
- # TODO replace with `value`
- @classmethod
- def value4(cls, unit, flat_args, spec_args):
- test_dir = _common.get_norm_unit_path(unit)
- return {cls.KEY: os.path.join(test_dir, unit.filename())}
-
class Blob:
KEY = 'BLOB'
@@ -339,11 +305,11 @@ class BuildFolderPath:
KEY = 'BUILD-FOLDER-PATH'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def normalized(cls, unit, flat_args, spec_args):
return {cls.KEY: _common.get_norm_unit_path(unit)}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def stripped(cls, unit, flat_args, spec_args):
return {cls.KEY: _common.strip_roots(unit.path())}
@@ -379,21 +345,21 @@ class CustomDependencies:
KEY = 'CUSTOM-DEPENDENCIES'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def all_standard(cls, unit, flat_args, spec_args):
custom_deps = ' '.join(spec_args.get('DEPENDS', []) + get_values_list(unit, 'TEST_DEPENDS_VALUE'))
return {cls.KEY: custom_deps}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def depends_only(cls, unit, flat_args, spec_args):
return {cls.KEY: " ".join(spec_args.get('DEPENDS', []))}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def test_depends_only(cls, unit, flat_args, spec_args):
custom_deps = get_values_list(unit, 'TEST_DEPENDS_VALUE')
return {cls.KEY: " ".join(custom_deps)}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
+ def depends_with_linter(cls, unit, flat_args, spec_args):
deps = []
_, linter = flat_args
deps.append(os.path.dirname(linter))
@@ -401,8 +367,8 @@ class CustomDependencies:
return {cls.KEY: " ".join(deps)}
@classmethod
- def value5(cls, unit, flat_args, spec_args):
- deps = _create_pm(unit).get_peers_from_package_json()
+ def nots_with_recipies(cls, unit, flat_args, spec_args):
+ deps = flat_args[0]
recipes_lines = format_recipes(unit.get("TEST_RECIPES_VALUE")).strip().splitlines()
if recipes_lines:
deps = deps or []
@@ -424,7 +390,7 @@ class ForkMode:
KEY = 'FORK-MODE'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_and_unit(cls, unit, flat_args, spec_args):
fork_mode = []
if 'FORK_SUBTESTS' in spec_args:
fork_mode.append('subtests')
@@ -435,7 +401,7 @@ class ForkMode:
return {cls.KEY: fork_mode}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def test_fork_mode(cls, unit, flat_args, spec_args):
return {cls.KEY: unit.get('TEST_FORK_MODE')}
@@ -603,6 +569,10 @@ class NodejsRootVarName:
class NodeModulesBundleFilename:
KEY = 'NODE-MODULES-BUNDLE-FILENAME'
+ @classmethod
+ def value(cls, unit, flat_args, spec_args):
+ return {cls.KEY: spec_args.get('nm_bundle')}
+
class PythonPaths:
KEY = 'PYTHON-PATHS'
@@ -617,12 +587,12 @@ class Requirements:
KEY = 'REQUIREMENTS'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
test_requirements = spec_args.get('REQUIREMENTS', []) + get_values_list(unit, 'TEST_REQUIREMENTS_VALUE')
return {cls.KEY: serialize_list(test_requirements)}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def with_maybe_fuzzing(cls, unit, flat_args, spec_args):
test_requirements = serialize_list(
spec_args.get('REQUIREMENTS', []) + get_values_list(unit, 'TEST_REQUIREMENTS_VALUE')
)
@@ -633,17 +603,17 @@ class Requirements:
return {cls.KEY: test_requirements}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def from_macro_args(cls, unit, flat_args, spec_args):
value = " ".join(spec_args.get('REQUIREMENTS', []))
return {cls.KEY: value}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
requirements = get_values_list(unit, 'TEST_REQUIREMENTS_VALUE')
return {cls.KEY: serialize_list(requirements)}
@classmethod
- def value5(cls, unit, flat_args, spec_args):
+ def from_unit_with_full_network(cls, unit, flat_args, spec_args):
requirements = sorted(set(["network:full"] + get_values_list(unit, "TEST_REQUIREMENTS_VALUE")))
return {cls.KEY: serialize_list(requirements)}
@@ -661,19 +631,19 @@ class ScriptRelPath:
KEY = 'SCRIPT-REL-PATH'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def second_flat(cls, unit, flat_args, spec_args):
return {cls.KEY: flat_args[1]}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def first_flat(cls, unit, flat_args, spec_args):
return {cls.KEY: flat_args[0]}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def pytest(cls, unit, flat_args, spec_args):
return {cls.KEY: 'py3test.bin' if (unit.get("PYTHON3") == 'yes') else "pytest.bin"}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
+ def junit(cls, unit, flat_args, spec_args):
return {cls.KEY: 'junit5.test' if unit.get('MODULE_TYPE') == 'JUNIT5' else 'junit.test'}
@@ -681,11 +651,11 @@ class Size:
KEY = 'SIZE'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
return {cls.KEY: ''.join(spec_args.get('SIZE', [])) or unit.get('TEST_SIZE_NAME')}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
return {cls.KEY: unit.get('TEST_SIZE_NAME')}
@@ -701,11 +671,11 @@ class SourceFolderPath:
KEY = 'SOURCE-FOLDER-PATH'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def normalized(cls, unit, flat_args, spec_args):
return {cls.KEY: _common.get_norm_unit_path(unit)}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def test_dir(cls, unit, flat_args, spec_args):
test_dir = _common.get_norm_unit_path(unit)
test_files = flat_args[1:]
if test_files:
@@ -717,12 +687,12 @@ class SplitFactor:
KEY = 'SPLIT-FACTOR'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
value = ''.join(spec_args.get('SPLIT_FACTOR', [])) or unit.get('TEST_SPLIT_FACTOR')
return {cls.KEY: value}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
return {cls.KEY: unit.get('TEST_SPLIT_FACTOR')}
@@ -730,17 +700,17 @@ class Tag:
KEY = 'TAG'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
tags = serialize_list(sorted(_get_test_tags(unit, spec_args)))
return {cls.KEY: tags}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
tags = serialize_list(get_values_list(unit, "TEST_TAGS_VALUE"))
return {cls.KEY: tags}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def from_unit_fat_external_no_retries(cls, unit, flat_args, spec_args):
tags = sorted(set(["ya:fat", "ya:external", "ya:noretries"] + get_values_list(unit, "TEST_TAGS_VALUE")))
return {cls.KEY: serialize_list(tags)}
@@ -785,19 +755,19 @@ class TestCwd:
KEY = 'TEST-CWD'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
test_cwd = unit.get('TEST_CWD_VALUE') # TODO: validate test_cwd value
return {cls.KEY: test_cwd}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def keywords_replaced(cls, unit, flat_args, spec_args):
test_cwd = unit.get('TEST_CWD_VALUE') or ''
if test_cwd:
test_cwd = test_cwd.replace("$TEST_CWD_VALUE", "").replace('"MACRO_CALLS_DELIM"', "").strip()
return {cls.KEY: test_cwd}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def moddir(cls, unit, flat_args, spec_args):
return {cls.KEY: unit.get("MODDIR")}
@@ -805,7 +775,7 @@ class TestData:
KEY = 'TEST-DATA'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
test_data = sorted(
_common.filter_out_by_keyword(
spec_args.get('DATA', []) + get_norm_paths(unit, 'TEST_DATA_VALUE'), 'AUTOUPDATED'
@@ -814,7 +784,7 @@ class TestData:
return {cls.KEY: serialize_list(test_data)}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit_with_canonical(cls, unit, flat_args, spec_args):
test_data = sorted(
_common.filter_out_by_keyword(
spec_args.get('DATA', []) + get_norm_paths(unit, 'TEST_DATA_VALUE'), 'AUTOUPDATED'
@@ -827,7 +797,7 @@ class TestData:
return {cls.KEY: value}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def ktlint(cls, unit, flat_args, spec_args):
if unit.get('_USE_KTLINT_OLD') == 'yes':
extra_test_data = serialize_list([KTLINT_OLD_EDITOR_CONFIG])
else:
@@ -840,13 +810,13 @@ class TestData:
return {cls.KEY: extra_test_data}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
+ def java_style(cls, unit, flat_args, spec_args):
ymake_java_test = unit.get('YMAKE_JAVA_TEST') == 'yes'
if ymake_java_test:
return {cls.KEY: java_srcdirs_to_data(unit, 'ALL_SRCDIRS')}
@classmethod
- def value5(cls, unit, flat_args, spec_args):
+ def from_unit_with_canonical(cls, unit, flat_args, spec_args):
test_data = get_norm_paths(unit, 'TEST_DATA_VALUE')
data, _ = get_canonical_test_resources(unit)
test_data += data
@@ -854,7 +824,7 @@ class TestData:
return {cls.KEY: value}
@classmethod
- def value6(cls, unit, flat_args, spec_args):
+ def java_test(cls, unit, flat_args, spec_args):
test_data = get_norm_paths(unit, 'TEST_DATA_VALUE')
test_data.append('arcadia/build/scripts/run_junit.py')
test_data.append('arcadia/build/scripts/unpacking_jtest_runner.py')
@@ -874,7 +844,7 @@ class TestData:
return {cls.KEY: value}
@classmethod
- def value7(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
return {cls.KEY: serialize_list(get_values_list(unit, "TEST_DATA_VALUE"))}
@@ -882,6 +852,22 @@ class TsConfigPath:
KEY = 'TS_CONFIG_PATH'
+class TsStylelintConfig:
+ KEY = 'TS_STYLELINT_CONFIG'
+
+ @classmethod
+ def value(cls, unit, flat_args, spec_args):
+ test_config = unit.get('_TS_STYLELINT_CONFIG')
+ abs_test_config = unit.resolve(unit.resolve_arc_path(test_config))
+ if not abs_test_config:
+ ymake.report_configure_error(
+ f"Config for stylelint not found: {test_config}.\n"
+ "Set the correct value in `TS_STYLELINT(<config_filename>)` macro in the `ya.make` file."
+ )
+
+ return {cls.KEY: test_config}
+
+
class TsTestDataDirs:
KEY = 'TS-TEST-DATA-DIRS'
@@ -919,16 +905,16 @@ class TestedProjectName:
KEY = 'TESTED-PROJECT-NAME'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def unit_name(cls, unit, flat_args, spec_args):
return {cls.KEY: unit.name()}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def normalized_basename(cls, unit, flat_args, spec_args):
test_dir = _common.get_norm_unit_path(unit)
return {cls.KEY: os.path.basename(test_dir)}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def test_dir(cls, unit, flat_args, spec_args):
test_dir = _common.get_norm_unit_path(unit)
test_files = flat_args[1:]
if test_files:
@@ -936,21 +922,21 @@ class TestedProjectName:
return {cls.KEY: os.path.basename(test_dir)}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
+ def path_filename_basename(cls, unit, flat_args, spec_args):
binary_path = os.path.join(unit.path(), unit.filename())
return {cls.KEY: os.path.basename(binary_path)}
@classmethod
- def value5(cls, unit, flat_args, spec_args):
+ def normalized(cls, unit, flat_args, spec_args):
return {cls.KEY: _common.get_norm_unit_path(unit)}
@classmethod
- def value6(cls, unit, flat_args, spec_args):
+ def path_filename_basename_without_pkg_ext(cls, unit, flat_args, spec_args):
value = os.path.basename(os.path.join(unit.path(), unit.filename()).replace(".pkg", ""))
return {cls.KEY: value}
@classmethod
- def value7(cls, unit, flat_args, spec_args):
+ def filename_without_ext(cls, unit, flat_args, spec_args):
return {cls.KEY: os.path.splitext(unit.filename())[0]}
@@ -972,12 +958,12 @@ class TestFiles:
return {cls.KEY: value, cls.KEY2: value}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def flat_args_wo_first(cls, unit, flat_args, spec_args):
value = serialize_list(flat_args[1:])
return {cls.KEY: value, cls.KEY2: value}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def java_style(cls, unit, flat_args, spec_args):
test_files = flat_args[1:]
check_level = flat_args[1]
allowed_levels = {
@@ -993,27 +979,40 @@ class TestFiles:
return {cls.KEY: value, cls.KEY2: value}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
+ def normalized(cls, unit, flat_args, spec_args):
value = serialize_list([_common.get_norm_unit_path(unit, unit.filename())])
return {cls.KEY: value, cls.KEY2: value}
@classmethod
- def value5(cls, unit, flat_args, spec_args):
+ def test_srcs(cls, unit, flat_args, spec_args):
test_files = get_values_list(unit, 'TEST_SRCS_VALUE')
return {cls.KEY: serialize_list(test_files)}
@classmethod
- def value6(cls, unit, flat_args, spec_args):
+ def ts_test_srcs(cls, unit, flat_args, spec_args):
test_files = get_values_list(unit, "_TS_TEST_SRCS_VALUE")
test_files = _resolve_module_files(unit, unit.get("MODDIR"), test_files)
return {cls.KEY: serialize_list(test_files)}
@classmethod
- def value7(cls, unit, flat_args, spec_args):
+ def ts_input_files(cls, unit, flat_args, spec_args):
typecheck_files = get_values_list(unit, "TS_INPUT_FILES")
test_files = [_common.resolve_common_const(f) for f in typecheck_files]
return {cls.KEY: serialize_list(test_files)}
+ @classmethod
+ def ts_lint_srcs(cls, unit, flat_args, spec_args):
+ test_files = get_values_list(unit, "_TS_LINT_SRCS_VALUE")
+ test_files = _resolve_module_files(unit, unit.get("MODDIR"), test_files)
+ return {cls.KEY: serialize_list(test_files)}
+
+ @classmethod
+ def stylesheets(cls, unit, flat_args, spec_args):
+ test_files = get_values_list(unit, "_TS_STYLELINT_FILES")
+ test_files = _resolve_module_files(unit, unit.get("MODDIR"), test_files)
+
+ return {cls.KEY: serialize_list(test_files)}
+
class TestEnv:
KEY = 'TEST-ENV'
@@ -1062,34 +1061,32 @@ class TestName:
return {cls.KEY: flat_args[0]}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def first_flat_with_bench(cls, unit, flat_args, spec_args):
return {cls.KEY: flat_args[0] + '_bench'}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def first_flat(cls, unit, flat_args, spec_args):
return {cls.KEY: flat_args[0].lower()}
@classmethod
- def value4(cls, unit, flat_args, spec_args):
- unit_path = unit.path()
- binary_path = os.path.join(unit_path, unit.filename())
- test_name = os.path.basename(binary_path)
+ def filename_without_ext(cls, unit, flat_args, spec_args):
+ test_name = os.path.basename(os.path.join(unit.path(), unit.filename()))
return {cls.KEY: os.path.splitext(test_name)[0]}
@classmethod
- def value5(cls, unit, flat_args, spec_args):
+ def normalized_joined_dir_basename(cls, unit, flat_args, spec_args):
path = _common.get_norm_unit_path(unit)
value = '-'.join([os.path.basename(os.path.dirname(path)), os.path.basename(path)])
return {cls.KEY: value}
@classmethod
- def value6(cls, unit, flat_args, spec_args):
+ def normalized_joined_dir_basename_deps(cls, unit, flat_args, spec_args):
path = _common.get_norm_unit_path(unit)
value = '-'.join([os.path.basename(os.path.dirname(path)), os.path.basename(path), 'dependencies']).strip('-')
return {cls.KEY: value}
@classmethod
- def value7(cls, unit, flat_args, spec_args):
+ def filename_without_pkg_ext(cls, unit, flat_args, spec_args):
test_name = os.path.basename(os.path.join(unit.path(), unit.filename()).replace(".pkg", ""))
return {cls.KEY: os.path.splitext(test_name)[0]}
@@ -1124,12 +1121,12 @@ class TestTimeout:
KEY = 'TEST-TIMEOUT'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
test_timeout = ''.join(spec_args.get('TIMEOUT', [])) or unit.get('TEST_TIMEOUT') or ''
return {cls.KEY: test_timeout}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def from_unit_with_default(cls, unit, flat_args, spec_args):
timeout = list(filter(None, [unit.get(["TEST_TIMEOUT"])]))
if timeout:
timeout = timeout[0]
@@ -1138,7 +1135,7 @@ class TestTimeout:
return {cls.KEY: timeout}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
return {cls.KEY: unit.get('TEST_TIMEOUT')}
@@ -1147,7 +1144,7 @@ class TsResources:
@classmethod
def value(cls, unit, flat_args, spec_args):
- erm_json = _create_erm_json(unit)
+ erm_json = spec_args['erm_json']
ret = {}
for tool in erm_json.list_npm_packages():
tool_resource_label = cls.KEY.format(tool.upper())
@@ -1214,17 +1211,17 @@ class YtSpec:
KEY = 'YT-SPEC'
@classmethod
- def value(cls, unit, flat_args, spec_args):
+ def from_macro_args_and_unit(cls, unit, flat_args, spec_args):
value = serialize_list(spec_args.get('YT_SPEC', []) + get_unit_list_variable(unit, 'TEST_YT_SPEC_VALUE'))
return {cls.KEY: value}
@classmethod
- def value2(cls, unit, flat_args, spec_args):
+ def from_unit(cls, unit, flat_args, spec_args):
yt_spec = get_values_list(unit, 'TEST_YT_SPEC_VALUE')
if yt_spec:
return {cls.KEY: serialize_list(yt_spec)}
@classmethod
- def value3(cls, unit, flat_args, spec_args):
+ def from_unit_list_var(cls, unit, flat_args, spec_args):
yt_spec_values = get_unit_list_variable(unit, 'TEST_YT_SPEC_VALUE')
return {cls.KEY: serialize_list(yt_spec_values)}
diff --git a/build/plugins/lib/nots/package_manager/__init__.py b/build/plugins/lib/nots/package_manager/__init__.py
index 3e1de532e9..4bb369ba47 100644
--- a/build/plugins/lib/nots/package_manager/__init__.py
+++ b/build/plugins/lib/nots/package_manager/__init__.py
@@ -36,6 +36,7 @@ __all__ = [
"bundle_node_modules",
"constants",
"extract_node_modules",
+ "get_package_manager_type",
"manager",
"utils",
]
diff --git a/build/plugins/lib/nots/package_manager/base/lockfile.py b/build/plugins/lib/nots/package_manager/base/lockfile.py
index b1e0effdc8..4ae51ca7bf 100644
--- a/build/plugins/lib/nots/package_manager/base/lockfile.py
+++ b/build/plugins/lib/nots/package_manager/base/lockfile.py
@@ -30,7 +30,10 @@ class LockfilePackageMeta(object):
return " ".join([self.tarball_url, self.sky_id, self.integrity, self.integrity_algorithm])
def to_uri(self):
- pkg_uri = f"{self.tarball_url}#integrity={self.integrity_algorithm}-{self.integrity}"
+ tarball_url: str = self.tarball_url
+ if not tarball_url.startswith("https://") and not tarball_url.startswith("http://"):
+ tarball_url = "https://npm.yandex-team.ru/" + tarball_url
+ pkg_uri = f"{tarball_url}#integrity={self.integrity_algorithm}-{self.integrity}"
return pkg_uri
diff --git a/build/plugins/nots.py b/build/plugins/nots.py
index b99de011d4..329b1c111d 100644
--- a/build/plugins/nots.py
+++ b/build/plugins/nots.py
@@ -1,10 +1,18 @@
-import base64
-import six
import os
+import typing
+from enum import auto, StrEnum
+
import ymake
-import ytest
-from _common import resolve_common_const, get_norm_unit_path, rootrel_arc_src, strip_roots, to_yesno
+import _dart_fields as df
+import ytest
+from _common import (
+ rootrel_arc_src,
+ sort_uniq,
+ strip_roots,
+ to_yesno,
+)
+from _dart_fields import create_dart_record
# 1 is 60 files per chunk for TIMEOUT(60) - default timeout for SIZE(SMALL)
@@ -13,6 +21,82 @@ from _common import resolve_common_const, get_norm_unit_path, rootrel_arc_src, s
ESLINT_FILE_PROCESSING_TIME_DEFAULT = 0.2 # seconds per file
+class TsTestType(StrEnum):
+ JEST = auto()
+ HERMIONE = auto()
+ PLAYWRIGHT = auto()
+ ESLINT = auto()
+ TSC_TYPECHECK = auto()
+ TS_STYLELINT = auto()
+
+
+TS_TEST_FIELDS_BASE = (
+ df.BinaryPath.normalized,
+ df.BuildFolderPath.normalized,
+ df.ForkMode.test_fork_mode,
+ df.NodejsRootVarName.value,
+ df.ScriptRelPath.first_flat,
+ df.SourceFolderPath.normalized,
+ df.SplitFactor.from_unit,
+ df.TestData.from_unit,
+ df.TestedProjectName.filename_without_ext,
+ df.TestEnv.value,
+ df.TestName.value,
+ df.TestRecipes.value,
+ df.TestTimeout.from_unit,
+)
+
+TS_TEST_SPECIFIC_FIELDS = {
+ TsTestType.JEST: (
+ df.Size.from_unit,
+ df.Tag.from_unit,
+ df.Requirements.from_unit,
+ df.ConfigPath.value,
+ df.TsTestDataDirs.value,
+ df.TsTestDataDirsRename.value,
+ df.TsResources.value,
+ df.TsTestForPath.value,
+ ),
+ TsTestType.HERMIONE: (
+ df.Tag.from_unit_fat_external_no_retries,
+ df.Requirements.from_unit_with_full_network,
+ df.ConfigPath.value,
+ df.TsTestDataDirs.value,
+ df.TsTestDataDirsRename.value,
+ df.TsResources.value,
+ df.TsTestForPath.value,
+ ),
+ TsTestType.PLAYWRIGHT: (
+ df.Size.from_unit,
+ df.Tag.from_unit,
+ df.Requirements.from_unit,
+ df.ConfigPath.value,
+ df.TsTestDataDirs.value,
+ df.TsTestDataDirsRename.value,
+ df.TsResources.value,
+ df.TsTestForPath.value,
+ ),
+ TsTestType.ESLINT: (
+ df.Size.from_unit,
+ df.TestCwd.moddir,
+ df.Tag.from_unit,
+ df.Requirements.from_unit,
+ df.EslintConfigPath.value,
+ ),
+ TsTestType.TSC_TYPECHECK: (
+ df.Size.from_unit,
+ df.TestCwd.moddir,
+ df.Tag.from_unit,
+ df.Requirements.from_unit,
+ ),
+ TsTestType.TS_STYLELINT: (
+ df.TsStylelintConfig.value,
+ df.TestFiles.stylesheets,
+ df.NodeModulesBundleFilename.value,
+ ),
+}
+
+
class PluginLogger(object):
def __init__(self):
self.unit = None
@@ -57,30 +141,6 @@ class PluginLogger(object):
logger = PluginLogger()
-def get_values_list(unit, key):
- res = map(str.strip, (unit.get(key) or '').replace('$' + key, '').strip().split())
- return [r for r in res if r and r not in ['""', "''"]]
-
-
-def format_recipes(data: str | None) -> str:
- if not data:
- return ""
-
- data = data.replace('"USE_RECIPE_DELIM"', "\n")
- data = data.replace("$TEST_RECIPES_VALUE", "")
- return data
-
-
-def prepare_recipes(data: str | None) -> bytes:
- formatted = format_recipes(data)
- return base64.b64encode(six.ensure_binary(formatted))
-
-
-def serialize_list(lst):
- lst = list(filter(None, lst))
- return '\"' + ';'.join(lst) + '\"' if lst else ''
-
-
def _with_report_configure_error(fn):
def _wrapper(*args, **kwargs):
last_state = logger.get_state()
@@ -118,7 +178,16 @@ def _build_cmd_input_paths(paths, hide=False, disable_include_processor=False):
return _build_directives("input", [hide_part, disable_ip_part], paths)
-def _get_pm_type(unit) -> str:
+def _create_erm_json(unit):
+ from lib.nots.erm_json_lite import ErmJsonLite
+
+ erm_packages_path = unit.get("ERM_PACKAGES_PATH")
+ path = unit.resolve(unit.resolve_arc_path(erm_packages_path))
+
+ return ErmJsonLite.load(path)
+
+
+def _get_pm_type(unit) -> typing.Literal["pnpm", "npm"]:
resolved = unit.get("PM_TYPE")
if not resolved:
raise Exception("PM_TYPE is not set yet. Macro _SET_PACKAGE_MANAGER() should be called before.")
@@ -137,6 +206,7 @@ def _create_pm(unit):
sources_path = _get_source_path(unit)
module_path = unit.get("TS_TEST_FOR_PATH") if unit.get("TS_TEST_FOR") else unit.get("MODDIR")
+ # noinspection PyPep8Naming
PackageManager = get_package_manager_type(_get_pm_type(unit))
return PackageManager(
@@ -150,15 +220,6 @@ def _create_pm(unit):
)
-def _create_erm_json(unit):
- from lib.nots.erm_json_lite import ErmJsonLite
-
- erm_packages_path = unit.get("ERM_PACKAGES_PATH")
- path = unit.resolve(unit.resolve_arc_path(erm_packages_path))
-
- return ErmJsonLite.load(path)
-
-
@_with_report_configure_error
def on_set_package_manager(unit):
pm_type = "pnpm" # projects without any lockfile are processed by pnpm
@@ -312,12 +373,15 @@ def on_ts_configure(unit):
_filter_inputs_by_rules_from_tsconfig(unit, tsconfig)
- _setup_eslint(unit)
- _setup_tsc_typecheck(unit, tsconfig_paths)
-
+ # Code navigation
if unit.get("TS_YNDEXING") == "yes":
unit.on_do_ts_yndexing()
+ # Style tests
+ _setup_eslint(unit)
+ _setup_tsc_typecheck(unit)
+ _setup_stylelint(unit)
+
@_with_report_configure_error
def on_setup_build_env(unit): # type: (Unit) -> None
@@ -373,24 +437,6 @@ def _filter_inputs_by_rules_from_tsconfig(unit, tsconfig):
__set_append(unit, "TS_INPUT_FILES", [os.path.join(target_path, f) for f in filtered_files])
-def _get_ts_test_data_dirs(unit):
- return sorted(
- set([os.path.dirname(rootrel_arc_src(p, unit)) for p in (get_values_list(unit, "_TS_TEST_DATA_VALUE") or [])])
- )
-
-
-def _resolve_config_path(unit, test_runner, rel_to):
- config_path = unit.get("ESLINT_CONFIG_PATH") if test_runner == "eslint" else unit.get("TS_TEST_CONFIG_PATH")
- arc_config_path = unit.resolve_arc_path(config_path)
- abs_config_path = unit.resolve(arc_config_path)
- if not abs_config_path:
- raise Exception("{} config not found: {}".format(test_runner, config_path))
-
- unit.onsrcs([arc_config_path])
- abs_rel_to = unit.resolve(unit.resolve_arc_path(unit.get(rel_to)))
- return os.path.relpath(abs_config_path, start=abs_rel_to)
-
-
def _is_tests_enabled(unit):
if unit.get("TIDY") == "yes":
return False
@@ -398,48 +444,6 @@ def _is_tests_enabled(unit):
return True
-def _get_test_runner_handlers():
- return {
- "jest": _add_jest_ts_test,
- "hermione": _add_hermione_ts_test,
- "playwright": _add_playwright_ts_test,
- }
-
-
-def _add_jest_ts_test(unit, test_runner, test_files, deps, test_record):
- test_record.update(
- {
- "CONFIG-PATH": _resolve_config_path(unit, test_runner, rel_to="TS_TEST_FOR_PATH"),
- }
- )
- _add_test(unit, test_runner, test_files, deps, test_record)
-
-
-def _add_hermione_ts_test(unit, test_runner, test_files, deps, test_record):
- test_tags = sorted(set(["ya:fat", "ya:external", "ya:noretries"] + get_values_list(unit, "TEST_TAGS_VALUE")))
- test_requirements = sorted(set(["network:full"] + get_values_list(unit, "TEST_REQUIREMENTS_VALUE")))
-
- test_record.update(
- {
- "SIZE": "LARGE",
- "TAG": serialize_list(test_tags),
- "REQUIREMENTS": serialize_list(test_requirements),
- "CONFIG-PATH": _resolve_config_path(unit, test_runner, rel_to="TS_TEST_FOR_PATH"),
- }
- )
-
- _add_test(unit, test_runner, test_files, deps, test_record)
-
-
-def _add_playwright_ts_test(unit, test_runner, test_files, deps, test_record):
- test_record.update(
- {
- "CONFIG-PATH": _resolve_config_path(unit, test_runner, rel_to="TS_TEST_FOR_PATH"),
- }
- )
- _add_test(unit, test_runner, test_files, deps, test_record)
-
-
def _setup_eslint(unit):
if not _is_tests_enabled(unit):
return
@@ -447,38 +451,60 @@ def _setup_eslint(unit):
if unit.get("_NO_LINT_VALUE") == "none":
return
- lint_files = get_values_list(unit, "_TS_LINT_SRCS_VALUE")
- if not lint_files:
+ test_files = df.TestFiles.ts_lint_srcs(unit, (), {})[df.TestFiles.KEY]
+ if not test_files:
return
- mod_dir = unit.get("MODDIR")
-
unit.on_peerdir_ts_resource("eslint")
user_recipes = unit.get("TEST_RECIPES_VALUE")
unit.on_setup_install_node_modules_recipe()
- lint_files = _resolve_module_files(unit, mod_dir, lint_files)
- deps = _create_pm(unit).get_peers_from_package_json()
- test_record = {
- "ESLINT_CONFIG_PATH": _resolve_config_path(unit, "eslint", rel_to="MODDIR"),
- "LINT-FILE-PROCESSING-TIME": str(ESLINT_FILE_PROCESSING_TIME_DEFAULT),
- }
+ test_type = TsTestType.ESLINT
+
+ from lib.nots.package_manager import constants
+
+ peers = _create_pm(unit).get_peers_from_package_json()
+ deps = df.CustomDependencies.nots_with_recipies(unit, (peers,), {})[df.CustomDependencies.KEY].split()
+
+ if deps:
+ joined_deps = "\n".join(deps)
+ logger.info(f"{test_type} deps: \n{joined_deps}")
+ unit.ondepends(deps)
+
+ flat_args = (test_type, "MODDIR")
+
+ dart_record = create_dart_record(
+ TS_TEST_FIELDS_BASE + TS_TEST_SPECIFIC_FIELDS[test_type],
+ unit,
+ flat_args,
+ {},
+ )
+ dart_record[df.TestFiles.KEY] = test_files
+ dart_record[df.NodeModulesBundleFilename.KEY] = constants.NODE_MODULES_WORKSPACE_BUNDLE_FILENAME
- _add_test(unit, "eslint", lint_files, deps, test_record, mod_dir)
+ extra_deps = df.CustomDependencies.test_depends_only(unit, (), {})[df.CustomDependencies.KEY].split()
+ dart_record[df.CustomDependencies.KEY] = " ".join(sort_uniq(deps + extra_deps))
+ dart_record[df.LintFileProcessingTime.KEY] = str(ESLINT_FILE_PROCESSING_TIME_DEFAULT)
+
+ data = ytest.dump_test(unit, dart_record)
+ if data:
+ unit.set_property(["DART_DATA", data])
unit.set(["TEST_RECIPES_VALUE", user_recipes])
-def _setup_tsc_typecheck(unit, tsconfig_paths: list[str]):
+@_with_report_configure_error
+def _setup_tsc_typecheck(unit):
if not _is_tests_enabled(unit):
return
if unit.get("_TS_TYPECHECK_VALUE") == "none":
return
- typecheck_files = get_values_list(unit, "TS_INPUT_FILES")
- if not typecheck_files:
+ test_files = df.TestFiles.ts_input_files(unit, (), {})[df.TestFiles.KEY]
+ if not test_files:
return
+ tsconfig_paths = unit.get("TS_CONFIG_PATH").split()
tsconfig_path = tsconfig_paths[0]
if len(tsconfig_paths) > 1:
@@ -495,79 +521,96 @@ def _setup_tsc_typecheck(unit, tsconfig_paths: list[str]):
unit.on_setup_install_node_modules_recipe()
unit.on_setup_extract_output_tars_recipe([unit.get("MODDIR")])
- _add_test(
+ test_type = TsTestType.TSC_TYPECHECK
+
+ from lib.nots.package_manager import constants
+
+ peers = _create_pm(unit).get_peers_from_package_json()
+ deps = df.CustomDependencies.nots_with_recipies(unit, (peers,), {})[df.CustomDependencies.KEY].split()
+
+ if deps:
+ joined_deps = "\n".join(deps)
+ logger.info(f"{test_type} deps: \n{joined_deps}")
+ unit.ondepends(deps)
+
+ flat_args = (test_type,)
+
+ dart_record = create_dart_record(
+ TS_TEST_FIELDS_BASE + TS_TEST_SPECIFIC_FIELDS[test_type],
unit,
- test_type="tsc_typecheck",
- test_files=[resolve_common_const(f) for f in typecheck_files],
- deps=_create_pm(unit).get_peers_from_package_json(),
- test_record={"TS_CONFIG_PATH": tsconfig_path},
- test_cwd=unit.get("MODDIR"),
+ flat_args,
+ {},
)
- unit.set(["TEST_RECIPES_VALUE", user_recipes])
+ dart_record[df.TestFiles.KEY] = test_files
+ dart_record[df.NodeModulesBundleFilename.KEY] = constants.NODE_MODULES_WORKSPACE_BUNDLE_FILENAME
+ extra_deps = df.CustomDependencies.test_depends_only(unit, (), {})[df.CustomDependencies.KEY].split()
+ dart_record[df.CustomDependencies.KEY] = " ".join(sort_uniq(deps + extra_deps))
+ dart_record[df.TsConfigPath.KEY] = tsconfig_path
-def _resolve_module_files(unit, mod_dir, file_paths):
- mod_dir_with_sep_len = len(mod_dir) + 1
- resolved_files = []
+ data = ytest.dump_test(unit, dart_record)
+ if data:
+ unit.set_property(["DART_DATA", data])
+ unit.set(["TEST_RECIPES_VALUE", user_recipes])
- for path in file_paths:
- resolved = rootrel_arc_src(path, unit)
- if resolved.startswith(mod_dir):
- resolved = resolved[mod_dir_with_sep_len:]
- resolved_files.append(resolved)
- return resolved_files
+@_with_report_configure_error
+def _setup_stylelint(unit):
+ if not _is_tests_enabled(unit):
+ return
+ if unit.get("_TS_STYLELINT_VALUE") == "no":
+ return
+
+ test_files = df.TestFiles.stylesheets(unit, (), {})[df.TestFiles.KEY]
+ if not test_files:
+ return
-def _add_test(unit, test_type, test_files, deps=None, test_record=None, test_cwd=None):
from lib.nots.package_manager import constants
- def sort_uniq(text):
- return sorted(set(text))
+ recipes_value = unit.get("TEST_RECIPES_VALUE")
+ unit.on_setup_install_node_modules_recipe()
+ unit.on_setup_extract_output_tars_recipe([unit.get("MODDIR")])
+
+ test_type = TsTestType.TS_STYLELINT
- recipes_lines = format_recipes(unit.get("TEST_RECIPES_VALUE")).strip().splitlines()
- if recipes_lines:
- deps = deps or []
- deps.extend([os.path.dirname(r.strip().split(" ")[0]) for r in recipes_lines])
+ peers = _create_pm(unit).get_peers_from_package_json()
+ deps = df.CustomDependencies.nots_with_recipies(unit, (peers,), {})[df.CustomDependencies.KEY].split()
if deps:
joined_deps = "\n".join(deps)
logger.info(f"{test_type} deps: \n{joined_deps}")
unit.ondepends(deps)
- test_dir = get_norm_unit_path(unit)
- full_test_record = {
- # Key to discover suite (see devtools/ya/test/explore/__init__.py#gen_suite)
- "SCRIPT-REL-PATH": test_type,
- # Test name as shown in PR check, should be unique inside one module
- "TEST-NAME": test_type.lower().replace(".new", ""),
- "TEST-TIMEOUT": unit.get("TEST_TIMEOUT") or "",
- "TEST-ENV": ytest.prepare_env(unit.get("TEST_ENV_VALUE")),
- "TESTED-PROJECT-NAME": os.path.splitext(unit.filename())[0],
- "TEST-RECIPES": prepare_recipes(unit.get("TEST_RECIPES_VALUE")),
- "SOURCE-FOLDER-PATH": test_dir,
- "BUILD-FOLDER-PATH": test_dir,
- "BINARY-PATH": os.path.join(test_dir, unit.filename()),
- "SPLIT-FACTOR": unit.get("TEST_SPLIT_FACTOR") or "",
- "FORK-MODE": unit.get("TEST_FORK_MODE") or "",
- "SIZE": unit.get("TEST_SIZE_NAME") or "",
- "TEST-DATA": serialize_list(get_values_list(unit, "TEST_DATA_VALUE")),
- "TEST-FILES": serialize_list(test_files),
- "TEST-CWD": test_cwd or "",
- "TAG": serialize_list(get_values_list(unit, "TEST_TAGS_VALUE")),
- "REQUIREMENTS": serialize_list(get_values_list(unit, "TEST_REQUIREMENTS_VALUE")),
- "NODEJS-ROOT-VAR-NAME": unit.get("NODEJS-ROOT-VAR-NAME"),
- "NODE-MODULES-BUNDLE-FILENAME": constants.NODE_MODULES_WORKSPACE_BUNDLE_FILENAME,
- "CUSTOM-DEPENDENCIES": " ".join(sort_uniq((deps or []) + get_values_list(unit, "TEST_DEPENDS_VALUE"))),
- }
-
- if test_record:
- full_test_record.update(test_record)
-
- data = ytest.dump_test(unit, full_test_record)
+ flat_args = (test_type,)
+ spec_args = dict(nm_bundle=constants.NODE_MODULES_WORKSPACE_BUNDLE_FILENAME)
+
+ dart_record = create_dart_record(
+ TS_TEST_FIELDS_BASE + TS_TEST_SPECIFIC_FIELDS[test_type], unit, flat_args, spec_args
+ )
+
+ extra_deps = df.CustomDependencies.test_depends_only(unit, (), {})[df.CustomDependencies.KEY].split()
+ dart_record[df.CustomDependencies.KEY] = " ".join(sort_uniq(deps + extra_deps))
+
+ data = ytest.dump_test(unit, dart_record)
if data:
unit.set_property(["DART_DATA", data])
+ unit.set(["TEST_RECIPES_VALUE", recipes_value])
+
+
+def _resolve_module_files(unit, mod_dir, file_paths):
+ mod_dir_with_sep_len = len(mod_dir) + 1
+ resolved_files = []
+
+ for path in file_paths:
+ resolved = rootrel_arc_src(path, unit)
+ if resolved.startswith(mod_dir):
+ resolved = resolved[mod_dir_with_sep_len:]
+ resolved_files.append(resolved)
+
+ return resolved_files
+
def _set_resource_vars(unit, erm_json, tool, version, nodejs_major=None):
# type: (any, ErmJsonLite, Version, str|None, int|None) -> None
@@ -723,37 +766,54 @@ def on_ts_test_for_configure(unit, test_runner, default_config, node_modules_fil
if unit.enabled('TS_COVERAGE'):
unit.on_peerdir_ts_resource("nyc")
- for_mod_path = unit.get("TS_TEST_FOR_PATH")
+ for_mod_path = df.TsTestForPath.value(unit, (), {})[df.TsTestForPath.KEY]
unit.onpeerdir([for_mod_path])
unit.on_setup_extract_node_modules_recipe([for_mod_path])
unit.on_setup_extract_output_tars_recipe([for_mod_path])
- root = "$B" if test_runner == "hermione" else "$(BUILD_ROOT)"
- unit.set(["TS_TEST_NM", os.path.join(root, for_mod_path, node_modules_filename)])
+ build_root = "$B" if test_runner == TsTestType.HERMIONE else "$(BUILD_ROOT)"
+ unit.set(["TS_TEST_NM", os.path.join(build_root, for_mod_path, node_modules_filename)])
config_path = unit.get("TS_TEST_CONFIG_PATH")
if not config_path:
config_path = os.path.join(for_mod_path, default_config)
unit.set(["TS_TEST_CONFIG_PATH", config_path])
- test_record = _add_ts_resources_to_test_record(
- unit,
- {
- "TS-TEST-FOR-PATH": for_mod_path,
- "TS-TEST-DATA-DIRS": serialize_list(_get_ts_test_data_dirs(unit)),
- "TS-TEST-DATA-DIRS-RENAME": unit.get("_TS_TEST_DATA_DIRS_RENAME_VALUE"),
- },
- )
-
- test_files = get_values_list(unit, "_TS_TEST_SRCS_VALUE")
- test_files = _resolve_module_files(unit, unit.get("MODDIR"), test_files)
+ test_files = df.TestFiles.ts_test_srcs(unit, (), {})[df.TestFiles.KEY]
if not test_files:
ymake.report_configure_error("No tests found")
return
- deps = _create_pm(unit).get_peers_from_package_json()
- add_ts_test = _get_test_runner_handlers()[test_runner]
- add_ts_test(unit, test_runner, test_files, deps, test_record)
+ from lib.nots.package_manager import constants
+
+ peers = _create_pm(unit).get_peers_from_package_json()
+ deps = df.CustomDependencies.nots_with_recipies(unit, (peers,), {})[df.CustomDependencies.KEY].split()
+
+ if deps:
+ joined_deps = "\n".join(deps)
+ logger.info(f"{test_runner} deps: \n{joined_deps}")
+ unit.ondepends(deps)
+
+ flat_args = (test_runner, "TS_TEST_FOR_PATH")
+ spec_args = {'erm_json': _create_erm_json(unit)}
+
+ dart_record = create_dart_record(
+ TS_TEST_FIELDS_BASE + TS_TEST_SPECIFIC_FIELDS[test_runner],
+ unit,
+ flat_args,
+ spec_args,
+ )
+ dart_record[df.TestFiles.KEY] = test_files
+ dart_record[df.NodeModulesBundleFilename.KEY] = constants.NODE_MODULES_WORKSPACE_BUNDLE_FILENAME
+
+ extra_deps = df.CustomDependencies.test_depends_only(unit, (), {})[df.CustomDependencies.KEY].split()
+ dart_record[df.CustomDependencies.KEY] = " ".join(sort_uniq(deps + extra_deps))
+ if test_runner == TsTestType.HERMIONE:
+ dart_record[df.Size.KEY] = "LARGE"
+
+ data = ytest.dump_test(unit, dart_record)
+ if data:
+ unit.set_property(["DART_DATA", data])
@_with_report_configure_error
@@ -776,16 +836,6 @@ def on_set_ts_test_for_vars(unit, for_mod):
unit.set(["TS_TEST_FOR_PATH", rootrel_arc_src(for_mod, unit)])
-def _add_ts_resources_to_test_record(unit, test_record):
- erm_json = _create_erm_json(unit)
- for tool in erm_json.list_npm_packages():
- tool_resource_label = "{}-ROOT-VAR-NAME".format(tool.upper())
- tool_resource_value = unit.get(tool_resource_label)
- if tool_resource_value:
- test_record[tool_resource_label] = tool_resource_value
- return test_record
-
-
@_with_report_configure_error
def on_ts_files(unit, *files):
new_cmds = ['$COPY_CMD ${{input;context=TEXT:"{0}"}} ${{output;noauto:"{0}"}}'.format(f) for f in files]
diff --git a/build/plugins/pybuild.py b/build/plugins/pybuild.py
index df83c194e8..746872885c 100644
--- a/build/plugins/pybuild.py
+++ b/build/plugins/pybuild.py
@@ -261,6 +261,7 @@ def py_program(unit, py3):
if unit.get('PYTHON_SQLITE3') != 'no':
peers.append('contrib/tools/python/src/Modules/_sqlite')
unit.onpeerdir(peers)
+ unit.onwindows_long_path_manifest()
if unit.get('MODULE_TYPE') == 'PROGRAM': # can not check DLL
unit.onadd_check_py_imports()
diff --git a/build/plugins/ytest.py b/build/plugins/ytest.py
index 5f74e15d20..aa41dff565 100644
--- a/build/plugins/ytest.py
+++ b/build/plugins/ytest.py
@@ -40,17 +40,17 @@ KTLINT_OLD_EDITOR_CONFIG = "arcadia/build/platform/java/ktlint_old/.editorconfig
YTEST_FIELDS_BASE = (
df.AndroidApkTestActivity.value,
- df.BinaryPath.value,
- df.BuildFolderPath.value,
- df.CustomDependencies.value,
+ df.BinaryPath.normalized,
+ df.BuildFolderPath.normalized,
+ df.CustomDependencies.all_standard,
df.GlobalLibraryPath.value,
- df.ScriptRelPath.value,
+ df.ScriptRelPath.second_flat,
df.SkipTest.value,
- df.SourceFolderPath.value,
- df.SplitFactor.value,
- df.TestCwd.value,
+ df.SourceFolderPath.normalized,
+ df.SplitFactor.from_macro_args_and_unit,
+ df.TestCwd.from_unit,
df.TestedProjectFilename.value,
- df.TestedProjectName.value,
+ df.TestedProjectName.unit_name,
df.TestEnv.value,
df.TestIosDeviceType.value,
df.TestIosRuntimeType.value,
@@ -59,43 +59,43 @@ YTEST_FIELDS_BASE = (
YTEST_FIELDS_EXTRA = (
df.Blob.value,
- df.ForkMode.value,
- df.Size.value,
- df.Tag.value,
- df.TestTimeout.value,
- df.YtSpec.value,
+ df.ForkMode.from_macro_and_unit,
+ df.Size.from_macro_args_and_unit,
+ df.Tag.from_macro_args_and_unit,
+ df.TestTimeout.from_macro_args_and_unit,
+ df.YtSpec.from_macro_args_and_unit,
)
PY_EXEC_FIELDS_BASE = (
df.Blob.value,
- df.BuildFolderPath.value2,
+ df.BuildFolderPath.stripped,
df.CanonizeSubPath.value,
- df.CustomDependencies.value3,
- df.ForkMode.value2,
+ df.CustomDependencies.test_depends_only,
+ df.ForkMode.test_fork_mode,
df.ForkTestFiles.value,
df.PythonPaths.value,
- df.Requirements.value4,
- df.Size.value2,
+ df.Requirements.from_unit,
+ df.Size.from_unit,
df.SkipTest.value,
- df.SourceFolderPath.value,
- df.SplitFactor.value2,
- df.Tag.value,
- df.TestCwd.value2,
- df.TestData.value5,
+ df.SourceFolderPath.normalized,
+ df.SplitFactor.from_unit,
+ df.Tag.from_macro_args_and_unit,
+ df.TestCwd.keywords_replaced,
+ df.TestData.from_unit_with_canonical,
df.TestEnv.value,
- df.TestFiles.value5,
+ df.TestFiles.test_srcs,
df.TestPartition.value,
df.TestRecipes.value,
- df.TestTimeout.value2,
+ df.TestTimeout.from_unit_with_default,
df.UseArcadiaPython.value,
)
CHECK_FIELDS_BASE = (
- df.CustomDependencies.value2,
- df.Requirements.value3,
- df.ScriptRelPath.value2,
+ df.CustomDependencies.depends_only,
+ df.Requirements.from_macro_args,
+ df.ScriptRelPath.first_flat,
df.TestEnv.value,
- df.TestName.value3,
+ df.TestName.first_flat,
df.UseArcadiaPython.value,
)
@@ -478,8 +478,8 @@ def get_project_tidy_config(unit):
@df.with_fields(
CHECK_FIELDS_BASE
+ (
- df.TestedProjectName.value2,
- df.SourceFolderPath.value,
+ df.TestedProjectName.normalized_basename,
+ df.SourceFolderPath.normalized,
df.SbrUidExt.value,
df.TestFiles.value,
)
@@ -513,10 +513,10 @@ def check_data(fields, unit, *args):
@df.with_fields(
CHECK_FIELDS_BASE
+ (
- df.TestedProjectName.value2,
- df.SourceFolderPath.value,
+ df.TestedProjectName.normalized_basename,
+ df.SourceFolderPath.normalized,
df.SbrUidExt.value,
- df.TestFiles.value2,
+ df.TestFiles.flat_args_wo_first,
)
)
def check_resource(fields, unit, *args):
@@ -546,10 +546,10 @@ def check_resource(fields, unit, *args):
@df.with_fields(
CHECK_FIELDS_BASE
+ (
- df.TestedProjectName.value2,
- df.SourceFolderPath.value,
- df.TestData.value3,
- df.TestFiles.value2,
+ df.TestedProjectName.normalized_basename,
+ df.SourceFolderPath.normalized,
+ df.TestData.ktlint,
+ df.TestFiles.flat_args_wo_first,
df.ModuleLang.value,
df.KtlintBinary.value,
df.UseKtlintOld.value,
@@ -584,11 +584,11 @@ def ktlint(fields, unit, *args):
@df.with_fields(
CHECK_FIELDS_BASE
+ (
- df.TestedProjectName.value2,
- df.SourceFolderPath.value,
- df.TestData.value4,
- df.ForkMode.value2,
- df.TestFiles.value3,
+ df.TestedProjectName.normalized_basename,
+ df.SourceFolderPath.normalized,
+ df.TestData.java_style,
+ df.ForkMode.test_fork_mode,
+ df.TestFiles.java_style,
df.JdkLatestVersion.value,
df.JdkResource.value,
df.ModuleLang.value,
@@ -628,10 +628,10 @@ def java_style(fields, unit, *args):
@df.with_fields(
CHECK_FIELDS_BASE
+ (
- df.TestedProjectName.value3,
- df.SourceFolderPath.value2,
- df.ForkMode.value2,
- df.TestFiles.value2,
+ df.TestedProjectName.test_dir,
+ df.SourceFolderPath.test_dir,
+ df.ForkMode.test_fork_mode,
+ df.TestFiles.flat_args_wo_first,
df.ModuleLang.value,
)
)
@@ -662,10 +662,10 @@ def gofmt(fields, unit, *args):
@df.with_fields(
CHECK_FIELDS_BASE
+ (
- df.TestedProjectName.value2,
- df.SourceFolderPath.value,
- df.ForkMode.value2,
- df.TestFiles.value2,
+ df.TestedProjectName.normalized_basename,
+ df.SourceFolderPath.normalized,
+ df.ForkMode.test_fork_mode,
+ df.TestFiles.flat_args_wo_first,
df.ModuleLang.value,
)
)
@@ -737,11 +737,11 @@ def on_register_no_check_imports(unit):
@df.with_fields(
(
- df.TestedProjectName.value2,
- df.SourceFolderPath.value,
+ df.TestedProjectName.normalized_basename,
+ df.SourceFolderPath.normalized,
df.TestEnv.value,
df.UseArcadiaPython.value,
- df.TestFiles.value4,
+ df.TestFiles.normalized,
df.ModuleLang.value,
df.NoCheck.value,
)
@@ -766,11 +766,11 @@ def onadd_check_py_imports(fields, unit, *args):
@df.with_fields(
PY_EXEC_FIELDS_BASE
+ (
- df.TestName.value4,
- df.ScriptRelPath.value3,
- df.TestedProjectName.value4,
+ df.TestName.filename_without_ext,
+ df.ScriptRelPath.pytest,
+ df.TestedProjectName.path_filename_basename,
df.ModuleLang.value,
- df.BinaryPath.value2,
+ df.BinaryPath.stripped,
df.TestRunnerBin.value,
)
)
@@ -787,7 +787,7 @@ def onadd_pytest_bin(fields, unit, *args):
if unit.get('ADD_SRCDIR_TO_TEST_DATA') == "yes":
unit.ondata_files(_common.get_norm_unit_path(unit))
- yt_spec = df.YtSpec.value2(unit, flat_args, spec_args)
+ yt_spec = df.YtSpec.from_unit(unit, flat_args, spec_args)
if yt_spec and yt_spec[df.YtSpec.KEY]:
unit.ondata_files(deserialize_list(yt_spec[df.YtSpec.KEY]))
@@ -802,26 +802,26 @@ def onadd_pytest_bin(fields, unit, *args):
@df.with_fields(
(
- df.SourceFolderPath.value,
- df.TestName.value5,
- df.ScriptRelPath.value4,
- df.TestTimeout.value3,
- df.TestedProjectName.value5,
+ df.SourceFolderPath.normalized,
+ df.TestName.normalized_joined_dir_basename,
+ df.ScriptRelPath.junit,
+ df.TestTimeout.from_unit,
+ df.TestedProjectName.normalized,
df.TestEnv.value,
- df.TestData.value6,
- df.ForkMode.value2,
- df.SplitFactor.value2,
- df.CustomDependencies.value3,
- df.Tag.value,
- df.Size.value2,
- df.Requirements.value2,
+ df.TestData.java_test,
+ df.ForkMode.test_fork_mode,
+ df.SplitFactor.from_unit,
+ df.CustomDependencies.test_depends_only,
+ df.Tag.from_macro_args_and_unit,
+ df.Size.from_unit,
+ df.Requirements.with_maybe_fuzzing,
df.TestRecipes.value,
df.ModuleType.value,
df.UnittestDir.value,
df.JvmArgs.value,
# TODO optimize, SystemProperties is used in TestData
df.SystemProperties.value,
- df.TestCwd.value,
+ df.TestCwd.from_unit,
df.SkipTest.value,
df.JavaClasspathCmdType.value,
df.JdkResource.value,
@@ -848,7 +848,7 @@ def onjava_test(fields, unit, *args):
if unit.get('ADD_SRCDIR_TO_TEST_DATA') == "yes":
unit.ondata_files(_common.get_norm_unit_path(unit))
- yt_spec = df.YtSpec.value3(unit, (), {})
+ yt_spec = df.YtSpec.from_unit_list_var(unit, (), {})
unit.ondata_files(deserialize_list(yt_spec[df.YtSpec.KEY]))
try:
@@ -864,10 +864,10 @@ def onjava_test(fields, unit, *args):
@df.with_fields(
(
- df.SourceFolderPath.value,
- df.TestName.value6,
- df.TestedProjectName.value5,
- df.CustomDependencies.value3,
+ df.SourceFolderPath.normalized,
+ df.TestName.normalized_joined_dir_basename_deps,
+ df.TestedProjectName.normalized,
+ df.CustomDependencies.test_depends_only,
df.IgnoreClasspathClash.value,
df.ModuleType.value,
df.ModuleLang.value,
@@ -908,9 +908,9 @@ def onrun(unit, *args):
@df.with_fields(
PY_EXEC_FIELDS_BASE
+ (
- df.TestName.value7,
- df.TestedProjectName.value6,
- df.BinaryPath.value3,
+ df.TestName.filename_without_pkg_ext,
+ df.TestedProjectName.path_filename_basename_without_pkg_ext,
+ df.BinaryPath.stripped_without_pkg_ext,
)
)
def onsetup_exectest(fields, unit, *args):
@@ -928,7 +928,7 @@ def onsetup_exectest(fields, unit, *args):
if unit.get('ADD_SRCDIR_TO_TEST_DATA') == "yes":
unit.ondata_files(_common.get_norm_unit_path(unit))
- yt_spec = df.YtSpec.value2(unit, (), {})
+ yt_spec = df.YtSpec.from_unit(unit, (), {})
if yt_spec and yt_spec[df.YtSpec.KEY]:
unit.ondata_files(deserialize_list(yt_spec[df.YtSpec.KEY]))
@@ -1078,8 +1078,8 @@ def clang_tidy(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
df.ModuleLang.value,
)
@@ -1111,8 +1111,8 @@ def unittest_py(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
df.ModuleLang.value,
)
@@ -1144,8 +1144,8 @@ def gunittest(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
df.ModuleLang.value,
df.BenchmarkOpts.value,
@@ -1178,8 +1178,8 @@ def g_benchmark(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value2,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit_with_canonical,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
df.ModuleLang.value,
)
@@ -1212,8 +1212,8 @@ def go_test(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
)
)
@@ -1245,8 +1245,8 @@ def boost_test(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value2,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.with_maybe_fuzzing,
df.FuzzDicts.value,
df.FuzzOpts.value,
df.Fuzzing.value,
@@ -1281,8 +1281,8 @@ def fuzz_test(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
df.ModuleLang.value,
df.BenchmarkOpts.value,
@@ -1314,8 +1314,8 @@ def y_benchmark(fields, unit, *args):
+ YTEST_FIELDS_EXTRA
+ (
df.TestName.value,
- df.TestData.value,
- df.Requirements.value,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
)
)
@@ -1344,9 +1344,9 @@ def coverage_extractor(fields, unit, *args):
YTEST_FIELDS_BASE
+ YTEST_FIELDS_EXTRA
+ (
- df.TestName.value2,
- df.TestData.value,
- df.Requirements.value,
+ df.TestName.first_flat_with_bench,
+ df.TestData.from_macro_args_and_unit,
+ df.Requirements.from_macro_args_and_unit,
df.TestPartition.value,
df.GoBenchTimeout.value,
df.ModuleLang.value,
@@ -1363,7 +1363,7 @@ def go_bench(fields, unit, *args):
"FORK_TESTS": 0,
}
flat_args, spec_args = _common.sort_by_keywords(keywords, args)
- tags = df.Tag.value(unit, flat_args, spec_args)[df.Tag.KEY]
+ tags = df.Tag.from_macro_args_and_unit(unit, flat_args, spec_args)[df.Tag.KEY]
if "ya:run_go_benchmark" not in tags:
return
diff --git a/build/scripts/go_proto_wrapper.py b/build/scripts/go_proto_wrapper.py
index a8d856db6f..1973d6e381 100644
--- a/build/scripts/go_proto_wrapper.py
+++ b/build/scripts/go_proto_wrapper.py
@@ -50,7 +50,8 @@ def main(args):
m = re.match(OUT_DIR_FLAG_PATTERN, args[i])
if m:
out_dir_flag = m.group(1)
- index = max(len(out_dir_flag), args[i].rfind(':') + 1)
+ index = len(out_dir_flag)
+ index = max(index, args[i].find(':', index) + 1)
out_dir = args[i][index:]
if out_dir_orig:
assert out_dir_orig == out_dir, 'Output directories do not match: [{}] and [{}]'.format(
diff --git a/build/scripts/split_unittest.py b/build/scripts/split_unittest.py
index 8874b8b915..7214c70fdc 100644
--- a/build/scripts/split_unittest.py
+++ b/build/scripts/split_unittest.py
@@ -1,4 +1,5 @@
import argparse
+import os
import tempfile
import shlex
import subprocess
@@ -31,11 +32,14 @@ def get_shuffled_chunk(tests, modulo, modulo_index):
def list_tests(binary):
- with tempfile.NamedTemporaryFile() as tmpfile:
- cmd = [binary, "--list-verbose", "--list-path", tmpfile.name]
+ # can't use NamedTemporaryFile or mkstemp because of child process access issues on Windows
+ # https://stackoverflow.com/questions/66744497/python-tempfile-namedtemporaryfile-cant-use-generated-tempfile
+ with tempfile.TemporaryDirectory() as tmp_dir:
+ list_file = os.path.join(tmp_dir, 'list')
+ cmd = [binary, "--list-verbose", "--list-path", list_file]
subprocess.check_call(cmd)
- with open(tmpfile.name) as afile:
+ with open(list_file) as afile:
lines = afile.read().strip().split("\n")
lines = [x.strip() for x in lines]
return [x for x in lines if x]
diff --git a/build/sysincl/misc.yml b/build/sysincl/misc.yml
index 982f4451f7..cf47b8622b 100644
--- a/build/sysincl/misc.yml
+++ b/build/sysincl/misc.yml
@@ -149,10 +149,22 @@
includes:
- mkl.h: contrib/libs/intel/mkl/include/mkl.h
-# deprecated contrib with ADDINCL to libintl
-- source_filter: "^contrib/(deprecated/glib/glib|libs/gdk-pixbuf)"
+# Use gettext-stub which has a permissive license
+- source_filter: "^contrib/libs/gdk-pixbuf"
includes:
- - libintl.h: contrib/deprecated/libintl/libintl.h
+ - libintl.h: contrib/restricted/gettext-stub/libintl.h
+
+- source_filter: "^contrib/restricted/glib"
+ includes:
+ - libintl.h: contrib/restricted/gettext-stub/libintl.h
+
+- source_filter: "^contrib/restricted/gst-plugins-base"
+ includes:
+ - libintl.h: contrib/restricted/gettext-stub/libintl.h
+
+- source_filter: "^contrib/restricted/gstreamer"
+ includes:
+ - libintl.h: contrib/restricted/gettext-stub/libintl.h
- source_filter: "^contrib/libs/poco/Data/ODBC"
includes:
@@ -519,6 +531,11 @@
- "]b4_location_include["
- "position.hh"
+- source_filter: "^contrib/libs/libheif"
+ includes:
+ - error.h: contrib/libs/libheif/libheif/error.h
+ - file.h: contrib/libs/libheif/libheif/file.h
+
- source_filter: "^vendor/github.com/NVIDIA"
includes:
- nvml.h:
diff --git a/build/ymake.core.conf b/build/ymake.core.conf
index f89bb2490a..bdb2f6ec92 100644
--- a/build/ymake.core.conf
+++ b/build/ymake.core.conf
@@ -2853,7 +2853,7 @@ macro SIZE(Type) {
### This macro doesn't place all file into Out, it emits #include<Src>... Use the for C++ source files only.
### You should specify file name with the extension as Out. Further processing will be done according this extension.
macro JOIN_SRCS(Out, Src...) {
- .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/gen_join_srcs.py"} ${hide;input:"build/scripts/process_command_files.py"} ${output:Out} --ya-start-command-file ${input;rootrel:Src} --ya-end-command-file ${output_include;from_input;hide:Src} ${hide;kv:"p JS"} ${hide;kv:"pc magenta"}
+ .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/gen_join_srcs.py"} ${hide;input:"build/scripts/process_command_files.py"} ${output:Out} --ya-start-command-file ${input;rootrel;context=TEXT:Src} --ya-end-command-file ${output_include;from_input;hide:Src} ${hide;kv:"p JS"} ${hide;kv:"pc magenta"}
.SEM=target_joined_source $Out ${input:Src} ${hide;output;suf=.o:Out} ${hide;input:"build/scripts/gen_join_srcs.py"} ${hide;input:"build/scripts/process_command_files.py"} && target_macroses-ITEM && target_macroses-macro target_joined_source && target_macroses-args $Out ${input:Src} ${hide;output;suf=.o:Out} ${hide;input:"build/scripts/gen_join_srcs.py"} ${hide;input:"build/scripts/process_command_files.py"}
_CONDITIONAL_SRCS($TIDY_VALUE $Src)
}
@@ -2864,7 +2864,7 @@ macro JOIN_SRCS(Out, Src...) {
### This macro doesn't place all file into Out, it emits #include<Src>... Use the for C++ source files only.
### You should specify file name with the extension as Out. Further processing will be done according to this extension.
macro JOIN_SRCS_GLOBAL(Out, Src...) {
- .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/gen_join_srcs.py"} ${hide;input:"build/scripts/process_command_files.py"} ${noauto;output:Out} --ya-start-command-file ${input;rootrel:Src} --ya-end-command-file ${output_include;from_input;hide:Src} ${hide;kv:"p JS"} ${hide;kv:"pc magenta"}
+ .CMD=$YMAKE_PYTHON3 ${input:"build/scripts/gen_join_srcs.py"} ${hide;input:"build/scripts/process_command_files.py"} ${noauto;output:Out} --ya-start-command-file ${input;rootrel;context=TEXT:Src} --ya-end-command-file ${output_include;from_input;hide:Src} ${hide;kv:"p JS"} ${hide;kv:"pc magenta"}
SRCS(GLOBAL $Out)
}
@@ -2874,7 +2874,7 @@ macro JOIN_SRCS_GLOBAL(Out, Src...) {
### This macro places all files into single file, so will work with any sources.
### You should specify file name with the extension as Out. Further processing will be done according to this extension.
macro FLAT_JOIN_SRCS_GLOBAL(Out, Src...) {
- .CMD=$FS_TOOLS cat ${noauto;output:Out} --ya-start-command-file ${input:Src} --ya-end-command-file ${output_include;from_input;hide:Src} ${hide;kv:"p JS"} ${hide;kv:"pc magenta"}
+ .CMD=$FS_TOOLS cat ${noauto;output:Out} --ya-start-command-file ${input;context=TEXT:Src} --ya-end-command-file ${output_include;from_input;hide:Src} ${hide;kv:"p JS"} ${hide;kv:"pc magenta"}
SRCS(GLOBAL $Out)
}
@@ -4454,15 +4454,16 @@ macro SYMLINK(From, To) {
# tag:internal
### @usage: _TARGET_SOURCES_FOR_HEADERS_IMPL([GENERATE] Args...) # internal
### Generate prefix " && target_sources PRIVATE " before $Args when GENERATE is specified in the list of actual arguments
-macro _TARGET_SOURCES_FOR_HEADERS_IMPL(GENERATE?" && target_sources PRIVATE ":"", Args...) {
- .SEM=$GENERATE ${output;ext=.h:Args} ${output;ext=.hh:Args} ${output;ext=.hpp:Args} ${output;ext=.inc:Args} ${output;ext=.i:Args}
+### Generate prefix " && target_options-privates-ITEM && target_options-privates-option target_sources && target_options-privates-args " before $Args when GENERATE2 is specified in the list of actual arguments
+macro _TARGET_SOURCES_FOR_HEADERS_IMPL(GENERATE?" && target_sources PRIVATE ":"", GENERATE2?" && target_options-privates-ITEM && target_options-privates-option target_sources && target_options-privates-args ":"", Args...) {
+ .SEM=$GENERATE ${output;ext=.h:Args} ${output;ext=.hh:Args} ${output;ext=.hpp:Args} ${output;ext=.inc:Args} ${output;ext=.i:Args} $GENERATE2 ${output;ext=.h:Args} ${output;ext=.hh:Args} ${output;ext=.hpp:Args} ${output;ext=.inc:Args} ${output;ext=.i:Args}
}
# tag:internal
### @usage: _TARGET_SOURCES_FOR_HEADERS(Args...) # internal
### Generate prefix " && target_sources PRIVATE " before $Args if Args is not empty
macro _TARGET_SOURCES_FOR_HEADERS(Args...) {
- .SEM=$_TARGET_SOURCES_FOR_HEADERS_IMPL(${pre=GENERATE :Args})
+ .SEM=$_TARGET_SOURCES_FOR_HEADERS_IMPL(${pre=GENERATE GENERATE2 :Args})
}
# tag:internal
diff --git a/build/ymake_conf.py b/build/ymake_conf.py
index a34c6f9a9d..1db5338b42 100755
--- a/build/ymake_conf.py
+++ b/build/ymake_conf.py
@@ -41,7 +41,7 @@ class WindowsVersion(object):
ANDROID_API_DEFAULT = 21
# This is default Linux SDK unless `-DOS_SDK` is specified in cmdline
-LINUX_SDK_DEFAULT = "ubuntu-14"
+LINUX_SDK_DEFAULT = "ubuntu-16"
MACOS_VERSION_MIN = "11.0"
MACOS_VERSION_MIN_AS_INT = "110000"
diff --git a/contrib/java/javax/annotation/javax.annotation-api/1.3.1/ya.make b/contrib/java/javax/annotation/javax.annotation-api/1.3.1/ya.make
index 28a71b8ea1..c32b8f34c9 100644
--- a/contrib/java/javax/annotation/javax.annotation-api/1.3.1/ya.make
+++ b/contrib/java/javax/annotation/javax.annotation-api/1.3.1/ya.make
@@ -2,6 +2,7 @@ JAVA_CONTRIB()
LICENSE(CDDL-1.0)
+
JAR_RESOURCE(545709491)
SRC_RESOURCE(545709503)
diff --git a/contrib/libs/apache/orc/c++/src/Reader.cc b/contrib/libs/apache/orc/c++/src/Reader.cc
index 2cc88fbb80..0586918d80 100644
--- a/contrib/libs/apache/orc/c++/src/Reader.cc
+++ b/contrib/libs/apache/orc/c++/src/Reader.cc
@@ -565,7 +565,7 @@ namespace orc {
mutableFooter->CopyFrom(*footer);
tail.set_file_length(fileLength);
tail.set_postscript_length(postscriptLength);
- TString result;
+ TProtoStringType result;
if (!tail.SerializeToString(&result)) {
throw ParseError("Failed to serialize file tail");
}
@@ -691,7 +691,7 @@ namespace orc {
std::string ReaderImpl::getMetadataValue(const std::string& key) const {
for (int i = 0; i < footer->metadata_size(); ++i) {
- if (footer->metadata(i).name() == TString(key)) {
+ if (footer->metadata(i).name() == TProtoStringType(key)) {
return footer->metadata(i).value();
}
}
@@ -741,7 +741,7 @@ namespace orc {
bool ReaderImpl::hasMetadataValue(const std::string& key) const {
for (int i = 0; i < footer->metadata_size(); ++i) {
- if (footer->metadata(i).name() == TString(key)) {
+ if (footer->metadata(i).name() == TProtoStringType(key)) {
return true;
}
}
@@ -1367,7 +1367,7 @@ namespace orc {
if (serializedFooter.length() != 0) {
// Parse the file tail from the serialized one.
proto::FileTail tail;
- if (!tail.ParseFromString(TString(serializedFooter))) {
+ if (!tail.ParseFromString(TProtoStringType(serializedFooter))) {
throw ParseError("Failed to parse the file tail from string");
}
contents->postscript = std::make_unique<proto::PostScript>(tail.postscript());
diff --git a/contrib/libs/apache/orc/c++/src/Statistics.hh b/contrib/libs/apache/orc/c++/src/Statistics.hh
index b36e431a7f..053b6c7fd8 100644
--- a/contrib/libs/apache/orc/c++/src/Statistics.hh
+++ b/contrib/libs/apache/orc/c++/src/Statistics.hh
@@ -27,6 +27,8 @@
#include "Timezone.hh"
#include "TypeImpl.hh"
+#include <util/generic/string.h>
+
namespace orc {
/**
@@ -711,14 +713,14 @@ namespace orc {
proto::DecimalStatistics* decStats = pbStats.mutable_decimal_statistics();
if (_stats.hasMinimum()) {
- decStats->set_minimum(TString(_stats.getMinimum().toString(true)));
- decStats->set_maximum(TString(_stats.getMaximum().toString(true)));
+ decStats->set_minimum(TProtoStringType(_stats.getMinimum().toString(true)));
+ decStats->set_maximum(TProtoStringType(_stats.getMaximum().toString(true)));
} else {
decStats->clear_minimum();
decStats->clear_maximum();
}
if (_stats.hasSum()) {
- decStats->set_sum(TString(_stats.getSum().toString(true)));
+ decStats->set_sum(TProtoStringType(_stats.getSum().toString(true)));
} else {
decStats->clear_sum();
}
@@ -1225,8 +1227,8 @@ namespace orc {
proto::StringStatistics* strStats = pbStats.mutable_string_statistics();
if (_stats.hasMinimum()) {
- strStats->set_minimum(TString(_stats.getMinimum()));
- strStats->set_maximum(TString(_stats.getMaximum()));
+ strStats->set_minimum(TProtoStringType(_stats.getMinimum()));
+ strStats->set_maximum(TProtoStringType(_stats.getMaximum()));
} else {
strStats->clear_minimum();
strStats->clear_maximum();
diff --git a/contrib/libs/apache/orc/c++/src/Writer.cc b/contrib/libs/apache/orc/c++/src/Writer.cc
index 19b71190a3..ca96e709c9 100644
--- a/contrib/libs/apache/orc/c++/src/Writer.cc
+++ b/contrib/libs/apache/orc/c++/src/Writer.cc
@@ -429,8 +429,8 @@ namespace orc {
void WriterImpl::addUserMetadata(const std::string& name, const std::string& value) {
proto::UserMetadataItem* userMetadataItem = fileFooter.add_metadata();
- userMetadataItem->set_name(TString(name));
- userMetadataItem->set_value(TString(value));
+ userMetadataItem->set_name(TProtoStringType(name));
+ userMetadataItem->set_value(TProtoStringType(value));
}
void WriterImpl::init() {
@@ -510,7 +510,7 @@ namespace orc {
*stripeFooter.add_columns() = encodings[i];
}
- stripeFooter.set_writer_timezone(TString(options.getTimezoneName()));
+ stripeFooter.set_writer_timezone(TProtoStringType(options.getTimezoneName()));
// add stripe statistics to metadata
proto::StripeStatistics* stripeStats = metadata.add_stripe_stats();
@@ -679,8 +679,8 @@ namespace orc {
for (auto& key : t.getAttributeKeys()) {
const auto& value = t.getAttributeValue(key);
auto protoAttr = protoType.add_attributes();
- protoAttr->set_key(TString(key));
- protoAttr->set_value(TString(value));
+ protoAttr->set_key(TProtoStringType(key));
+ protoAttr->set_value(TProtoStringType(value));
}
int pos = static_cast<int>(index);
@@ -689,7 +689,7 @@ namespace orc {
for (uint64_t i = 0; i < t.getSubtypeCount(); ++i) {
// only add subtypes' field names if this type is STRUCT
if (t.getKind() == STRUCT) {
- footer.mutable_types(pos)->add_field_names(TString(t.getFieldName(i)));
+ footer.mutable_types(pos)->add_field_names(TProtoStringType(t.getFieldName(i)));
}
footer.mutable_types(pos)->add_subtypes(++index);
buildFooterType(*t.getSubtype(i), footer, index);
diff --git a/contrib/libs/apache/orc/c++/src/sargs/PredicateLeaf.cc b/contrib/libs/apache/orc/c++/src/sargs/PredicateLeaf.cc
index 5fceedd854..54968545b9 100644
--- a/contrib/libs/apache/orc/c++/src/sargs/PredicateLeaf.cc
+++ b/contrib/libs/apache/orc/c++/src/sargs/PredicateLeaf.cc
@@ -26,6 +26,8 @@
#include <sstream>
#include <type_traits>
+#include <util/generic/string.h>
+
namespace orc {
PredicateLeaf::PredicateLeaf(Operator op, PredicateDataType type, const std::string& colName,
@@ -495,11 +497,11 @@ namespace orc {
return result;
}
- static std::vector<TString> literal2String(const std::vector<Literal>& values) {
- std::vector<TString> result;
+ static std::vector<TProtoStringType> literal2String(const std::vector<Literal>& values) {
+ std::vector<TProtoStringType> result;
std::for_each(values.cbegin(), values.cend(), [&](const Literal& val) {
if (!val.isNull()) {
- result.emplace_back(TString(val.getString()));
+ result.emplace_back(TProtoStringType(val.getString()));
}
});
return result;
diff --git a/contrib/libs/backtrace/atomic.c b/contrib/libs/backtrace/atomic.c
index fcac485b23..21785a19e8 100644
--- a/contrib/libs/backtrace/atomic.c
+++ b/contrib/libs/backtrace/atomic.c
@@ -1,5 +1,5 @@
/* atomic.c -- Support for atomic functions if not present.
- Copyright (C) 2013-2021 Free Software Foundation, Inc.
+ Copyright (C) 2013-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/backtrace-supported.h b/contrib/libs/backtrace/backtrace-supported.h
index 1ece38888f..39482feb9e 100644
--- a/contrib/libs/backtrace/backtrace-supported.h
+++ b/contrib/libs/backtrace/backtrace-supported.h
@@ -1,5 +1,5 @@
/* backtrace-supported.h.in -- Whether stack backtrace is supported.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/backtrace.c b/contrib/libs/backtrace/backtrace.c
index 7b62900852..3e6b81e9a3 100644
--- a/contrib/libs/backtrace/backtrace.c
+++ b/contrib/libs/backtrace/backtrace.c
@@ -1,5 +1,5 @@
/* backtrace.c -- Entry point for stack backtrace library.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/backtrace.h b/contrib/libs/backtrace/backtrace.h
index 69cea4ca1e..de92a3afb3 100644
--- a/contrib/libs/backtrace/backtrace.h
+++ b/contrib/libs/backtrace/backtrace.h
@@ -1,5 +1,5 @@
/* backtrace.h -- Public header file for stack backtrace library.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/dwarf.c b/contrib/libs/backtrace/dwarf.c
index fa304aa6b2..54bff64b0d 100644
--- a/contrib/libs/backtrace/dwarf.c
+++ b/contrib/libs/backtrace/dwarf.c
@@ -1,5 +1,5 @@
/* dwarf.c -- Get file/line information from DWARF for backtraces.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
@@ -2039,7 +2039,7 @@ add_ranges_from_ranges (
base = (uintptr_t) high;
else
{
- if (!add_range (state, rdata,
+ if (!add_range (state, rdata,
(uintptr_t) low + base + base_address,
(uintptr_t) high + base + base_address,
error_callback, data, vec))
@@ -2238,7 +2238,7 @@ add_ranges (struct backtrace_state *state,
const struct dwarf_sections *dwarf_sections,
uintptr_t base_address, int is_bigendian,
struct unit *u, uintptr_t base, const struct pcrange *pcrange,
- int (*add_range) (struct backtrace_state *state, void *rdata,
+ int (*add_range) (struct backtrace_state *state, void *rdata,
uintptr_t lowpc, uintptr_t highpc,
backtrace_error_callback error_callback,
void *data, void *vec),
diff --git a/contrib/libs/backtrace/elf.c b/contrib/libs/backtrace/elf.c
index a769690510..81fcf4e000 100644
--- a/contrib/libs/backtrace/elf.c
+++ b/contrib/libs/backtrace/elf.c
@@ -1,5 +1,5 @@
/* elf.c -- Get debug data from an ELF file for backtraces.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
@@ -589,7 +589,7 @@ elf_nodebug (struct backtrace_state *state, uintptr_t pc,
return bdata.ret;
}
- error_callback (data, "no debug info in ELF executable", -1);
+ error_callback (data, "no debug info in ELF executable (make sure to compile with -g)", -1);
return 0;
}
@@ -5687,10 +5687,10 @@ elf_uncompress_lzma_block (const unsigned char *compressed,
/* Block header CRC. */
computed_crc = elf_crc32 (0, compressed + block_header_offset,
block_header_size - 4);
- stream_crc = (compressed[off]
- | (compressed[off + 1] << 8)
- | (compressed[off + 2] << 16)
- | (compressed[off + 3] << 24));
+ stream_crc = ((uint32_t)compressed[off]
+ | ((uint32_t)compressed[off + 1] << 8)
+ | ((uint32_t)compressed[off + 2] << 16)
+ | ((uint32_t)compressed[off + 3] << 24));
if (unlikely (computed_crc != stream_crc))
{
elf_uncompress_failed ();
@@ -6300,10 +6300,10 @@ elf_uncompress_lzma (struct backtrace_state *state,
/* Next comes a CRC of the stream flags. */
computed_crc = elf_crc32 (0, compressed + 6, 2);
- stream_crc = (compressed[8]
- | (compressed[9] << 8)
- | (compressed[10] << 16)
- | (compressed[11] << 24));
+ stream_crc = ((uint32_t)compressed[8]
+ | ((uint32_t)compressed[9] << 8)
+ | ((uint32_t)compressed[10] << 16)
+ | ((uint32_t)compressed[11] << 24));
if (unlikely (computed_crc != stream_crc))
{
elf_uncompress_failed ();
@@ -6344,10 +6344,10 @@ elf_uncompress_lzma (struct backtrace_state *state,
/* Before that is a footer CRC. */
computed_crc = elf_crc32 (0, compressed + offset, 6);
- stream_crc = (compressed[offset - 4]
- | (compressed[offset - 3] << 8)
- | (compressed[offset - 2] << 16)
- | (compressed[offset - 1] << 24));
+ stream_crc = ((uint32_t)compressed[offset - 4]
+ | ((uint32_t)compressed[offset - 3] << 8)
+ | ((uint32_t)compressed[offset - 2] << 16)
+ | ((uint32_t)compressed[offset - 1] << 24));
if (unlikely (computed_crc != stream_crc))
{
elf_uncompress_failed ();
@@ -6403,10 +6403,10 @@ elf_uncompress_lzma (struct backtrace_state *state,
/* Next is a CRC of the index. */
computed_crc = elf_crc32 (0, compressed + index_offset,
offset - index_offset);
- stream_crc = (compressed[offset]
- | (compressed[offset + 1] << 8)
- | (compressed[offset + 2] << 16)
- | (compressed[offset + 3] << 24));
+ stream_crc = ((uint32_t)compressed[offset]
+ | ((uint32_t)compressed[offset + 1] << 8)
+ | ((uint32_t)compressed[offset + 2] << 16)
+ | ((uint32_t)compressed[offset + 3] << 24));
if (unlikely (computed_crc != stream_crc))
{
elf_uncompress_failed ();
@@ -6841,7 +6841,8 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
}
}
- if (!gnu_debugdata_view_valid
+ if (!debuginfo
+ && !gnu_debugdata_view_valid
&& strcmp (name, ".gnu_debugdata") == 0)
{
if (!elf_get_view (state, descriptor, memory, memory_size,
diff --git a/contrib/libs/backtrace/fileline.c b/contrib/libs/backtrace/fileline.c
index e16fc0ee3d..68e80c6d27 100644
--- a/contrib/libs/backtrace/fileline.c
+++ b/contrib/libs/backtrace/fileline.c
@@ -1,5 +1,5 @@
/* fileline.c -- Get file and line number information in a backtrace.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/internal.h b/contrib/libs/backtrace/internal.h
index c6fc717e81..4fa0af8cb6 100644
--- a/contrib/libs/backtrace/internal.h
+++ b/contrib/libs/backtrace/internal.h
@@ -1,5 +1,5 @@
/* internal.h -- Internal header file for stack backtrace library.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/macho.c b/contrib/libs/backtrace/macho.c
index d00aea9bc8..8f768f14a5 100644
--- a/contrib/libs/backtrace/macho.c
+++ b/contrib/libs/backtrace/macho.c
@@ -1,5 +1,5 @@
/* elf.c -- Get debug data from a Mach-O file for backtraces.
- Copyright (C) 2020-2021 Free Software Foundation, Inc.
+ Copyright (C) 2020-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
@@ -271,12 +271,14 @@ struct macho_nlist_64
/* Value found in nlist n_type field. */
-#define MACH_O_N_EXT 0x01 /* Extern symbol */
+#define MACH_O_N_STAB 0xe0 /* Stabs debugging symbol */
+#define MACH_O_N_TYPE 0x0e /* Mask for type bits */
+
+/* Values found after masking with MACH_O_N_TYPE. */
+#define MACH_O_N_UNDF 0x00 /* Undefined symbol */
#define MACH_O_N_ABS 0x02 /* Absolute symbol */
-#define MACH_O_N_SECT 0x0e /* Defined in section */
+#define MACH_O_N_SECT 0x0e /* Defined in section from n_sect field */
-#define MACH_O_N_TYPE 0x0e /* Mask for type bits */
-#define MACH_O_N_STAB 0xe0 /* Stabs debugging symbol */
/* Information we keep for a Mach-O symbol. */
@@ -324,7 +326,7 @@ macho_nodebug (struct backtrace_state *state ATTRIBUTE_UNUSED,
backtrace_full_callback callback ATTRIBUTE_UNUSED,
backtrace_error_callback error_callback, void *data)
{
- error_callback (data, "no debug info in Mach-O executable", -1);
+ error_callback (data, "no debug info in Mach-O executable (make sure to compile with -g; may need to run dsymutil)", -1);
return 0;
}
@@ -492,10 +494,10 @@ macho_defined_symbol (uint8_t type)
{
if ((type & MACH_O_N_STAB) != 0)
return 0;
- if ((type & MACH_O_N_EXT) != 0)
- return 0;
switch (type & MACH_O_N_TYPE)
{
+ case MACH_O_N_UNDF:
+ return 0;
case MACH_O_N_ABS:
return 1;
case MACH_O_N_SECT:
@@ -674,7 +676,6 @@ macho_add_symtab (struct backtrace_state *state, int descriptor,
struct macho_syminfo_data *p;
p = backtrace_atomic_load_pointer (pp);
-
if (p == NULL)
break;
diff --git a/contrib/libs/backtrace/mmap.c b/contrib/libs/backtrace/mmap.c
index d7313be73f..322ed94566 100644
--- a/contrib/libs/backtrace/mmap.c
+++ b/contrib/libs/backtrace/mmap.c
@@ -1,5 +1,5 @@
/* mmap.c -- Memory allocation with mmap.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/mmapio.c b/contrib/libs/backtrace/mmapio.c
index 7f6fa8d274..b780c3d07d 100644
--- a/contrib/libs/backtrace/mmapio.c
+++ b/contrib/libs/backtrace/mmapio.c
@@ -1,5 +1,5 @@
/* mmapio.c -- File views using mmap.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/posix.c b/contrib/libs/backtrace/posix.c
index 924631d2e6..79f4950f84 100644
--- a/contrib/libs/backtrace/posix.c
+++ b/contrib/libs/backtrace/posix.c
@@ -1,5 +1,5 @@
/* posix.c -- POSIX file I/O routines for the backtrace library.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/print.c b/contrib/libs/backtrace/print.c
index 93d0d3abb4..3e61f02ebb 100644
--- a/contrib/libs/backtrace/print.c
+++ b/contrib/libs/backtrace/print.c
@@ -1,5 +1,5 @@
/* print.c -- Print the current backtrace.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/simple.c b/contrib/libs/backtrace/simple.c
index 785e726e6b..fd3fac688f 100644
--- a/contrib/libs/backtrace/simple.c
+++ b/contrib/libs/backtrace/simple.c
@@ -1,5 +1,5 @@
/* simple.c -- The backtrace_simple function.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/sort.c b/contrib/libs/backtrace/sort.c
index a60a980e65..fedfe21cbd 100644
--- a/contrib/libs/backtrace/sort.c
+++ b/contrib/libs/backtrace/sort.c
@@ -1,5 +1,5 @@
/* sort.c -- Sort without allocating memory
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/state.c b/contrib/libs/backtrace/state.c
index 0f368a2390..b564a18b54 100644
--- a/contrib/libs/backtrace/state.c
+++ b/contrib/libs/backtrace/state.c
@@ -1,5 +1,5 @@
/* state.c -- Create the backtrace state.
- Copyright (C) 2012-2021 Free Software Foundation, Inc.
+ Copyright (C) 2012-2024 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Google.
Redistribution and use in source and binary forms, with or without
diff --git a/contrib/libs/backtrace/ya.make b/contrib/libs/backtrace/ya.make
index 120793f6d6..65e49d05d9 100644
--- a/contrib/libs/backtrace/ya.make
+++ b/contrib/libs/backtrace/ya.make
@@ -6,9 +6,9 @@ LICENSE(BSD-3-Clause)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(2024-06-26)
+VERSION(2024-07-12)
-ORIGINAL_SOURCE(https://github.com/ianlancetaylor/libbacktrace/archive/4ead348bb45f753121ca0bd44170ff8352d4c514.tar.gz)
+ORIGINAL_SOURCE(https://github.com/ianlancetaylor/libbacktrace/archive/febbb9bff98b39ee596aa15d1f58e4bba442cd6a.tar.gz)
ADDINCL(
contrib/libs/backtrace
diff --git a/contrib/libs/c-ares/CHANGES.0 b/contrib/libs/c-ares/CHANGES.0
index 73fe8c7710..0da401eabe 100644
--- a/contrib/libs/c-ares/CHANGES.0
+++ b/contrib/libs/c-ares/CHANGES.0
@@ -250,7 +250,7 @@ Version 1.7.0 (Nov 30, 2009)
which are _not_ related with memory tracking. For the c-ares library when
--enable-debug is given it does not enable the memory tracking feature. If
you wish to enable the curl debug memory tracking you must use configure
- option --enable-curldebug explicitily to do so.
+ option --enable-curldebug explicitly to do so.
Internally, definition of preprocessor symbol DEBUGBUILD restricts code
which is only compiled for debug enabled builds. And symbol CURLDEBUG is
@@ -376,7 +376,7 @@ Version 1.6.0 (Dec 9, 2008)
buffer to shrink instead of expand if a reply contained 8 or more records.
* Nov 25 2008 (Yang Tse)
-- In preparation for the upcomming IPv6 nameservers patch, the internal
+- In preparation for the upcoming IPv6 nameservers patch, the internal
ares_addr union is now changed into an internal struct which also holds
the address family.
@@ -533,7 +533,7 @@ Version 1.5.3 (Aug 29, 2008)
elsewhere). The define was also somewhat artificially used in the windows
port. Now, I instead rewrote the use of gethostbyname to enlarge the host
name buffer in case of need and totally avoid the use of the MAXHOSTNAMELEN
- define. I thus also removed the defien from the namser.h file where it was
+ define. I thus also removed the define from the namser.h file where it was
once added for the windows build.
I also fixed init_by_defaults() function to not leak memory in case if
@@ -673,7 +673,7 @@ Version 1.5.0 (Nov 21, 2007)
3. The third problem is that Valgrind assumes that query->qid is not
initialised correctly. And it does that because query->qid is set from
- DNS_HEADER_QID(qbuf); Valgrind says that qbuf has unitialised bytes. And
+ DNS_HEADER_QID(qbuf); Valgrind says that qbuf has uninitialised bytes. And
qbuf has uninitialised bytes because of channel->next_id . And next_id is
set by ares_init.c:ares__generate_new_id() . I found that putting short r=0
in this function (instead of short r) makes all Valgrind warnings go away.
@@ -681,8 +681,8 @@ Version 1.5.0 (Nov 21, 2007)
buffer_ptr[counter] ^= state[xorIndex]; (ares_query.c:62)
- This is what triggers Valgrind.. buffer_ptr is unitialised in this function,
- and by applying ^= on it, it remains unitialised.
+ This is what triggers Valgrind.. buffer_ptr is uninitialised in this function,
+ and by applying ^= on it, it remains uninitialised.
Version 1.4.0 (June 8, 2007)
@@ -1094,7 +1094,7 @@ Version 1.2.1 (October 20, 2004)
from a series of registry branches.
This can be wrong in the case where DHCP has assigned nameservers, but the
- user has overridden these servers with other prefered settings. Then it's
+ user has overridden these servers with other preferred settings. Then it's
wrong to use the DHCPNAMESERVER setting in registry.
In the case of no global DHCP-assigned or fixed servers, but DNS server(s)
diff --git a/contrib/libs/c-ares/INSTALL.md b/contrib/libs/c-ares/INSTALL.md
index 9b2f847be8..de766aad28 100644
--- a/contrib/libs/c-ares/INSTALL.md
+++ b/contrib/libs/c-ares/INSTALL.md
@@ -32,7 +32,7 @@ the same for both Git and official release tarballs.
AutoTools Build
===============
-### General Information, works on most Unix Platforms (Linux, FreeBSD, etc)
+### 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):
@@ -57,7 +57,7 @@ you need to specify that already when running configure:
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:
+installation in your own home directory:
./configure --prefix=$HOME
make
@@ -183,7 +183,7 @@ Method using a configure cross-compile (tested with Android NDK r7b):
./tools/make-standalone-toolchain.sh
- which creates a usual cross-compile toolchain. Lets assume that you put
+ which creates a usual cross-compile toolchain. Let's assume that you put
this toolchain below `/opt` then invoke configure with something
like:
@@ -213,7 +213,7 @@ 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
+tested on most platforms including Windows, Linux, FreeBSD, macOS, AIX and
Solaris.
In the most basic form, building with CMake might look like:
@@ -233,18 +233,23 @@ 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)
-
+| Option Name | Description | Default Value |
+|-----------------------------|-----------------------------------------------------------------------|----------------|
+| CARES_STATIC | Build the static library | Off |
+| CARES_SHARED | Build the shared library | On |
+| CARES_INSTALL | Hook in installation, useful to disable if chain building | On |
+| CARES_STATIC_PIC | Build the static library as position-independent | Off |
+| CARES_BUILD_TESTS | Build and run tests | Off |
+| CARES_BUILD_CONTAINER_TESTS | Build and run container tests (implies CARES_BUILD_TESTS, Linux only) | Off |
+| CARES_BUILD_TOOLS | Build tools | On |
+| CARES_SYMBOL_HIDING | Hide private symbols in shared libraries | Off |
+| CARES_THREADS | Build with thread-safety support | On |
Ninja
-----
Ninja is the next-generation build system meant for generators like CMake that
-heavily parallize builds. Its use is very similar to the normal build:
+heavily parallelize builds. Its use is very similar to the normal build:
```sh
cd /path/to/cmake/source
diff --git a/contrib/libs/c-ares/README.md b/contrib/libs/c-ares/README.md
index 40d3c08114..70aa67fce6 100644
--- a/contrib/libs/c-ares/README.md
+++ b/contrib/libs/c-ares/README.md
@@ -1,11 +1,12 @@
-c-ares
-======
+# [![c-ares logo](https://c-ares.org/art/c-ares-logo.svg)](https://c-ares.org/)
-[![Build Status](https://api.cirrus-ci.com/github/c-ares/c-ares.svg)](https://cirrus-ci.com/github/c-ares/c-ares)
+[![Build Status](https://api.cirrus-ci.com/github/c-ares/c-ares.svg?branch=main)](https://cirrus-ci.com/github/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/github/c-ares/c-ares/badge.svg)](https://coveralls.io/github/c-ares/c-ares)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/291/badge)](https://bestpractices.coreinfrastructure.org/projects/291)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/c-ares.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:c-ares)
+[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=c-ares_c-ares&metric=bugs)](https://sonarcloud.io/summary/new_code?id=c-ares_c-ares)
+[![Coverity Scan Status](https://scan.coverity.com/projects/c-ares/badge.svg)](https://scan.coverity.com/projects/c-ares)
This is c-ares, an asynchronous resolver library. It is intended for
applications which need to perform DNS queries without blocking, or need to
@@ -21,14 +22,13 @@ If you find bugs, correct flaws, have questions or have comments in general in
regard to c-ares (or by all means the original ares too), get in touch with us
on the c-ares mailing list: https://lists.haxx.se/listinfo/c-ares
-c-ares is distributed the MIT license.
+c-ares is distributed under the MIT license.
You'll find all c-ares details and news here:
https://c-ares.org/
-Notes for c-ares hackers
-------------------------
+## 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.
@@ -47,7 +47,7 @@ Notes for c-ares hackers
* 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
+ 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.
diff --git a/contrib/libs/c-ares/RELEASE-NOTES b/contrib/libs/c-ares/RELEASE-NOTES
deleted file mode 100644
index 169a39fcb3..0000000000
--- a/contrib/libs/c-ares/RELEASE-NOTES
+++ /dev/null
@@ -1,74 +0,0 @@
-c-ares version 1.20.1
-
-This release resolves a significant issue in the 1.20.0 release.
-
-Bug fixes:
- o Resolve use-after-free issue when TCP connection is terminated before a
- response is returned [17]
- o Reduce number of queries for a load test case to prevent overloading some
- build systems
- o Fix fuzz test build target [18]
-
-
-c-ares 1.20.0 notes below:
-
-This is a feature and bugfix release with some significant internal changes.
-
-Changes:
- o Update from 1989 MIT license text to modern MIT license text [1]
- o Remove acountry from built tools as nerd.dk is gone [3]
- o Add new ARES_OPT_UDP_MAX_QUERIES configuration option to limit the number of
- queries that can be made from a single ephemeral port [7]
- o Default per-query timeout has been reduced to 2s with a 3x retry count [8]
- o Modernization: start implementing some common data structures that are easy
- to use and hard to misuse. This will make code refactoring easier and remove
- some varied implementations in use. This change also makes ares_timeout()
- more efficient [9]
- o Use SPDX identifiers and a REUSE CI job to verify [12]
- o rand: add support for getrandom() [14]
-
-Bug fixes:
- o TCP back to back queries were broken [2]
- o Ensure queries for ares_getaddrinfo() are not requeued during destruction [4]
- o ares_getaddrinfo() should not retry other address classes if one address
- class has already been returned [5]
- o Avoid production ill-formed result when qualifying a name with the root
- domain [6]
- o Fix missing prefix for CMake generated libcares.pc [10]
- o DNS server ports will now be read from system configuration instead of
- defaulting to port 53 [11]
- o Remove some unreachable code [13]
- o Replace usages of sprintf with snprintf [15]
- o Fix Watcom instructions and update Windows URLs [16]
-
-Thanks go to these friendly people for their efforts and contributions:
- Alexey A Tikhonov (@alexey-tikhonov)
- Ben Noordhuis (@bnoordhuis)
- Brad House (@bradh352)
- @Chilledheart
- Daniel Stenberg (@bagder)
- Douglas R. Reno (@renodr)
- Jérôme Duval (@korli)
- Sam Morris (@yrro)
- Tim Wojtulewicz (@timwoj)
-(9 contributors)
-
-References to bug reports and discussions on issues:
- [1] = https://github.com/c-ares/c-ares/pull/556
- [2] = https://github.com/c-ares/c-ares/pull/552
- [3] = https://github.com/c-ares/c-ares/pull/554
- [4] = https://github.com/c-ares/c-ares/pull/553
- [5] = https://github.com/c-ares/c-ares/pull/551
- [6] = https://github.com/c-ares/c-ares/pull/546
- [7] = https://github.com/c-ares/c-ares/pull/549
- [8] = https://github.com/c-ares/c-ares/pull/542
- [9] = https://github.com/c-ares/c-ares/pull/540
- [10] = https://github.com/c-ares/c-ares/pull/530
- [11] = https://github.com/c-ares/c-ares/pull/534
- [12] = https://github.com/c-ares/c-ares/commit/c1b00c41
- [13] = https://github.com/c-ares/c-ares/pull/527
- [14] = https://github.com/c-ares/c-ares/pull/526
- [15] = https://github.com/c-ares/c-ares/pull/525
- [16] = https://github.com/c-ares/c-ares/pull/524
- [17] = https://github.com/c-ares/c-ares/pull/562
- [18] = https://github.com/c-ares/c-ares/pull/559
diff --git a/contrib/libs/c-ares/RELEASE-NOTES.md b/contrib/libs/c-ares/RELEASE-NOTES.md
new file mode 100644
index 0000000000..3a9b9dd9c3
--- /dev/null
+++ b/contrib/libs/c-ares/RELEASE-NOTES.md
@@ -0,0 +1,49 @@
+## c-ares version 1.28.1 - Mar 30 2024
+
+This release contains a fix for a single significant regression introduced
+in c-ares 1.28.0.
+
+* `ares_search()` and `ares_getaddrinfo()` resolution fails if no search domains
+ are specified. [Issue #737](https://github.com/c-ares/c-ares/issues/737)
+
+
+## c-ares version 1.28.0 - Mar 29 2024
+
+This is a feature and bugfix release.
+
+Features:
+
+* Emit warnings when deprecated c-ares functions are used. This can be
+ disabled by passing a compiler definition of `CARES_NO_DEPRECATED`. [PR #732](https://github.com/c-ares/c-ares/pull/732)
+* Add function `ares_search_dnsrec()` to search for records using the new DNS
+ record data structures. [PR #719](https://github.com/c-ares/c-ares/pull/719)
+* Rework internals to pass around `ares_dns_record_t` instead of binary data,
+ this introduces new public functions of `ares_query_dnsrec()` and
+ `ares_send_dnsrec()`. [PR #730](https://github.com/c-ares/c-ares/pull/730)
+
+Changes:
+
+* tests: when performing simulated queries, reduce timeouts to make tests run
+ faster
+* Replace configuration file parsers with memory-safe parser. [PR #725](https://github.com/c-ares/c-ares/pull/725)
+* Remove `acountry` completely, the manpage might still get installed otherwise. [Issue #718](https://github.com/c-ares/c-ares/pull/718)
+
+Bugfixes:
+
+* CMake: don't overwrite global required libraries/definitions/includes which
+ could cause build errors for projects chain building c-ares. [Issue #729](https://github.com/c-ares/c-ares/issues/729)
+* On some platforms, `netinet6/in6.h` is not included by `netinet/in.h`
+ and needs to be included separately. [PR #728](https://github.com/c-ares/c-ares/pull/728)
+* Fix a potential memory leak in `ares_init()`. [Issue #724](https://github.com/c-ares/c-ares/issues/724)
+* Some platforms don't have the `isascii()` function. Implement as a macro. [PR #721](https://github.com/c-ares/c-ares/pull/721)
+* CMake: Fix Chain building if CMAKE runtime paths not set
+* NDots configuration should allow a value of zero. [PR #735](https://github.com/c-ares/c-ares/pull/735)
+
+Thanks go to these friendly people for their efforts and contributions for this release:
+
+* Brad House (@bradh352)
+* Cristian Rodríguez (@crrodriguez)
+* Daniel Stenberg (@bagder)
+* Faraz (@farazrbx)
+* Faraz Fallahi (@fffaraz)
+* Oliver Welsh (@oliverwelsh)
diff --git a/contrib/libs/c-ares/include/ares.h b/contrib/libs/c-ares/include/ares.h
index ac8a22f0a6..2bbdcc9ec2 100644
--- a/contrib/libs/c-ares/include/ares.h
+++ b/contrib/libs/c-ares/include/ares.h
@@ -28,16 +28,16 @@
#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 */
+#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__)
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \
+ !defined(__SYMBIAN32__)
# define WIN32
#endif
@@ -47,13 +47,13 @@
libc5-based Linux systems. Only include it on system that are known to
require it! */
#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
- defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
- defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
- defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__)
-#include <sys/select.h>
+ defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
+ defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
+ defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__)
+# include <sys/select.h>
#endif
#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
-#include <sys/bsdskt.h>
+# include <sys/bsdskt.h>
#endif
#if defined(WATT32)
@@ -86,10 +86,10 @@
#endif
#if defined(ANDROID) || defined(__ANDROID__)
-#include <jni.h>
+# include <jni.h>
#endif
-#ifdef __cplusplus
+#ifdef __cplusplus
extern "C" {
#endif
@@ -97,74 +97,139 @@ extern "C" {
** 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)
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(__SYMBIAN32__)
+# ifdef CARES_STATICLIB
+# define CARES_EXTERN
# else
-# define CARES_EXTERN __declspec(dllimport)
+# ifdef CARES_BUILDING_LIBRARY
+# define CARES_EXTERN __declspec(dllexport)
+# else
+# define CARES_EXTERN __declspec(dllimport)
+# endif
# endif
-#elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING)
-# define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN
#else
-# define CARES_EXTERN
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define CARES_EXTERN __attribute__((visibility("default")))
+# elif defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 900
+# define CARES_EXTERN __attribute__((visibility("default")))
+# elif defined(__SUNPRO_C)
+# define CARES_EXTERN _global
+# else
+# define CARES_EXTERN
+# endif
#endif
+#ifdef __GNUC__
+# define CARES_GCC_VERSION \
+ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#else
+# define CARES_GCC_VERSION 0
+#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 */
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
-/* ares_library_init error codes */
-#define ARES_ELOADIPHLPAPI 22 /* introduced in 1.7.0 */
-#define ARES_EADDRGETNETWORKPARAMS 23 /* introduced in 1.7.0 */
+#if 1
+# define CARES_DEPRECATED
+# define CARES_DEPRECATED_FOR(f)
+#else
+# if CARES_GCC_VERSION >= 30200 || __has_attribute(__deprecated__)
+# define CARES_DEPRECATED __attribute__((__deprecated__))
+# else
+# define CARES_DEPRECATED
+# endif
-/* More error codes */
-#define ARES_ECANCELLED 24 /* introduced in 1.7.0 */
+# if CARES_GCC_VERSION >= 40500 || defined(__clang__)
+# define CARES_DEPRECATED_FOR(f) \
+ __attribute__((deprecated("Use " #f " instead")))
+# elif defined(_MSC_VER)
+# define CARES_DEPRECATED_FOR(f) __declspec(deprecated("Use " #f " instead"))
+# else
+# define CARES_DEPRECATED_FOR(f) CARES_DEPRECATED
+# endif
+#endif
-/* More ares_getaddrinfo error codes */
-#define ARES_ESERVICE 25 /* introduced in 1.?.0 */
+typedef enum {
+ ARES_SUCCESS = 0,
+
+ /* Server error codes (ARES_ENODATA indicates no relevant answer) */
+ ARES_ENODATA = 1,
+ ARES_EFORMERR = 2,
+ ARES_ESERVFAIL = 3,
+ ARES_ENOTFOUND = 4,
+ ARES_ENOTIMP = 5,
+ ARES_EREFUSED = 6,
+
+ /* Locally generated error codes */
+ ARES_EBADQUERY = 7,
+ ARES_EBADNAME = 8,
+ ARES_EBADFAMILY = 9,
+ ARES_EBADRESP = 10,
+ ARES_ECONNREFUSED = 11,
+ ARES_ETIMEOUT = 12,
+ ARES_EOF = 13,
+ ARES_EFILE = 14,
+ ARES_ENOMEM = 15,
+ ARES_EDESTRUCTION = 16,
+ ARES_EBADSTR = 17,
+
+ /* ares_getnameinfo error codes */
+ ARES_EBADFLAGS = 18,
+
+ /* ares_getaddrinfo error codes */
+ ARES_ENONAME = 19,
+ ARES_EBADHINTS = 20,
+
+ /* Uninitialized library error code */
+ ARES_ENOTINITIALIZED = 21, /* introduced in 1.7.0 */
+
+ /* ares_library_init error codes */
+ ARES_ELOADIPHLPAPI = 22, /* introduced in 1.7.0 */
+ ARES_EADDRGETNETWORKPARAMS = 23, /* introduced in 1.7.0 */
+
+ /* More error codes */
+ ARES_ECANCELLED = 24, /* introduced in 1.7.0 */
+
+ /* More ares_getaddrinfo error codes */
+ ARES_ESERVICE = 25, /* ares_getaddrinfo() was passed a text service name that
+ * is not recognized. introduced in 1.16.0 */
+
+ ARES_ENOSERVER = 26 /* No DNS servers were configured */
+} ares_status_t;
+
+typedef enum {
+ ARES_FALSE = 0,
+ ARES_TRUE = 1
+} ares_bool_t;
+
+/*! Values for ARES_OPT_EVENT_THREAD */
+typedef enum {
+ /*! Default (best choice) event system */
+ ARES_EVSYS_DEFAULT = 0,
+ /*! Win32 IOCP/AFD_POLL event system */
+ ARES_EVSYS_WIN32 = 1,
+ /*! Linux epoll */
+ ARES_EVSYS_EPOLL = 2,
+ /*! BSD/MacOS kqueue */
+ ARES_EVSYS_KQUEUE = 3,
+ /*! POSIX poll() */
+ ARES_EVSYS_POLL = 4,
+ /*! last fallback on Unix-like systems, select() */
+ ARES_EVSYS_SELECT = 5
+} ares_evsys_t;
/* Flag values */
-#define ARES_FLAG_USEVC (1 << 0)
-#define ARES_FLAG_PRIMARY (1 << 1)
-#define ARES_FLAG_IGNTC (1 << 2)
-#define ARES_FLAG_NORECURSE (1 << 3)
-#define ARES_FLAG_STAYOPEN (1 << 4)
-#define ARES_FLAG_NOSEARCH (1 << 5)
-#define ARES_FLAG_NOALIASES (1 << 6)
-#define ARES_FLAG_NOCHECKRESP (1 << 7)
-#define ARES_FLAG_EDNS (1 << 8)
+#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)
+#define ARES_FLAG_NO_DFLT_SVR (1 << 9)
/* Option mask values */
#define ARES_OPT_FLAGS (1 << 0)
@@ -188,55 +253,58 @@ extern "C" {
#define ARES_OPT_HOSTS_FILE (1 << 18)
#define ARES_OPT_UDP_MAX_QUERIES (1 << 19)
#define ARES_OPT_MAXTIMEOUTMS (1 << 20)
-#define ARES_OPT_JITTER (1 << 21)
+#define ARES_OPT_QUERY_CACHE (1 << 21)
+#define ARES_OPT_EVENT_THREAD (1 << 22)
+#define ARES_OPT_SERVER_FAILOVER (1 << 23)
/* 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)
+#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 (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)
+#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 (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)))
+#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)
+#define ARES_LIB_INIT_NONE (0)
+#define ARES_LIB_INIT_WIN32 (1 << 0)
+#define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32)
/*
@@ -244,23 +312,33 @@ extern "C" {
*/
#ifndef ares_socket_typedef
-#ifdef WIN32
+# ifdef WIN32
typedef SOCKET ares_socket_t;
-#define ARES_SOCKET_BAD INVALID_SOCKET
-#else
+# define ARES_SOCKET_BAD INVALID_SOCKET
+# else
typedef int ares_socket_t;
-#define ARES_SOCKET_BAD -1
-#endif
-#define ares_socket_typedef
+# 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);
+typedef void (*ares_sock_state_cb)(void *data, ares_socket_t socket_fd,
+ int readable, int writable);
struct apattern;
+/* Options controlling server failover behavior.
+ * The retry chance is the probability (1/N) by which we will retry a failed
+ * server instead of the best server when selecting a server to send queries
+ * to.
+ * The retry delay is the minimum time in milliseconds to wait between doing
+ * such retries (applied per-server).
+ */
+struct ares_server_failover_options {
+ unsigned short retry_chance;
+ size_t retry_delay;
+};
+
/* NOTE about the ares_options struct to users and developers.
This struct will remain looking like this. It will not be extended nor
@@ -279,30 +357,31 @@ struct apattern;
*/
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;
+ int flags;
+ int timeout; /* in seconds or milliseconds, depending on options */
+ int tries;
+ int ndots;
+ unsigned short udp_port; /* host byte order */
+ unsigned short tcp_port; /* host byte order */
+ int socket_send_buffer_size;
+ int socket_receive_buffer_size;
+ struct in_addr *servers;
+ int nservers;
+ char **domains;
+ int ndomains;
+ char *lookups;
ares_sock_state_cb sock_state_cb;
- void *sock_state_cb_data;
- struct apattern *sortlist;
- int nsort;
- int ednspsz;
- char *resolvconf_path;
- char *hosts_path;
- int udp_max_queries;
+ void *sock_state_cb_data;
+ struct apattern *sortlist;
+ int nsort;
+ int ednspsz;
+ char *resolvconf_path;
+ char *hosts_path;
+ int udp_max_queries;
+ int maxtimeout; /* in milliseconds */
+ unsigned int qcache_max_ttl; /* Maximum TTL for query cache, 0=disabled */
+ ares_evsys_t evsys;
+ struct ares_server_failover_options server_failover_opts;
};
struct hostent;
@@ -312,109 +391,129 @@ struct ares_channeldata;
struct ares_addrinfo;
struct ares_addrinfo_hints;
+/* Legacy typedef, don't use, you can't specify "const" */
typedef struct ares_channeldata *ares_channel;
-typedef void (*ares_callback)(void *arg,
- int status,
- int timeouts,
- unsigned char *abuf,
- int alen);
+/* Current main channel typedef */
+typedef struct ares_channeldata ares_channel_t;
-typedef void (*ares_host_callback)(void *arg,
- int status,
- int timeouts,
+/*
+ * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr
+ * struct below when ares itself was built, but many apps would use this
+ * private version since the header checked a HAVE_* define for it. Starting
+ * with 1.7.0 we always declare and use our own to stop relying on the
+ * system's one.
+ */
+struct ares_in6_addr {
+ union {
+ unsigned char _S6_u8[16];
+ } _S6_un;
+};
+
+struct ares_addr {
+ int family;
+
+ union {
+ struct in_addr addr4;
+ struct ares_in6_addr addr6;
+ } addr;
+};
+
+/* DNS record parser, writer, and helpers */
+#include "ares_dns_record.h"
+
+typedef void (*ares_callback)(void *arg, int status, int timeouts,
+ unsigned char *abuf, int alen);
+
+typedef void (*ares_callback_dnsrec)(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+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 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_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 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);
+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),
+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));
+ 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);
+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 int ares_library_initialized(void);
-CARES_EXTERN void ares_library_cleanup(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 CARES_DEPRECATED_FOR(ares_init_options) int ares_init(
+ ares_channel_t **channelptr);
+
+CARES_EXTERN int ares_init_options(ares_channel_t **channelptr,
+ const struct ares_options *options,
+ int optmask);
-CARES_EXTERN int ares_init_options(ares_channel *channelptr,
- struct ares_options *options,
- int optmask);
+CARES_EXTERN int ares_save_options(ares_channel_t *channel,
+ 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 void ares_destroy_options(struct ares_options *options);
+CARES_EXTERN int ares_dup(ares_channel_t **dest, ares_channel_t *src);
-CARES_EXTERN int ares_dup(ares_channel *dest,
- ares_channel src);
+CARES_EXTERN ares_status_t ares_reinit(ares_channel_t *channel);
-CARES_EXTERN void ares_destroy(ares_channel channel);
+CARES_EXTERN void ares_destroy(ares_channel_t *channel);
-CARES_EXTERN void ares_cancel(ares_channel channel);
+CARES_EXTERN void ares_cancel(ares_channel_t *channel);
/* These next 3 configure local binding for the out-going socket
* connection. Use these to specify source IP and/or network device
* on multi-homed systems.
*/
-CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip);
+CARES_EXTERN void ares_set_local_ip4(ares_channel_t *channel,
+ unsigned int local_ip);
/* local_ip6 should be 16 bytes in length */
-CARES_EXTERN void ares_set_local_ip6(ares_channel channel,
- const unsigned char* local_ip6);
+CARES_EXTERN void ares_set_local_ip6(ares_channel_t *channel,
+ const unsigned char *local_ip6);
/* local_dev_name should be null terminated. */
-CARES_EXTERN void ares_set_local_dev(ares_channel channel,
- const char* local_dev_name);
+CARES_EXTERN void ares_set_local_dev(ares_channel_t *channel,
+ const char *local_dev_name);
-CARES_EXTERN void ares_set_socket_callback(ares_channel channel,
- ares_sock_create_callback callback,
- void *user_data);
+CARES_EXTERN void ares_set_socket_callback(ares_channel_t *channel,
+ ares_sock_create_callback callback,
+ void *user_data);
-CARES_EXTERN void ares_set_socket_configure_callback(ares_channel channel,
- ares_sock_config_callback callback,
- void *user_data);
+CARES_EXTERN void ares_set_socket_configure_callback(
+ ares_channel_t *channel, ares_sock_config_callback callback, void *user_data);
-CARES_EXTERN int ares_set_sortlist(ares_channel channel,
- const char *sortstr);
+CARES_EXTERN int ares_set_sortlist(ares_channel_t *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_getaddrinfo(ares_channel_t *channel, const char *node,
+ const char *service,
+ const struct ares_addrinfo_hints *hints,
+ ares_addrinfo_callback callback, void *arg);
-CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai);
+CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo *ai);
/*
* Virtual function set to have user-managed socket IO.
@@ -425,124 +524,138 @@ CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai);
* 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 *);
+ 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,
+CARES_EXTERN void
+ ares_set_socket_functions(ares_channel_t *channel,
+ const struct ares_socket_functions *funcs,
+ void *user_data);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_send_dnsrec) void ares_send(
+ ares_channel_t *channel, const unsigned char *qbuf, int qlen,
+ ares_callback callback, void *arg);
+
+/*! Send a DNS query as an ares_dns_record_t with a callback containing the
+ * parsed DNS record.
+ *
+ * \param[in] channel Pointer to channel on which queries will be sent.
+ * \param[in] dnsrec DNS Record to send
+ * \param[in] callback Callback function invoked on completion or failure of
+ * the query sequence.
+ * \param[in] arg Additional argument passed to the callback function.
+ * \param[out] qid Query ID
+ * \return One of the c-ares status codes.
+ */
+CARES_EXTERN ares_status_t ares_send_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_query_dnsrec) void ares_query(
+ ares_channel_t *channel, const char *name, int dnsclass, int type,
+ ares_callback callback, void *arg);
+
+/*! Perform a DNS query with a callback containing the parsed DNS record.
+ *
+ * \param[in] channel Pointer to channel on which queries will be sent.
+ * \param[in] name Query name
+ * \param[in] dnsclass DNS Class
+ * \param[in] type DNS Record Type
+ * \param[in] callback Callback function invoked on completion or failure of
+ * the query sequence.
+ * \param[in] arg Additional argument passed to the callback function.
+ * \param[out] qid Query ID
+ * \return One of the c-ares status codes.
+ */
+CARES_EXTERN ares_status_t ares_query_dnsrec(ares_channel_t *channel,
+ const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_search_dnsrec) void ares_search(
+ ares_channel_t *channel, const char *name, int dnsclass, int type,
+ ares_callback callback, void *arg);
+
+/*! Search for a complete DNS message.
+ *
+ * \param[in] channel Pointer to channel on which queries will be sent.
+ * \param[in] dnsrec Pointer to initialized and filled DNS record object.
+ * \param[in] callback Callback function invoked on completion or failure of
+ * the query sequence.
+ * \param[in] arg Additional argument passed to the callback function.
+ * \return One of the c-ares status codes. In all cases, except
+ * ARES_EFORMERR due to misuse, this error code will also be sent
+ * to the provided callback.
+ */
+CARES_EXTERN ares_status_t ares_search_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_getaddrinfo) void ares_gethostbyname(
+ ares_channel_t *channel, const char *name, int family,
+ ares_host_callback callback, void *arg);
+
+CARES_EXTERN int ares_gethostbyname_file(ares_channel_t *channel,
+ const char *name, int family,
+ struct hostent **host);
+
+CARES_EXTERN void ares_gethostbyaddr(ares_channel_t *channel, const void *addr,
+ int addrlen, int family,
+ ares_host_callback callback, void *arg);
+
+CARES_EXTERN void ares_getnameinfo(ares_channel_t *channel,
const struct sockaddr *sa,
- ares_socklen_t salen,
- int flags,
- ares_nameinfo_callback callback,
- void *arg);
+ 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 CARES_DEPRECATED_FOR(
+ ARES_OPT_EVENT_THREAD or
+ ARES_OPT_SOCK_STATE_CB) int ares_fds(ares_channel_t *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 CARES_DEPRECATED_FOR(
+ ARES_OPT_EVENT_THREAD or
+ ARES_OPT_SOCK_STATE_CB) int ares_getsock(ares_channel_t *channel,
+ ares_socket_t *socks, int numsocks);
-CARES_EXTERN struct timeval *ares_timeout(ares_channel channel,
+CARES_EXTERN struct timeval *ares_timeout(ares_channel_t *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 CARES_DEPRECATED_FOR(ares_process_fd) void ares_process(
+ ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds);
+
+CARES_EXTERN void ares_process_fd(ares_channel_t *channel,
+ ares_socket_t read_fd,
+ ares_socket_t write_fd);
+
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_record_create) 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 CARES_DEPRECATED_FOR(ares_dns_record_create) 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,
+ 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;
-};
+ const unsigned char *abuf, int alen,
+ unsigned char **s, long *enclen);
struct ares_addrttl {
struct in_addr ipaddr;
@@ -551,47 +664,47 @@ struct ares_addrttl {
struct ares_addr6ttl {
struct ares_in6_addr ip6addr;
- int ttl;
+ int ttl;
};
struct ares_caa_reply {
- struct ares_caa_reply *next;
- int critical;
- unsigned char *property;
- size_t plength; /* plength excludes null termination */
- unsigned char *value;
- size_t length; /* length excludes null termination */
+ struct ares_caa_reply *next;
+ int critical;
+ unsigned char *property;
+ size_t plength; /* plength excludes null termination */
+ unsigned char *value;
+ size_t length; /* length excludes null termination */
};
struct ares_srv_reply {
- struct ares_srv_reply *next;
- char *host;
- unsigned short priority;
- unsigned short weight;
- unsigned short port;
+ struct ares_srv_reply *next;
+ char *host;
+ unsigned short priority;
+ unsigned short weight;
+ unsigned short port;
};
struct ares_mx_reply {
- struct ares_mx_reply *next;
- char *host;
- unsigned short priority;
+ struct ares_mx_reply *next;
+ char *host;
+ unsigned short priority;
};
struct ares_txt_reply {
- struct ares_txt_reply *next;
- unsigned char *txt;
- size_t length; /* length excludes null termination */
+ struct ares_txt_reply *next;
+ unsigned char *txt;
+ size_t length; /* length excludes null termination */
};
/* NOTE: This structure is a superset of ares_txt_reply
*/
struct ares_txt_ext {
- struct ares_txt_ext *next;
- unsigned char *txt;
- size_t length;
+ 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;
+ unsigned char record_start;
};
struct ares_naptr_reply {
@@ -615,11 +728,11 @@ struct ares_soa_reply {
};
struct ares_uri_reply {
- struct ares_uri_reply *next;
- unsigned short priority;
- unsigned short weight;
- char *uri;
- int ttl;
+ struct ares_uri_reply *next;
+ unsigned short priority;
+ unsigned short weight;
+ char *uri;
+ int ttl;
};
/*
@@ -669,72 +782,57 @@ struct ares_addrinfo_hints {
** 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 CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_aaaa_reply(
+ const unsigned char *abuf, int alen, struct hostent **host,
+ struct ares_addr6ttl *addrttls, int *naddrttls);
-CARES_EXTERN int ares_parse_caa_reply(const unsigned char* abuf,
- int alen,
- struct ares_caa_reply** caa_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_caa_reply(
+ const unsigned char *abuf, int alen, struct ares_caa_reply **caa_out);
-CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf,
- int alen,
- const void *addr,
- int addrlen,
- int family,
- struct hostent **host);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_ptr_reply(
+ const unsigned char *abuf, int alen, const void *addr, int addrlen,
+ int family, struct hostent **host);
-CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf,
- int alen,
- struct hostent **host);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) 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 CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_soa_reply(
+ const unsigned char *abuf, int alen, struct ares_soa_reply **soa_out);
-CARES_EXTERN int ares_parse_uri_reply(const unsigned char* abuf,
- int alen,
- struct ares_uri_reply** uri_out);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_dns_parse) int ares_parse_uri_reply(
+ const unsigned char *abuf, int alen, struct ares_uri_reply **uri_out);
-CARES_EXTERN void ares_free_string(void *str);
+CARES_EXTERN void ares_free_string(void *str);
-CARES_EXTERN void ares_free_hostent(struct hostent *host);
+CARES_EXTERN void ares_free_hostent(struct hostent *host);
-CARES_EXTERN void ares_free_data(void *dataptr);
+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;
+ int family;
+
union {
struct in_addr addr4;
struct ares_in6_addr addr6;
@@ -743,38 +841,73 @@ struct ares_addr_node {
struct ares_addr_port_node {
struct ares_addr_port_node *next;
- int family;
+ 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);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_set_servers_csv) int ares_set_servers(
+ ares_channel_t *channel, const struct ares_addr_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
+ CARES_DEPRECATED_FOR(ares_set_servers_ports_csv) int ares_set_servers_ports(
+ ares_channel_t *channel, const struct ares_addr_port_node *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);
+/* Incoming string format: host[:port][,host[:port]]... */
+CARES_EXTERN int ares_set_servers_csv(ares_channel_t *channel,
+ const char *servers);
+CARES_EXTERN int ares_set_servers_ports_csv(ares_channel_t *channel,
+ const char *servers);
+CARES_EXTERN char *ares_get_servers_csv(ares_channel_t *channel);
-CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst,
- ares_socklen_t size);
+CARES_EXTERN CARES_DEPRECATED_FOR(ares_get_servers_csv) int ares_get_servers(
+ ares_channel_t *channel, struct ares_addr_node **servers);
-CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst);
+CARES_EXTERN
+ CARES_DEPRECATED_FOR(ares_get_servers_ports_csv) int ares_get_servers_ports(
+ ares_channel_t *channel, struct ares_addr_port_node **servers);
+CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst,
+ ares_socklen_t size);
+
+CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst);
+
+/*! Whether or not the c-ares library was built with threadsafety
+ *
+ * \return ARES_TRUE if built with threadsafety, ARES_FALSE if not
+ */
+CARES_EXTERN ares_bool_t ares_threadsafety(void);
+
+
+/*! Block until notified that there are no longer any queries in queue, or
+ * the specified timeout has expired.
+ *
+ * \param[in] channel Initialized ares channel
+ * \param[in] timeout_ms Number of milliseconds to wait for the queue to be
+ * empty. -1 for Infinite.
+ * \return ARES_ENOTIMP if not built with threading support, ARES_ETIMEOUT
+ * if requested timeout expires, ARES_SUCCESS when queue is empty.
+ */
+CARES_EXTERN ares_status_t ares_queue_wait_empty(ares_channel_t *channel,
+ int timeout_ms);
+
+
+/*! Retrieve the total number of active queries pending answers from servers.
+ * Some c-ares requests may spawn multiple queries, such as ares_getaddrinfo()
+ * when using AF_UNSPEC, which will be reflected in this number.
+ *
+ * \param[in] channel Initialized ares channel
+ * \return Number of active queries to servers
+ */
+CARES_EXTERN size_t ares_queue_active_queries(ares_channel_t *channel);
-#ifdef __cplusplus
+#ifdef __cplusplus
}
#endif
diff --git a/contrib/libs/c-ares/include/ares_build-linux.h b/contrib/libs/c-ares/include/ares_build-linux.h
index 3d4d7aed9c..bf3692fbbe 100644
--- a/contrib/libs/c-ares/include/ares_build-linux.h
+++ b/contrib/libs/c-ares/include/ares_build-linux.h
@@ -12,7 +12,6 @@
* files. We need to include some dependent headers that may be system specific
* for C-Ares */
#define CARES_HAVE_SYS_TYPES_H
-#define CARES_HAVE_SYS_RANDOM_H
#define CARES_HAVE_SYS_SOCKET_H
/* #undef CARES_HAVE_WINDOWS_H */
/* #undef CARES_HAVE_WS2TCPIP_H */
@@ -25,10 +24,6 @@
# include <sys/types.h>
#endif
-#ifdef CARES_HAVE_SYS_RANDOM_H
-# include <sys/random.h>
-#endif
-
#ifdef CARES_HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
diff --git a/contrib/libs/c-ares/include/ares_dns.h b/contrib/libs/c-ares/include/ares_dns.h
index e49c3d26ab..46edbbbc52 100644
--- a/contrib/libs/c-ares/include/ares_dns.h
+++ b/contrib/libs/c-ares/include/ares_dns.h
@@ -40,84 +40,88 @@
* 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])))))
+#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__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)))
+#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)
+# 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)
+#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)
+#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)
+#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)
+#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)
+#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)
+#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/include/ares_dns_record.h b/contrib/libs/c-ares/include/ares_dns_record.h
new file mode 100644
index 0000000000..8d09bd0a46
--- /dev/null
+++ b/contrib/libs/c-ares/include/ares_dns_record.h
@@ -0,0 +1,1020 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES_DNS_RECORD_H
+#define __ARES_DNS_RECORD_H
+
+/* Include ares.h, not this file directly */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*! \addtogroup ares_dns_record DNS Record Handling
+ *
+ * This is a set of functions to create and manipulate DNS records.
+ *
+ * @{
+ */
+
+/*! DNS Record types handled by c-ares. Some record types may only be valid
+ * on requests (e.g. ARES_REC_TYPE_ANY), and some may only be valid on
+ * responses */
+typedef enum {
+ ARES_REC_TYPE_A = 1, /*!< Host address. */
+ ARES_REC_TYPE_NS = 2, /*!< Authoritative server. */
+ ARES_REC_TYPE_CNAME = 5, /*!< Canonical name. */
+ ARES_REC_TYPE_SOA = 6, /*!< Start of authority zone. */
+ ARES_REC_TYPE_PTR = 12, /*!< Domain name pointer. */
+ ARES_REC_TYPE_HINFO = 13, /*!< Host information. */
+ ARES_REC_TYPE_MX = 15, /*!< Mail routing information. */
+ ARES_REC_TYPE_TXT = 16, /*!< Text strings. */
+ ARES_REC_TYPE_AAAA = 28, /*!< RFC 3596. Ip6 Address. */
+ ARES_REC_TYPE_SRV = 33, /*!< RFC 2782. Server Selection. */
+ ARES_REC_TYPE_NAPTR = 35, /*!< RFC 3403. Naming Authority Pointer */
+ ARES_REC_TYPE_OPT = 41, /*!< RFC 6891. EDNS0 option (meta-RR) */
+
+ ARES_REC_TYPE_TLSA = 52, /*!< RFC 6698. DNS-Based Authentication of Named
+ * Entities (DANE) Transport Layer Security
+ * (TLS) Protocol: TLSA */
+ ARES_REC_TYPE_SVCB = 64, /*!< RFC 9460. General Purpose Service Binding */
+ ARES_REC_TYPE_HTTPS = 65, /*!< RFC 9460. Service Binding type for use with
+ * HTTPS */
+ ARES_REC_TYPE_ANY = 255, /*!< Wildcard match. Not response RR. */
+ ARES_REC_TYPE_URI = 256, /*!< RFC 7553. Uniform Resource Identifier */
+ ARES_REC_TYPE_CAA = 257, /*!< RFC 6844. Certification Authority
+ * Authorization. */
+ ARES_REC_TYPE_RAW_RR = 65536 /*!< Used as an indicator that the RR record
+ * is not parsed, but provided in wire
+ * format */
+} ares_dns_rec_type_t;
+
+/*! DNS Classes for requests and responses. */
+typedef enum {
+ ARES_CLASS_IN = 1, /*!< Internet */
+ ARES_CLASS_CHAOS = 3, /*!< CHAOS */
+ ARES_CLASS_HESOID = 4, /*!< Hesoid [Dyer 87] */
+ ARES_CLASS_NONE = 254, /*!< RFC 2136 */
+ ARES_CLASS_ANY = 255 /*!< Any class (requests only) */
+} ares_dns_class_t;
+
+/*! DNS RR Section type */
+typedef enum {
+ ARES_SECTION_ANSWER = 1, /*!< Answer section */
+ ARES_SECTION_AUTHORITY = 2, /*!< Authority section */
+ ARES_SECTION_ADDITIONAL = 3 /*!< Additional information section */
+} ares_dns_section_t;
+
+/*! DNS Header opcodes */
+typedef enum {
+ ARES_OPCODE_QUERY = 0, /*!< Standard query */
+ ARES_OPCODE_IQUERY = 1, /*!< Inverse query. Obsolete. */
+ ARES_OPCODE_STATUS = 2, /*!< Name server status query */
+ ARES_OPCODE_NOTIFY = 4, /*!< Zone change notification (RFC 1996) */
+ ARES_OPCODE_UPDATE = 5, /*!< Zone update message (RFC2136) */
+} ares_dns_opcode_t;
+
+/*! DNS Header flags */
+typedef enum {
+ ARES_FLAG_QR = 1 << 0, /*!< QR. If set, is a response */
+ ARES_FLAG_AA = 1 << 1, /*!< Authoritative Answer. If set, is authoritative */
+ ARES_FLAG_TC = 1 << 2, /*!< Truncation. If set, is truncated response */
+ ARES_FLAG_RD = 1 << 3, /*!< Recursion Desired. If set, recursion is desired */
+ ARES_FLAG_RA = 1 << 4, /*!< Recursion Available. If set, server supports
+ * recursion */
+ ARES_FLAG_AD = 1 << 5, /*!< RFC 2065. Authentic Data bit indicates in a
+ * response that the data included has been verified by
+ * the server providing it */
+ ARES_FLAG_CD = 1 << 6, /*!< RFC 2065. Checking Disabled bit indicates in a
+ * query that non-verified data is acceptable to the
+ * resolver sending the query. */
+} ares_dns_flags_t;
+
+/*! DNS Response Codes from server */
+typedef enum {
+ ARES_RCODE_NOERROR = 0, /*!< Success */
+ ARES_RCODE_FORMERR = 1, /*!< Format error. The name server was unable
+ * to interpret the query. */
+ ARES_RCODE_SERVFAIL = 2, /*!< Server Failure. The name server was
+ * unable to process this query due to a
+ * problem with the nameserver */
+ ARES_RCODE_NXDOMAIN = 3, /*!< Name Error. Meaningful only for
+ * responses from an authoritative name
+ * server, this code signifies that the
+ * domain name referenced in the query does
+ * not exist. */
+ ARES_RCODE_NOTIMP = 4, /*!< Not implemented. The name server does
+ * not support the requested kind of
+ * query */
+ ARES_RCODE_REFUSED = 5, /*!< Refused. The name server refuses to
+ * perform the specified operation for
+ * policy reasons. */
+ ARES_RCODE_YXDOMAIN = 6, /*!< RFC 2136. Some name that ought not to
+ * exist, does exist. */
+ ARES_RCODE_YXRRSET = 7, /*!< RFC 2136. Some RRset that ought to not
+ * exist, does exist. */
+ ARES_RCODE_NXRRSET = 8, /*!< RFC 2136. Some RRset that ought to exist,
+ * does not exist. */
+ ARES_RCODE_NOTAUTH = 9, /*!< RFC 2136. The server is not authoritative
+ * for the zone named in the Zone section.
+ */
+ ARES_RCODE_NOTZONE = 10, /*!< RFC 2136. A name used in the Prerequisite
+ * or Update Section is not within the zone
+ * denoted by the Zone Section. */
+ ARES_RCODE_DSOTYPEI = 11, /*!< RFC 8409. DSO-TYPE Not implemented */
+ ARES_RCODE_BADSIG = 16, /*!< RFC 8945. TSIG Signature Failure */
+ ARES_RCODE_BADKEY = 17, /*!< RFC 8945. Key not recognized. */
+ ARES_RCODE_BADTIME = 18, /*!< RFC 8945. Signature out of time window. */
+ ARES_RCODE_BADMODE = 19, /*!< RFC 2930. Bad TKEY Mode */
+ ARES_RCODE_BADNAME = 20, /*!< RFC 2930. Duplicate Key Name */
+ ARES_RCODE_BADALG = 21, /*!< RFC 2930. Algorithm not supported */
+ ARES_RCODE_BADTRUNC = 22, /*!< RFC 8945. Bad Truncation */
+ ARES_RCODE_BADCOOKIE = 23, /*!< RVC 7973. Bad/missing Server Cookie */
+} ares_dns_rcode_t;
+
+/*! Data types used */
+typedef enum {
+ ARES_DATATYPE_INADDR = 1, /*!< struct in_addr * type */
+ ARES_DATATYPE_INADDR6 = 2, /*!< struct ares_in6_addr * type */
+ ARES_DATATYPE_U8 = 3, /*!< 8bit unsigned integer */
+ ARES_DATATYPE_U16 = 4, /*!< 16bit unsigned integer */
+ ARES_DATATYPE_U32 = 5, /*!< 32bit unsigned integer */
+ ARES_DATATYPE_NAME = 6, /*!< Null-terminated string of a domain name */
+ ARES_DATATYPE_STR = 7, /*!< Null-terminated string */
+ ARES_DATATYPE_BIN = 8, /*!< Binary data */
+ ARES_DATATYPE_BINP = 9, /*!< Officially defined as binary data, but likely
+ * printable. Guaranteed to have a NULL
+ * terminator for convenience (not included in
+ * length) */
+ ARES_DATATYPE_OPT = 10, /*!< Array of options. 16bit identifier, BIN
+ * data. */
+} ares_dns_datatype_t;
+
+/*! Keys used for all RR Types. We take the record type and multiply by 100
+ * to ensure we have a proper offset between keys so we can keep these sorted
+ */
+typedef enum {
+ /*! A Record. Address. Datatype: INADDR */
+ ARES_RR_A_ADDR = (ARES_REC_TYPE_A * 100) + 1,
+ /*! NS Record. Name. Datatype: NAME */
+ ARES_RR_NS_NSDNAME = (ARES_REC_TYPE_NS * 100) + 1,
+ /*! CNAME Record. CName. Datatype: NAME */
+ ARES_RR_CNAME_CNAME = (ARES_REC_TYPE_CNAME * 100) + 1,
+ /*! SOA Record. MNAME, Primary Source of Data. Datatype: NAME */
+ ARES_RR_SOA_MNAME = (ARES_REC_TYPE_SOA * 100) + 1,
+ /*! SOA Record. RNAME, Mailbox of person responsible. Datatype: NAME */
+ ARES_RR_SOA_RNAME = (ARES_REC_TYPE_SOA * 100) + 2,
+ /*! SOA Record. Serial, version. Datatype: U32 */
+ ARES_RR_SOA_SERIAL = (ARES_REC_TYPE_SOA * 100) + 3,
+ /*! SOA Record. Refresh, zone refersh interval. Datatype: U32 */
+ ARES_RR_SOA_REFRESH = (ARES_REC_TYPE_SOA * 100) + 4,
+ /*! SOA Record. Retry, failed refresh retry interval. Datatype: U32 */
+ ARES_RR_SOA_RETRY = (ARES_REC_TYPE_SOA * 100) + 5,
+ /*! SOA Record. Expire, upper limit on authority. Datatype: U32 */
+ ARES_RR_SOA_EXPIRE = (ARES_REC_TYPE_SOA * 100) + 6,
+ /*! SOA Record. Minimum, RR TTL. Datatype: U32 */
+ ARES_RR_SOA_MINIMUM = (ARES_REC_TYPE_SOA * 100) + 7,
+ /*! PTR Record. DNAME, pointer domain. Datatype: NAME */
+ ARES_RR_PTR_DNAME = (ARES_REC_TYPE_PTR * 100) + 1,
+ /*! HINFO Record. CPU. Datatype: STR */
+ ARES_RR_HINFO_CPU = (ARES_REC_TYPE_HINFO * 100) + 1,
+ /*! HINFO Record. OS. Datatype: STR */
+ ARES_RR_HINFO_OS = (ARES_REC_TYPE_HINFO * 100) + 2,
+ /*! MX Record. Preference. Datatype: U16 */
+ ARES_RR_MX_PREFERENCE = (ARES_REC_TYPE_MX * 100) + 1,
+ /*! MX Record. Exchange, domain. Datatype: NAME */
+ ARES_RR_MX_EXCHANGE = (ARES_REC_TYPE_MX * 100) + 2,
+ /*! TXT Record. Data. Datatype: BINP */
+ ARES_RR_TXT_DATA = (ARES_REC_TYPE_TXT * 100) + 1,
+ /*! AAAA Record. Address. Datatype: INADDR6 */
+ ARES_RR_AAAA_ADDR = (ARES_REC_TYPE_AAAA * 100) + 1,
+ /*! SRV Record. Priority. Datatype: U16 */
+ ARES_RR_SRV_PRIORITY = (ARES_REC_TYPE_SRV * 100) + 2,
+ /*! SRV Record. Weight. Datatype: U16 */
+ ARES_RR_SRV_WEIGHT = (ARES_REC_TYPE_SRV * 100) + 3,
+ /*! SRV Record. Port. Datatype: U16 */
+ ARES_RR_SRV_PORT = (ARES_REC_TYPE_SRV * 100) + 4,
+ /*! SRV Record. Target domain. Datatype: NAME */
+ ARES_RR_SRV_TARGET = (ARES_REC_TYPE_SRV * 100) + 5,
+ /*! NAPTR Record. Order. Datatype: U16 */
+ ARES_RR_NAPTR_ORDER = (ARES_REC_TYPE_NAPTR * 100) + 1,
+ /*! NAPTR Record. Preference. Datatype: U16 */
+ ARES_RR_NAPTR_PREFERENCE = (ARES_REC_TYPE_NAPTR * 100) + 2,
+ /*! NAPTR Record. Flags. Datatype: STR */
+ ARES_RR_NAPTR_FLAGS = (ARES_REC_TYPE_NAPTR * 100) + 3,
+ /*! NAPTR Record. Services. Datatype: STR */
+ ARES_RR_NAPTR_SERVICES = (ARES_REC_TYPE_NAPTR * 100) + 4,
+ /*! NAPTR Record. Regexp. Datatype: STR */
+ ARES_RR_NAPTR_REGEXP = (ARES_REC_TYPE_NAPTR * 100) + 5,
+ /*! NAPTR Record. Replacement. Datatype: NAME */
+ ARES_RR_NAPTR_REPLACEMENT = (ARES_REC_TYPE_NAPTR * 100) + 6,
+ /*! OPT Record. UDP Size. Datatype: U16 */
+ ARES_RR_OPT_UDP_SIZE = (ARES_REC_TYPE_OPT * 100) + 1,
+ /*! OPT Record. Version. Datatype: U8 */
+ ARES_RR_OPT_VERSION = (ARES_REC_TYPE_OPT * 100) + 3,
+ /*! OPT Record. Flags. Datatype: U16 */
+ ARES_RR_OPT_FLAGS = (ARES_REC_TYPE_OPT * 100) + 4,
+ /*! OPT Record. Options. Datatype: OPT */
+ ARES_RR_OPT_OPTIONS = (ARES_REC_TYPE_OPT * 100) + 5,
+ /*! TLSA Record. Certificate Usage. Datatype: U8 */
+ ARES_RR_TLSA_CERT_USAGE = (ARES_REC_TYPE_TLSA * 100) + 1,
+ /*! TLSA Record. Selector. Datatype: U8 */
+ ARES_RR_TLSA_SELECTOR = (ARES_REC_TYPE_TLSA * 100) + 2,
+ /*! TLSA Record. Matching Type. Datatype: U8 */
+ ARES_RR_TLSA_MATCH = (ARES_REC_TYPE_TLSA * 100) + 3,
+ /*! TLSA Record. Certificate Association Data. Datatype: BIN */
+ ARES_RR_TLSA_DATA = (ARES_REC_TYPE_TLSA * 100) + 4,
+ /*! SVCB Record. SvcPriority. Datatype: U16 */
+ ARES_RR_SVCB_PRIORITY = (ARES_REC_TYPE_SVCB * 100) + 1,
+ /*! SVCB Record. TargetName. Datatype: NAME */
+ ARES_RR_SVCB_TARGET = (ARES_REC_TYPE_SVCB * 100) + 2,
+ /*! SVCB Record. SvcParams. Datatype: OPT */
+ ARES_RR_SVCB_PARAMS = (ARES_REC_TYPE_SVCB * 100) + 3,
+ /*! HTTPS Record. SvcPriority. Datatype: U16 */
+ ARES_RR_HTTPS_PRIORITY = (ARES_REC_TYPE_HTTPS * 100) + 1,
+ /*! HTTPS Record. TargetName. Datatype: NAME */
+ ARES_RR_HTTPS_TARGET = (ARES_REC_TYPE_HTTPS * 100) + 2,
+ /*! HTTPS Record. SvcParams. Datatype: OPT */
+ ARES_RR_HTTPS_PARAMS = (ARES_REC_TYPE_HTTPS * 100) + 3,
+ /*! URI Record. Priority. Datatype: U16 */
+ ARES_RR_URI_PRIORITY = (ARES_REC_TYPE_URI * 100) + 1,
+ /*! URI Record. Weight. Datatype: U16 */
+ ARES_RR_URI_WEIGHT = (ARES_REC_TYPE_URI * 100) + 2,
+ /*! URI Record. Target domain. Datatype: NAME */
+ ARES_RR_URI_TARGET = (ARES_REC_TYPE_URI * 100) + 3,
+ /*! CAA Record. Critical flag. Datatype: U8 */
+ ARES_RR_CAA_CRITICAL = (ARES_REC_TYPE_CAA * 100) + 1,
+ /*! CAA Record. Tag/Property. Datatype: STR */
+ ARES_RR_CAA_TAG = (ARES_REC_TYPE_CAA * 100) + 2,
+ /*! CAA Record. Value. Datatype: BINP */
+ ARES_RR_CAA_VALUE = (ARES_REC_TYPE_CAA * 100) + 3,
+ /*! RAW Record. RR Type. Datatype: U16 */
+ ARES_RR_RAW_RR_TYPE = (ARES_REC_TYPE_RAW_RR * 100) + 1,
+ /*! RAW Record. RR Data. Datatype: BIN */
+ ARES_RR_RAW_RR_DATA = (ARES_REC_TYPE_RAW_RR * 100) + 2,
+} ares_dns_rr_key_t;
+
+/*! TLSA Record ARES_RR_TLSA_CERT_USAGE known values */
+typedef enum {
+ /*! Certificate Usage 0. CA Constraint. */
+ ARES_TLSA_USAGE_CA = 0,
+ /*! Certificate Usage 1. Service Certificate Constraint. */
+ ARES_TLSA_USAGE_SERVICE = 1,
+ /*! Certificate Usage 2. Trust Anchor Assertion. */
+ ARES_TLSA_USAGE_TRUSTANCHOR = 2,
+ /*! Certificate Usage 3. Domain-issued certificate. */
+ ARES_TLSA_USAGE_DOMAIN = 3
+} ares_tlsa_usage_t;
+
+/*! TLSA Record ARES_RR_TLSA_SELECTOR known values */
+typedef enum {
+ /*! Full Certificate */
+ ARES_TLSA_SELECTOR_FULL = 0,
+ /*! DER-encoded SubjectPublicKeyInfo */
+ ARES_TLSA_SELECTOR_SUBJPUBKEYINFO = 1
+} ares_tlsa_selector_t;
+
+/*! TLSA Record ARES_RR_TLSA_MATCH known values */
+typedef enum {
+ /*! Exact match */
+ ARES_TLSA_MATCH_EXACT = 0,
+ /*! Sha256 match */
+ ARES_TLSA_MATCH_SHA256 = 1,
+ /*! Sha512 match */
+ ARES_TLSA_MATCH_SHA512 = 2
+} ares_tlsa_match_t;
+
+/*! SVCB (and HTTPS) RR known parameters */
+typedef enum {
+ /*! Mandatory keys in this RR (RFC 9460 Section 8) */
+ ARES_SVCB_PARAM_MANDATORY = 0,
+ /*! Additional supported protocols (RFC 9460 Section 7.1) */
+ ARES_SVCB_PARAM_ALPN = 1,
+ /*! No support for default protocol (RFC 9460 Section 7.1) */
+ ARES_SVCB_PARAM_NO_DEFAULT_ALPN = 2,
+ /*! Port for alternative endpoint (RFC 9460 Section 7.2) */
+ ARES_SVCB_PARAM_PORT = 3,
+ /*! IPv4 address hints (RFC 9460 Section 7.3) */
+ ARES_SVCB_PARAM_IPV4HINT = 4,
+ /*! RESERVED (held for Encrypted ClientHello) */
+ ARES_SVCB_PARAM_ECH = 5,
+ /*! IPv6 address hints (RFC 9460 Section 7.3) */
+ ARES_SVCB_PARAM_IPV6HINT = 6
+} ares_svcb_param_t;
+
+/*! OPT RR known parameters */
+typedef enum {
+ /*! RFC 8764. Apple's DNS Long-Lived Queries Protocol */
+ ARES_OPT_PARAM_LLQ = 1,
+ /*! http://files.dns-sd.org/draft-sekar-dns-ul.txt: Update Lease */
+ ARES_OPT_PARAM_UL = 2,
+ /*! RFC 5001. Name Server Identification */
+ ARES_OPT_PARAM_NSID = 3,
+ /*! RFC 6975. DNSSEC Algorithm Understood */
+ ARES_OPT_PARAM_DAU = 5,
+ /*! RFC 6975. DS Hash Understood */
+ ARES_OPT_PARAM_DHU = 6,
+ /*! RFC 6975. NSEC3 Hash Understood */
+ ARES_OPT_PARAM_N3U = 7,
+ /*! RFC 7871. Client Subnet */
+ ARES_OPT_PARAM_EDNS_CLIENT_SUBNET = 8,
+ /*! RFC 7314. Expire Timer */
+ ARES_OPT_PARAM_EDNS_EXPIRE = 9,
+ /*! RFC 7873. Client and Server Cookies */
+ ARES_OPT_PARAM_COOKIE = 10,
+ /*! RFC 7828. TCP Keepalive timeout */
+ ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE = 11,
+ /*! RFC 7830. Padding */
+ ARES_OPT_PARAM_PADDING = 12,
+ /*! RFC 7901. Chain query requests */
+ ARES_OPT_PARAM_CHAIN = 13,
+ /*! RFC 8145. Signaling Trust Anchor Knowledge in DNSSEC */
+ ARES_OPT_PARAM_EDNS_KEY_TAG = 14,
+ /*! RFC 8914. Extended ERROR code and message */
+ ARES_OPT_PARAM_EXTENDED_DNS_ERROR = 15,
+} ares_opt_param_t;
+
+/*! Data type for option records for keys like ARES_RR_OPT_OPTIONS and
+ * ARES_RR_HTTPS_PARAMS returned by ares_dns_opt_get_datatype() */
+typedef enum {
+ /*! No value allowed for this option */
+ ARES_OPT_DATATYPE_NONE = 1,
+ /*! List of strings, each prefixed with a single octet representing the length
+ */
+ ARES_OPT_DATATYPE_STR_LIST = 2,
+ /*! List of 8bit integers, concatenated */
+ ARES_OPT_DATATYPE_U8_LIST = 3,
+ /*! 16bit integer in network byte order */
+ ARES_OPT_DATATYPE_U16 = 4,
+ /*! list of 16bit integer in network byte order, concatenated. */
+ ARES_OPT_DATATYPE_U16_LIST = 5,
+ /*! 32bit integer in network byte order */
+ ARES_OPT_DATATYPE_U32 = 6,
+ /*! list 32bit integer in network byte order, concatenated */
+ ARES_OPT_DATATYPE_U32_LIST = 7,
+ /*! List of ipv4 addresses in network byte order, concatenated */
+ ARES_OPT_DATATYPE_INADDR4_LIST = 8,
+ /*! List of ipv6 addresses in network byte order, concatenated */
+ ARES_OPT_DATATYPE_INADDR6_LIST = 9,
+ /*! Binary Data */
+ ARES_OPT_DATATYPE_BIN = 10,
+ /*! DNS Domain Name Format */
+ ARES_OPT_DATATYPE_NAME = 11
+} ares_dns_opt_datatype_t;
+
+/*! Data type for flags to ares_dns_parse() */
+typedef enum {
+ /*! Parse Answers from RFC 1035 that allow name compression as RAW */
+ ARES_DNS_PARSE_AN_BASE_RAW = 1 << 0,
+ /*! Parse Authority from RFC 1035 that allow name compression as RAW */
+ ARES_DNS_PARSE_NS_BASE_RAW = 1 << 1,
+ /*! Parse Additional from RFC 1035 that allow name compression as RAW */
+ ARES_DNS_PARSE_AR_BASE_RAW = 1 << 2,
+ /*! Parse Answers from later RFCs (no name compression) RAW */
+ ARES_DNS_PARSE_AN_EXT_RAW = 1 << 3,
+ /*! Parse Authority from later RFCs (no name compression) as RAW */
+ ARES_DNS_PARSE_NS_EXT_RAW = 1 << 4,
+ /*! Parse Additional from later RFCs (no name compression) as RAW */
+ ARES_DNS_PARSE_AR_EXT_RAW = 1 << 5
+} ares_dns_parse_flags_t;
+
+/*! String representation of DNS Record Type
+ *
+ * \param[in] type DNS Record Type
+ * \return string
+ */
+CARES_EXTERN const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type);
+
+/*! String representation of DNS Class
+ *
+ * \param[in] qclass DNS Class
+ * \return string
+ */
+CARES_EXTERN const char *ares_dns_class_tostr(ares_dns_class_t qclass);
+
+/*! String representation of DNS OpCode
+ *
+ * \param[in] opcode DNS OpCode
+ * \return string
+ */
+CARES_EXTERN const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode);
+
+/*! String representation of DNS Resource Record Parameter
+ *
+ * \param[in] key DNS Resource Record parameter
+ * \return string
+ */
+CARES_EXTERN const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key);
+
+/*! String representation of DNS Resource Record section
+ *
+ * \param[in] section Section
+ * \return string
+ */
+CARES_EXTERN const char *ares_dns_section_tostr(ares_dns_section_t section);
+
+/*! Convert DNS class name as string to ares_dns_class_t
+ *
+ * \param[out] qclass Pointer passed by reference to write class
+ * \param[in] str String to convert
+ * \return ARES_TRUE on success
+ */
+CARES_EXTERN ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass,
+ const char *str);
+
+/*! Convert DNS record type as string to ares_dns_rec_type_t
+ *
+ * \param[out] qtype Pointer passed by reference to write record type
+ * \param[in] str String to convert
+ * \return ARES_TRUE on success
+ */
+CARES_EXTERN ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype,
+ const char *str);
+
+
+/*! Convert DNS response code as string to from ares_dns_rcode_t
+ *
+ * \param[in] rcode Response code to convert
+ * \return ARES_TRUE on success
+ */
+CARES_EXTERN const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode);
+
+/*! Convert any valid ip address (ipv4 or ipv6) into struct ares_addr and
+ * return the starting pointer of the network byte order address and the
+ * length of the address (4 or 16).
+ *
+ * \param[in] ipaddr ASCII string form of the ip address
+ * \param[in,out] addr Must set "family" member to one of AF_UNSPEC,
+ * AF_INET, AF_INET6 on input.
+ * \param[out] out_len Length of binary form address
+ * \return Pointer to start of binary address or NULL on error.
+ */
+CARES_EXTERN const void *ares_dns_pton(const char *ipaddr,
+ struct ares_addr *addr, size_t *out_len);
+
+/*! Convert an ip address into the PTR format for in-addr.arpa or in6.arpa
+ *
+ * \param[in] addr properly filled address structure
+ * \return String representing PTR, use ares_free_string() to free
+ */
+CARES_EXTERN char *ares_dns_addr_to_ptr(const struct ares_addr *addr);
+
+
+/*! The options/parameters extensions to some RRs can be somewhat opaque, this
+ * is a helper to return the best match for a datatype for interpreting the
+ * option record.
+ *
+ * \param[in] key Key associated with options/parameters
+ * \param[in] opt Option Key/Parameter
+ * \return Datatype
+ */
+CARES_EXTERN ares_dns_opt_datatype_t
+ ares_dns_opt_get_datatype(ares_dns_rr_key_t key, unsigned short opt);
+
+/*! The options/parameters extensions to some RRs can be somewhat opaque, this
+ * is a helper to return the name if the option is known.
+ *
+ * \param[in] key Key associated with options/parameters
+ * \param[in] opt Option Key/Parameter
+ * \return name, or NULL if not known.
+ */
+CARES_EXTERN const char *ares_dns_opt_get_name(ares_dns_rr_key_t key,
+ unsigned short opt);
+
+
+/*! Retrieve a list of Resource Record keys that can be set or retrieved for
+ * the Resource record type.
+ *
+ * \param[in] type Record Type
+ * \param[out] cnt Number of keys returned
+ * \return array of keys associated with Resource Record
+ */
+CARES_EXTERN const ares_dns_rr_key_t *
+ ares_dns_rr_get_keys(ares_dns_rec_type_t type, size_t *cnt);
+
+/*! Retrieve the datatype associated with a Resource Record key.
+ *
+ * \param[in] key Resource Record Key
+ * \return datatype
+ */
+CARES_EXTERN ares_dns_datatype_t
+ ares_dns_rr_key_datatype(ares_dns_rr_key_t key);
+
+/*! Retrieve the DNS Resource Record type associated with a Resource Record key.
+ *
+ * \param[in] key Resource Record Key
+ * \return DNS Resource Record Type
+ */
+CARES_EXTERN ares_dns_rec_type_t
+ ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key);
+
+/*! Opaque data type representing a DNS RR (Resource Record) */
+struct ares_dns_rr;
+
+/*! Typedef for opaque data type representing a DNS RR (Resource Record) */
+typedef struct ares_dns_rr ares_dns_rr_t;
+
+/*! Opaque data type representing a DNS Query Data QD Packet */
+struct ares_dns_qd;
+
+/*! Typedef for opaque data type representing a DNS Query Data QD Packet */
+typedef struct ares_dns_qd ares_dns_qd_t;
+
+/*! Opaque data type representing a DNS Packet */
+struct ares_dns_record;
+
+/*! Typedef for opaque data type representing a DNS Packet */
+typedef struct ares_dns_record ares_dns_record_t;
+
+
+/*! Create a new DNS record object
+ *
+ * \param[out] dnsrec Pointer passed by reference for a newly allocated
+ * record object. Must be ares_dns_record_destroy()'d by
+ * caller.
+ * \param[in] id DNS Query ID. If structuring a new query to be sent
+ * with ares_send(), this value should be zero.
+ * \param[in] flags DNS Flags from \ares_dns_flags_t
+ * \param[in] opcode DNS OpCode (typically ARES_OPCODE_QUERY)
+ * \param[in] rcode DNS RCode
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec,
+ unsigned short id,
+ unsigned short flags,
+ ares_dns_opcode_t opcode,
+ ares_dns_rcode_t rcode);
+
+/*! Destroy a DNS record object
+ *
+ * \param[in] dnsrec Initialized record object
+ */
+CARES_EXTERN void ares_dns_record_destroy(ares_dns_record_t *dnsrec);
+
+/*! Get the DNS Query ID
+ *
+ * \param[in] dnsrec Initialized record object
+ * \return DNS query id
+ */
+CARES_EXTERN unsigned short
+ ares_dns_record_get_id(const ares_dns_record_t *dnsrec);
+
+/*! Get the DNS Record Flags
+ *
+ * \param[in] dnsrec Initialized record object
+ * \return One or more \ares_dns_flags_t
+ */
+CARES_EXTERN unsigned short
+ ares_dns_record_get_flags(const ares_dns_record_t *dnsrec);
+
+/*! Get the DNS Record OpCode
+ *
+ * \param[in] dnsrec Initialized record object
+ * \return opcode
+ */
+CARES_EXTERN ares_dns_opcode_t
+ ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec);
+
+/*! Get the DNS Record RCode
+ *
+ * \param[in] dnsrec Initialized record object
+ * \return rcode
+ */
+CARES_EXTERN ares_dns_rcode_t
+ ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec);
+
+/*! Add a query to the DNS Record. Typically a record will have only 1
+ * query. Most DNS servers will reject queries with more than 1 question.
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] name Name/Hostname of request
+ * \param[in] qtype Type of query
+ * \param[in] qclass Class of query (typically ARES_CLASS_IN)
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec,
+ const char *name,
+ ares_dns_rec_type_t qtype,
+ ares_dns_class_t qclass);
+
+/*! Replace the question name with a new name. This may be used when performing
+ * a search with aliases.
+ *
+ * Note that this will invalidate the name pointer returned from
+ * ares_dns_record_query_get().
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] idx Index of question (typically 0)
+ * \param[in] name Name to use as replacement.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_query_set_name(
+ ares_dns_record_t *dnsrec, size_t idx, const char *name);
+
+
+/*! Replace the question type with a different type. This may be used when
+ * needing to query more than one address class (e.g. A and AAAA)
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] idx Index of question (typically 0)
+ * \param[in] qtype Record Type to use as replacement.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_query_set_type(
+ ares_dns_record_t *dnsrec, size_t idx, ares_dns_rec_type_t qtype);
+
+/*! Get the count of queries in the DNS Record
+ *
+ * \param[in] dnsrec Initialized record object
+ * \return count of queries
+ */
+CARES_EXTERN size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec);
+
+/*! Get the data about the query at the provided index.
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] idx Index of query
+ * \param[out] name Optional. Returns name, may pass NULL if not desired.
+ * This pointer will be invalided by any call to
+ * ares_dns_record_query_set_name().
+ * \param[out] qtype Optional. Returns record type, may pass NULL.
+ * \param[out] qclass Optional. Returns class, may pass NULL.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_query_get(
+ const ares_dns_record_t *dnsrec, size_t idx, const char **name,
+ ares_dns_rec_type_t *qtype, ares_dns_class_t *qclass);
+
+/*! Get the count of Resource Records in the provided section
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] sect Section. ARES_SECTION_ANSWER is most used.
+ * \return count of resource records.
+ */
+CARES_EXTERN size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect);
+
+
+/*! Add a Resource Record to the DNS Record.
+ *
+ * \param[out] rr_out Pointer to created resource record. This pointer
+ * is owned by the DNS record itself, this is just made
+ * available to facilitate adding RR-specific fields.
+ * \param[in] dnsrec Initialized record object
+ * \param[in] sect Section to add resource record to
+ * \param[in] name Resource Record name/hostname
+ * \param[in] type Record Type
+ * \param[in] rclass Class
+ * \param[in] ttl TTL
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_record_rr_add(
+ ares_dns_rr_t **rr_out, ares_dns_record_t *dnsrec, ares_dns_section_t sect,
+ const char *name, ares_dns_rec_type_t type, ares_dns_class_t rclass,
+ unsigned int ttl);
+
+/*! Fetch a writable resource record based on the section and index.
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] sect Section for resource record
+ * \param[in] idx Index of resource record in section
+ * \return NULL on misuse, otherwise a writable pointer to the resource record
+ */
+CARES_EXTERN ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect,
+ size_t idx);
+
+/*! Fetch a non-writeable resource record based on the section and index.
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] sect Section for resource record
+ * \param[in] idx Index of resource record in section
+ * \return NULL on misuse, otherwise a const pointer to the resource record
+ */
+CARES_EXTERN const ares_dns_rr_t *
+ ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx);
+
+
+/*! Remove the resource record based on the section and index
+ *
+ * \param[in] dnsrec Initialized record object
+ * \param[in] sect Section for resource record
+ * \param[in] idx Index of resource record in section
+ * \return ARES_SUCCESS on success, otherwise an error code.
+ */
+CARES_EXTERN ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect,
+ size_t idx);
+
+
+/*! Retrieve the resource record Name/Hostname
+ *
+ * \param[in] rr Pointer to resource record
+ * \return Name
+ */
+CARES_EXTERN const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr);
+
+/*! Retrieve the resource record type
+ *
+ * \param[in] rr Pointer to resource record
+ * \return type
+ */
+CARES_EXTERN ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr);
+
+/*! Retrieve the resource record class
+ *
+ * \param[in] rr Pointer to resource record
+ * \return class
+ */
+CARES_EXTERN ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr);
+
+/*! Retrieve the resource record TTL
+ *
+ * \param[in] rr Pointer to resource record
+ * \return TTL
+ */
+CARES_EXTERN unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr);
+
+/*! Set ipv4 address data type for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_INADDR
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] addr Pointer to ipv4 address to use.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const struct in_addr *addr);
+
+/*! Set ipv6 address data type for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_INADDR6
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] addr Pointer to ipv6 address to use.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t
+ ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const struct ares_in6_addr *addr);
+
+/*! Set string data for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_STR or ARES_DATATYPE_NAME.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] val Pointer to string to set.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const char *val);
+
+/*! Set 8bit unsigned integer for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_U8
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] val 8bit unsigned integer
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ unsigned char val);
+
+/*! Set 16bit unsigned integer for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_U16
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] val 16bit unsigned integer
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ unsigned short val);
+
+/*! Set 32bit unsigned integer for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_U32
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] val 32bit unsigned integer
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ unsigned int val);
+
+/*! Set binary (BIN or BINP) data for specified resource record and key. Can
+ * only be used on keys with datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] val Pointer to binary data.
+ * \param[in] len Length of binary data
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const unsigned char *val,
+ size_t len);
+
+/*! Set the option for the RR
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] opt Option record key id.
+ * \param[out] val Optional. Value to associate with option.
+ * \param[out] val_len Length of value passed.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ unsigned short opt,
+ const unsigned char *val,
+ size_t val_len);
+
+/*! Retrieve a pointer to the ipv4 address. Can only be used on keys with
+ * datatype ARES_DATATYPE_INADDR.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return pointer to ipv4 address or NULL on error
+ */
+CARES_EXTERN const struct in_addr *
+ ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key);
+
+/*! Retrieve a pointer to the ipv6 address. Can only be used on keys with
+ * datatype ARES_DATATYPE_INADDR6.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return pointer to ipv6 address or NULL on error
+ */
+CARES_EXTERN const struct ares_in6_addr *
+ ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key);
+
+/*! Retrieve a pointer to the string. Can only be used on keys with
+ * datatype ARES_DATATYPE_STR and ARES_DATATYPE_NAME.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return pointer string or NULL on error
+ */
+CARES_EXTERN const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key);
+
+/*! Retrieve an 8bit unsigned integer. Can only be used on keys with
+ * datatype ARES_DATATYPE_U8.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return 8bit unsigned integer
+ */
+CARES_EXTERN unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key);
+
+/*! Retrieve an 16bit unsigned integer. Can only be used on keys with
+ * datatype ARES_DATATYPE_U16.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return 16bit unsigned integer
+ */
+CARES_EXTERN unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key);
+
+/*! Retrieve an 32bit unsigned integer. Can only be used on keys with
+ * datatype ARES_DATATYPE_U32.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return 32bit unsigned integer
+ */
+CARES_EXTERN unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key);
+
+/*! Retrieve a pointer to the binary data. Can only be used on keys with
+ * datatype ARES_DATATYPE_BIN or ARES_DATATYPE_BINP. If BINP, the data is
+ * guaranteed to have a NULL terminator which is NOT included in the length.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[out] len Length of binary data returned
+ * \return pointer binary data or NULL on error
+ */
+CARES_EXTERN const unsigned char *
+ ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ size_t *len);
+
+/*! Retrieve the number of options stored for the RR.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \return count, or 0 if none.
+ */
+CARES_EXTERN size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key);
+
+/*! Retrieve the option for the RR by index.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] idx Index of option record
+ * \param[out] val Optional. Pointer passed by reference to hold value.
+ * Options may not have values. Value if returned is
+ * guaranteed to be NULL terminated, however in most
+ * cases it is not printable.
+ * \param[out] val_len Optional. Pointer passed by reference to hold value
+ * length.
+ * \return option key/id on success, 65535 on misuse.
+ */
+CARES_EXTERN unsigned short
+ ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ size_t idx, const unsigned char **val, size_t *val_len);
+
+/*! Retrieve the option for the RR by the option key/id.
+ *
+ * \param[in] dns_rr Pointer to resource record
+ * \param[in] key DNS Resource Record Key
+ * \param[in] opt Option record key id (this is not the index).
+ * \param[out] val Optional. Pointer passed by reference to hold value.
+ * Options may not have values. Value if returned is
+ * guaranteed to be NULL terminated, however in most cases
+ * it is not printable.
+ * \param[out] val_len Optional. Pointer passed by reference to hold value
+ * length.
+ * \return ARES_TRUE on success, ARES_FALSE on misuse.
+ */
+CARES_EXTERN ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ unsigned short opt,
+ const unsigned char **val,
+ size_t *val_len);
+
+/*! Parse a complete DNS message.
+ *
+ * \param[in] buf pointer to bytes to be parsed
+ * \param[in] buf_len Length of buf provided
+ * \param[in] flags Flags dictating how the message should be parsed.
+ * \param[out] dnsrec Pointer passed by reference for a new DNS record object
+ * that must be ares_dns_record_destroy()'d by caller.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_parse(const unsigned char *buf,
+ size_t buf_len, unsigned int flags,
+ ares_dns_record_t **dnsrec);
+
+/*! Write a complete DNS message
+ *
+ * \param[in] dnsrec Pointer to initialized and filled DNS record object.
+ * \param[out] buf Pointer passed by reference to be filled in with with
+ * DNS message. Must be ares_free()'d by caller.
+ * \param[out] buf_len Length of returned buffer containing DNS message.
+ * \return ARES_SUCCESS on success
+ */
+CARES_EXTERN ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec,
+ unsigned char **buf, size_t *buf_len);
+
+
+/*! Duplicate a complete DNS message. This does not copy internal members
+ * (such as the ttl decrement capability).
+ *
+ * \param[in] dnsrec Pointer to initialized and filled DNS record object.
+ * \return duplicted DNS record object, or NULL on out of memory.
+ */
+CARES_EXTERN ares_dns_record_t *
+ ares_dns_record_duplicate(const ares_dns_record_t *dnsrec);
+
+/*! @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ARES_DNS_RECORD_H */
diff --git a/contrib/libs/c-ares/include/ares_nameser.h b/contrib/libs/c-ares/include/ares_nameser.h
index 3138d89d74..cf0e3b2d8a 100644
--- a/contrib/libs/c-ares/include/ares_nameser.h
+++ b/contrib/libs/c-ares/include/ares_nameser.h
@@ -44,51 +44,51 @@
*/
#ifndef NS_PACKETSZ
-# define NS_PACKETSZ 512 /* maximum packet size */
+# define NS_PACKETSZ 512 /* maximum packet size */
#endif
#ifndef NS_MAXDNAME
-# define NS_MAXDNAME 256 /* maximum domain name */
+# define NS_MAXDNAME 256 /* maximum domain name */
#endif
#ifndef NS_MAXCDNAME
-# define NS_MAXCDNAME 255 /* maximum compressed domain name */
+# define NS_MAXCDNAME 255 /* maximum compressed domain name */
#endif
#ifndef NS_MAXLABEL
-# define NS_MAXLABEL 63
+# define NS_MAXLABEL 63
#endif
#ifndef NS_HFIXEDSZ
-# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
+# define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
#endif
#ifndef NS_QFIXEDSZ
-# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */
+# define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */
#endif
#ifndef NS_RRFIXEDSZ
-# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
+# define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
#endif
#ifndef NS_INT16SZ
-# define NS_INT16SZ 2
+# define NS_INT16SZ 2
#endif
#ifndef NS_INADDRSZ
-# define NS_INADDRSZ 4
+# define NS_INADDRSZ 4
#endif
#ifndef NS_IN6ADDRSZ
-# define NS_IN6ADDRSZ 16
+# define NS_IN6ADDRSZ 16
#endif
#ifndef NS_CMPRSFLGS
-# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
+# define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
#endif
#ifndef NS_DEFAULTPORT
-# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */
+# define NS_DEFAULTPORT 53 /* For both TCP and UDP. */
#endif
/* ============================================================================
@@ -99,106 +99,106 @@
#ifndef CARES_HAVE_ARPA_NAMESER_H
typedef enum __ns_class {
- ns_c_invalid = 0, /* Cookie. */
- ns_c_in = 1, /* Internet. */
- ns_c_2 = 2, /* unallocated/unsupported. */
- ns_c_chaos = 3, /* MIT Chaos-net. */
- ns_c_hs = 4, /* MIT Hesiod. */
- /* Query class values which do not appear in resource records */
- ns_c_none = 254, /* for prereq. sections in update requests */
- ns_c_any = 255, /* Wildcard match. */
- ns_c_max = 65536
+ ns_c_invalid = 0, /* Cookie. */
+ ns_c_in = 1, /* Internet. */
+ ns_c_2 = 2, /* unallocated/unsupported. */
+ ns_c_chaos = 3, /* MIT Chaos-net. */
+ ns_c_hs = 4, /* MIT Hesiod. */
+ /* Query class values which do not appear in resource records */
+ ns_c_none = 254, /* for prereq. sections in update requests */
+ ns_c_any = 255, /* Wildcard match. */
+ ns_c_max = 65536
} ns_class;
typedef enum __ns_type {
- ns_t_invalid = 0, /* Cookie. */
- ns_t_a = 1, /* Host address. */
- ns_t_ns = 2, /* Authoritative server. */
- ns_t_md = 3, /* Mail destination. */
- ns_t_mf = 4, /* Mail forwarder. */
- ns_t_cname = 5, /* Canonical name. */
- ns_t_soa = 6, /* Start of authority zone. */
- ns_t_mb = 7, /* Mailbox domain name. */
- ns_t_mg = 8, /* Mail group member. */
- ns_t_mr = 9, /* Mail rename name. */
- ns_t_null = 10, /* Null resource record. */
- ns_t_wks = 11, /* Well known service. */
- ns_t_ptr = 12, /* Domain name pointer. */
- ns_t_hinfo = 13, /* Host information. */
- ns_t_minfo = 14, /* Mailbox information. */
- ns_t_mx = 15, /* Mail routing information. */
- ns_t_txt = 16, /* Text strings. */
- ns_t_rp = 17, /* Responsible person. */
- ns_t_afsdb = 18, /* AFS cell database. */
- ns_t_x25 = 19, /* X_25 calling address. */
- ns_t_isdn = 20, /* ISDN calling address. */
- ns_t_rt = 21, /* Router. */
- ns_t_nsap = 22, /* NSAP address. */
- ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */
- ns_t_sig = 24, /* Security signature. */
- ns_t_key = 25, /* Security key. */
- ns_t_px = 26, /* X.400 mail mapping. */
- ns_t_gpos = 27, /* Geographical position (withdrawn). */
- ns_t_aaaa = 28, /* Ip6 Address. */
- ns_t_loc = 29, /* Location Information. */
- ns_t_nxt = 30, /* Next domain (security). */
- ns_t_eid = 31, /* Endpoint identifier. */
- ns_t_nimloc = 32, /* Nimrod Locator. */
- ns_t_srv = 33, /* Server Selection. */
- ns_t_atma = 34, /* ATM Address */
- ns_t_naptr = 35, /* Naming Authority PoinTeR */
- ns_t_kx = 36, /* Key Exchange */
- ns_t_cert = 37, /* Certification record */
- ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */
- ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
- ns_t_sink = 40, /* Kitchen sink (experimentatl) */
- ns_t_opt = 41, /* EDNS0 option (meta-RR) */
- ns_t_apl = 42, /* Address prefix list (RFC3123) */
- ns_t_ds = 43, /* Delegation Signer (RFC4034) */
- ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */
- ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */
- ns_t_nsec = 47, /* Next Secure (RFC4034) */
- ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */
- ns_t_tkey = 249, /* Transaction key */
- ns_t_tsig = 250, /* Transaction signature. */
- ns_t_ixfr = 251, /* Incremental zone transfer. */
- ns_t_axfr = 252, /* Transfer zone of authority. */
- ns_t_mailb = 253, /* Transfer mailbox records. */
- ns_t_maila = 254, /* Transfer mail agent records. */
- ns_t_any = 255, /* Wildcard match. */
- ns_t_uri = 256, /* Uniform Resource Identifier (RFC7553) */
- ns_t_caa = 257, /* Certification Authority Authorization. */
- ns_t_max = 65536
+ ns_t_invalid = 0, /* Cookie. */
+ ns_t_a = 1, /* Host address. */
+ ns_t_ns = 2, /* Authoritative server. */
+ ns_t_md = 3, /* Mail destination. */
+ ns_t_mf = 4, /* Mail forwarder. */
+ ns_t_cname = 5, /* Canonical name. */
+ ns_t_soa = 6, /* Start of authority zone. */
+ ns_t_mb = 7, /* Mailbox domain name. */
+ ns_t_mg = 8, /* Mail group member. */
+ ns_t_mr = 9, /* Mail rename name. */
+ ns_t_null = 10, /* Null resource record. */
+ ns_t_wks = 11, /* Well known service. */
+ ns_t_ptr = 12, /* Domain name pointer. */
+ ns_t_hinfo = 13, /* Host information. */
+ ns_t_minfo = 14, /* Mailbox information. */
+ ns_t_mx = 15, /* Mail routing information. */
+ ns_t_txt = 16, /* Text strings. */
+ ns_t_rp = 17, /* Responsible person. */
+ ns_t_afsdb = 18, /* AFS cell database. */
+ ns_t_x25 = 19, /* X_25 calling address. */
+ ns_t_isdn = 20, /* ISDN calling address. */
+ ns_t_rt = 21, /* Router. */
+ ns_t_nsap = 22, /* NSAP address. */
+ ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */
+ ns_t_sig = 24, /* Security signature. */
+ ns_t_key = 25, /* Security key. */
+ ns_t_px = 26, /* X.400 mail mapping. */
+ ns_t_gpos = 27, /* Geographical position (withdrawn). */
+ ns_t_aaaa = 28, /* Ip6 Address. */
+ ns_t_loc = 29, /* Location Information. */
+ ns_t_nxt = 30, /* Next domain (security). */
+ ns_t_eid = 31, /* Endpoint identifier. */
+ ns_t_nimloc = 32, /* Nimrod Locator. */
+ ns_t_srv = 33, /* Server Selection. */
+ ns_t_atma = 34, /* ATM Address */
+ ns_t_naptr = 35, /* Naming Authority PoinTeR */
+ ns_t_kx = 36, /* Key Exchange */
+ ns_t_cert = 37, /* Certification record */
+ ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */
+ ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
+ ns_t_sink = 40, /* Kitchen sink (experimental) */
+ ns_t_opt = 41, /* EDNS0 option (meta-RR) */
+ ns_t_apl = 42, /* Address prefix list (RFC3123) */
+ ns_t_ds = 43, /* Delegation Signer (RFC4034) */
+ ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */
+ ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */
+ ns_t_nsec = 47, /* Next Secure (RFC4034) */
+ ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */
+ ns_t_tkey = 249, /* Transaction key */
+ ns_t_tsig = 250, /* Transaction signature. */
+ ns_t_ixfr = 251, /* Incremental zone transfer. */
+ ns_t_axfr = 252, /* Transfer zone of authority. */
+ ns_t_mailb = 253, /* Transfer mailbox records. */
+ ns_t_maila = 254, /* Transfer mail agent records. */
+ ns_t_any = 255, /* Wildcard match. */
+ ns_t_uri = 256, /* Uniform Resource Identifier (RFC7553) */
+ ns_t_caa = 257, /* Certification Authority Authorization. */
+ ns_t_max = 65536
} ns_type;
typedef enum __ns_opcode {
- ns_o_query = 0, /* Standard query. */
- ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */
- ns_o_status = 2, /* Name server status query (unsupported). */
- /* Opcode 3 is undefined/reserved. */
- ns_o_notify = 4, /* Zone change notification. */
- ns_o_update = 5, /* Zone update message. */
- ns_o_max = 6
+ ns_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_r_noerror = 0, /* No error occurred. */
+ ns_r_formerr = 1, /* Format error. */
+ ns_r_servfail = 2, /* Server failure. */
+ ns_r_nxdomain = 3, /* Name error. */
+ ns_r_notimpl = 4, /* Unimplemented. */
+ ns_r_refused = 5, /* Operation refused. */
+ /* these are for BIND_UPDATE */
+ ns_r_yxdomain = 6, /* Name exists */
+ ns_r_yxrrset = 7, /* RRset exists */
+ ns_r_nxrrset = 8, /* RRset does not exist */
+ ns_r_notauth = 9, /* Not authoritative for zone */
+ ns_r_notzone = 10, /* Zone of record different from zone section */
+ ns_r_max = 11,
+ /* The following are TSIG extended errors */
+ ns_r_badsig = 16,
+ ns_r_badkey = 17,
+ ns_r_badtime = 18
} ns_rcode;
#endif /* CARES_HAVE_ARPA_NAMESER_H */
@@ -212,45 +212,45 @@ typedef enum __ns_rcode {
*/
#ifndef PACKETSZ
-# define PACKETSZ NS_PACKETSZ
+# define PACKETSZ NS_PACKETSZ
#endif
#ifndef MAXDNAME
-# define MAXDNAME NS_MAXDNAME
+# define MAXDNAME NS_MAXDNAME
#endif
#ifndef MAXCDNAME
-# define MAXCDNAME NS_MAXCDNAME
+# define MAXCDNAME NS_MAXCDNAME
#endif
#ifndef MAXLABEL
-# define MAXLABEL NS_MAXLABEL
+# define MAXLABEL NS_MAXLABEL
#endif
#ifndef HFIXEDSZ
-# define HFIXEDSZ NS_HFIXEDSZ
+# define HFIXEDSZ NS_HFIXEDSZ
#endif
#ifndef QFIXEDSZ
-# define QFIXEDSZ NS_QFIXEDSZ
+# define QFIXEDSZ NS_QFIXEDSZ
#endif
#ifndef RRFIXEDSZ
-# define RRFIXEDSZ NS_RRFIXEDSZ
+# define RRFIXEDSZ NS_RRFIXEDSZ
#endif
#ifndef INDIR_MASK
-# define INDIR_MASK NS_CMPRSFLGS
+# define INDIR_MASK NS_CMPRSFLGS
#endif
#ifndef NAMESERVER_PORT
-# define NAMESERVER_PORT NS_DEFAULTPORT
+# define NAMESERVER_PORT NS_DEFAULTPORT
#endif
/* opcodes */
#ifndef O_QUERY
-# define O_QUERY 0 /* ns_o_query */
+# define O_QUERY 0 /* ns_o_query */
#endif
#ifndef O_IQUERY
# define O_IQUERY 1 /* ns_o_iquery */
@@ -268,242 +268,242 @@ typedef enum __ns_rcode {
/* response codes */
#ifndef SERVFAIL
-# define SERVFAIL ns_r_servfail
+# define SERVFAIL ns_r_servfail
#endif
#ifndef NOTIMP
-# define NOTIMP ns_r_notimpl
+# define NOTIMP ns_r_notimpl
#endif
#ifndef REFUSED
-# define REFUSED ns_r_refused
+# define REFUSED ns_r_refused
#endif
#if defined(_WIN32) && !defined(HAVE_ARPA_NAMESER_COMPAT_H) && defined(NOERROR)
# undef NOERROR /* it seems this is already defined in winerror.h */
#endif
#ifndef NOERROR
-# define NOERROR ns_r_noerror
+# define NOERROR ns_r_noerror
#endif
#ifndef FORMERR
-# define FORMERR ns_r_formerr
+# define FORMERR ns_r_formerr
#endif
#ifndef NXDOMAIN
-# define NXDOMAIN ns_r_nxdomain
+# define NXDOMAIN ns_r_nxdomain
#endif
/* Non-standard response codes, use numeric values */
#ifndef YXDOMAIN
-# define YXDOMAIN 6 /* ns_r_yxdomain */
+# define YXDOMAIN 6 /* ns_r_yxdomain */
#endif
#ifndef YXRRSET
-# define YXRRSET 7 /* ns_r_yxrrset */
+# define YXRRSET 7 /* ns_r_yxrrset */
#endif
#ifndef NXRRSET
-# define NXRRSET 8 /* ns_r_nxrrset */
+# define NXRRSET 8 /* ns_r_nxrrset */
#endif
#ifndef NOTAUTH
-# define NOTAUTH 9 /* ns_r_notauth */
+# define NOTAUTH 9 /* ns_r_notauth */
#endif
#ifndef NOTZONE
-# define NOTZONE 10 /* ns_r_notzone */
+# define NOTZONE 10 /* ns_r_notzone */
#endif
#ifndef TSIG_BADSIG
-# define TSIG_BADSIG 16 /* ns_r_badsig */
+# define TSIG_BADSIG 16 /* ns_r_badsig */
#endif
#ifndef TSIG_BADKEY
-# define TSIG_BADKEY 17 /* ns_r_badkey */
+# define TSIG_BADKEY 17 /* ns_r_badkey */
#endif
#ifndef TSIG_BADTIME
-# define TSIG_BADTIME 18 /* ns_r_badtime */
+# define TSIG_BADTIME 18 /* ns_r_badtime */
#endif
/* classes */
#ifndef C_IN
-# define C_IN 1 /* ns_c_in */
+# define C_IN 1 /* ns_c_in */
#endif
#ifndef C_CHAOS
-# define C_CHAOS 3 /* ns_c_chaos */
+# define C_CHAOS 3 /* ns_c_chaos */
#endif
#ifndef C_HS
-# define C_HS 4 /* ns_c_hs */
+# define C_HS 4 /* ns_c_hs */
#endif
#ifndef C_NONE
-# define C_NONE 254 /* ns_c_none */
+# define C_NONE 254 /* ns_c_none */
#endif
#ifndef C_ANY
-# define C_ANY 255 /* ns_c_any */
+# define C_ANY 255 /* ns_c_any */
#endif
/* types */
#ifndef T_A
-# define T_A 1 /* ns_t_a */
+# define T_A 1 /* ns_t_a */
#endif
#ifndef T_NS
-# define T_NS 2 /* ns_t_ns */
+# define T_NS 2 /* ns_t_ns */
#endif
#ifndef T_MD
-# define T_MD 3 /* ns_t_md */
+# define T_MD 3 /* ns_t_md */
#endif
#ifndef T_MF
-# define T_MF 4 /* ns_t_mf */
+# define T_MF 4 /* ns_t_mf */
#endif
#ifndef T_CNAME
-# define T_CNAME 5 /* ns_t_cname */
+# define T_CNAME 5 /* ns_t_cname */
#endif
#ifndef T_SOA
-# define T_SOA 6 /* ns_t_soa */
+# define T_SOA 6 /* ns_t_soa */
#endif
#ifndef T_MB
-# define T_MB 7 /* ns_t_mb */
+# define T_MB 7 /* ns_t_mb */
#endif
#ifndef T_MG
-# define T_MG 8 /* ns_t_mg */
+# define T_MG 8 /* ns_t_mg */
#endif
#ifndef T_MR
-# define T_MR 9 /* ns_t_mr */
+# define T_MR 9 /* ns_t_mr */
#endif
#ifndef T_NULL
-# define T_NULL 10 /* ns_t_null */
+# define T_NULL 10 /* ns_t_null */
#endif
#ifndef T_WKS
-# define T_WKS 11 /* ns_t_wks */
+# define T_WKS 11 /* ns_t_wks */
#endif
#ifndef T_PTR
-# define T_PTR 12 /* ns_t_ptr */
+# define T_PTR 12 /* ns_t_ptr */
#endif
#ifndef T_HINFO
-# define T_HINFO 13 /* ns_t_hinfo */
+# define T_HINFO 13 /* ns_t_hinfo */
#endif
#ifndef T_MINFO
-# define T_MINFO 14 /* ns_t_minfo */
+# define T_MINFO 14 /* ns_t_minfo */
#endif
#ifndef T_MX
-# define T_MX 15 /* ns_t_mx */
+# define T_MX 15 /* ns_t_mx */
#endif
#ifndef T_TXT
-# define T_TXT 16 /* ns_t_txt */
+# define T_TXT 16 /* ns_t_txt */
#endif
#ifndef T_RP
-# define T_RP 17 /* ns_t_rp */
+# define T_RP 17 /* ns_t_rp */
#endif
#ifndef T_AFSDB
-# define T_AFSDB 18 /* ns_t_afsdb */
+# define T_AFSDB 18 /* ns_t_afsdb */
#endif
#ifndef T_X25
-# define T_X25 19 /* ns_t_x25 */
+# define T_X25 19 /* ns_t_x25 */
#endif
#ifndef T_ISDN
-# define T_ISDN 20 /* ns_t_isdn */
+# define T_ISDN 20 /* ns_t_isdn */
#endif
#ifndef T_RT
-# define T_RT 21 /* ns_t_rt */
+# define T_RT 21 /* ns_t_rt */
#endif
#ifndef T_NSAP
-# define T_NSAP 22 /* ns_t_nsap */
+# define T_NSAP 22 /* ns_t_nsap */
#endif
#ifndef T_NSAP_PTR
-# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */
+# define T_NSAP_PTR 23 /* ns_t_nsap_ptr */
#endif
#ifndef T_SIG
-# define T_SIG 24 /* ns_t_sig */
+# define T_SIG 24 /* ns_t_sig */
#endif
#ifndef T_KEY
-# define T_KEY 25 /* ns_t_key */
+# define T_KEY 25 /* ns_t_key */
#endif
#ifndef T_PX
-# define T_PX 26 /* ns_t_px */
+# define T_PX 26 /* ns_t_px */
#endif
#ifndef T_GPOS
-# define T_GPOS 27 /* ns_t_gpos */
+# define T_GPOS 27 /* ns_t_gpos */
#endif
#ifndef T_AAAA
-# define T_AAAA 28 /* ns_t_aaaa */
+# define T_AAAA 28 /* ns_t_aaaa */
#endif
#ifndef T_LOC
-# define T_LOC 29 /* ns_t_loc */
+# define T_LOC 29 /* ns_t_loc */
#endif
#ifndef T_NXT
-# define T_NXT 30 /* ns_t_nxt */
+# define T_NXT 30 /* ns_t_nxt */
#endif
#ifndef T_EID
-# define T_EID 31 /* ns_t_eid */
+# define T_EID 31 /* ns_t_eid */
#endif
#ifndef T_NIMLOC
-# define T_NIMLOC 32 /* ns_t_nimloc */
+# define T_NIMLOC 32 /* ns_t_nimloc */
#endif
#ifndef T_SRV
-# define T_SRV 33 /* ns_t_srv */
+# define T_SRV 33 /* ns_t_srv */
#endif
#ifndef T_ATMA
-# define T_ATMA 34 /* ns_t_atma */
+# define T_ATMA 34 /* ns_t_atma */
#endif
#ifndef T_NAPTR
-# define T_NAPTR 35 /* ns_t_naptr */
+# define T_NAPTR 35 /* ns_t_naptr */
#endif
#ifndef T_KX
-# define T_KX 36 /* ns_t_kx */
+# define T_KX 36 /* ns_t_kx */
#endif
#ifndef T_CERT
-# define T_CERT 37 /* ns_t_cert */
+# define T_CERT 37 /* ns_t_cert */
#endif
#ifndef T_A6
-# define T_A6 38 /* ns_t_a6 */
+# define T_A6 38 /* ns_t_a6 */
#endif
#ifndef T_DNAME
-# define T_DNAME 39 /* ns_t_dname */
+# define T_DNAME 39 /* ns_t_dname */
#endif
#ifndef T_SINK
-# define T_SINK 40 /* ns_t_sink */
+# define T_SINK 40 /* ns_t_sink */
#endif
#ifndef T_OPT
-# define T_OPT 41 /* ns_t_opt */
+# define T_OPT 41 /* ns_t_opt */
#endif
#ifndef T_APL
-# define T_APL 42 /* ns_t_apl */
+# define T_APL 42 /* ns_t_apl */
#endif
#ifndef T_DS
-# define T_DS 43 /* ns_t_ds */
+# define T_DS 43 /* ns_t_ds */
#endif
#ifndef T_SSHFP
-# define T_SSHFP 44 /* ns_t_sshfp */
+# define T_SSHFP 44 /* ns_t_sshfp */
#endif
#ifndef T_RRSIG
-# define T_RRSIG 46 /* ns_t_rrsig */
+# define T_RRSIG 46 /* ns_t_rrsig */
#endif
#ifndef T_NSEC
-# define T_NSEC 47 /* ns_t_nsec */
+# define T_NSEC 47 /* ns_t_nsec */
#endif
#ifndef T_DNSKEY
-# define T_DNSKEY 48 /* ns_t_dnskey */
+# define T_DNSKEY 48 /* ns_t_dnskey */
#endif
#ifndef T_TKEY
-# define T_TKEY 249 /* ns_t_tkey */
+# define T_TKEY 249 /* ns_t_tkey */
#endif
#ifndef T_TSIG
-# define T_TSIG 250 /* ns_t_tsig */
+# define T_TSIG 250 /* ns_t_tsig */
#endif
#ifndef T_IXFR
-# define T_IXFR 251 /* ns_t_ixfr */
+# define T_IXFR 251 /* ns_t_ixfr */
#endif
#ifndef T_AXFR
-# define T_AXFR 252 /* ns_t_axfr */
+# define T_AXFR 252 /* ns_t_axfr */
#endif
#ifndef T_MAILB
-# define T_MAILB 253 /* ns_t_mailb */
+# define T_MAILB 253 /* ns_t_mailb */
#endif
#ifndef T_MAILA
-# define T_MAILA 254 /* ns_t_maila */
+# define T_MAILA 254 /* ns_t_maila */
#endif
#ifndef T_ANY
-# define T_ANY 255 /* ns_t_any */
+# define T_ANY 255 /* ns_t_any */
#endif
#ifndef T_URI
-# define T_URI 256 /* ns_t_uri */
+# define T_URI 256 /* ns_t_uri */
#endif
#ifndef T_CAA
-# define T_CAA 257 /* ns_t_caa */
+# define T_CAA 257 /* ns_t_caa */
#endif
#ifndef T_MAX
-# define T_MAX 65536 /* ns_t_max */
+# define T_MAX 65536 /* ns_t_max */
#endif
diff --git a/contrib/libs/c-ares/include/ares_rules.h b/contrib/libs/c-ares/include/ares_rules.h
index f6b1f663e2..450dc8ab2d 100644
--- a/contrib/libs/c-ares/include/ares_rules.h
+++ b/contrib/libs/c-ares/include/ares_rules.h
@@ -81,7 +81,7 @@
#ifndef CARES_TYPEOF_ARES_SOCKLEN_T
# error "CARES_TYPEOF_ARES_SOCKLEN_T definition is missing!"
- Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing
+Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing
#endif
/*
@@ -92,15 +92,14 @@
#define CareschkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1
-/*
- * Verify that the size previously defined and expected for
- * ares_socklen_t is actually the same as the one reported
- * by sizeof() at compile time.
- */
+ /*
+ * Verify that the size previously defined and expected for
+ * ares_socklen_t is actually the same as the one reported
+ * by sizeof() at compile time.
+ */
-typedef char
- __cares_rule_02__
- [CareschkszEQ(ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))];
+ typedef char __cares_rule_02__[CareschkszEQ(
+ ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))];
/*
* Verify at compile time that the size of ares_socklen_t as reported
@@ -108,9 +107,7 @@ typedef char
* the current compilation.
*/
-typedef char
- __cares_rule_03__
- [CareschkszGE(ares_socklen_t, int)];
+typedef char __cares_rule_03__[CareschkszGE(ares_socklen_t, int)];
/* ================================================================ */
/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */
diff --git a/contrib/libs/c-ares/include/ares_version.h b/contrib/libs/c-ares/include/ares_version.h
index 34784e2ed4..0e94a98be8 100644
--- a/contrib/libs/c-ares/include/ares_version.h
+++ b/contrib/libs/c-ares/include/ares_version.h
@@ -28,18 +28,18 @@
#define ARES__VERSION_H
/* This is the global package copyright */
-#define ARES_COPYRIGHT "2004 - 2023 Daniel Stenberg, <daniel@haxx.se>."
+#define ARES_COPYRIGHT "2004 - 2024 Daniel Stenberg, <daniel@haxx.se>."
#define ARES_VERSION_MAJOR 1
-#define ARES_VERSION_MINOR 20
+#define ARES_VERSION_MINOR 28
#define ARES_VERSION_PATCH 1
-#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
- (ARES_VERSION_MINOR<<8)|\
- (ARES_VERSION_PATCH))
-#define ARES_VERSION_STR "1.20.1"
+#define ARES_VERSION \
+ ((ARES_VERSION_MAJOR << 16) | (ARES_VERSION_MINOR << 8) | \
+ (ARES_VERSION_PATCH))
+#define ARES_VERSION_STR "1.28.1"
#if (ARES_VERSION >= 0x010700)
-# define CARES_HAVE_ARES_LIBRARY_INIT 1
+# define CARES_HAVE_ARES_LIBRARY_INIT 1
# define CARES_HAVE_ARES_LIBRARY_CLEANUP 1
#else
# undef CARES_HAVE_ARES_LIBRARY_INIT
diff --git a/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c b/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c
index 1798fc69fa..95717890c2 100644
--- a/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c
+++ b/contrib/libs/c-ares/src/lib/ares__addrinfo2hostent.c
@@ -54,147 +54,143 @@
#include "ares_inet_net_pton.h"
#include "ares_private.h"
-int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
- struct hostent **host)
+ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
+ struct hostent **host)
{
- struct ares_addrinfo_node *next;
+ struct ares_addrinfo_node *next;
struct ares_addrinfo_cname *next_cname;
- char **aliases = NULL;
- char *addrs = NULL;
- int naliases = 0, naddrs = 0, alias = 0, i;
-
- if (ai == NULL || host == NULL)
+ char **aliases = NULL;
+ char *addrs = NULL;
+ size_t naliases = 0;
+ size_t naddrs = 0;
+ size_t alias = 0;
+ size_t i;
+
+ if (ai == NULL || host == NULL) {
return ARES_EBADQUERY;
-
- *host = ares_malloc(sizeof(**host));
- if (!(*host))
- {
- goto enomem;
- }
- memset(*host, 0, sizeof(**host));
+ }
/* Use the first node of the response as the family, since hostent can only
* represent one family. We assume getaddrinfo() returned a sorted list if
* the user requested AF_UNSPEC. */
- if (family == AF_UNSPEC && ai->nodes)
+ if (family == AF_UNSPEC && ai->nodes) {
family = ai->nodes->ai_family;
+ }
+
+ if (family != AF_INET && family != AF_INET6) {
+ return ARES_EBADQUERY;
+ }
+
+ *host = ares_malloc(sizeof(**host));
+ if (!(*host)) {
+ goto enomem;
+ }
+ memset(*host, 0, sizeof(**host));
next = ai->nodes;
- while (next)
- {
- if(next->ai_family == family)
- {
- ++naddrs;
- }
- next = next->ai_next;
+ while (next) {
+ if (next->ai_family == family) {
+ ++naddrs;
}
+ next = next->ai_next;
+ }
next_cname = ai->cnames;
- while (next_cname)
- {
- if(next_cname->alias)
- ++naliases;
- next_cname = next_cname->next;
+ 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 (!aliases) {
+ goto enomem;
+ }
(*host)->h_aliases = aliases;
memset(aliases, 0, (naliases + 1) * sizeof(char *));
- if (naliases)
- {
- next_cname = ai->cnames;
- while (next_cname)
- {
- if(next_cname->alias) {
- aliases[alias] = ares_strdup(next_cname->alias);
- if (!aliases[alias]) {
- goto enomem;
- }
- alias++;
- }
- next_cname = next_cname->next;
- }
+ if (naliases) {
+ for (next_cname = ai->cnames; next_cname != NULL;
+ next_cname = next_cname->next) {
+ if (next_cname->alias == NULL) {
+ continue;
+ }
+ aliases[alias] = ares_strdup(next_cname->alias);
+ if (!aliases[alias]) {
+ goto enomem;
+ }
+ alias++;
}
+ }
(*host)->h_addr_list = ares_malloc((naddrs + 1) * sizeof(char *));
- if (!(*host)->h_addr_list)
- {
- goto enomem;
- }
+ if (!(*host)->h_addr_list) {
+ goto enomem;
+ }
memset((*host)->h_addr_list, 0, (naddrs + 1) * sizeof(char *));
- if (ai->cnames)
- {
- (*host)->h_name = ares_strdup(ai->cnames->name);
- if ((*host)->h_name == NULL && ai->cnames->name)
- {
- goto enomem;
- }
+ if (ai->cnames) {
+ (*host)->h_name = ares_strdup(ai->cnames->name);
+ if ((*host)->h_name == NULL && ai->cnames->name) {
+ goto enomem;
}
- else
- {
- (*host)->h_name = ares_strdup(ai->name);
- if ((*host)->h_name == NULL && ai->name)
- {
- goto enomem;
- }
+ } else {
+ (*host)->h_name = ares_strdup(ai->name);
+ if ((*host)->h_name == NULL && ai->name) {
+ goto enomem;
+ }
+ }
+
+ (*host)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family;
+
+ if (family == AF_INET) {
+ (*host)->h_length = sizeof(struct in_addr);
+ }
+
+ if (family == AF_INET6) {
+ (*host)->h_length = sizeof(struct ares_in6_addr);
+ }
+
+ if (naddrs) {
+ addrs = ares_malloc(naddrs * (size_t)(*host)->h_length);
+ if (!addrs) {
+ goto enomem;
}
- (*host)->h_addrtype = family;
- (*host)->h_length = (family == AF_INET)?
- sizeof(struct in_addr):sizeof(struct ares_in6_addr);
-
- if (naddrs)
- {
- addrs = ares_malloc(naddrs * (*host)->h_length);
- if (!addrs)
- {
- goto enomem;
- }
-
- i = 0;
- next = ai->nodes;
- while (next)
- {
- if(next->ai_family == family)
- {
- (*host)->h_addr_list[i] = addrs + (i * (*host)->h_length);
- if (family == AF_INET6)
- {
- memcpy((*host)->h_addr_list[i],
- &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
- (*host)->h_length);
- }
- else
- {
- memcpy((*host)->h_addr_list[i],
- &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
- (*host)->h_length);
- }
- ++i;
- }
- next = next->ai_next;
- }
-
- if (i == 0)
- {
- ares_free(addrs);
- }
+ i = 0;
+ for (next = ai->nodes; next != NULL; next = next->ai_next) {
+ if (next->ai_family != family) {
+ continue;
+ }
+ (*host)->h_addr_list[i] = addrs + (i * (size_t)(*host)->h_length);
+ if (family == AF_INET6) {
+ memcpy(
+ (*host)->h_addr_list[i],
+ &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
+ (size_t)(*host)->h_length);
+ }
+ if (family == AF_INET) {
+ memcpy(
+ (*host)->h_addr_list[i],
+ &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
+ (size_t)(*host)->h_length);
+ }
+ ++i;
}
- if (naddrs == 0 && naliases == 0)
- {
- ares_free_hostent(*host);
- *host = NULL;
- return ARES_ENODATA;
+ if (i == 0) {
+ ares_free(addrs);
}
+ }
+
+ if (naddrs == 0 && naliases == 0) {
+ ares_free_hostent(*host);
+ *host = NULL;
+ return ARES_ENODATA;
+ }
return ARES_SUCCESS;
@@ -204,74 +200,79 @@ enomem:
return ARES_ENOMEM;
}
-
-int ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
- int req_naddrttls, struct ares_addrttl *addrttls,
- struct ares_addr6ttl *addr6ttls, int *naddrttls)
+ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
+ size_t req_naddrttls,
+ struct ares_addrttl *addrttls,
+ struct ares_addr6ttl *addr6ttls,
+ size_t *naddrttls)
{
- struct ares_addrinfo_node *next;
+ struct ares_addrinfo_node *next;
struct ares_addrinfo_cname *next_cname;
- int cname_ttl = INT_MAX;
+ int cname_ttl = INT_MAX;
- if (family != AF_INET && family != AF_INET6)
+ if (family != AF_INET && family != AF_INET6) {
return ARES_EBADQUERY;
+ }
- if (ai == NULL || naddrttls == NULL)
+ if (ai == NULL || naddrttls == NULL) {
return ARES_EBADQUERY;
+ }
- if (family == AF_INET && addrttls == NULL)
+ if (family == AF_INET && addrttls == NULL) {
return ARES_EBADQUERY;
+ }
- if (family == AF_INET6 && addr6ttls == NULL)
+ if (family == AF_INET6 && addr6ttls == NULL) {
return ARES_EBADQUERY;
+ }
- if (req_naddrttls == 0)
+ if (req_naddrttls == 0) {
return ARES_EBADQUERY;
+ }
*naddrttls = 0;
next_cname = ai->cnames;
- while (next_cname)
- {
- if(next_cname->ttl < cname_ttl)
- cname_ttl = next_cname->ttl;
- next_cname = next_cname->next;
+ while (next_cname) {
+ if (next_cname->ttl < cname_ttl) {
+ cname_ttl = next_cname->ttl;
}
+ next_cname = next_cname->next;
+ }
- next = ai->nodes;
- while (next)
- {
- if(next->ai_family == family)
- {
- if (*naddrttls < req_naddrttls)
- {
- if (family == AF_INET6)
- {
- if(next->ai_ttl > cname_ttl)
- addr6ttls[*naddrttls].ttl = cname_ttl;
- else
- addr6ttls[*naddrttls].ttl = next->ai_ttl;
-
- memcpy(&addr6ttls[*naddrttls].ip6addr,
- &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
- sizeof(struct ares_in6_addr));
- }
- else
- {
- if(next->ai_ttl > cname_ttl)
- addrttls[*naddrttls].ttl = cname_ttl;
- else
- addrttls[*naddrttls].ttl = next->ai_ttl;
- memcpy(&addrttls[*naddrttls].ipaddr,
- &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
- sizeof(struct in_addr));
- }
- (*naddrttls)++;
- }
- }
- next = next->ai_next;
+ for (next = ai->nodes; next != NULL; next = next->ai_next) {
+ if (next->ai_family != family) {
+ continue;
+ }
+
+ if (*naddrttls >= req_naddrttls) {
+ break;
}
+ if (family == AF_INET6) {
+ if (next->ai_ttl > cname_ttl) {
+ addr6ttls[*naddrttls].ttl = cname_ttl;
+ } else {
+ addr6ttls[*naddrttls].ttl = next->ai_ttl;
+ }
+
+ memcpy(
+ &addr6ttls[*naddrttls].ip6addr,
+ &(CARES_INADDR_CAST(struct sockaddr_in6 *, next->ai_addr)->sin6_addr),
+ sizeof(struct ares_in6_addr));
+ } else {
+ if (next->ai_ttl > cname_ttl) {
+ addrttls[*naddrttls].ttl = cname_ttl;
+ } else {
+ addrttls[*naddrttls].ttl = next->ai_ttl;
+ }
+ memcpy(
+ &addrttls[*naddrttls].ipaddr,
+ &(CARES_INADDR_CAST(struct sockaddr_in *, next->ai_addr)->sin_addr),
+ sizeof(struct in_addr));
+ }
+ (*naddrttls)++;
+ }
+
return ARES_SUCCESS;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c b/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c
index a086d3f12f..baa9b37212 100644
--- a/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c
+++ b/contrib/libs/c-ares/src/lib/ares__addrinfo_localhost.c
@@ -38,164 +38,152 @@
#endif
#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600
-#include <ws2ipdef.h>
-#include <iphlpapi.h>
+# include <ws2ipdef.h>
+#endif
+
+#if defined(USE_WINSOCK)
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
#endif
#include "ares.h"
#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
#include "ares_private.h"
-int ares_append_ai_node(int aftype,
- unsigned short port,
- int ttl,
- const void *adata,
- struct ares_addrinfo_node **nodes)
+ares_status_t ares_append_ai_node(int aftype, unsigned short port,
+ unsigned int ttl, const void *adata,
+ struct ares_addrinfo_node **nodes)
{
struct ares_addrinfo_node *node;
node = ares__append_addrinfo_node(nodes);
- if (!node)
- {
- return ARES_ENOMEM;
- }
+ if (!node) {
+ return ARES_ENOMEM;
+ }
memset(node, 0, sizeof(*node));
- if (aftype == AF_INET)
- {
- struct sockaddr_in *sin = ares_malloc(sizeof(*sin));
- if (!sin)
- {
- return ARES_ENOMEM;
- }
-
- memset(sin, 0, sizeof(*sin));
- memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr));
- sin->sin_family = AF_INET;
- sin->sin_port = htons(port);
-
- node->ai_addr = (struct sockaddr *)sin;
- node->ai_family = AF_INET;
- node->ai_addrlen = sizeof(*sin);
- node->ai_addr = (struct sockaddr *)sin;
- node->ai_ttl = ttl;
+ if (aftype == AF_INET) {
+ struct sockaddr_in *sin = ares_malloc(sizeof(*sin));
+ if (!sin) {
+ return ARES_ENOMEM;
}
- if (aftype == AF_INET6)
- {
- struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6));
- if (!sin6)
- {
- return ARES_ENOMEM;
- }
-
- memset(sin6, 0, sizeof(*sin6));
- memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr));
- sin6->sin6_family = AF_INET6;
- sin6->sin6_port = htons(port);
-
- node->ai_addr = (struct sockaddr *)sin6;
- node->ai_family = AF_INET6;
- node->ai_addrlen = sizeof(*sin6);
- node->ai_addr = (struct sockaddr *)sin6;
- node->ai_ttl = ttl;
+ memset(sin, 0, sizeof(*sin));
+ memcpy(&sin->sin_addr.s_addr, adata, sizeof(sin->sin_addr.s_addr));
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons(port);
+
+ node->ai_addr = (struct sockaddr *)sin;
+ node->ai_family = AF_INET;
+ node->ai_addrlen = sizeof(*sin);
+ node->ai_addr = (struct sockaddr *)sin;
+ node->ai_ttl = (int)ttl;
+ }
+
+ if (aftype == AF_INET6) {
+ struct sockaddr_in6 *sin6 = ares_malloc(sizeof(*sin6));
+ if (!sin6) {
+ return ARES_ENOMEM;
}
+ memset(sin6, 0, sizeof(*sin6));
+ memcpy(&sin6->sin6_addr.s6_addr, adata, sizeof(sin6->sin6_addr.s6_addr));
+ sin6->sin6_family = AF_INET6;
+ sin6->sin6_port = htons(port);
+
+ node->ai_addr = (struct sockaddr *)sin6;
+ node->ai_family = AF_INET6;
+ node->ai_addrlen = sizeof(*sin6);
+ node->ai_addr = (struct sockaddr *)sin6;
+ node->ai_ttl = (int)ttl;
+ }
+
return ARES_SUCCESS;
}
-
-static int ares__default_loopback_addrs(int aftype,
- unsigned short port,
- struct ares_addrinfo_node **nodes)
+static ares_status_t
+ ares__default_loopback_addrs(int aftype, unsigned short port,
+ struct ares_addrinfo_node **nodes)
{
- int status = ARES_SUCCESS;
-
- if (aftype == AF_UNSPEC || aftype == AF_INET6)
- {
- struct ares_in6_addr addr6;
- ares_inet_pton(AF_INET6, "::1", &addr6);
- status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes);
- if (status != ARES_SUCCESS)
- {
- return status;
- }
+ ares_status_t status = ARES_SUCCESS;
+
+ if (aftype == AF_UNSPEC || aftype == AF_INET6) {
+ struct ares_in6_addr addr6;
+ ares_inet_pton(AF_INET6, "::1", &addr6);
+ status = ares_append_ai_node(AF_INET6, port, 0, &addr6, nodes);
+ if (status != ARES_SUCCESS) {
+ return status;
}
+ }
- if (aftype == AF_UNSPEC || aftype == AF_INET)
- {
- struct in_addr addr4;
- ares_inet_pton(AF_INET, "127.0.0.1", &addr4);
- status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes);
- if (status != ARES_SUCCESS)
- {
- return status;
- }
+ if (aftype == AF_UNSPEC || aftype == AF_INET) {
+ struct in_addr addr4;
+ ares_inet_pton(AF_INET, "127.0.0.1", &addr4);
+ status = ares_append_ai_node(AF_INET, port, 0, &addr4, nodes);
+ if (status != ARES_SUCCESS) {
+ return status;
}
+ }
return status;
}
-
-static int ares__system_loopback_addrs(int aftype,
- unsigned short port,
- struct ares_addrinfo_node **nodes)
+static ares_status_t
+ ares__system_loopback_addrs(int aftype, unsigned short port,
+ struct ares_addrinfo_node **nodes)
{
-#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && !defined(__WATCOMC__)
+#if defined(_WIN32) && defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0600 && \
+ !defined(__WATCOMC__)
PMIB_UNICASTIPADDRESS_TABLE table;
- unsigned int i;
- int status;
+ unsigned int i;
+ ares_status_t status;
*nodes = NULL;
- if (GetUnicastIpAddressTable(aftype, &table) != NO_ERROR)
+ if (GetUnicastIpAddressTable((ADDRESS_FAMILY)aftype, &table) != NO_ERROR) {
return ARES_ENOTFOUND;
+ }
+
+ for (i = 0; i < table->NumEntries; i++) {
+ if (table->Table[i].InterfaceLuid.Info.IfType !=
+ IF_TYPE_SOFTWARE_LOOPBACK) {
+ continue;
+ }
- for (i=0; i<table->NumEntries; i++)
- {
- if (table->Table[i].InterfaceLuid.Info.IfType !=
- IF_TYPE_SOFTWARE_LOOPBACK)
- {
- continue;
- }
-
- if (table->Table[i].Address.si_family == AF_INET)
- {
- status = ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
- &table->Table[i].Address.Ipv4.sin_addr,
- nodes);
- }
- else if (table->Table[i].Address.si_family == AF_INET6)
- {
- status = ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
- &table->Table[i].Address.Ipv6.sin6_addr,
- nodes);
- }
- else
- {
- /* Ignore any others */
- continue;
- }
-
- if (status != ARES_SUCCESS)
- {
- goto fail;
- }
+ if (table->Table[i].Address.si_family == AF_INET) {
+ status =
+ ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
+ &table->Table[i].Address.Ipv4.sin_addr, nodes);
+ } else if (table->Table[i].Address.si_family == AF_INET6) {
+ status =
+ ares_append_ai_node(table->Table[i].Address.si_family, port, 0,
+ &table->Table[i].Address.Ipv6.sin6_addr, nodes);
+ } else {
+ /* Ignore any others */
+ continue;
}
- if (*nodes == NULL)
- status = ARES_ENOTFOUND;
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (*nodes == NULL) {
+ status = ARES_ENOTFOUND;
+ }
fail:
FreeMibTable(table);
- if (status != ARES_SUCCESS)
- {
- ares__freeaddrinfo_nodes(*nodes);
- *nodes = NULL;
- }
+ if (status != ARES_SUCCESS) {
+ ares__freeaddrinfo_nodes(*nodes);
+ *nodes = NULL;
+ }
return status;
@@ -208,14 +196,12 @@ fail:
#endif
}
-
-int ares__addrinfo_localhost(const char *name,
- unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai)
+ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port,
+ const struct ares_addrinfo_hints *hints,
+ struct ares_addrinfo *ai)
{
struct ares_addrinfo_node *nodes = NULL;
- int result;
+ ares_status_t status;
/* Validate family */
switch (hints->ai_family) {
@@ -228,21 +214,19 @@ int ares__addrinfo_localhost(const char *name,
}
ai->name = ares_strdup(name);
- if(!ai->name)
- {
- goto enomem;
- }
+ if (!ai->name) {
+ goto enomem;
+ }
- result = ares__system_loopback_addrs(hints->ai_family, port, &nodes);
+ status = ares__system_loopback_addrs(hints->ai_family, port, &nodes);
- if (result == ARES_ENOTFOUND)
- {
- result = ares__default_loopback_addrs(hints->ai_family, port, &nodes);
- }
+ if (status == ARES_ENOTFOUND) {
+ status = ares__default_loopback_addrs(hints->ai_family, port, &nodes);
+ }
ares__addrinfo_cat_nodes(&ai->nodes, nodes);
- return result;
+ return status;
enomem:
ares__freeaddrinfo_nodes(nodes);
diff --git a/contrib/libs/c-ares/src/lib/ares__buf.c b/contrib/libs/c-ares/src/lib/ares__buf.c
index 777a5300c9..0663383df9 100644
--- a/contrib/libs/c-ares/src/lib/ares__buf.c
+++ b/contrib/libs/c-ares/src/lib/ares__buf.c
@@ -33,40 +33,41 @@
#endif
struct ares__buf {
- const unsigned char *data; /*!< pointer to start of data buffer */
- size_t data_len; /*!< total size of data in buffer */
+ const unsigned char *data; /*!< pointer to start of data buffer */
+ size_t data_len; /*!< total size of data in buffer */
- unsigned char *alloc_buf; /*!< Pointer to allocated data buffer,
- * not used for const buffers */
- size_t alloc_buf_len; /*!< Size of allocated data buffer */
+ unsigned char *alloc_buf; /*!< Pointer to allocated data buffer,
+ * not used for const buffers */
+ size_t alloc_buf_len; /*!< Size of allocated data buffer */
- size_t offset; /*!< Current working offset in buffer */
- size_t tag_offset; /*!< Tagged offset in buffer. Uses
- * SIZE_MAX if not set. */
+ size_t offset; /*!< Current working offset in buffer */
+ size_t tag_offset; /*!< Tagged offset in buffer. Uses
+ * SIZE_MAX if not set. */
};
ares__buf_t *ares__buf_create(void)
{
- ares__buf_t *buf = ares_malloc(sizeof(*buf));
- if (buf == NULL)
+ ares__buf_t *buf = ares_malloc_zero(sizeof(*buf));
+ if (buf == NULL) {
return NULL;
+ }
- memset(buf, 0, sizeof(*buf));
buf->tag_offset = SIZE_MAX;
return buf;
}
-
ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len)
{
ares__buf_t *buf;
- if (data == NULL || data_len == 0)
+ if (data == NULL || data_len == 0) {
return NULL;
+ }
buf = ares__buf_create();
- if (buf == NULL)
+ if (buf == NULL) {
return NULL;
+ }
buf->data = data;
buf->data_len = data_len;
@@ -74,72 +75,84 @@ ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len)
return buf;
}
-
void ares__buf_destroy(ares__buf_t *buf)
{
- if (buf == NULL)
+ if (buf == NULL) {
return;
+ }
ares_free(buf->alloc_buf);
ares_free(buf);
}
-
-static int ares__buf_is_const(const ares__buf_t *buf)
+static ares_bool_t ares__buf_is_const(const ares__buf_t *buf)
{
- if (buf == NULL)
- return 0;
+ if (buf == NULL) {
+ return ARES_FALSE;
+ }
- if (buf->data != NULL && buf->alloc_buf == NULL)
- return 1;
+ if (buf->data != NULL && buf->alloc_buf == NULL) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-
-static void ares__buf_reclaim(ares__buf_t *buf)
+void ares__buf_reclaim(ares__buf_t *buf)
{
size_t prefix_size;
size_t data_size;
- if (buf == NULL)
+ if (buf == NULL) {
+ return;
+ }
+
+ if (ares__buf_is_const(buf)) {
return;
+ }
- if (ares__buf_is_const(buf))
+ /* Silence coverity. All lengths are zero so would bail out later but
+ * coverity doesn't know this */
+ if (buf->alloc_buf == NULL) {
return;
+ }
- if (buf->tag_offset != SIZE_MAX) {
+ if (buf->tag_offset != SIZE_MAX && buf->tag_offset < buf->offset) {
prefix_size = buf->tag_offset;
} else {
prefix_size = buf->offset;
}
- if (prefix_size == 0)
+ if (prefix_size == 0) {
return;
+ }
data_size = buf->data_len - prefix_size;
memmove(buf->alloc_buf, buf->alloc_buf + prefix_size, data_size);
- buf->data = buf->alloc_buf;
- buf->data_len = data_size;
- buf->offset -= prefix_size;
- if (buf->tag_offset != SIZE_MAX)
+ buf->data = buf->alloc_buf;
+ buf->data_len = data_size;
+ buf->offset -= prefix_size;
+ if (buf->tag_offset != SIZE_MAX) {
buf->tag_offset -= prefix_size;
+ }
return;
}
-
-static int ares__buf_ensure_space(ares__buf_t *buf, size_t needed_size)
+static ares_status_t ares__buf_ensure_space(ares__buf_t *buf,
+ size_t needed_size)
{
size_t remaining_size;
size_t alloc_size;
unsigned char *ptr;
- if (buf == NULL)
+ if (buf == NULL) {
return ARES_EFORMERR;
+ }
- if (ares__buf_is_const(buf))
+ if (ares__buf_is_const(buf)) {
return ARES_EFORMERR;
+ }
/* When calling ares__buf_finish_str() we end up adding a null terminator,
* so we want to ensure the size is always sufficient for this as we don't
@@ -148,31 +161,35 @@ static int ares__buf_ensure_space(ares__buf_t *buf, size_t needed_size)
/* No need to do an expensive move operation, we have enough to just append */
remaining_size = buf->alloc_buf_len - buf->data_len;
- if (remaining_size >= needed_size)
+ if (remaining_size >= needed_size) {
return ARES_SUCCESS;
+ }
/* See if just moving consumed data frees up enough space */
ares__buf_reclaim(buf);
remaining_size = buf->alloc_buf_len - buf->data_len;
- if (remaining_size >= needed_size)
+ if (remaining_size >= needed_size) {
return ARES_SUCCESS;
+ }
alloc_size = buf->alloc_buf_len;
/* Not yet started */
- if (alloc_size == 0)
+ if (alloc_size == 0) {
alloc_size = 16; /* Always shifts 1, so ends up being 32 minimum */
+ }
/* Increase allocation by powers of 2 */
do {
- alloc_size <<= 1;
- remaining_size = alloc_size - buf->data_len;
+ alloc_size <<= 1;
+ remaining_size = alloc_size - buf->data_len;
} while (remaining_size < needed_size);
ptr = ares_realloc(buf->alloc_buf, alloc_size);
- if (ptr == NULL)
+ if (ptr == NULL) {
return ARES_ENOMEM;
+ }
buf->alloc_buf = ptr;
buf->alloc_buf_len = alloc_size;
@@ -181,75 +198,148 @@ static int ares__buf_ensure_space(ares__buf_t *buf, size_t needed_size)
return ARES_SUCCESS;
}
+ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len)
+{
+ if (buf == NULL || ares__buf_is_const(buf)) {
+ return ARES_EFORMERR;
+ }
+
+ if (len >= buf->alloc_buf_len - buf->offset) {
+ return ARES_EFORMERR;
+ }
-int ares__buf_append(ares__buf_t *buf, const unsigned char *data,
- size_t data_len)
+ buf->data_len = len;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data,
+ size_t data_len)
{
- int status;
+ ares_status_t status;
- if (data == NULL || data_len == 0)
+ if (data == NULL || data_len == 0) {
return ARES_EFORMERR;
+ }
status = ares__buf_ensure_space(buf, data_len);
- if (status != ARES_SUCCESS)
+ if (status != ARES_SUCCESS) {
return status;
+ }
memcpy(buf->alloc_buf + buf->data_len, data, data_len);
buf->data_len += data_len;
return ARES_SUCCESS;
}
+ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte)
+{
+ return ares__buf_append(buf, &byte, 1);
+}
+
+ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16)
+{
+ ares_status_t status;
+
+ status = ares__buf_append_byte(buf, (unsigned char)((u16 >> 8) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, (unsigned char)(u16 & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32)
+{
+ ares_status_t status;
+
+ status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 24) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 16) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ((unsigned char)(u32 >> 8) & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ((unsigned char)u32 & 0xff));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len)
{
- int status;
+ ares_status_t status;
- if (len == NULL || *len == 0)
+ if (len == NULL || *len == 0) {
return NULL;
+ }
status = ares__buf_ensure_space(buf, *len);
- if (status != ARES_SUCCESS)
+ if (status != ARES_SUCCESS) {
return NULL;
+ }
- *len = buf->alloc_buf_len - buf->data_len;
+ /* -1 for possible null terminator for ares__buf_finish_str() */
+ *len = buf->alloc_buf_len - buf->data_len - 1;
return buf->alloc_buf + buf->data_len;
}
-
void ares__buf_append_finish(ares__buf_t *buf, size_t len)
{
- if (buf == NULL)
+ if (buf == NULL) {
return;
+ }
buf->data_len += len;
}
-
unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len)
{
unsigned char *ptr = NULL;
- if (buf == NULL || len == NULL || ares__buf_is_const(buf))
+ if (buf == NULL || len == NULL || ares__buf_is_const(buf)) {
return NULL;
+ }
ares__buf_reclaim(buf);
+
+ /* We don't want to return NULL except on failure, may be zero-length */
+ if (buf->alloc_buf == NULL &&
+ ares__buf_ensure_space(buf, 1) != ARES_SUCCESS) {
+ return NULL;
+ }
ptr = buf->alloc_buf;
*len = buf->data_len;
ares_free(buf);
return ptr;
}
-
char *ares__buf_finish_str(ares__buf_t *buf, size_t *len)
{
char *ptr;
size_t mylen;
ptr = (char *)ares__buf_finish_bin(buf, &mylen);
- if (ptr == NULL)
+ if (ptr == NULL) {
return NULL;
+ }
- if (len != NULL)
+ if (len != NULL) {
*len = mylen;
+ }
/* NOTE: ensured via ares__buf_ensure_space() that there is always at least
* 1 extra byte available for this specific use-case */
@@ -258,131 +348,285 @@ char *ares__buf_finish_str(ares__buf_t *buf, size_t *len)
return ptr;
}
-
void ares__buf_tag(ares__buf_t *buf)
{
- if (buf == NULL)
+ if (buf == NULL) {
return;
+ }
buf->tag_offset = buf->offset;
}
-
-int ares__buf_tag_rollback(ares__buf_t *buf)
+ares_status_t ares__buf_tag_rollback(ares__buf_t *buf)
{
- if (buf == NULL || buf->tag_offset == SIZE_MAX)
+ if (buf == NULL || buf->tag_offset == SIZE_MAX) {
return ARES_EFORMERR;
+ }
buf->offset = buf->tag_offset;
buf->tag_offset = SIZE_MAX;
return ARES_SUCCESS;
}
-
-int ares__buf_tag_clear(ares__buf_t *buf)
+ares_status_t ares__buf_tag_clear(ares__buf_t *buf)
{
- if (buf == NULL || buf->tag_offset == SIZE_MAX)
+ if (buf == NULL || buf->tag_offset == SIZE_MAX) {
return ARES_EFORMERR;
+ }
buf->tag_offset = SIZE_MAX;
return ARES_SUCCESS;
}
-
const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len)
{
- if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL)
+ if (buf == NULL || buf->tag_offset == SIZE_MAX || len == NULL) {
return NULL;
+ }
*len = buf->offset - buf->tag_offset;
return buf->data + buf->tag_offset;
}
+size_t ares__buf_tag_length(const ares__buf_t *buf)
+{
+ if (buf == NULL || buf->tag_offset == SIZE_MAX) {
+ return 0;
+ }
+ return buf->offset - buf->tag_offset;
+}
+
+ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf,
+ unsigned char *bytes, size_t *len)
+{
+ size_t ptr_len = 0;
+ const unsigned char *ptr = ares__buf_tag_fetch(buf, &ptr_len);
+
+ if (ptr == NULL || bytes == NULL || len == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*len < ptr_len) {
+ return ARES_EFORMERR;
+ }
+
+ *len = ptr_len;
+
+ if (ptr_len > 0) {
+ memcpy(bytes, ptr, ptr_len);
+ }
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str,
+ size_t len)
+{
+ size_t out_len;
+ ares_status_t status;
+ size_t i;
+
+ if (str == NULL || len == 0) {
+ return ARES_EFORMERR;
+ }
+
+ /* Space for NULL terminator */
+ out_len = len - 1;
+
+ status = ares__buf_tag_fetch_bytes(buf, (unsigned char *)str, &out_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* NULL terminate */
+ str[out_len] = 0;
+
+ /* Validate string is printable */
+ for (i = 0; i < out_len; i++) {
+ if (!ares__isprint(str[i])) {
+ return ARES_EBADSTR;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
static const unsigned char *ares__buf_fetch(const ares__buf_t *buf, size_t *len)
{
- if (len != NULL)
+ if (len != NULL) {
*len = 0;
+ }
- if (buf == NULL || len == NULL || buf->data == NULL)
+ if (buf == NULL || len == NULL || buf->data == NULL) {
return NULL;
+ }
*len = buf->data_len - buf->offset;
+ if (*len == 0) {
+ return NULL;
+ }
+
return buf->data + buf->offset;
}
-
-int ares__buf_consume(ares__buf_t *buf, size_t len)
+ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len)
{
- size_t remaining_len;
+ size_t remaining_len = ares__buf_len(buf);
- ares__buf_fetch(buf, &remaining_len);
-
- if (remaining_len < len)
+ if (remaining_len < len) {
return ARES_EBADRESP;
+ }
buf->offset += len;
return ARES_SUCCESS;
}
-
-int ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16)
+ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16)
{
size_t remaining_len;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ unsigned int u32;
- if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16))
+ if (buf == NULL || u16 == NULL || remaining_len < sizeof(*u16)) {
return ARES_EBADRESP;
+ }
- *u16 = (unsigned short)((unsigned short)(ptr[0]) << 8 | (unsigned short)ptr[1]);
+ /* Do math in an unsigned int in order to prevent warnings due to automatic
+ * conversion by the compiler from short to int during shifts */
+ u32 = ((unsigned int)(ptr[0]) << 8 | (unsigned int)ptr[1]);
+ *u16 = (unsigned short)(u32 & 0xFFFF);
return ares__buf_consume(buf, sizeof(*u16));
}
+ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+
+ if (buf == NULL || u32 == NULL || remaining_len < sizeof(*u32)) {
+ return ARES_EBADRESP;
+ }
-int ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
- size_t len)
+ *u32 = ((unsigned int)(ptr[0]) << 24 | (unsigned int)(ptr[1]) << 16 |
+ (unsigned int)(ptr[2]) << 8 | (unsigned int)(ptr[3]));
+
+ return ares__buf_consume(buf, sizeof(*u32));
+}
+
+ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
+ size_t len)
{
size_t remaining_len;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
- if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len)
+ if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) {
return ARES_EBADRESP;
+ }
memcpy(bytes, ptr, len);
return ares__buf_consume(buf, len);
}
+ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len,
+ ares_bool_t null_term,
+ unsigned char **bytes)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+
+ if (buf == NULL || bytes == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ *bytes = ares_malloc(null_term ? len + 1 : len);
+ if (*bytes == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ memcpy(*bytes, ptr, len);
+ if (null_term) {
+ (*bytes)[len] = 0;
+ }
+ return ares__buf_consume(buf, len);
+}
+
+ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+
+ if (buf == NULL || str == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ *str = ares_malloc(len + 1);
+ if (*str == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ memcpy(*str, ptr, len);
+ (*str)[len] = 0;
+
+ return ares__buf_consume(buf, len);
+}
+
+ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf,
+ ares__buf_t *dest, size_t len)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ ares_status_t status;
+
+ if (buf == NULL || dest == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ status = ares__buf_append(dest, ptr, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares__buf_consume(buf, len);
+}
+
+static ares_bool_t ares__is_whitespace(unsigned char c,
+ ares_bool_t include_linefeed)
+{
+ switch (c) {
+ case '\r':
+ case '\t':
+ case ' ':
+ case '\v':
+ case '\f':
+ return ARES_TRUE;
+ case '\n':
+ return include_linefeed;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
-size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed)
+size_t ares__buf_consume_whitespace(ares__buf_t *buf,
+ ares_bool_t include_linefeed)
{
size_t remaining_len = 0;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
size_t i;
- if (ptr == NULL)
+ if (ptr == NULL) {
return 0;
+ }
- for (i=0; i<remaining_len; i++) {
- switch(ptr[i]) {
- case '\r':
- case '\t':
- case ' ':
- case '\v':
- case '\f':
- break;
- case '\n':
- if (!include_linefeed)
- goto done;
- break;
- default:
- goto done;
+ for (i = 0; i < remaining_len; i++) {
+ if (!ares__is_whitespace(ptr[i], include_linefeed)) {
+ break;
}
}
-done:
- if (i > 0)
+ if (i > 0) {
ares__buf_consume(buf, i);
+ }
return i;
}
@@ -392,85 +636,580 @@ size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf)
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
size_t i;
- if (ptr == NULL)
+ if (ptr == NULL) {
return 0;
+ }
- for (i=0; i<remaining_len; i++) {
- switch(ptr[i]) {
- case '\r':
- case '\t':
- case ' ':
- case '\v':
- case '\f':
- case '\n':
- goto done;
- default:
- break;
+ for (i = 0; i < remaining_len; i++) {
+ if (ares__is_whitespace(ptr[i], ARES_TRUE)) {
+ break;
+ }
+ }
+
+ if (i > 0) {
+ ares__buf_consume(buf, i);
+ }
+ return i;
+}
+
+size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed)
+{
+ size_t remaining_len = 0;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ size_t i;
+
+ if (ptr == NULL) {
+ return 0;
+ }
+
+ for (i = 0; i < remaining_len; i++) {
+ if (ptr[i] == '\n') {
+ goto done;
}
}
done:
- if (i > 0)
+ if (include_linefeed && i < remaining_len && ptr[i] == '\n') {
+ i++;
+ }
+
+ if (i > 0) {
ares__buf_consume(buf, i);
+ }
return i;
}
-size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed)
+size_t ares__buf_consume_until_charset(ares__buf_t *buf,
+ const unsigned char *charset, size_t len,
+ ares_bool_t require_charset)
{
size_t remaining_len = 0;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
size_t i;
+ ares_bool_t found = ARES_FALSE;
- if (ptr == NULL)
+ if (ptr == NULL || charset == NULL || len == 0) {
return 0;
+ }
- for (i=0; i<remaining_len; i++) {
- switch(ptr[i]) {
- case '\n':
- if (include_linefeed)
- i++;
+ for (i = 0; i < remaining_len; i++) {
+ size_t j;
+ for (j = 0; j < len; j++) {
+ if (ptr[i] == charset[j]) {
+ found = ARES_TRUE;
goto done;
- default:
- break;
+ }
}
}
done:
- if (i > 0)
+ if (require_charset && !found) {
+ return 0;
+ }
+
+ if (i > 0) {
+ ares__buf_consume(buf, i);
+ }
+ return i;
+}
+
+size_t ares__buf_consume_charset(ares__buf_t *buf, const unsigned char *charset,
+ size_t len)
+{
+ size_t remaining_len = 0;
+ const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
+ size_t i;
+
+ if (ptr == NULL || charset == NULL || len == 0) {
+ return 0;
+ }
+
+ for (i = 0; i < remaining_len; i++) {
+ size_t j;
+ for (j = 0; j < len; j++) {
+ if (ptr[i] == charset[j]) {
+ break;
+ }
+ }
+ /* Not found */
+ if (j == len) {
+ break;
+ }
+ }
+
+ if (i > 0) {
ares__buf_consume(buf, i);
+ }
return i;
}
+static void ares__buf_destroy_cb(void *arg)
+{
+ ares__buf_destroy(arg);
+}
+
+static ares_bool_t ares__buf_split_isduplicate(ares__llist_t *list,
+ const unsigned char *val,
+ size_t len,
+ ares__buf_split_t flags)
+{
+ ares__llist_node_t *node;
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares__buf_t *buf = ares__llist_node_val(node);
+ size_t plen = 0;
+ const unsigned char *ptr = ares__buf_peek(buf, &plen);
+
+ /* Can't be duplicate if lengths mismatch */
+ if (plen != len) {
+ continue;
+ }
+
+ if (flags & ARES_BUF_SPLIT_CASE_INSENSITIVE) {
+ if (ares__memeq_ci(ptr, val, len)) {
+ return ARES_TRUE;
+ }
+ } else {
+ if (memcmp(ptr, val, len) == 0) {
+ return ARES_TRUE;
+ }
+ }
+ }
+ return ARES_FALSE;
+}
+
+ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
+ size_t delims_len, ares__buf_split_t flags,
+ size_t max_sections, ares__llist_t **list)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t first = ARES_TRUE;
+
+ if (buf == NULL || delims == NULL || delims_len == 0 || list == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *list = ares__llist_create(ares__buf_destroy_cb);
+ if (*list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ while (ares__buf_len(buf)) {
+ size_t len = 0;
+ const unsigned char *ptr;
+
+ if (first) {
+ /* No delimiter yet, just tag the start */
+ ares__buf_tag(buf);
+ } else {
+ if (flags & ARES_BUF_SPLIT_DONT_CONSUME_DELIMS) {
+ /* tag then eat delimiter so its first byte in buffer */
+ ares__buf_tag(buf);
+ ares__buf_consume(buf, 1);
+ } else {
+ /* throw away delimiter */
+ ares__buf_consume(buf, 1);
+ ares__buf_tag(buf);
+ }
+ }
+
+ if (max_sections && ares__llist_len(*list) >= max_sections - 1) {
+ ares__buf_consume(buf, ares__buf_len(buf));
+ } else {
+ ares__buf_consume_until_charset(buf, delims, delims_len, ARES_FALSE);
+ }
+
+ ptr = ares__buf_tag_fetch(buf, &len);
+
+ /* Shouldn't be possible */
+ if (ptr == NULL) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
+
+ if (flags & ARES_BUF_SPLIT_LTRIM) {
+ size_t i;
+ for (i = 0; i < len; i++) {
+ if (!ares__is_whitespace(ptr[i], ARES_TRUE)) {
+ break;
+ }
+ }
+ ptr += i;
+ len -= i;
+ }
+
+ if (flags & ARES_BUF_SPLIT_RTRIM) {
+ while (len && ares__is_whitespace(ptr[len - 1], ARES_TRUE)) {
+ len--;
+ }
+ }
+
+ if (len != 0 || flags & ARES_BUF_SPLIT_ALLOW_BLANK) {
+ ares__buf_t *data;
+
+ if (!(flags & ARES_BUF_SPLIT_NO_DUPLICATES) ||
+ !ares__buf_split_isduplicate(*list, ptr, len, flags)) {
+ /* Since we don't allow const buffers of 0 length, and user wants
+ * 0-length buffers, swap what we do here */
+ if (len) {
+ data = ares__buf_create_const(ptr, len);
+ } else {
+ data = ares__buf_create();
+ }
+
+ if (data == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ if (ares__llist_insert_last(*list, data) == NULL) {
+ ares__buf_destroy(data);
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+ }
+
+ first = ARES_FALSE;
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__llist_destroy(*list);
+ *list = NULL;
+ }
-int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data,
- size_t data_len)
+ return status;
+}
+
+ares_bool_t ares__buf_begins_with(const ares__buf_t *buf,
+ const unsigned char *data, size_t data_len)
{
size_t remaining_len = 0;
const unsigned char *ptr = ares__buf_fetch(buf, &remaining_len);
- if (ptr == NULL || data == NULL || data_len == 0)
+ if (ptr == NULL || data == NULL || data_len == 0) {
+ return ARES_FALSE;
+ }
+
+ if (data_len > remaining_len) {
+ return ARES_FALSE;
+ }
+
+ if (memcmp(ptr, data, data_len) != 0) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+size_t ares__buf_len(const ares__buf_t *buf)
+{
+ if (buf == NULL) {
+ return 0;
+ }
+
+ return buf->data_len - buf->offset;
+}
+
+const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len)
+{
+ return ares__buf_fetch(buf, len);
+}
+
+size_t ares__buf_get_position(const ares__buf_t *buf)
+{
+ if (buf == NULL) {
+ return 0;
+ }
+ return buf->offset;
+}
+
+ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx)
+{
+ if (buf == NULL) {
return ARES_EFORMERR;
+ }
- if (data_len > remaining_len)
- return ARES_EBADRESP;
+ if (idx > buf->data_len) {
+ return ARES_EFORMERR;
+ }
- if (memcmp(ptr, data, data_len) == 0)
+ buf->offset = idx;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len,
+ unsigned char **bin, size_t *bin_len,
+ ares_bool_t allow_multiple)
+{
+ unsigned char len;
+ ares_status_t status;
+ ares__buf_t *binbuf = NULL;
+ size_t orig_len = ares__buf_len(buf);
+
+ if (buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (remaining_len == 0) {
return ARES_EBADRESP;
+ }
+
+ binbuf = ares__buf_create();
+ if (binbuf == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ while (orig_len - ares__buf_len(buf) < remaining_len) {
+ status = ares__buf_fetch_bytes(buf, &len, 1);
+ if (status != ARES_SUCCESS) {
+ break;
+ }
+
+ if (len) {
+ /* XXX: Maybe we should scan to make sure it is printable? */
+ if (bin != NULL) {
+ status = ares__buf_fetch_bytes_into_buf(buf, binbuf, len);
+ } else {
+ status = ares__buf_consume(buf, len);
+ }
+ if (status != ARES_SUCCESS) {
+ break;
+ }
+ }
+
+ if (!allow_multiple) {
+ break;
+ }
+ }
+
+
+ if (status != ARES_SUCCESS) {
+ ares__buf_destroy(binbuf);
+ } else {
+ if (bin != NULL) {
+ size_t mylen = 0;
+ /* NOTE: we use ares__buf_finish_str() here as we guarantee NULL
+ * Termination even though we are technically returning binary data.
+ */
+ *bin = (unsigned char *)ares__buf_finish_str(binbuf, &mylen);
+ *bin_len = mylen;
+ }
+ }
+
+ return status;
+}
+
+ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len,
+ char **str, ares_bool_t allow_multiple)
+{
+ size_t len;
+ return ares__buf_parse_dns_binstr(buf, remaining_len, (unsigned char **)str,
+ &len, allow_multiple);
+}
+
+ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num, size_t len)
+{
+ size_t i;
+ size_t mod;
+
+ if (len == 0) {
+ len = ares__count_digits(num);
+ }
+
+ mod = ares__pow(10, len);
+
+ for (i = len; i > 0; i--) {
+ size_t digit = (num % mod);
+ ares_status_t status;
+
+ mod /= 10;
+
+ /* Silence coverity. Shouldn't be possible since we calculate it above */
+ if (mod == 0) {
+ return ARES_EFORMERR;
+ }
+ digit /= mod;
+ status = ares__buf_append_byte(buf, '0' + (unsigned char)(digit & 0xFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
return ARES_SUCCESS;
}
+ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num, size_t len)
+{
+ size_t i;
+ static const unsigned char hexbytes[] = "0123456789ABCDEF";
-size_t ares__buf_len(const ares__buf_t *buf)
+ if (len == 0) {
+ len = ares__count_hexdigits(num);
+ }
+
+ for (i = len; i > 0; i--) {
+ ares_status_t status;
+ status = ares__buf_append_byte(buf, hexbytes[(num >> ((i - 1) * 4)) & 0xF]);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str)
{
- size_t len = 0;
- ares__buf_fetch(buf, &len);
- return len;
+ return ares__buf_append(buf, (const unsigned char *)str, ares_strlen(str));
}
+static ares_status_t ares__buf_hexdump_line(ares__buf_t *buf, size_t idx,
+ const unsigned char *data,
+ size_t len)
+{
+ size_t i;
+ ares_status_t status;
-const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len)
+ /* Address */
+ status = ares__buf_append_num_hex(buf, idx, 6);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* | */
+ status = ares__buf_append_str(buf, " | ");
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (i >= len) {
+ status = ares__buf_append_str(buf, " ");
+ } else {
+ status = ares__buf_append_num_hex(buf, data[i], 2);
+ }
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_byte(buf, ' ');
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ /* | */
+ status = ares__buf_append_str(buf, " | ");
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ for (i = 0; i < 16; i++) {
+ if (i >= len) {
+ break;
+ }
+ status = ares__buf_append_byte(buf, ares__isprint(data[i]) ? data[i] : '.');
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ares__buf_append_byte(buf, '\n');
+}
+
+ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data,
+ size_t len)
{
- return ares__buf_fetch(buf, len);
+ size_t i;
+
+ /* Each line is 16 bytes */
+ for (i = 0; i < len; i += 16) {
+ ares_status_t status;
+ status = ares__buf_hexdump_line(buf, i, data + i, len - i);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
}
+ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf)
+{
+ FILE *fp = NULL;
+ unsigned char *ptr = NULL;
+ size_t len = 0;
+ size_t ptr_len = 0;
+ long ftell_len = 0;
+ ares_status_t status;
+
+ if (filename == NULL || buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ fp = fopen(filename, "rb");
+ if (fp == NULL) {
+ int error = ERRNO;
+ switch (error) {
+ case ENOENT:
+ case ESRCH:
+ status = ARES_ENOTFOUND;
+ goto done;
+ default:
+ DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
+ strerror(error)));
+ DEBUGF(fprintf(stderr, "Error opening file: %s\n", filename));
+ status = ARES_EFILE;
+ goto done;
+ }
+ }
+
+ /* Get length portably, fstat() is POSIX, not C */
+ if (fseek(fp, 0, SEEK_END) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ ftell_len = ftell(fp);
+ if (ftell_len < 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+ len = (size_t)ftell_len;
+
+ if (fseek(fp, 0, SEEK_SET) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ if (len == 0) {
+ status = ARES_SUCCESS;
+ goto done;
+ }
+
+ /* Read entire data into buffer */
+ ptr_len = len;
+ ptr = ares__buf_append_start(buf, &ptr_len);
+ if (ptr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ ptr_len = fread(ptr, 1, len, fp);
+ if (ptr_len != len) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ ares__buf_append_finish(buf, len);
+ status = ARES_SUCCESS;
+
+done:
+ if (fp != NULL) {
+ fclose(fp);
+ }
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__buf.h b/contrib/libs/c-ares/src/lib/ares__buf.h
index d81fc26f42..4298814f7b 100644
--- a/contrib/libs/c-ares/src/lib/ares__buf.h
+++ b/contrib/libs/c-ares/src/lib/ares__buf.h
@@ -33,6 +33,10 @@
* validation and return a success/fail result. There are also various helpers
* for writing data to the buffer which dynamically grows.
*
+ * All operations that fetch or consume data from the buffer will move forward
+ * the internal pointer, thus marking the data as processed which may no longer
+ * be accessible after certain operations (such as append).
+ *
* The helpers for this object are meant to be added as needed. If you can't
* find it, write it!
*
@@ -44,10 +48,10 @@ struct ares__buf;
typedef struct ares__buf ares__buf_t;
/*! Create a new buffer object that dynamically allocates buffers for data.
- *
+ *
* \return initialized buffer object or NULL if out of memory.
*/
-ares__buf_t *ares__buf_create(void);
+ares__buf_t *ares__buf_create(void);
/*! Create a new buffer object that uses a user-provided data pointer. The
* data provided will not be manipulated, and cannot be appended to. This
@@ -60,21 +64,90 @@ ares__buf_t *ares__buf_create(void);
*/
ares__buf_t *ares__buf_create_const(const unsigned char *data, size_t data_len);
+
/*! Destroy an initialized buffer object.
*
* \param[in] buf Initialized buf object
*/
-void ares__buf_destroy(ares__buf_t *buf);
+void ares__buf_destroy(ares__buf_t *buf);
+
-/*! Append to a dynamic buffer object
+/*! Append multiple bytes to a dynamic buffer object
*
* \param[in] buf Initialized buffer object
* \param[in] data Data to copy to buffer object
* \param[in] data_len Length of data to copy to buffer object.
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_append(ares__buf_t *buf, const unsigned char *data,
- size_t data_len);
+ares_status_t ares__buf_append(ares__buf_t *buf, const unsigned char *data,
+ size_t data_len);
+
+/*! Append a single byte to the dynamic buffer object
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] byte Single byte to append to buffer object.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_byte(ares__buf_t *buf, unsigned char byte);
+
+/*! Append a null-terminated string to the dynamic buffer object
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] str String to append to buffer object.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_str(ares__buf_t *buf, const char *str);
+
+/*! Append a 16bit Big Endian number to the buffer.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] u16 16bit integer
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_be16(ares__buf_t *buf, unsigned short u16);
+
+/*! Append a 32bit Big Endian number to the buffer.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] u32 32bit integer
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_append_be32(ares__buf_t *buf, unsigned int u32);
+
+/*! Append a number in ASCII decimal form.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] num Number to print
+ * \param[in] len Length to output, use 0 for no padding
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_append_num_dec(ares__buf_t *buf, size_t num,
+ size_t len);
+
+/*! Append a number in ASCII hexadecimal form.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] num Number to print
+ * \param[in] len Length to output, use 0 for no padding
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_append_num_hex(ares__buf_t *buf, size_t num,
+ size_t len);
+
+/*! Sets the current buffer length. This *may* be used if there is a need to
+ * override a prior position in the buffer, such as if there is a length
+ * prefix that isn't easily predictable, and you must go back and overwrite
+ * that position.
+ *
+ * Only valid on non-const buffers. Length provided must not exceed current
+ * allocated buffer size, but otherwise there are very few protections on
+ * this function. Use cautiously.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] len Length to set
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_set_length(ares__buf_t *buf, size_t len);
/*! Start a dynamic append operation that returns a buffer suitable for
@@ -98,7 +171,17 @@ unsigned char *ares__buf_append_start(ares__buf_t *buf, size_t *len);
* operation. Must not be greater than returned from
* ares__buf_append_start().
*/
-void ares__buf_append_finish(ares__buf_t *buf, size_t len);
+void ares__buf_append_finish(ares__buf_t *buf, size_t len);
+
+/*! Write the data provided to the buffer in a hexdump format.
+ *
+ * \param[in] buf Initialized buffer object.
+ * \param[in] data Data to hex dump
+ * \param[in] len Length of data to hexdump
+ * \return ARES_SUCCESS on success.
+ */
+ares_status_t ares__buf_hexdump(ares__buf_t *buf, const unsigned char *data,
+ size_t len);
/*! Clean up ares__buf_t and return allocated pointer to unprocessed data. It
* is the responsibility of the caller to ares_free() the returned buffer.
@@ -106,7 +189,7 @@ void ares__buf_append_finish(ares__buf_t *buf, size_t len);
*
* \param[in] buf Initialized buffer object. Can not be a "const" buffer.
* \param[out] len Length of data returned
- * \return pointer to unprocessed data or NULL on error.
+ * \return pointer to unprocessed data (may be zero length) or NULL on error.
*/
unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len);
@@ -124,7 +207,7 @@ unsigned char *ares__buf_finish_bin(ares__buf_t *buf, size_t *len);
* \param[out] len Optional. Length of data returned, or NULL if not needed.
* \return pointer to unprocessed data or NULL on error.
*/
-char *ares__buf_finish_str(ares__buf_t *buf, size_t *len);
+char *ares__buf_finish_str(ares__buf_t *buf, size_t *len);
/*! Tag a position to save in the buffer in case parsing needs to rollback,
* such as if insufficient data is available, but more data may be added in
@@ -133,14 +216,14 @@ char *ares__buf_finish_str(ares__buf_t *buf, size_t *len);
*
* \param[in] buf Initialized buffer object
*/
-void ares__buf_tag(ares__buf_t *buf);
+void ares__buf_tag(ares__buf_t *buf);
/*! Rollback to a tagged position. Will automatically clear the tag.
*
* \param[in] buf Initialized buffer object
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_tag_rollback(ares__buf_t *buf);
+ares_status_t ares__buf_tag_rollback(ares__buf_t *buf);
/*! Clear the tagged position without rolling back. You should do this any
* time a tag is no longer needed as future append operations can reclaim
@@ -149,7 +232,7 @@ int ares__buf_tag_rollback(ares__buf_t *buf);
* \param[in] buf Initialized buffer object
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_tag_clear(ares__buf_t *buf);
+ares_status_t ares__buf_tag_clear(ares__buf_t *buf);
/*! Fetch the buffer and length of data starting from the tagged position up
* to the _current_ position. It will not unset the tagged position. The
@@ -162,13 +245,47 @@ int ares__buf_tag_clear(ares__buf_t *buf);
*/
const unsigned char *ares__buf_tag_fetch(const ares__buf_t *buf, size_t *len);
+/*! Get the length of the current tag offset to the current position.
+ *
+ * \param[in] buf Initialized buffer object
+ * \return length
+ */
+size_t ares__buf_tag_length(const ares__buf_t *buf);
+
+/*! Fetch the bytes starting from the tagged position up to the _current_
+ * position using the provided buffer. It will not unset the tagged position.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in,out] bytes Buffer to hold data
+ * \param[in,out] len On input, buffer size, on output, bytes place in
+ * buffer.
+ * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size
+ */
+ares_status_t ares__buf_tag_fetch_bytes(const ares__buf_t *buf,
+ unsigned char *bytes, size_t *len);
+
+/*! Fetch the bytes starting from the tagged position up to the _current_
+ * position as a NULL-terminated string using the provided buffer. The data
+ * is validated to be ASCII-printable data. It will not unset the tagged
+ * poition.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in,out] str Buffer to hold data
+ * \param[in] len On input, buffer size, on output, bytes place in
+ * buffer.
+ * \return ARES_SUCCESS if fetched, ARES_EFORMERR if insufficient buffer size,
+ * ARES_EBADSTR if not printable ASCII
+ */
+ares_status_t ares__buf_tag_fetch_string(const ares__buf_t *buf, char *str,
+ size_t len);
+
/*! Consume the given number of bytes without reading them.
*
* \param[in] buf Initialized buffer object
* \param[in] len Length to consume
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_consume(ares__buf_t *buf, size_t len);
+ares_status_t ares__buf_consume(ares__buf_t *buf, size_t len);
/*! Fetch a 16bit Big Endian number from the buffer.
*
@@ -176,7 +293,16 @@ int ares__buf_consume(ares__buf_t *buf, size_t len);
* \param[out] u16 Buffer to hold 16bit integer
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16);
+ares_status_t ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16);
+
+/*! Fetch a 32bit Big Endian number from the buffer.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] u32 Buffer to hold 32bit integer
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_be32(ares__buf_t *buf, unsigned int *u32);
+
/*! Fetch the requested number of bytes into the provided buffer
*
@@ -185,17 +311,57 @@ int ares__buf_fetch_be16(ares__buf_t *buf, unsigned short *u16);
* \param[in] len Requested number of bytes (must be > 0)
* \return ARES_SUCCESS or one of the c-ares error codes
*/
-int ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
- size_t len);
+ares_status_t ares__buf_fetch_bytes(ares__buf_t *buf, unsigned char *bytes,
+ size_t len);
+
+
+/*! Fetch the requested number of bytes and return a new buffer that must be
+ * ares_free()'d by the caller.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] len Requested number of bytes (must be > 0)
+ * \param[in] null_term Even though this is considered binary data, the user
+ * knows it may be a vald string, so add a null
+ * terminator.
+ * \param[out] bytes Pointer passed by reference. Will be allocated.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_bytes_dup(ares__buf_t *buf, size_t len,
+ ares_bool_t null_term,
+ unsigned char **bytes);
+
+/*! Fetch the requested number of bytes and place them into the provided
+ * dest buffer object.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] dest Buffer object to append bytes.
+ * \param[in] len Requested number of bytes (must be > 0)
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_bytes_into_buf(ares__buf_t *buf,
+ ares__buf_t *dest, size_t len);
+
+/*! Fetch the requested number of bytes and return a new buffer that must be
+ * ares_free()'d by the caller. The returned buffer is a null terminated
+ * string.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] len Requested number of bytes (must be > 0)
+ * \param[out] str Pointer passed by reference. Will be allocated.
+ * \return ARES_SUCCESS or one of the c-ares error codes
+ */
+ares_status_t ares__buf_fetch_str_dup(ares__buf_t *buf, size_t len, char **str);
/*! Consume whitespace characters (0x09, 0x0B, 0x0C, 0x0D, 0x20, and optionally
* 0x0A).
*
* \param[in] buf Initialized buffer object
- * \param[in] include_linefeed 1 to include consuming 0x0A, 0 otherwise.
+ * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A,
+ * ARES_FALSE otherwise.
* \return number of whitespace characters consumed
*/
-size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed);
+size_t ares__buf_consume_whitespace(ares__buf_t *buf,
+ ares_bool_t include_linefeed);
/*! Consume any non-whitespace character (anything other than 0x09, 0x0B, 0x0C,
@@ -204,16 +370,96 @@ size_t ares__buf_consume_whitespace(ares__buf_t *buf, int include_linefeed);
* \param[in] buf Initialized buffer object
* \return number of characters consumed
*/
-size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf);
+size_t ares__buf_consume_nonwhitespace(ares__buf_t *buf);
+
+
+/*! Consume until a character in the character set provided is reached. Does
+ * not include the character from the charset at the end.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] charset character set
+ * \param[in] len length of character set
+ * \param[in] require_charset require we find a character from the charset.
+ * if ARES_FALSE it will simply consume the
+ * rest of the buffer. If ARES_TRUE will return
+ * 0 if not found.
+ * \return number of characters consumed
+ */
+size_t ares__buf_consume_until_charset(ares__buf_t *buf,
+ const unsigned char *charset, size_t len,
+ ares_bool_t require_charset);
+
+
+/*! Consume while the characters match the characters in the provided set.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] charset character set
+ * \param[in] len length of character set
+ * \return number of characters consumed
+ */
+size_t ares__buf_consume_charset(ares__buf_t *buf, const unsigned char *charset,
+ size_t len);
+
/*! Consume from the current position until the end of the line, and optionally
* the end of line character (0x0A) itself.
*
* \param[in] buf Initialized buffer object
- * \param[in] include_linefeed 1 to include consuming 0x0A, 0 otherwise.
+ * \param[in] include_linefeed ARES_TRUE to include consuming 0x0A,
+ * ARES_FALSE otherwise.
* \return number of characters consumed
*/
-size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed);
+size_t ares__buf_consume_line(ares__buf_t *buf, ares_bool_t include_linefeed);
+
+typedef enum {
+ /*! No flags */
+ ARES_BUF_SPLIT_NONE = 0,
+ /*! The delimiter will be the first character in the buffer, except the
+ * first buffer since the start doesn't have a delimiter. This option is
+ * incompatible with ARES_BUF_SPLIT_LTRIM since the delimiter is always
+ * the first character.
+ */
+ ARES_BUF_SPLIT_DONT_CONSUME_DELIMS = 1 << 0,
+ /*! Allow blank sections, by default blank sections are not emitted. If using
+ * ARES_BUF_SPLIT_DONT_CONSUME_DELIMS, the delimiter is not counted as part
+ * of the section */
+ ARES_BUF_SPLIT_ALLOW_BLANK = 1 << 1,
+ /*! Remove duplicate entries */
+ ARES_BUF_SPLIT_NO_DUPLICATES = 1 << 2,
+ /*! Perform case-insensitive matching when comparing values */
+ ARES_BUF_SPLIT_CASE_INSENSITIVE = 1 << 3,
+ /*! Trim leading whitespace from buffer */
+ ARES_BUF_SPLIT_LTRIM = 1 << 4,
+ /*! Trim trailing whitespace from buffer */
+ ARES_BUF_SPLIT_RTRIM = 1 << 5,
+ /*! Trim leading and trailing whitespace from buffer */
+ ARES_BUF_SPLIT_TRIM = (ARES_BUF_SPLIT_LTRIM | ARES_BUF_SPLIT_RTRIM)
+} ares__buf_split_t;
+
+/*! Split the provided buffer into multiple sub-buffers stored in the variable
+ * pointed to by the linked list. The sub buffers are const buffers pointing
+ * into the buf provided.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] delims Possible delimiters
+ * \param[in] delims_len Length of possible delimiters
+ * \param[in] flags One more more flags
+ * \param[in] max_sections Maximum number of sections. Use 0 for
+ * unlimited. Useful for splitting key/value
+ * pairs where the delimiter may be a valid
+ * character in the value. A value of 1 would
+ * have little usefulness and would effectively
+ * ignore the delimiter itself.
+ * \param[out] list Result. Depending on flags, this may be a
+ * valid list with no elements. Use
+ * ares__llist_destroy() to free the memory which
+ * will also free the contained ares__buf_t
+ * objects.
+ * \return ARES_SUCCESS on success, or error like ARES_ENOMEM.
+ */
+ares_status_t ares__buf_split(ares__buf_t *buf, const unsigned char *delims,
+ size_t delims_len, ares__buf_split_t flags,
+ size_t max_sections, ares__llist_t **list);
/*! Check the unprocessed buffer to see if it begins with the sequence of
@@ -222,10 +468,10 @@ size_t ares__buf_consume_line(ares__buf_t *buf, int include_linefeed);
* \param[in] buf Initialized buffer object
* \param[in] data Bytes of data to compare.
* \param[in] data_len Length of data to compare.
- * \return ARES_SUCCESS or one of the c-ares error codes
+ * \return ARES_TRUE on match, ARES_FALSE otherwise.
*/
-int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data,
- size_t data_len);
+ares_bool_t ares__buf_begins_with(const ares__buf_t *buf,
+ const unsigned char *data, size_t data_len);
/*! Size of unprocessed remaining data length
@@ -233,7 +479,7 @@ int ares__buf_begins_with(ares__buf_t *buf, const unsigned char *data,
* \param[in] buf Initialized buffer object
* \return length remaining
*/
-size_t ares__buf_len(const ares__buf_t *buf);
+size_t ares__buf_len(const ares__buf_t *buf);
/*! Retrieve a pointer to the currently unprocessed data. Generally this isn't
* recommended to be used in practice. The returned pointer may be invalidated
@@ -243,9 +489,110 @@ size_t ares__buf_len(const ares__buf_t *buf);
* \param[out] len Length of available data
* \return Pointer to buffer of unprocessed data
*/
-const unsigned char *ares__buf_peek(const ares__buf_t *buf,
- size_t *len);
+const unsigned char *ares__buf_peek(const ares__buf_t *buf, size_t *len);
+
+
+/*! Wipe any processed data from the beginning of the buffer. This will
+ * move any remaining data to the front of the internally allocated buffer.
+ *
+ * Can not be used on const buffer objects.
+ *
+ * Typically not needed to call, as any new append operation will automatically
+ * call this function if there is insufficient space to append the data in
+ * order to try to avoid another memory allocation.
+ *
+ * It may be useful to call in order to ensure the current message being
+ * processed is in the beginning of the buffer if there is an intent to use
+ * ares__buf_set_position() and ares__buf_get_position() as may be necessary
+ * when processing DNS compressed names.
+ *
+ * If there is an active tag, it will NOT clear the tag, it will use the tag
+ * as the start of the unprocessed data rather than the current offset. If
+ * a prior tag is no longer needed, may be wise to call ares__buf_tag_clear().
+ *
+ * \param[in] buf Initialized buffer object
+ */
+void ares__buf_reclaim(ares__buf_t *buf);
+
+/*! Set the current offset within the internal buffer.
+ *
+ * Typically this should not be used, if possible, use the ares__buf_tag*()
+ * operations instead.
+ *
+ * One exception is DNS name compression which may backwards reference to
+ * an index in the message. It may be necessary in such a case to call
+ * ares__buf_reclaim() if using a dynamic (non-const) buffer before processing
+ * such a message.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[in] idx Index to set position
+ * \return ARES_SUCCESS if valid index
+ */
+ares_status_t ares__buf_set_position(ares__buf_t *buf, size_t idx);
+/*! Get the current offset within the internal buffer.
+ *
+ * Typically this should not be used, if possible, use the ares__buf_tag*()
+ * operations instead.
+ *
+ * This can be used to get the current position, useful for saving if a
+ * jump via ares__buf_set_position() is performed and need to restore the
+ * current position for future operations.
+ *
+ * \param[in] buf Initialized buffer object
+ * \return index of current position
+ */
+size_t ares__buf_get_position(const ares__buf_t *buf);
+
+/*! Parse a character-string as defined in RFC1035, as a null-terminated
+ * string.
+ *
+ * \param[in] buf initialized buffer object
+ * \param[in] remaining_len maximum length that should be used for parsing
+ * the string, this is often less than the remaining
+ * buffer and is based on the RR record length.
+ * \param[out] name Pointer passed by reference to be filled in with
+ * allocated string of the parsed that must be
+ * ares_free()'d by the caller.
+ * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple
+ * strings back to back, and will concatenate in
+ * the returned str.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_parse_dns_str(ares__buf_t *buf, size_t remaining_len,
+ char **name, ares_bool_t allow_multiple);
+
+/*! Parse a character-string as defined in RFC1035, as binary, however for
+ * convenience this does guarantee a NULL terminator (that is not included
+ * in the returned length).
+ *
+ * \param[in] buf initialized buffer object
+ * \param[in] remaining_len maximum length that should be used for parsing
+ * the string, this is often less than the remaining
+ * buffer and is based on the RR record length.
+ * \param[out] bin Pointer passed by reference to be filled in with
+ * allocated string of the parsed that must be
+ * ares_free()'d by the caller.
+ * \param[out] bin_len Length of returned string.
+ * \param[in] allow_multiple ARES_TRUE if it should attempt to parse multiple
+ * strings back to back, and will concatenate in
+ * the returned str.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__buf_parse_dns_binstr(ares__buf_t *buf, size_t remaining_len,
+ unsigned char **bin, size_t *bin_len,
+ ares_bool_t allow_multiple);
+
+/*! Load data from specified file path into provided buffer. The entire file
+ * is loaded into memory.
+ *
+ * \param[in] filename complete path to file
+ * \param[in,out] buf Initialized (non-const) buffer object to load data
+ * into
+ * \return ARES_ENOTFOUND if file not found, ARES_EFILE if issues reading
+ * file, ARES_ENOMEM if out of memory, ARES_SUCCESS on success.
+ */
+ares_status_t ares__buf_load_file(const char *filename, ares__buf_t *buf);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__close_sockets.c b/contrib/libs/c-ares/src/lib/ares__close_sockets.c
index fe64e54037..13ecca8f5e 100644
--- a/contrib/libs/c-ares/src/lib/ares__close_sockets.c
+++ b/contrib/libs/c-ares/src/lib/ares__close_sockets.c
@@ -31,38 +31,47 @@
#include "ares_private.h"
#include <assert.h>
+static void ares__requeue_queries(struct server_connection *conn)
+{
+ struct query *query;
+ struct timeval now = ares__tvnow();
+
+ while ((query = ares__llist_first_val(conn->queries_to_conn)) != NULL) {
+ ares__requeue_query(query, &now);
+ }
+}
void ares__close_connection(struct server_connection *conn)
{
struct server_state *server = conn->server;
- ares_channel channel = server->channel;
+ ares_channel_t *channel = server->channel;
+
+ /* Unlink */
+ ares__llist_node_claim(
+ ares__htable_asvp_get_direct(channel->connnode_by_socket, conn->fd));
+ ares__htable_asvp_remove(channel->connnode_by_socket, conn->fd);
if (conn->is_tcp) {
/* Reset any existing input and output buffer. */
ares__buf_consume(server->tcp_parser, ares__buf_len(server->tcp_parser));
ares__buf_consume(server->tcp_send, ares__buf_len(server->tcp_send));
- server->tcp_connection_generation = ++channel->tcp_connection_generation;
server->tcp_conn = NULL;
}
+ /* Requeue queries to other connections */
+ ares__requeue_queries(conn);
+
+ ares__llist_destroy(conn->queries_to_conn);
SOCK_STATE_CALLBACK(channel, conn->fd, 0, 0);
ares__close_socket(channel, conn->fd);
- ares__llist_node_claim(
- ares__htable_asvp_get_direct(channel->connnode_by_socket, conn->fd)
- );
- ares__htable_asvp_remove(channel->connnode_by_socket, conn->fd);
-#ifndef NDEBUG
- assert(ares__llist_len(conn->queries_to_conn) == 0);
-#endif
- ares__llist_destroy(conn->queries_to_conn);
ares_free(conn);
}
void ares__close_sockets(struct server_state *server)
{
- ares__llist_node_t *node;
+ ares__llist_node_t *node;
while ((node = ares__llist_node_first(server->connections)) != NULL) {
struct server_connection *conn = ares__llist_node_val(node);
@@ -70,35 +79,41 @@ void ares__close_sockets(struct server_state *server)
}
}
-void ares__check_cleanup_conn(ares_channel channel, ares_socket_t fd)
+void ares__check_cleanup_conn(const ares_channel_t *channel,
+ struct server_connection *conn)
{
- ares__llist_node_t *node;
- struct server_connection *conn;
- int do_cleanup = 0;
+ ares_bool_t do_cleanup = ARES_FALSE;
- node = ares__htable_asvp_get_direct(channel->connnode_by_socket, fd);
- if (node == NULL) {
+ if (channel == NULL || conn == NULL) {
return;
}
- conn = ares__llist_node_val(node);
-
if (ares__llist_len(conn->queries_to_conn)) {
return;
}
/* If we are configured not to stay open, close it out */
if (!(channel->flags & ARES_FLAG_STAYOPEN)) {
- do_cleanup = 1;
+ do_cleanup = ARES_TRUE;
+ }
+
+ /* If the associated server has failures, close it out. Resetting the
+ * connection (and specifically the source port number) can help resolve
+ * situations where packets are being dropped.
+ */
+ if (conn->server->consec_failures > 0) {
+ do_cleanup = ARES_TRUE;
}
/* If the udp connection hit its max queries, always close it */
if (!conn->is_tcp && channel->udp_max_queries > 0 &&
- conn->total_queries >= (size_t)channel->udp_max_queries) {
- do_cleanup = 1;
+ conn->total_queries >= channel->udp_max_queries) {
+ do_cleanup = ARES_TRUE;
}
- if (do_cleanup) {
- ares__close_connection(conn);
+ if (!do_cleanup) {
+ return;
}
+
+ ares__close_connection(conn);
}
diff --git a/contrib/libs/c-ares/src/lib/ares__get_hostent.c b/contrib/libs/c-ares/src/lib/ares__get_hostent.c
deleted file mode 100644
index 8ac2425ed4..0000000000
--- a/contrib/libs/c-ares/src/lib/ares__get_hostent.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998, 2011 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <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/src/lib/ares__hosts_file.c b/contrib/libs/c-ares/src/lib/ares__hosts_file.c
new file mode 100644
index 0000000000..e279623de3
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__hosts_file.c
@@ -0,0 +1,1030 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.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
+#include <time.h>
+#include "ares_platform.h"
+
+/* HOSTS FILE PROCESSING OVERVIEW
+ * ==============================
+ * The hosts file on the system contains static entries to be processed locally
+ * rather than querying the nameserver. Each row is an IP address followed by
+ * a list of space delimited hostnames that match the ip address. This is used
+ * for both forward and reverse lookups.
+ *
+ * We are caching the entire parsed hosts file for performance reasons. Some
+ * files may be quite sizable and as per Issue #458 can approach 1/2MB in size,
+ * and the parse overhead on a rapid succession of queries can be quite large.
+ * The entries are stored in forwards and backwards hashtables so we can get
+ * O(1) performance on lookup. The file is cached until the file modification
+ * timestamp changes.
+ *
+ * The hosts file processing is quite unique. It has to merge all related hosts
+ * and ips into a single entry due to file formatting requirements. For
+ * instance take the below:
+ *
+ * 127.0.0.1 localhost.localdomain localhost
+ * ::1 localhost.localdomain localhost
+ * 192.168.1.1 host.example.com host
+ * 192.168.1.5 host.example.com host
+ * 2620:1234::1 host.example.com host6.example.com host6 host
+ *
+ * This will yield 2 entries.
+ * 1) ips: 127.0.0.1,::1
+ * hosts: localhost.localdomain,localhost
+ * 2) ips: 192.168.1.1,192.168.1.5,2620:1234::1
+ * hosts: host.example.com,host,host6.example.com,host6
+ *
+ * It could be argued that if searching for 192.168.1.1 that the 'host6'
+ * hostnames should not be returned, but this implementation will return them
+ * since they are related. It is unlikely this will matter in the real world.
+ */
+
+struct ares_hosts_file {
+ time_t ts;
+ /*! cache the filename so we know if the filename changes it automatically
+ * invalidates the cache */
+ char *filename;
+ /*! iphash is the owner of the 'entry' object as there is only ever a single
+ * match to the object. */
+ ares__htable_strvp_t *iphash;
+ /*! hosthash does not own the entry so won't free on destruction */
+ ares__htable_strvp_t *hosthash;
+};
+
+struct ares_hosts_entry {
+ size_t refcnt; /*! If the entry is stored multiple times in the
+ * ip address hash, we have to reference count it */
+ ares__llist_t *ips;
+ ares__llist_t *hosts;
+};
+
+const void *ares_dns_pton(const char *ipaddr, struct ares_addr *addr,
+ size_t *out_len)
+{
+ const void *ptr = NULL;
+ size_t ptr_len = 0;
+
+ if (ipaddr == NULL || addr == NULL || out_len == NULL) {
+ return NULL;
+ }
+
+ *out_len = 0;
+
+ if (addr->family == AF_INET &&
+ ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) {
+ ptr = &addr->addr.addr4;
+ ptr_len = sizeof(addr->addr.addr4);
+ } else if (addr->family == AF_INET6 &&
+ ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) {
+ ptr = &addr->addr.addr6;
+ ptr_len = sizeof(addr->addr.addr6);
+ } else if (addr->family == AF_UNSPEC) {
+ if (ares_inet_pton(AF_INET, ipaddr, &addr->addr.addr4) > 0) {
+ addr->family = AF_INET;
+ ptr = &addr->addr.addr4;
+ ptr_len = sizeof(addr->addr.addr4);
+ } else if (ares_inet_pton(AF_INET6, ipaddr, &addr->addr.addr6) > 0) {
+ addr->family = AF_INET6;
+ ptr = &addr->addr.addr6;
+ ptr_len = sizeof(addr->addr.addr6);
+ }
+ }
+
+ *out_len = ptr_len;
+ return ptr;
+}
+
+static ares_bool_t ares__normalize_ipaddr(const char *ipaddr, char *out,
+ size_t out_len)
+{
+ struct ares_addr data;
+ const void *addr;
+ size_t addr_len = 0;
+
+ memset(&data, 0, sizeof(data));
+ data.family = AF_UNSPEC;
+
+ addr = ares_dns_pton(ipaddr, &data, &addr_len);
+ if (addr == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (!ares_inet_ntop(data.family, addr, out, (ares_socklen_t)out_len)) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static void ares__hosts_entry_destroy(ares_hosts_entry_t *entry)
+{
+ if (entry == NULL) {
+ return;
+ }
+
+ /* Honor reference counting */
+ if (entry->refcnt != 0) {
+ entry->refcnt--;
+ }
+
+ if (entry->refcnt > 0) {
+ return;
+ }
+
+ ares__llist_destroy(entry->hosts);
+ ares__llist_destroy(entry->ips);
+ ares_free(entry);
+}
+
+static void ares__hosts_entry_destroy_cb(void *entry)
+{
+ ares__hosts_entry_destroy(entry);
+}
+
+void ares__hosts_file_destroy(ares_hosts_file_t *hf)
+{
+ if (hf == NULL) {
+ return;
+ }
+
+ ares_free(hf->filename);
+ ares__htable_strvp_destroy(hf->hosthash);
+ ares__htable_strvp_destroy(hf->iphash);
+ ares_free(hf);
+}
+
+static ares_hosts_file_t *ares__hosts_file_create(const char *filename)
+{
+ ares_hosts_file_t *hf = ares_malloc_zero(sizeof(*hf));
+ if (hf == NULL) {
+ goto fail;
+ }
+
+ hf->ts = time(NULL);
+
+ hf->filename = ares_strdup(filename);
+ if (hf->filename == NULL) {
+ goto fail;
+ }
+
+ hf->iphash = ares__htable_strvp_create(ares__hosts_entry_destroy_cb);
+ if (hf->iphash == NULL) {
+ goto fail;
+ }
+
+ hf->hosthash = ares__htable_strvp_create(NULL);
+ if (hf->hosthash == NULL) {
+ goto fail;
+ }
+
+ return hf;
+
+fail:
+ ares__hosts_file_destroy(hf);
+ return NULL;
+}
+
+typedef enum {
+ ARES_MATCH_NONE = 0,
+ ARES_MATCH_IPADDR = 1,
+ ARES_MATCH_HOST = 2
+} ares_hosts_file_match_t;
+
+static ares_status_t ares__hosts_file_merge_entry(
+ const ares_hosts_file_t *hf, ares_hosts_entry_t *existing,
+ ares_hosts_entry_t *entry, ares_hosts_file_match_t matchtype)
+{
+ ares__llist_node_t *node;
+
+ /* If we matched on IP address, we know there can only be 1, so there's no
+ * reason to do anything */
+ if (matchtype != ARES_MATCH_IPADDR) {
+ while ((node = ares__llist_node_first(entry->ips)) != NULL) {
+ const char *ipaddr = ares__llist_node_val(node);
+
+ if (ares__htable_strvp_get_direct(hf->iphash, ipaddr) != NULL) {
+ ares__llist_node_destroy(node);
+ continue;
+ }
+
+ ares__llist_node_move_parent_last(node, existing->ips);
+ }
+ }
+
+
+ while ((node = ares__llist_node_first(entry->hosts)) != NULL) {
+ const char *hostname = ares__llist_node_val(node);
+
+ if (ares__htable_strvp_get_direct(hf->hosthash, hostname) != NULL) {
+ ares__llist_node_destroy(node);
+ continue;
+ }
+
+ ares__llist_node_move_parent_last(node, existing->hosts);
+ }
+
+ ares__hosts_entry_destroy(entry);
+ return ARES_SUCCESS;
+}
+
+static ares_hosts_file_match_t
+ ares__hosts_file_match(const ares_hosts_file_t *hf, ares_hosts_entry_t *entry,
+ ares_hosts_entry_t **match)
+{
+ ares__llist_node_t *node;
+ *match = NULL;
+
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const char *ipaddr = ares__llist_node_val(node);
+ *match = ares__htable_strvp_get_direct(hf->iphash, ipaddr);
+ if (*match != NULL) {
+ return ARES_MATCH_IPADDR;
+ }
+ }
+
+ for (node = ares__llist_node_first(entry->hosts); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const char *host = ares__llist_node_val(node);
+ *match = ares__htable_strvp_get_direct(hf->hosthash, host);
+ if (*match != NULL) {
+ return ARES_MATCH_HOST;
+ }
+ }
+
+ return ARES_MATCH_NONE;
+}
+
+/*! entry is invalidated upon calling this function, always, even on error */
+static ares_status_t ares__hosts_file_add(ares_hosts_file_t *hosts,
+ ares_hosts_entry_t *entry)
+{
+ ares_hosts_entry_t *match = NULL;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node;
+ ares_hosts_file_match_t matchtype;
+ size_t num_hostnames;
+
+ /* Record the number of hostnames in this entry file. If we merge into an
+ * existing record, these will be *appended* to the entry, so we'll count
+ * backwards when adding to the hosts hashtable */
+ num_hostnames = ares__llist_len(entry->hosts);
+
+ matchtype = ares__hosts_file_match(hosts, entry, &match);
+
+ if (matchtype != ARES_MATCH_NONE) {
+ status = ares__hosts_file_merge_entry(hosts, match, entry, matchtype);
+ if (status != ARES_SUCCESS) {
+ ares__hosts_entry_destroy(entry);
+ return status;
+ }
+ /* entry was invalidated above by merging */
+ entry = match;
+ }
+
+ if (matchtype != ARES_MATCH_IPADDR) {
+ const char *ipaddr = ares__llist_last_val(entry->ips);
+
+ if (!ares__htable_strvp_get(hosts->iphash, ipaddr, NULL)) {
+ if (!ares__htable_strvp_insert(hosts->iphash, ipaddr, entry)) {
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+ entry->refcnt++;
+ }
+ }
+
+ /* Go backwards, on a merge, hostnames are appended. Breakout once we've
+ * consumed all the hosts that we appended */
+ for (node = ares__llist_node_last(entry->hosts); node != NULL;
+ node = ares__llist_node_prev(node)) {
+ const char *val = ares__llist_node_val(node);
+
+ if (num_hostnames == 0) {
+ break;
+ }
+
+ num_hostnames--;
+
+ /* first hostname match wins. If we detect a duplicate hostname for another
+ * ip it will automatically be added to the same entry */
+ if (ares__htable_strvp_get(hosts->hosthash, val, NULL)) {
+ continue;
+ }
+
+ if (!ares__htable_strvp_insert(hosts->hosthash, val, entry)) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_bool_t ares__hosts_entry_isdup(ares_hosts_entry_t *entry,
+ const char *host)
+{
+ ares__llist_node_t *node;
+
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const char *myhost = ares__llist_node_val(node);
+ if (strcasecmp(myhost, host) == 0) {
+ return ARES_TRUE;
+ }
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__parse_hosts_hostnames(ares__buf_t *buf,
+ ares_hosts_entry_t *entry)
+{
+ entry->hosts = ares__llist_create(ares_free);
+ if (entry->hosts == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ /* Parse hostnames and aliases */
+ while (ares__buf_len(buf)) {
+ char hostname[256];
+ char *temp;
+ ares_status_t status;
+ unsigned char comment = '#';
+
+ ares__buf_consume_whitespace(buf, ARES_FALSE);
+
+ if (ares__buf_len(buf) == 0) {
+ break;
+ }
+
+ /* See if it is a comment, if so stop processing */
+ if (ares__buf_begins_with(buf, &comment, 1)) {
+ break;
+ }
+
+ ares__buf_tag(buf);
+
+ /* Must be at end of line */
+ if (ares__buf_consume_nonwhitespace(buf) == 0) {
+ break;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, hostname, sizeof(hostname));
+ if (status != ARES_SUCCESS) {
+ /* Bad entry, just ignore as long as its not the first. If its the first,
+ * it must be valid */
+ if (ares__llist_len(entry->hosts) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ continue;
+ }
+
+ /* Validate it is a valid hostname characterset */
+ if (!ares__is_hostname(hostname)) {
+ continue;
+ }
+
+ /* Don't add a duplicate to the same entry */
+ if (ares__hosts_entry_isdup(entry, hostname)) {
+ continue;
+ }
+
+ /* Add to list */
+ temp = ares_strdup(hostname);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ if (ares__llist_insert_last(entry->hosts, temp) == NULL) {
+ ares_free(temp);
+ return ARES_ENOMEM;
+ }
+ }
+
+ /* Must have at least 1 entry */
+ if (ares__llist_len(entry->hosts) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__parse_hosts_ipaddr(ares__buf_t *buf,
+ ares_hosts_entry_t **entry_out)
+{
+ char addr[INET6_ADDRSTRLEN];
+ char *temp;
+ ares_hosts_entry_t *entry = NULL;
+ ares_status_t status;
+
+ *entry_out = NULL;
+
+ ares__buf_tag(buf);
+ ares__buf_consume_nonwhitespace(buf);
+ status = ares__buf_tag_fetch_string(buf, addr, sizeof(addr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Validate and normalize the ip address format */
+ if (!ares__normalize_ipaddr(addr, addr, sizeof(addr))) {
+ return ARES_EBADSTR;
+ }
+
+ entry = ares_malloc_zero(sizeof(*entry));
+ if (entry == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ entry->ips = ares__llist_create(ares_free);
+ if (entry->ips == NULL) {
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+
+ temp = ares_strdup(addr);
+ if (temp == NULL) {
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+
+ if (ares__llist_insert_first(entry->ips, temp) == NULL) {
+ ares_free(temp);
+ ares__hosts_entry_destroy(entry);
+ return ARES_ENOMEM;
+ }
+
+ *entry_out = entry;
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__parse_hosts(const char *filename,
+ ares_hosts_file_t **out)
+{
+ ares__buf_t *buf = NULL;
+ ares_status_t status = ARES_EBADRESP;
+ ares_hosts_file_t *hf = NULL;
+ ares_hosts_entry_t *entry = NULL;
+
+ *out = NULL;
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(filename, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ hf = ares__hosts_file_create(filename);
+ if (hf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ while (ares__buf_len(buf)) {
+ unsigned char comment = '#';
+
+ /* -- Start of new line here -- */
+
+ /* Consume any leading whitespace */
+ ares__buf_consume_whitespace(buf, ARES_FALSE);
+
+ if (ares__buf_len(buf) == 0) {
+ break;
+ }
+
+ /* See if it is a comment, if so, consume remaining line */
+ if (ares__buf_begins_with(buf, &comment, 1)) {
+ ares__buf_consume_line(buf, ARES_TRUE);
+ continue;
+ }
+
+ /* Pull off ip address */
+ status = ares__parse_hosts_ipaddr(buf, &entry);
+ if (status == ARES_ENOMEM) {
+ goto done;
+ }
+ if (status != ARES_SUCCESS) {
+ /* Bad line, consume and go onto next */
+ ares__buf_consume_line(buf, ARES_TRUE);
+ continue;
+ }
+
+ /* Parse of the hostnames */
+ status = ares__parse_hosts_hostnames(buf, entry);
+ if (status == ARES_ENOMEM) {
+ goto done;
+ } else if (status != ARES_SUCCESS) {
+ /* Bad line, consume and go onto next */
+ ares__hosts_entry_destroy(entry);
+ entry = NULL;
+ ares__buf_consume_line(buf, ARES_TRUE);
+ continue;
+ }
+
+ /* Append the successful entry to the hosts file */
+ status = ares__hosts_file_add(hf, entry);
+ entry = NULL; /* is always invalidated by this function, even on error */
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Go to next line */
+ ares__buf_consume_line(buf, ARES_TRUE);
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__hosts_entry_destroy(entry);
+ ares__buf_destroy(buf);
+ if (status != ARES_SUCCESS) {
+ ares__hosts_file_destroy(hf);
+ } else {
+ *out = hf;
+ }
+ return status;
+}
+
+static ares_bool_t ares__hosts_expired(const char *filename,
+ const ares_hosts_file_t *hf)
+{
+ time_t mod_ts = 0;
+
+#ifdef HAVE_STAT
+ struct stat st;
+ if (stat(filename, &st) == 0) {
+ mod_ts = st.st_mtime;
+ }
+#elif defined(_WIN32)
+ struct _stat st;
+ if (_stat(filename, &st) == 0) {
+ mod_ts = st.st_mtime;
+ }
+#else
+ (void)filename;
+#endif
+
+ if (hf == NULL) {
+ return ARES_TRUE;
+ }
+
+ /* Expire every 60s if we can't get a time */
+ if (mod_ts == 0) {
+ mod_ts = time(NULL) - 60;
+ }
+
+ /* If filenames are different, its expired */
+ if (strcasecmp(hf->filename, filename) != 0) {
+ return ARES_TRUE;
+ }
+
+ if (hf->ts <= mod_ts) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__hosts_path(const ares_channel_t *channel,
+ ares_bool_t use_env, char **path)
+{
+ char *path_hosts = NULL;
+
+ *path = NULL;
+
+ if (channel->hosts_path) {
+ path_hosts = ares_strdup(channel->hosts_path);
+ if (!path_hosts) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (use_env) {
+ if (path_hosts) {
+ ares_free(path_hosts);
+ }
+
+ path_hosts = ares_strdup(getenv("CARES_HOSTS"));
+ if (!path_hosts) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (!path_hosts) {
+#ifdef WIN32
+ char PATH_HOSTS[MAX_PATH] = "";
+ char tmp[MAX_PATH];
+ HKEY hkeyHosts;
+ DWORD dwLength = sizeof(tmp);
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
+ &hkeyHosts) != ERROR_SUCCESS) {
+ return ARES_ENOTFOUND;
+ }
+ RegQueryValueExA(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
+ &dwLength);
+ ExpandEnvironmentStringsA(tmp, PATH_HOSTS, MAX_PATH);
+ RegCloseKey(hkeyHosts);
+ strcat(PATH_HOSTS, WIN_PATH_HOSTS);
+#elif defined(WATT32)
+ const char *PATH_HOSTS = _w32_GetHostsFile();
+
+ if (!PATH_HOSTS) {
+ return ARES_ENOTFOUND;
+ }
+#endif
+ path_hosts = ares_strdup(PATH_HOSTS);
+ if (!path_hosts) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ *path = path_hosts;
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__hosts_update(ares_channel_t *channel,
+ ares_bool_t use_env)
+{
+ ares_status_t status;
+ char *filename = NULL;
+
+ status = ares__hosts_path(channel, use_env, &filename);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (!ares__hosts_expired(filename, channel->hf)) {
+ ares_free(filename);
+ return ARES_SUCCESS;
+ }
+
+ ares__hosts_file_destroy(channel->hf);
+ channel->hf = NULL;
+
+ status = ares__parse_hosts(filename, &channel->hf);
+ ares_free(filename);
+ return status;
+}
+
+ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel,
+ ares_bool_t use_env, const char *ipaddr,
+ const ares_hosts_entry_t **entry)
+{
+ ares_status_t status;
+ char addr[INET6_ADDRSTRLEN];
+
+ *entry = NULL;
+
+ status = ares__hosts_update(channel, use_env);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (channel->hf == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ if (!ares__normalize_ipaddr(ipaddr, addr, sizeof(addr))) {
+ return ARES_EBADNAME;
+ }
+
+ *entry = ares__htable_strvp_get_direct(channel->hf->iphash, addr);
+ if (*entry == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__hosts_search_host(ares_channel_t *channel,
+ ares_bool_t use_env, const char *host,
+ const ares_hosts_entry_t **entry)
+{
+ ares_status_t status;
+
+ *entry = NULL;
+
+ status = ares__hosts_update(channel, use_env);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (channel->hf == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ *entry = ares__htable_strvp_get_direct(channel->hf->hosthash, host);
+ if (*entry == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry,
+ int family, struct hostent **hostent)
+{
+ ares_status_t status;
+ size_t naliases;
+ ares__llist_node_t *node;
+ size_t idx;
+
+ *hostent = ares_malloc_zero(sizeof(**hostent));
+ if (*hostent == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ (*hostent)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family;
+
+ /* Copy IP addresses that match the address family */
+ idx = 0;
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ struct ares_addr addr;
+ const void *ptr = NULL;
+ size_t ptr_len = 0;
+ const char *ipaddr = ares__llist_node_val(node);
+ char **temp = NULL;
+
+ memset(&addr, 0, sizeof(addr));
+
+ addr.family = family;
+ ptr = ares_dns_pton(ipaddr, &addr, &ptr_len);
+ if (ptr == NULL) {
+ continue;
+ }
+
+ /* If family == AF_UNSPEC, then we want to inherit this for future
+ * conversions as we can only support a single address class */
+ if (family == AF_UNSPEC) {
+ family = addr.family;
+ (*hostent)->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)addr.family;
+ }
+
+ temp = ares_realloc_zero((*hostent)->h_addr_list,
+ (idx + 1) * sizeof(*(*hostent)->h_addr_list),
+ (idx + 2) * sizeof(*(*hostent)->h_addr_list));
+ if (temp == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ (*hostent)->h_addr_list = temp;
+
+ (*hostent)->h_addr_list[idx] = ares_malloc(ptr_len);
+ if ((*hostent)->h_addr_list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ memcpy((*hostent)->h_addr_list[idx], ptr, ptr_len);
+ idx++;
+ (*hostent)->h_length = (HOSTENT_LENGTH_TYPE)ptr_len;
+ }
+
+ /* entry didn't match address class */
+ if (idx == 0) {
+ status = ARES_ENOTFOUND;
+ goto fail;
+ }
+
+ /* Copy main hostname */
+ (*hostent)->h_name = ares_strdup(ares__llist_first_val(entry->hosts));
+ if ((*hostent)->h_name == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ /* Copy aliases */
+ naliases = ares__llist_len(entry->hosts) - 1;
+
+ /* Cap at 100, some people use https://github.com/StevenBlack/hosts and we
+ * don't need 200k+ aliases */
+ if (naliases > 100) {
+ naliases = 100;
+ }
+
+ (*hostent)->h_aliases =
+ ares_malloc_zero((naliases + 1) * sizeof(*(*hostent)->h_aliases));
+ if ((*hostent)->h_aliases == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ /* Copy all entries to the alias except the first */
+ idx = 0;
+ node = ares__llist_node_first(entry->hosts);
+ node = ares__llist_node_next(node);
+ while (node != NULL) {
+ (*hostent)->h_aliases[idx] = ares_strdup(ares__llist_node_val(node));
+ if ((*hostent)->h_aliases[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ idx++;
+
+ /* Break out if artificially capped */
+ if (idx == naliases) {
+ break;
+ }
+ node = ares__llist_node_next(node);
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_free_hostent(*hostent);
+ *hostent = NULL;
+ return status;
+}
+
+static ares_status_t
+ ares__hosts_ai_append_cnames(const ares_hosts_entry_t *entry,
+ struct ares_addrinfo_cname **cnames_out)
+{
+ struct ares_addrinfo_cname *cname = NULL;
+ struct ares_addrinfo_cname *cnames = NULL;
+ const char *primaryhost;
+ ares__llist_node_t *node;
+ ares_status_t status;
+ size_t cnt = 0;
+
+ node = ares__llist_node_first(entry->hosts);
+ primaryhost = ares__llist_node_val(node);
+ /* Skip to next node to start with aliases */
+ node = ares__llist_node_next(node);
+
+ while (node != NULL) {
+ const char *host = ares__llist_node_val(node);
+
+ /* Cap at 100 entries. , some people use
+ * https://github.com/StevenBlack/hosts and we don't need 200k+ aliases */
+ cnt++;
+ if (cnt > 100) {
+ break;
+ }
+
+ cname = ares__append_addrinfo_cname(&cnames);
+ if (cname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cname->alias = ares_strdup(host);
+ if (cname->alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cname->name = ares_strdup(primaryhost);
+ if (cname->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ node = ares__llist_node_next(node);
+ }
+
+ /* No entries, add only primary */
+ if (cnames == NULL) {
+ cname = ares__append_addrinfo_cname(&cnames);
+ if (cname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cname->name = ares_strdup(primaryhost);
+ if (cname->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__freeaddrinfo_cnames(cnames);
+ return status;
+ }
+
+ *cnames_out = cnames;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry,
+ const char *name, int family,
+ unsigned short port,
+ ares_bool_t want_cnames,
+ struct ares_addrinfo *ai)
+{
+ ares_status_t status;
+ struct ares_addrinfo_cname *cnames = NULL;
+ struct ares_addrinfo_node *ainodes = NULL;
+ ares__llist_node_t *node;
+
+ switch (family) {
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ break;
+ default:
+ return ARES_EBADFAMILY;
+ }
+
+ ai->name = ares_strdup(name);
+ if (ai->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(entry->ips); node != NULL;
+ node = ares__llist_node_next(node)) {
+ struct ares_addr addr;
+ const void *ptr = NULL;
+ size_t ptr_len = 0;
+ const char *ipaddr = ares__llist_node_val(node);
+
+ memset(&addr, 0, sizeof(addr));
+ addr.family = family;
+ ptr = ares_dns_pton(ipaddr, &addr, &ptr_len);
+
+ if (ptr == NULL) {
+ continue;
+ }
+
+ status = ares_append_ai_node(addr.family, port, 0, ptr, &ainodes);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ if (want_cnames) {
+ status = ares__hosts_ai_append_cnames(entry, &cnames);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__freeaddrinfo_cnames(cnames);
+ ares__freeaddrinfo_nodes(ainodes);
+ ares_free(ai->name);
+ ai->name = NULL;
+ return status;
+ }
+ ares__addrinfo_cat_cnames(&ai->cnames, cnames);
+ ares__addrinfo_cat_nodes(&ai->nodes, ainodes);
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable.c b/contrib/libs/c-ares/src/lib/ares__htable.c
index 3ea65642d9..7aaf2d2089 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable.c
+++ b/contrib/libs/c-ares/src/lib/ares__htable.c
@@ -29,8 +29,8 @@
#include "ares__llist.h"
#include "ares__htable.h"
-#define ARES__HTABLE_MAX_BUCKETS (1U<<24)
-#define ARES__HTABLE_MIN_BUCKETS (1U<<4)
+#define ARES__HTABLE_MAX_BUCKETS (1U << 24)
+#define ARES__HTABLE_MIN_BUCKETS (1U << 4)
#define ARES__HTABLE_EXPAND_PERCENT 75
struct ares__htable {
@@ -41,44 +41,48 @@ struct ares__htable {
unsigned int seed;
unsigned int size;
size_t num_keys;
+ size_t num_collisions;
/* NOTE: if we converted buckets into ares__slist_t we could guarantee on
* hash collisions we would have O(log n) worst case insert and search
* performance. (We'd also need to make key_eq into a key_cmp to
* support sort). That said, risk with a random hash seed is near zero,
- * and ares__slist_t is heavier weight so I think using ares__llist_t is
+ * and ares__slist_t is heavier weight, so I think using ares__llist_t
* is an overall win. */
ares__llist_t **buckets;
};
-
static unsigned int ares__htable_generate_seed(ares__htable_t *htable)
{
unsigned int seed = 0;
+ time_t t = time(NULL);
/* Mix stack address, heap address, and time to generate a random seed, it
* doesn't have to be super secure, just quick. Likelihood of a hash
* collision attack is very low with a small amount of effort */
seed |= (unsigned int)((size_t)htable & 0xFFFFFFFF);
seed |= (unsigned int)((size_t)&seed & 0xFFFFFFFF);
- seed |= (unsigned int)time(NULL) & 0xFFFFFFFF;
+ seed |= (unsigned int)(t & 0xFFFFFFFF);
return seed;
}
static void ares__htable_buckets_destroy(ares__llist_t **buckets,
- unsigned int size,
- unsigned char destroy_vals)
+ unsigned int size,
+ ares_bool_t destroy_vals)
{
unsigned int i;
- if (buckets == NULL)
+ if (buckets == NULL) {
return;
+ }
- for (i=0; i<size; i++) {
- if (buckets[i] == NULL)
+ for (i = 0; i < size; i++) {
+ if (buckets[i] == NULL) {
continue;
+ }
- if (!destroy_vals)
+ if (!destroy_vals) {
ares__llist_replace_destructor(buckets[i], NULL);
+ }
ares__llist_destroy(buckets[i]);
}
@@ -86,16 +90,15 @@ static void ares__htable_buckets_destroy(ares__llist_t **buckets,
ares_free(buckets);
}
-
void ares__htable_destroy(ares__htable_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return;
- ares__htable_buckets_destroy(htable->buckets, htable->size, 1);
+ }
+ ares__htable_buckets_destroy(htable->buckets, htable->size, ARES_TRUE);
ares_free(htable);
}
-
ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
ares__htable_bucket_key_t bucket_key,
ares__htable_bucket_free_t bucket_free,
@@ -108,11 +111,10 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
goto fail;
}
- htable = ares_malloc(sizeof(*htable));
- if (htable == NULL)
+ htable = ares_malloc_zero(sizeof(*htable));
+ if (htable == NULL) {
goto fail;
-
- memset(htable, 0, sizeof(*htable));
+ }
htable->hash = hash_func;
htable->bucket_key = bucket_key;
@@ -120,12 +122,11 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
htable->key_eq = key_eq;
htable->seed = ares__htable_generate_seed(htable);
htable->size = ARES__HTABLE_MIN_BUCKETS;
- htable->buckets = ares_malloc(sizeof(*htable->buckets) * htable->size);
+ htable->buckets = ares_malloc_zero(sizeof(*htable->buckets) * htable->size);
- if (htable->buckets == NULL)
+ if (htable->buckets == NULL) {
goto fail;
-
- memset(htable->buckets, 0, sizeof(*htable->buckets) * htable->size);
+ }
return htable;
@@ -134,6 +135,34 @@ fail:
return NULL;
}
+const void **ares__htable_all_buckets(const ares__htable_t *htable, size_t *num)
+{
+ const void **out = NULL;
+ size_t cnt = 0;
+ size_t i;
+
+ if (htable == NULL || num == NULL) {
+ return NULL;
+ }
+
+ *num = 0;
+
+ out = ares_malloc_zero(sizeof(*out) * htable->num_keys);
+ if (out == NULL) {
+ return NULL;
+ }
+
+ for (i = 0; i < htable->size; i++) {
+ ares__llist_node_t *node;
+ for (node = ares__llist_node_first(htable->buckets[i]); node != NULL;
+ node = ares__llist_node_next(node)) {
+ out[cnt++] = ares__llist_node_val(node);
+ }
+ }
+
+ *num = cnt;
+ return out;
+}
/*! Grabs the Hashtable index from the key and length. The h index is
* the hash of the function reduced to the size of the bucket list.
@@ -142,106 +171,172 @@ fail:
* efficient */
#define HASH_IDX(h, key) h->hash(key, h->seed) & (h->size - 1)
-static ares__llist_node_t *ares__htable_find(ares__htable_t *htable,
- unsigned int idx,
- const void *key)
+static ares__llist_node_t *ares__htable_find(const ares__htable_t *htable,
+ unsigned int idx, const void *key)
{
ares__llist_node_t *node = NULL;
- for (node = ares__llist_node_first(htable->buckets[idx]);
- node != NULL;
+ for (node = ares__llist_node_first(htable->buckets[idx]); node != NULL;
node = ares__llist_node_next(node)) {
-
- if (htable->key_eq(key, htable->bucket_key(ares__llist_node_val(node))))
+ if (htable->key_eq(key, htable->bucket_key(ares__llist_node_val(node)))) {
break;
+ }
}
return node;
}
-
-static unsigned int ares__htable_expand(ares__htable_t *htable)
+static ares_bool_t ares__htable_expand(ares__htable_t *htable)
{
ares__llist_t **buckets = NULL;
unsigned int old_size = htable->size;
size_t i;
+ ares__llist_t **prealloc_llist = NULL;
+ size_t prealloc_llist_len = 0;
+ ares_bool_t rv = ARES_FALSE;
/* Not a failure, just won't expand */
- if (old_size == ARES__HTABLE_MAX_BUCKETS)
- return 1;
+ if (old_size == ARES__HTABLE_MAX_BUCKETS) {
+ return ARES_TRUE;
+ }
htable->size <<= 1;
- /* We must do this in 2 passes as we want it to be non-destructive in case
- * there is a memory allocation failure. So we will actually use more
- * memory doing it this way, but at least we might be able to gracefully
- * recover */
- buckets = ares_malloc(sizeof(*buckets) * htable->size);
- if (buckets == NULL)
- goto fail;
+ /* We must pre-allocate all memory we'll need before moving entries to the
+ * new hash array. Otherwise if there's a memory allocation failure in the
+ * middle, we wouldn't be able to recover. */
+ buckets = ares_malloc_zero(sizeof(*buckets) * htable->size);
+ if (buckets == NULL) {
+ goto done;
+ }
- memset(buckets, 0, sizeof(*buckets) * htable->size);
+ /* The maximum number of new llists we'll need is the number of collisions
+ * that were recorded */
+ prealloc_llist_len = htable->num_collisions;
+ if (prealloc_llist_len) {
+ prealloc_llist =
+ ares_malloc_zero(sizeof(*prealloc_llist) * prealloc_llist_len);
+ if (prealloc_llist == NULL) {
+ goto done;
+ }
+ }
+ for (i = 0; i < prealloc_llist_len; i++) {
+ prealloc_llist[i] = ares__llist_create(htable->bucket_free);
+ if (prealloc_llist[i] == NULL) {
+ goto done;
+ }
+ }
- for (i=0; i<old_size; i++) {
+ /* Iterate across all buckets and move the entries to the new buckets */
+ htable->num_collisions = 0;
+ for (i = 0; i < old_size; i++) {
ares__llist_node_t *node;
- for (node = ares__llist_node_first(htable->buckets[i]);
- node != NULL;
- node = ares__llist_node_next(node)) {
- void *val = ares__llist_node_val(node);
- size_t idx = HASH_IDX(htable, htable->bucket_key(val));
+ /* Nothing in this bucket */
+ if (htable->buckets[i] == NULL) {
+ continue;
+ }
+
+ /* Fast path optimization (most likely case), there is likely only a single
+ * entry in both the source and destination, check for this to confirm and
+ * if so, just move the bucket over */
+ if (ares__llist_len(htable->buckets[i]) == 1) {
+ const void *val = ares__llist_first_val(htable->buckets[i]);
+ size_t idx = HASH_IDX(htable, htable->bucket_key(val));
if (buckets[idx] == NULL) {
- buckets[idx] = ares__llist_create(htable->bucket_free);
- if (buckets[idx] == NULL)
- goto fail;
+ /* Swap! */
+ buckets[idx] = htable->buckets[i];
+ htable->buckets[i] = NULL;
+ continue;
+ }
+ }
+
+ /* Slow path, collisions */
+ while ((node = ares__llist_node_first(htable->buckets[i])) != NULL) {
+ const void *val = ares__llist_node_val(node);
+ size_t idx = HASH_IDX(htable, htable->bucket_key(val));
+
+ /* Try fast path again as maybe we popped one collision off and the
+ * next we can reuse the llist parent */
+ if (buckets[idx] == NULL && ares__llist_len(htable->buckets[i]) == 1) {
+ /* Swap! */
+ buckets[idx] = htable->buckets[i];
+ htable->buckets[i] = NULL;
+ break;
}
- if (ares__llist_insert_first(buckets[idx], val) == NULL) {
- goto fail;
+ /* Grab one off our preallocated list */
+ if (buckets[idx] == NULL) {
+ /* Silence static analysis, this isn't possible but it doesn't know */
+ if (prealloc_llist == NULL || prealloc_llist_len == 0) {
+ goto done;
+ }
+ buckets[idx] = prealloc_llist[prealloc_llist_len - 1];
+ prealloc_llist_len--;
+ } else {
+ /* Collision occurred since the bucket wasn't empty */
+ htable->num_collisions++;
}
+ ares__llist_node_move_parent_first(node, buckets[idx]);
+ }
+
+ /* Abandoned bucket, destroy */
+ if (htable->buckets[i] != NULL) {
+ ares__llist_destroy(htable->buckets[i]);
+ htable->buckets[i] = NULL;
}
}
- /* Swap out buckets */
- ares__htable_buckets_destroy(htable->buckets, old_size, 0);
+ /* We have guaranteed all the buckets have either been moved or destroyed,
+ * so we just call ares_free() on the array and swap out the pointer */
+ ares_free(htable->buckets);
htable->buckets = buckets;
- return 1;
+ buckets = NULL;
+ rv = ARES_TRUE;
-fail:
- ares__htable_buckets_destroy(buckets, htable->size, 0);
- htable->size = old_size;
+done:
+ ares_free(buckets);
+ /* destroy any unused preallocated buckets */
+ ares__htable_buckets_destroy(prealloc_llist, (unsigned int)prealloc_llist_len,
+ ARES_FALSE);
- return 0;
-}
+ /* On failure, we need to restore the htable size */
+ if (rv != ARES_TRUE) {
+ htable->size = old_size;
+ }
+ return rv;
+}
-unsigned int ares__htable_insert(ares__htable_t *htable, void *bucket)
+ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket)
{
unsigned int idx = 0;
ares__llist_node_t *node = NULL;
const void *key = NULL;
- if (htable == NULL || bucket == NULL)
- return 0;
+ if (htable == NULL || bucket == NULL) {
+ return ARES_FALSE;
+ }
- key = htable->bucket_key(bucket);
- idx = HASH_IDX(htable, key);
+ key = htable->bucket_key(bucket);
+ idx = HASH_IDX(htable, key);
/* See if we have a matching bucket already, if so, replace it */
node = ares__htable_find(htable, idx, key);
if (node != NULL) {
ares__llist_node_replace(node, bucket);
- return 1;
+ return ARES_TRUE;
}
/* Check to see if we should rehash because likelihood of collisions has
* increased beyond our threshold */
- if (htable->num_keys+1 > (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) {
+ if (htable->num_keys + 1 >
+ (htable->size * ARES__HTABLE_EXPAND_PERCENT) / 100) {
if (!ares__htable_expand(htable)) {
- return 0;
+ return ARES_FALSE;
}
/* If we expanded, need to calculate a new index */
idx = HASH_IDX(htable, key);
@@ -250,55 +345,70 @@ unsigned int ares__htable_insert(ares__htable_t *htable, void *bucket)
/* We lazily allocate the linked list */
if (htable->buckets[idx] == NULL) {
htable->buckets[idx] = ares__llist_create(htable->bucket_free);
- if (htable->buckets[idx] == NULL)
- return 0;
+ if (htable->buckets[idx] == NULL) {
+ return ARES_FALSE;
+ }
}
-
+
node = ares__llist_insert_first(htable->buckets[idx], bucket);
- if (node == NULL)
- return 0;
+ if (node == NULL) {
+ return ARES_FALSE;
+ }
+
+ /* Track collisions for rehash stability */
+ if (ares__llist_len(htable->buckets[idx]) > 1) {
+ htable->num_collisions++;
+ }
htable->num_keys++;
- return 1;
+ return ARES_TRUE;
}
-
-void *ares__htable_get(ares__htable_t *htable, const void *key)
+void *ares__htable_get(const ares__htable_t *htable, const void *key)
{
unsigned int idx;
- if (htable == NULL || key == NULL)
+ if (htable == NULL || key == NULL) {
return NULL;
+ }
idx = HASH_IDX(htable, key);
return ares__llist_node_val(ares__htable_find(htable, idx, key));
}
-
-unsigned int ares__htable_remove(ares__htable_t *htable, const void *key)
+ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key)
{
ares__llist_node_t *node;
unsigned int idx;
- if (htable == NULL || key == NULL)
- return 0;
+ if (htable == NULL || key == NULL) {
+ return ARES_FALSE;
+ }
idx = HASH_IDX(htable, key);
node = ares__htable_find(htable, idx, key);
- if (node == NULL)
- return 0;
+ if (node == NULL) {
+ return ARES_FALSE;
+ }
htable->num_keys--;
+
+ /* Reduce collisions */
+ if (ares__llist_len(ares__llist_node_parent(node)) > 1) {
+ htable->num_collisions--;
+ }
+
ares__llist_node_destroy(node);
- return 1;
+ return ARES_TRUE;
}
-size_t ares__htable_num_keys(ares__htable_t *htable)
+size_t ares__htable_num_keys(const ares__htable_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return 0;
+ }
return htable->num_keys;
}
@@ -306,68 +416,30 @@ unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len,
unsigned int seed)
{
/* recommended seed is 2166136261U, but we don't want collisions */
- unsigned int hv = seed;
- size_t i;
+ unsigned int hv = seed;
+ size_t i;
for (i = 0; i < key_len; i++) {
hv ^= (unsigned int)key[i];
/* hv *= 0x01000193 */
- hv += (hv<<1) + (hv<<4) + (hv<<7) + (hv<<8) + (hv<<24);
+ hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24);
}
return hv;
}
-/* tolower() is locale-specific. Use a lookup table fast conversion that only
- * operates on ASCII */
-static const unsigned char ares__tolower_lookup[] = {
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
- 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
- 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
- 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
- 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
- 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
- 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
- 0x78,0x79,0x7A,0x5B,0x5C,0x5D,0x5E,0x5F,
- 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
- 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
- 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
- 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
- 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
- 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,
- 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
- 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,
- 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
- 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,
- 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
- 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,
- 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
- 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
- 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
- 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,
- 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
-};
-
-
/* Case insensitive version, meant for ASCII strings */
-unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key, size_t key_len,
- unsigned int seed)
+unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key,
+ size_t key_len, unsigned int seed)
{
/* recommended seed is 2166136261U, but we don't want collisions */
- unsigned int hv = seed;
- size_t i;
+ unsigned int hv = seed;
+ size_t i;
for (i = 0; i < key_len; i++) {
- hv ^= (unsigned int)ares__tolower_lookup[key[i]];
+ hv ^= (unsigned int)ares__tolower(key[i]);
/* hv *= 0x01000193 */
- hv += (hv<<1) + (hv<<4) + (hv<<7) + (hv<<8) + (hv<<24);
+ hv += (hv << 1) + (hv << 4) + (hv << 7) + (hv << 8) + (hv << 24);
}
return hv;
diff --git a/contrib/libs/c-ares/src/lib/ares__htable.h b/contrib/libs/c-ares/src/lib/ares__htable.h
index bbd36f779b..d09c865977 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable.h
+++ b/contrib/libs/c-ares/src/lib/ares__htable.h
@@ -45,53 +45,53 @@
* @{
*/
-struct ares__htable_t;
+struct ares__htable;
/*! Opaque data type for generic hash table implementation */
typedef struct ares__htable ares__htable_t;
/*! Callback for generating a hash of the key.
- *
+ *
* \param[in] key pointer to key to be hashed
* \param[in] seed randomly generated seed used by hash function.
* value is specific to the hashtable instance
* but otherwise will not change between calls.
* \return hash
*/
-typedef unsigned int (*ares__htable_hashfunc_t)(const void *key,
+typedef unsigned int (*ares__htable_hashfunc_t)(const void *key,
unsigned int seed);
/*! Callback to free the bucket
- *
+ *
* \param[in] bucket user provided bucket
*/
typedef void (*ares__htable_bucket_free_t)(void *bucket);
/*! Callback to extract the key from the user-provided bucket
- *
+ *
* \param[in] bucket user provided bucket
* \return pointer to key held in bucket
*/
typedef const void *(*ares__htable_bucket_key_t)(const void *bucket);
/*! Callback to compare two keys for equality
- *
+ *
* \param[in] key1 first key
* \param[in] key2 second key
- * \return 1 if equal, 0 if not
+ * \return ARES_TRUE if equal, ARES_FALSE if not
*/
-typedef unsigned int (*ares__htable_key_eq_t)(const void *key1,
- const void *key2);
+typedef ares_bool_t (*ares__htable_key_eq_t)(const void *key1,
+ const void *key2);
-/*! Destroy the initialized hashtable
- *
- * \param[in] initialized hashtable
+/*! Destroy the initialized hashtable
+ *
+ * \param[in] htable initialized hashtable
*/
-void ares__htable_destroy(ares__htable_t *htable);
+void ares__htable_destroy(ares__htable_t *htable);
/*! Create a new hashtable
- *
+ *
* \param[in] hash_func Required. Callback for Hash function.
* \param[in] bucket_key Required. Callback to extract key from bucket.
* \param[in] bucket_free Required. Callback to free bucket.
@@ -104,40 +104,53 @@ ares__htable_t *ares__htable_create(ares__htable_hashfunc_t hash_func,
ares__htable_key_eq_t key_eq);
/*! Count of keys from initialized hashtable
- *
+ *
* \param[in] htable Initialized hashtable.
* \return count of keys
*/
-size_t ares__htable_num_keys(ares__htable_t *htable);
+size_t ares__htable_num_keys(const ares__htable_t *htable);
+
+/*! Retrieve an array of buckets from the hashtable. This is mainly used as
+ * a helper for retrieving an array of keys.
+ *
+ * \param[in] htable Initialized hashtable
+ * \param[out] num Count of returned buckets
+ * \return Array of pointers to the buckets. These are internal pointers
+ * to data within the hashtable, so if the key is removed, there
+ * will be a dangling pointer. It is expected wrappers will make
+ * such values safe by duplicating them.
+ */
+const void **ares__htable_all_buckets(const ares__htable_t *htable,
+ size_t *num);
/*! Insert bucket into hashtable
- *
+ *
* \param[in] htable Initialized hashtable.
* \param[in] bucket User-provided bucket to insert. Takes "ownership". Not
* allowed to be NULL.
- * \return 1 on success, 0 if out of memory
+ * \return ARES_TRUE on success, ARES_FALSE if out of memory
*/
-unsigned int ares__htable_insert(ares__htable_t *htable, void *bucket);
+ares_bool_t ares__htable_insert(ares__htable_t *htable, void *bucket);
/*! Retrieve bucket from hashtable based on key.
- *
+ *
* \param[in] htable Initialized hashtable
* \param[in] key Pointer to key to use for comparison.
* \return matching bucket, or NULL if not found.
*/
-void *ares__htable_get(ares__htable_t *htable, const void *key);
+void *ares__htable_get(const ares__htable_t *htable, const void *key);
-/*! Remove bucket from hashtable by key
- *
+/*! Remove bucket from hashtable by key
+ *
* \param[in] htable Initialized hashtable
* \param[in] key Pointer to key to use for comparison
- * \return 1 if found, 0 if not found
+ * \return ARES_TRUE if found, ARES_FALSE if not found
*/
-unsigned int ares__htable_remove(ares__htable_t *htable, const void *key);
+ares_bool_t ares__htable_remove(ares__htable_t *htable, const void *key);
/*! FNV1a hash algorithm. Can be used as underlying primitive for building
* a wrapper hashtable.
- *
+ *
* \param[in] key pointer to key
* \param[in] key_len Length of key
* \param[in] seed Seed for generating hash
@@ -146,18 +159,17 @@ unsigned int ares__htable_remove(ares__htable_t *htable, const void *key);
unsigned int ares__htable_hash_FNV1a(const unsigned char *key, size_t key_len,
unsigned int seed);
-/*! FNV1a hash algorithm, but converts all characters to lowercase before
+/*! FNV1a hash algorithm, but converts all characters to lowercase before
* hashing to make the hash case-insensitive. Can be used as underlying
* primitive for building a wrapper hashtable. Used on string-based keys.
- *
+ *
* \param[in] key pointer to key
* \param[in] key_len Length of key
* \param[in] seed Seed for generating hash
* \return hash value
*/
unsigned int ares__htable_hash_FNV1a_casecmp(const unsigned char *key,
- size_t key_len,
- unsigned int seed);
+ size_t key_len, unsigned int seed);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_asvp.c b/contrib/libs/c-ares/src/lib/ares__htable_asvp.c
index 7026524159..3c1d2a336f 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_asvp.c
+++ b/contrib/libs/c-ares/src/lib/ares__htable_asvp.c
@@ -29,30 +29,27 @@
#include "ares__htable.h"
#include "ares__htable_asvp.h"
-
struct ares__htable_asvp {
ares__htable_asvp_val_free_t free_val;
ares__htable_t *hash;
};
-
typedef struct {
ares_socket_t key;
void *val;
ares__htable_asvp_t *parent;
} ares__htable_asvp_bucket_t;
-
void ares__htable_asvp_destroy(ares__htable_asvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return;
+ }
ares__htable_destroy(htable->hash);
ares_free(htable);
}
-
static unsigned int hash_func(const void *key, unsigned int seed)
{
const ares_socket_t *arg = key;
@@ -60,50 +57,48 @@ static unsigned int hash_func(const void *key, unsigned int seed)
seed);
}
-
static const void *bucket_key(const void *bucket)
{
const ares__htable_asvp_bucket_t *arg = bucket;
return &arg->key;
}
-
static void bucket_free(void *bucket)
{
ares__htable_asvp_bucket_t *arg = bucket;
- if (arg->parent->free_val)
+ if (arg->parent->free_val) {
arg->parent->free_val(arg->val);
+ }
ares_free(arg);
}
-
-static unsigned int key_eq(const void *key1, const void *key2)
+static ares_bool_t key_eq(const void *key1, const void *key2)
{
const ares_socket_t *k1 = key1;
const ares_socket_t *k2 = key2;
- if (*k1 == *k2)
- return 1;
+ if (*k1 == *k2) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-
-ares__htable_asvp_t *ares__htable_asvp_create(
- ares__htable_asvp_val_free_t val_free)
+ares__htable_asvp_t *
+ ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free)
{
ares__htable_asvp_t *htable = ares_malloc(sizeof(*htable));
- if (htable == NULL)
+ if (htable == NULL) {
goto fail;
+ }
- htable->hash = ares__htable_create(hash_func,
- bucket_key,
- bucket_free,
- key_eq);
- if (htable->hash == NULL)
+ htable->hash =
+ ares__htable_create(hash_func, bucket_key, bucket_free, key_eq);
+ if (htable->hash == NULL) {
goto fail;
+ }
htable->free_val = val_free;
@@ -117,79 +112,117 @@ fail:
return NULL;
}
+ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable,
+ size_t *num)
+{
+ const void **buckets = NULL;
+ size_t cnt = 0;
+ ares_socket_t *out = NULL;
+ size_t i;
+
+ if (htable == NULL || num == NULL) {
+ return NULL;
+ }
+
+ *num = 0;
+
+ buckets = ares__htable_all_buckets(htable->hash, &cnt);
+ if (buckets == NULL || cnt == 0) {
+ return NULL;
+ }
+
+ out = ares_malloc_zero(sizeof(*out) * cnt);
+ if (out == NULL) {
+ ares_free(buckets);
+ return NULL;
+ }
-unsigned int ares__htable_asvp_insert(ares__htable_asvp_t *htable,
- ares_socket_t key, void *val)
+ for (i = 0; i < cnt; i++) {
+ out[i] = ((const ares__htable_asvp_bucket_t *)buckets[i])->key;
+ }
+
+ ares_free(buckets);
+ *num = cnt;
+ return out;
+}
+
+ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable,
+ ares_socket_t key, void *val)
{
ares__htable_asvp_bucket_t *bucket = NULL;
- if (htable == NULL)
+ if (htable == NULL) {
goto fail;
+ }
bucket = ares_malloc(sizeof(*bucket));
- if (bucket == NULL)
+ if (bucket == NULL) {
goto fail;
+ }
bucket->parent = htable;
bucket->key = key;
bucket->val = val;
- if (!ares__htable_insert(htable->hash, bucket))
+ if (!ares__htable_insert(htable->hash, bucket)) {
goto fail;
+ }
- return 1;
+ return ARES_TRUE;
fail:
if (bucket) {
ares_free(bucket);
}
- return 0;
+ return ARES_FALSE;
}
-
-unsigned int ares__htable_asvp_get(ares__htable_asvp_t *htable,
- ares_socket_t key, void **val)
+ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable,
+ ares_socket_t key, void **val)
{
ares__htable_asvp_bucket_t *bucket = NULL;
- if (val)
+ if (val) {
*val = NULL;
+ }
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
bucket = ares__htable_get(htable->hash, &key);
- if (bucket == NULL)
- return 0;
+ if (bucket == NULL) {
+ return ARES_FALSE;
+ }
- if (val)
+ if (val) {
*val = bucket->val;
- return 1;
+ }
+ return ARES_TRUE;
}
-
-void *ares__htable_asvp_get_direct(ares__htable_asvp_t *htable,
- ares_socket_t key)
+void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable,
+ ares_socket_t key)
{
void *val = NULL;
ares__htable_asvp_get(htable, key, &val);
return val;
}
-
-unsigned int ares__htable_asvp_remove(ares__htable_asvp_t *htable,
- ares_socket_t key)
+ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable,
+ ares_socket_t key)
{
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
return ares__htable_remove(htable->hash, &key);
}
-
-size_t ares__htable_asvp_num_keys(ares__htable_asvp_t *htable)
+size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return 0;
+ }
return ares__htable_num_keys(htable->hash);
}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_asvp.h b/contrib/libs/c-ares/src/lib/ares__htable_asvp.h
index f53b2775e0..49a766d023 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_asvp.h
+++ b/contrib/libs/c-ares/src/lib/ares__htable_asvp.h
@@ -48,72 +48,82 @@ struct ares__htable_asvp;
typedef struct ares__htable_asvp ares__htable_asvp_t;
/*! Callback to free value stored in hashtable
- *
+ *
* \param[in] val user-supplied value
*/
typedef void (*ares__htable_asvp_val_free_t)(void *val);
/*! Destroy hashtable
- *
+ *
* \param[in] htable Initialized hashtable
*/
void ares__htable_asvp_destroy(ares__htable_asvp_t *htable);
/*! Create size_t key, void pointer value hash table
- *
+ *
* \param[in] val_free Optional. Call back to free user-supplied value. If
* NULL it is expected the caller will clean up any user
* supplied values.
*/
-ares__htable_asvp_t *ares__htable_asvp_create(
- ares__htable_asvp_val_free_t val_free);
+ares__htable_asvp_t *
+ ares__htable_asvp_create(ares__htable_asvp_val_free_t val_free);
+
+/*! Retrieve an array of keys from the hashtable.
+ *
+ * \param[in] htable Initialized hashtable
+ * \param[out] num Count of returned keys
+ * \return Array of keys in the hashtable. Must be free'd with ares_free().
+ */
+ares_socket_t *ares__htable_asvp_keys(const ares__htable_asvp_t *htable,
+ size_t *num);
+
/*! Insert key/value into hash table
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to associate with value
* \param[in] val value to store (takes ownership). May be NULL.
- * \return 1 on success, 0 on out of memory or misuse
+ * \return ARES_TRUE on success, ARES_FALSE on out of memory or misuse
*/
-unsigned int ares__htable_asvp_insert(ares__htable_asvp_t *htable,
- ares_socket_t key, void *val);
+ares_bool_t ares__htable_asvp_insert(ares__htable_asvp_t *htable,
+ ares_socket_t key, void *val);
/*! Retrieve value from hashtable based on key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \param[out] val Optional. Pointer to store value.
- * \return 1 on success, 0 on failure
+ * \return ARES_TRUE on success, ARES_FALSE on failure
*/
-unsigned int ares__htable_asvp_get(ares__htable_asvp_t *htable,
- ares_socket_t key, void **val);
+ares_bool_t ares__htable_asvp_get(const ares__htable_asvp_t *htable,
+ ares_socket_t key, void **val);
/*! Retrieve value from hashtable directly as return value. Caveat to this
* function over ares__htable_asvp_get() is that if a NULL value is stored
* you cannot determine if the key is not found or the value is NULL.
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \return value associated with key in hashtable or NULL
*/
-void *ares__htable_asvp_get_direct(ares__htable_asvp_t *htable,
- ares_socket_t key);
+void *ares__htable_asvp_get_direct(const ares__htable_asvp_t *htable,
+ ares_socket_t key);
/*! Remove a value from the hashtable by key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
- * \return 1 if found, 0 if not
+ * \return ARES_TRUE if found, ARES_FALSE if not found
*/
-unsigned int ares__htable_asvp_remove(ares__htable_asvp_t *htable,
- ares_socket_t key);
+ares_bool_t ares__htable_asvp_remove(ares__htable_asvp_t *htable,
+ ares_socket_t key);
/*! Retrieve the number of keys stored in the hash table
- *
+ *
* \param[in] htable Initialized hash table
* \return count
*/
-size_t ares__htable_asvp_num_keys(ares__htable_asvp_t *htable);
+size_t ares__htable_asvp_num_keys(const ares__htable_asvp_t *htable);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_strvp.c b/contrib/libs/c-ares/src/lib/ares__htable_strvp.c
new file mode 100644
index 0000000000..bfae4c3622
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__htable_strvp.c
@@ -0,0 +1,198 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares__htable.h"
+#include "ares__htable_strvp.h"
+
+struct ares__htable_strvp {
+ ares__htable_strvp_val_free_t free_val;
+ ares__htable_t *hash;
+};
+
+typedef struct {
+ char *key;
+ void *val;
+ ares__htable_strvp_t *parent;
+} ares__htable_strvp_bucket_t;
+
+void ares__htable_strvp_destroy(ares__htable_strvp_t *htable)
+{
+ if (htable == NULL) {
+ return;
+ }
+
+ ares__htable_destroy(htable->hash);
+ ares_free(htable);
+}
+
+static unsigned int hash_func(const void *key, unsigned int seed)
+{
+ const char *arg = key;
+ return ares__htable_hash_FNV1a_casecmp((const unsigned char *)arg,
+ ares_strlen(arg), seed);
+}
+
+static const void *bucket_key(const void *bucket)
+{
+ const ares__htable_strvp_bucket_t *arg = bucket;
+ return arg->key;
+}
+
+static void bucket_free(void *bucket)
+{
+ ares__htable_strvp_bucket_t *arg = bucket;
+
+ if (arg->parent->free_val) {
+ arg->parent->free_val(arg->val);
+ }
+ ares_free(arg->key);
+ ares_free(arg);
+}
+
+static ares_bool_t key_eq(const void *key1, const void *key2)
+{
+ const char *k1 = key1;
+ const char *k2 = key2;
+
+ if (strcasecmp(k1, k2) == 0) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares__htable_strvp_t *
+ ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free)
+{
+ ares__htable_strvp_t *htable = ares_malloc(sizeof(*htable));
+ if (htable == NULL) {
+ goto fail;
+ }
+
+ htable->hash =
+ ares__htable_create(hash_func, bucket_key, bucket_free, key_eq);
+ if (htable->hash == NULL) {
+ goto fail;
+ }
+
+ htable->free_val = val_free;
+
+ return htable;
+
+fail:
+ if (htable) {
+ ares__htable_destroy(htable->hash);
+ ares_free(htable);
+ }
+ return NULL;
+}
+
+ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable,
+ const char *key, void *val)
+{
+ ares__htable_strvp_bucket_t *bucket = NULL;
+
+ if (htable == NULL || key == NULL) {
+ goto fail;
+ }
+
+ bucket = ares_malloc(sizeof(*bucket));
+ if (bucket == NULL) {
+ goto fail;
+ }
+
+ bucket->parent = htable;
+ bucket->key = ares_strdup(key);
+ if (bucket->key == NULL) {
+ goto fail;
+ }
+ bucket->val = val;
+
+ if (!ares__htable_insert(htable->hash, bucket)) {
+ goto fail;
+ }
+
+ return ARES_TRUE;
+
+fail:
+ if (bucket) {
+ ares_free(bucket->key);
+ ares_free(bucket);
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable,
+ const char *key, void **val)
+{
+ ares__htable_strvp_bucket_t *bucket = NULL;
+
+ if (val) {
+ *val = NULL;
+ }
+
+ if (htable == NULL || key == NULL) {
+ return ARES_FALSE;
+ }
+
+ bucket = ares__htable_get(htable->hash, key);
+ if (bucket == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (val) {
+ *val = bucket->val;
+ }
+ return ARES_TRUE;
+}
+
+void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable,
+ const char *key)
+{
+ void *val = NULL;
+ ares__htable_strvp_get(htable, key, &val);
+ return val;
+}
+
+ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable,
+ const char *key)
+{
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
+
+ return ares__htable_remove(htable->hash, key);
+}
+
+size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable)
+{
+ if (htable == NULL) {
+ return 0;
+ }
+ return ares__htable_num_keys(htable->hash);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_strvp.h b/contrib/libs/c-ares/src/lib/ares__htable_strvp.h
new file mode 100644
index 0000000000..25dd2b9077
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__htable_strvp.h
@@ -0,0 +1,118 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__HTABLE_STRVP_H
+#define __ARES__HTABLE_STRVP_H
+
+/*! \addtogroup ares__htable_strvp HashTable with string Key and void pointer
+ * Value
+ *
+ * This data structure wraps the base ares__htable data structure in order to
+ * split the key and value data types as string and void pointer, respectively.
+ *
+ * Average time complexity:
+ * - Insert: O(1)
+ * - Search: O(1)
+ * - Delete: O(1)
+ *
+ * @{
+ */
+
+struct ares__htable_strvp;
+
+/*! Opaque data type for size_t key, void pointer hash table implementation */
+typedef struct ares__htable_strvp ares__htable_strvp_t;
+
+/*! Callback to free value stored in hashtable
+ *
+ * \param[in] val user-supplied value
+ */
+typedef void (*ares__htable_strvp_val_free_t)(void *val);
+
+/*! Destroy hashtable
+ *
+ * \param[in] htable Initialized hashtable
+ */
+void ares__htable_strvp_destroy(ares__htable_strvp_t *htable);
+
+/*! Create string, void pointer value hash table
+ *
+ * \param[in] val_free Optional. Call back to free user-supplied value. If
+ * NULL it is expected the caller will clean up any user
+ * supplied values.
+ */
+ares__htable_strvp_t *
+ ares__htable_strvp_create(ares__htable_strvp_val_free_t val_free);
+
+/*! Insert key/value into hash table
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to associate with value
+ * \param[in] val value to store (takes ownership). May be NULL.
+ * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory
+ */
+ares_bool_t ares__htable_strvp_insert(ares__htable_strvp_t *htable,
+ const char *key, void *val);
+
+/*! Retrieve value from hashtable based on key
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to use to search
+ * \param[out] val Optional. Pointer to store value.
+ * \return ARES_TRUE on success, ARES_FALSE on failure
+ */
+ares_bool_t ares__htable_strvp_get(const ares__htable_strvp_t *htable,
+ const char *key, void **val);
+
+/*! Retrieve value from hashtable directly as return value. Caveat to this
+ * function over ares__htable_strvp_get() is that if a NULL value is stored
+ * you cannot determine if the key is not found or the value is NULL.
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to use to search
+ * \return value associated with key in hashtable or NULL
+ */
+void *ares__htable_strvp_get_direct(const ares__htable_strvp_t *htable,
+ const char *key);
+
+/*! Remove a value from the hashtable by key
+ *
+ * \param[in] htable Initialized hash table
+ * \param[in] key key to use to search
+ * \return ARES_TRUE if found, ARES_FALSE if not
+ */
+ares_bool_t ares__htable_strvp_remove(ares__htable_strvp_t *htable,
+ const char *key);
+
+/*! Retrieve the number of keys stored in the hash table
+ *
+ * \param[in] htable Initialized hash table
+ * \return count
+ */
+size_t ares__htable_strvp_num_keys(const ares__htable_strvp_t *htable);
+
+/*! @} */
+
+#endif /* __ARES__HTABLE_STVP_H */
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_stvp.c b/contrib/libs/c-ares/src/lib/ares__htable_szvp.c
index 7a4cd40a76..2ff64784bc 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_stvp.c
+++ b/contrib/libs/c-ares/src/lib/ares__htable_szvp.c
@@ -27,32 +27,29 @@
#include "ares.h"
#include "ares_private.h"
#include "ares__htable.h"
-#include "ares__htable_stvp.h"
+#include "ares__htable_szvp.h"
-
-struct ares__htable_stvp {
- ares__htable_stvp_val_free_t free_val;
+struct ares__htable_szvp {
+ ares__htable_szvp_val_free_t free_val;
ares__htable_t *hash;
};
-
typedef struct {
size_t key;
void *val;
- ares__htable_stvp_t *parent;
-} ares__htable_stvp_bucket_t;
+ ares__htable_szvp_t *parent;
+} ares__htable_szvp_bucket_t;
-
-void ares__htable_stvp_destroy(ares__htable_stvp_t *htable)
+void ares__htable_szvp_destroy(ares__htable_szvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return;
+ }
ares__htable_destroy(htable->hash);
ares_free(htable);
}
-
static unsigned int hash_func(const void *key, unsigned int seed)
{
const size_t *arg = key;
@@ -60,50 +57,48 @@ static unsigned int hash_func(const void *key, unsigned int seed)
seed);
}
-
static const void *bucket_key(const void *bucket)
{
- const ares__htable_stvp_bucket_t *arg = bucket;
+ const ares__htable_szvp_bucket_t *arg = bucket;
return &arg->key;
}
-
static void bucket_free(void *bucket)
{
- ares__htable_stvp_bucket_t *arg = bucket;
+ ares__htable_szvp_bucket_t *arg = bucket;
- if (arg->parent->free_val)
+ if (arg->parent->free_val) {
arg->parent->free_val(arg->val);
+ }
ares_free(arg);
}
-
-static unsigned int key_eq(const void *key1, const void *key2)
+static ares_bool_t key_eq(const void *key1, const void *key2)
{
const size_t *k1 = key1;
const size_t *k2 = key2;
- if (*k1 == *k2)
- return 1;
+ if (*k1 == *k2) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-
-ares__htable_stvp_t *ares__htable_stvp_create(
- ares__htable_stvp_val_free_t val_free)
+ares__htable_szvp_t *
+ ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free)
{
- ares__htable_stvp_t *htable = ares_malloc(sizeof(*htable));
- if (htable == NULL)
+ ares__htable_szvp_t *htable = ares_malloc(sizeof(*htable));
+ if (htable == NULL) {
goto fail;
+ }
- htable->hash = ares__htable_create(hash_func,
- bucket_key,
- bucket_free,
- key_eq);
- if (htable->hash == NULL)
+ htable->hash =
+ ares__htable_create(hash_func, bucket_key, bucket_free, key_eq);
+ if (htable->hash == NULL) {
goto fail;
+ }
htable->free_val = val_free;
@@ -117,77 +112,82 @@ fail:
return NULL;
}
-
-unsigned int ares__htable_stvp_insert(ares__htable_stvp_t *htable, size_t key,
- void *val)
+ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key,
+ void *val)
{
- ares__htable_stvp_bucket_t *bucket = NULL;
+ ares__htable_szvp_bucket_t *bucket = NULL;
- if (htable == NULL)
+ if (htable == NULL) {
goto fail;
+ }
bucket = ares_malloc(sizeof(*bucket));
- if (bucket == NULL)
+ if (bucket == NULL) {
goto fail;
+ }
bucket->parent = htable;
bucket->key = key;
bucket->val = val;
- if (!ares__htable_insert(htable->hash, bucket))
+ if (!ares__htable_insert(htable->hash, bucket)) {
goto fail;
+ }
- return 1;
+ return ARES_TRUE;
fail:
if (bucket) {
ares_free(bucket);
}
- return 0;
+ return ARES_FALSE;
}
-
-unsigned int ares__htable_stvp_get(ares__htable_stvp_t *htable, size_t key,
- void **val)
+ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key,
+ void **val)
{
- ares__htable_stvp_bucket_t *bucket = NULL;
+ ares__htable_szvp_bucket_t *bucket = NULL;
- if (val)
+ if (val) {
*val = NULL;
+ }
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
bucket = ares__htable_get(htable->hash, &key);
- if (bucket == NULL)
- return 0;
+ if (bucket == NULL) {
+ return ARES_FALSE;
+ }
- if (val)
+ if (val) {
*val = bucket->val;
- return 1;
+ }
+ return ARES_TRUE;
}
-
-void *ares__htable_stvp_get_direct(ares__htable_stvp_t *htable, size_t key)
+void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable,
+ size_t key)
{
void *val = NULL;
- ares__htable_stvp_get(htable, key, &val);
+ ares__htable_szvp_get(htable, key, &val);
return val;
}
-
-unsigned int ares__htable_stvp_remove(ares__htable_stvp_t *htable, size_t key)
+ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key)
{
- if (htable == NULL)
- return 0;
+ if (htable == NULL) {
+ return ARES_FALSE;
+ }
return ares__htable_remove(htable->hash, &key);
}
-
-size_t ares__htable_stvp_num_keys(ares__htable_stvp_t *htable)
+size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable)
{
- if (htable == NULL)
+ if (htable == NULL) {
return 0;
+ }
return ares__htable_num_keys(htable->hash);
}
diff --git a/contrib/libs/c-ares/src/lib/ares__htable_stvp.h b/contrib/libs/c-ares/src/lib/ares__htable_szvp.h
index 11d9d5ed4c..62b1776be9 100644
--- a/contrib/libs/c-ares/src/lib/ares__htable_stvp.h
+++ b/contrib/libs/c-ares/src/lib/ares__htable_szvp.h
@@ -26,7 +26,8 @@
#ifndef __ARES__HTABLE_STVP_H
#define __ARES__HTABLE_STVP_H
-/*! \addtogroup ares__htable_stvp HashTable with size_t Key and void pointer Value
+/*! \addtogroup ares__htable_szvp HashTable with size_t Key and void pointer
+ * Value
*
* This data structure wraps the base ares__htable data structure in order to
* split the key and value data types as size_t and void pointer, respectively.
@@ -39,76 +40,77 @@
* @{
*/
-struct ares__htable_stvp;
+struct ares__htable_szvp;
/*! Opaque data type for size_t key, void pointer hash table implementation */
-typedef struct ares__htable_stvp ares__htable_stvp_t;
+typedef struct ares__htable_szvp ares__htable_szvp_t;
/*! Callback to free value stored in hashtable
- *
+ *
* \param[in] val user-supplied value
*/
-typedef void (*ares__htable_stvp_val_free_t)(void *val);
+typedef void (*ares__htable_szvp_val_free_t)(void *val);
/*! Destroy hashtable
- *
+ *
* \param[in] htable Initialized hashtable
*/
-void ares__htable_stvp_destroy(ares__htable_stvp_t *htable);
+void ares__htable_szvp_destroy(ares__htable_szvp_t *htable);
/*! Create size_t key, void pointer value hash table
- *
+ *
* \param[in] val_free Optional. Call back to free user-supplied value. If
* NULL it is expected the caller will clean up any user
* supplied values.
*/
-ares__htable_stvp_t *ares__htable_stvp_create(
- ares__htable_stvp_val_free_t val_free);
+ares__htable_szvp_t *
+ ares__htable_szvp_create(ares__htable_szvp_val_free_t val_free);
/*! Insert key/value into hash table
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to associate with value
* \param[in] val value to store (takes ownership). May be NULL.
- * \return 1 on success, 0 on out of memory or misuse
+ * \return ARES_TRUE on success, ARES_FALSE on failure or out of memory
*/
-unsigned int ares__htable_stvp_insert(ares__htable_stvp_t *htable, size_t key,
- void *val);
+ares_bool_t ares__htable_szvp_insert(ares__htable_szvp_t *htable, size_t key,
+ void *val);
/*! Retrieve value from hashtable based on key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \param[out] val Optional. Pointer to store value.
- * \return 1 on success, 0 on failure
+ * \return ARES_TRUE on success, ARES_FALSE on failure
*/
-unsigned int ares__htable_stvp_get(ares__htable_stvp_t *htable, size_t key,
- void **val);
+ares_bool_t ares__htable_szvp_get(const ares__htable_szvp_t *htable, size_t key,
+ void **val);
/*! Retrieve value from hashtable directly as return value. Caveat to this
- * function over ares__htable_stvp_get() is that if a NULL value is stored
+ * function over ares__htable_szvp_get() is that if a NULL value is stored
* you cannot determine if the key is not found or the value is NULL.
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
* \return value associated with key in hashtable or NULL
*/
-void *ares__htable_stvp_get_direct(ares__htable_stvp_t *htable, size_t key);
+void *ares__htable_szvp_get_direct(const ares__htable_szvp_t *htable,
+ size_t key);
/*! Remove a value from the hashtable by key
- *
+ *
* \param[in] htable Initialized hash table
* \param[in] key key to use to search
- * \return 1 if found, 0 if not
+ * \return ARES_TRUE if found, ARES_FALSE if not
*/
-unsigned int ares__htable_stvp_remove(ares__htable_stvp_t *htable, size_t key);
+ares_bool_t ares__htable_szvp_remove(ares__htable_szvp_t *htable, size_t key);
/*! Retrieve the number of keys stored in the hash table
- *
+ *
* \param[in] htable Initialized hash table
* \return count
*/
-size_t ares__htable_stvp_num_keys(ares__htable_stvp_t *htable);
+size_t ares__htable_szvp_num_keys(const ares__htable_szvp_t *htable);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__iface_ips.c b/contrib/libs/c-ares/src/lib/ares__iface_ips.c
new file mode 100644
index 0000000000..b252a7ab49
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__iface_ips.c
@@ -0,0 +1,592 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+
+
+#ifdef USE_WINSOCK
+# include <winsock2.h>
+# include <ws2tcpip.h>
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+#ifdef HAVE_IFADDRS_H
+# include <ifaddrs.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#include "ares.h"
+#include "ares_private.h"
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name);
+
+typedef struct {
+ char *name;
+ struct ares_addr addr;
+ unsigned char netmask;
+ unsigned int ll_scope;
+ ares__iface_ip_flags_t flags;
+} ares__iface_ip_t;
+
+struct ares__iface_ips {
+ ares__iface_ip_t *ips;
+ size_t cnt;
+ size_t alloc_size;
+ ares__iface_ip_flags_t enum_flags;
+};
+
+static ares__iface_ips_t *ares__iface_ips_alloc(ares__iface_ip_flags_t flags)
+{
+ ares__iface_ips_t *ips = ares_malloc_zero(sizeof(*ips));
+ if (ips == NULL) {
+ return NULL;
+ }
+
+ /* Prealloc 4 entries */
+ ips->alloc_size = 4;
+ ips->ips = ares_malloc_zero(ips->alloc_size * sizeof(*ips->ips));
+ if (ips->ips == NULL) {
+ ares_free(ips);
+ return NULL;
+ }
+ ips->enum_flags = flags;
+ return ips;
+}
+
+static void ares__iface_ip_destroy(ares__iface_ip_t *ip)
+{
+ if (ip == NULL) {
+ return;
+ }
+ ares_free(ip->name);
+ memset(ip, 0, sizeof(*ip));
+}
+
+void ares__iface_ips_destroy(ares__iface_ips_t *ips)
+{
+ size_t i;
+
+ if (ips == NULL) {
+ return;
+ }
+
+ for (i = 0; i < ips->cnt; i++) {
+ ares__iface_ip_destroy(&ips->ips[i]);
+ }
+ ares_free(ips->ips);
+ ares_free(ips);
+}
+
+ares_status_t ares__iface_ips(ares__iface_ips_t **ips,
+ ares__iface_ip_flags_t flags, const char *name)
+{
+ ares_status_t status;
+
+ if (ips == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *ips = ares__iface_ips_alloc(flags);
+ if (*ips == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares__iface_ips_enumerate(*ips, name);
+ if (status != ARES_SUCCESS) {
+ ares__iface_ips_destroy(*ips);
+ *ips = NULL;
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t
+ ares__iface_ips_add(ares__iface_ips_t *ips, ares__iface_ip_flags_t flags,
+ const char *name, const struct ares_addr *addr,
+ unsigned char netmask, unsigned int ll_scope)
+{
+ size_t idx;
+
+ if (ips == NULL || name == NULL || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Don't want loopback */
+ if (flags & ARES_IFACE_IP_LOOPBACK &&
+ !(ips->enum_flags & ARES_IFACE_IP_LOOPBACK)) {
+ return ARES_SUCCESS;
+ }
+
+ /* Don't want offline */
+ if (flags & ARES_IFACE_IP_OFFLINE &&
+ !(ips->enum_flags & ARES_IFACE_IP_OFFLINE)) {
+ return ARES_SUCCESS;
+ }
+
+ /* Check for link-local */
+ if (ares__addr_is_linklocal(addr)) {
+ flags |= ARES_IFACE_IP_LINKLOCAL;
+ }
+ if (flags & ARES_IFACE_IP_LINKLOCAL &&
+ !(ips->enum_flags & ARES_IFACE_IP_LINKLOCAL)) {
+ return ARES_SUCCESS;
+ }
+
+ /* Set address flag based on address provided */
+ if (addr->family == AF_INET) {
+ flags |= ARES_IFACE_IP_V4;
+ }
+
+ if (addr->family == AF_INET6) {
+ flags |= ARES_IFACE_IP_V6;
+ }
+
+ /* If they specified either v4 or v6 validate flags otherwise assume they
+ * want to enumerate both */
+ if (ips->enum_flags & (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6)) {
+ if (flags & ARES_IFACE_IP_V4 && !(ips->enum_flags & ARES_IFACE_IP_V4)) {
+ return ARES_SUCCESS;
+ }
+ if (flags & ARES_IFACE_IP_V6 && !(ips->enum_flags & ARES_IFACE_IP_V6)) {
+ return ARES_SUCCESS;
+ }
+ }
+
+ /* Allocate more ips */
+ if (ips->cnt + 1 > ips->alloc_size) {
+ void *temp;
+ size_t alloc_size;
+
+ alloc_size = ares__round_up_pow2(ips->alloc_size + 1);
+ temp = ares_realloc_zero(ips->ips, ips->alloc_size * sizeof(*ips->ips),
+ alloc_size * sizeof(*ips->ips));
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ ips->ips = temp;
+ ips->alloc_size = alloc_size;
+ }
+
+ /* Add */
+ idx = ips->cnt++;
+
+ ips->ips[idx].flags = flags;
+ ips->ips[idx].netmask = netmask;
+ ips->ips[idx].ll_scope = ll_scope;
+ memcpy(&ips->ips[idx].addr, addr, sizeof(*addr));
+ ips->ips[idx].name = ares_strdup(name);
+ if (ips->ips[idx].name == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ return ARES_SUCCESS;
+}
+
+size_t ares__iface_ips_cnt(const ares__iface_ips_t *ips)
+{
+ if (ips == NULL) {
+ return 0;
+ }
+ return ips->cnt;
+}
+
+const char *ares__iface_ips_get_name(const ares__iface_ips_t *ips, size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return NULL;
+ }
+ return ips->ips[idx].name;
+}
+
+const struct ares_addr *ares__iface_ips_get_addr(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return NULL;
+ }
+ return &ips->ips[idx].addr;
+}
+
+ares__iface_ip_flags_t ares__iface_ips_get_flags(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return 0;
+ }
+ return ips->ips[idx].flags;
+}
+
+unsigned char ares__iface_ips_get_netmask(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return 0;
+ }
+ return ips->ips[idx].netmask;
+}
+
+unsigned int ares__iface_ips_get_ll_scope(const ares__iface_ips_t *ips,
+ size_t idx)
+{
+ if (ips == NULL || idx >= ips->cnt) {
+ return 0;
+ }
+ return ips->ips[idx].ll_scope;
+}
+
+
+#ifdef USE_WINSOCK
+
+# if 0
+static char *wcharp_to_charp(const wchar_t *in)
+{
+ char *out;
+ int len;
+
+ len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL);
+ if (len == -1) {
+ return NULL;
+ }
+
+ out = ares_malloc_zero((size_t)len + 1);
+
+ if (WideCharToMultiByte(CP_UTF8, 0, in, -1, out, len, NULL, NULL) == -1) {
+ ares_free(out);
+ return NULL;
+ }
+
+ return out;
+}
+# endif
+
+static ares_bool_t name_match(const char *name, const char *adapter_name,
+ unsigned int ll_scope)
+{
+ if (name == NULL || *name == 0) {
+ return ARES_TRUE;
+ }
+
+ if (strcasecmp(name, adapter_name) == 0) {
+ return ARES_TRUE;
+ }
+
+ if (ares_str_isnum(name) && (unsigned int)atoi(name) == ll_scope) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name)
+{
+ ULONG myflags = GAA_FLAG_INCLUDE_PREFIX /*|GAA_FLAG_INCLUDE_ALL_INTERFACES */;
+ ULONG outBufLen = 0;
+ DWORD retval;
+ IP_ADAPTER_ADDRESSES *addresses = NULL;
+ IP_ADAPTER_ADDRESSES *address = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Get necessary buffer size */
+ GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, NULL, &outBufLen);
+ if (outBufLen == 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ addresses = ares_malloc_zero(outBufLen);
+ if (addresses == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ retval =
+ GetAdaptersAddresses(AF_UNSPEC, myflags, NULL, addresses, &outBufLen);
+ if (retval != ERROR_SUCCESS) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ for (address = addresses; address != NULL; address = address->Next) {
+ IP_ADAPTER_UNICAST_ADDRESS *ipaddr = NULL;
+ ares__iface_ip_flags_t addrflag = 0;
+ char ifname[64] = "";
+
+# if defined(HAVE_CONVERTINTERFACEINDEXTOLUID) && \
+ defined(HAVE_CONVERTINTERFACELUIDTONAMEA)
+ /* Retrieve name from interface index.
+ * address->AdapterName appears to be a GUID/UUID of some sort, not a name.
+ * address->FriendlyName is user-changeable.
+ * That said, this doesn't appear to help us out on systems that don't
+ * have if_nametoindex() or if_indextoname() as they don't have these
+ * functions either! */
+ NET_LUID luid;
+ ConvertInterfaceIndexToLuid(address->IfIndex, &luid);
+ ConvertInterfaceLuidToNameA(&luid, ifname, sizeof(ifname));
+# else
+ ares_strcpy(ifname, address->AdapterName, sizeof(ifname));
+# endif
+
+ if (address->OperStatus != IfOperStatusUp) {
+ addrflag |= ARES_IFACE_IP_OFFLINE;
+ }
+
+ if (address->IfType == IF_TYPE_SOFTWARE_LOOPBACK) {
+ addrflag |= ARES_IFACE_IP_LOOPBACK;
+ }
+
+ for (ipaddr = address->FirstUnicastAddress; ipaddr != NULL;
+ ipaddr = ipaddr->Next) {
+ struct ares_addr addr;
+
+ if (ipaddr->Address.lpSockaddr->sa_family == AF_INET) {
+ const struct sockaddr_in *sockaddr_in =
+ (const struct sockaddr_in *)((void *)ipaddr->Address.lpSockaddr);
+ addr.family = AF_INET;
+ memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr,
+ sizeof(addr.addr.addr4));
+ } else if (ipaddr->Address.lpSockaddr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *sockaddr_in6 =
+ (const struct sockaddr_in6 *)((void *)ipaddr->Address.lpSockaddr);
+ addr.family = AF_INET6;
+ memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr,
+ sizeof(addr.addr.addr6));
+ } else {
+ /* Unknown */
+ continue;
+ }
+
+ /* Sometimes windows may use numerics to indicate a DNS server's adapter,
+ * which corresponds to the index rather than the name. Check and
+ * validate both. */
+ if (!name_match(name, ifname, address->Ipv6IfIndex)) {
+ continue;
+ }
+
+ status = ares__iface_ips_add(ips, addrflag, ifname, &addr,
+ ipaddr->OnLinkPrefixLength /* netmask */,
+ address->Ipv6IfIndex /* ll_scope */);
+
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+ }
+
+done:
+ ares_free(addresses);
+ return status;
+}
+
+#elif defined(HAVE_GETIFADDRS)
+
+static unsigned char count_addr_bits(const unsigned char *addr, size_t addr_len)
+{
+ size_t i;
+ unsigned char count = 0;
+
+ for (i = 0; i < addr_len; i++) {
+ count += ares__count_bits_u8(addr[i]);
+ }
+ return count;
+}
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name)
+{
+ struct ifaddrs *ifap = NULL;
+ struct ifaddrs *ifa = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (getifaddrs(&ifap) != 0) {
+ status = ARES_EFILE;
+ goto done;
+ }
+
+ for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+ ares__iface_ip_flags_t addrflag = 0;
+ struct ares_addr addr;
+ unsigned char netmask = 0;
+ unsigned int ll_scope = 0;
+
+ if (ifa->ifa_addr == NULL) {
+ continue;
+ }
+
+ if (!(ifa->ifa_flags & IFF_UP)) {
+ addrflag |= ARES_IFACE_IP_OFFLINE;
+ }
+
+ if (ifa->ifa_flags & IFF_LOOPBACK) {
+ addrflag |= ARES_IFACE_IP_LOOPBACK;
+ }
+
+ if (ifa->ifa_addr->sa_family == AF_INET) {
+ const struct sockaddr_in *sockaddr_in =
+ (const struct sockaddr_in *)((void *)ifa->ifa_addr);
+ addr.family = AF_INET;
+ memcpy(&addr.addr.addr4, &sockaddr_in->sin_addr, sizeof(addr.addr.addr4));
+ /* netmask */
+ sockaddr_in = (struct sockaddr_in *)((void *)ifa->ifa_netmask);
+ netmask = count_addr_bits((const void *)&sockaddr_in->sin_addr, 4);
+ } else if (ifa->ifa_addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *sockaddr_in6 =
+ (const struct sockaddr_in6 *)((void *)ifa->ifa_addr);
+ addr.family = AF_INET6;
+ memcpy(&addr.addr.addr6, &sockaddr_in6->sin6_addr,
+ sizeof(addr.addr.addr6));
+ /* netmask */
+ sockaddr_in6 = (struct sockaddr_in6 *)((void *)ifa->ifa_netmask);
+ netmask = count_addr_bits((const void *)&sockaddr_in6->sin6_addr, 16);
+# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ ll_scope = sockaddr_in6->sin6_scope_id;
+# endif
+ } else {
+ /* unknown */
+ continue;
+ }
+
+ /* Name mismatch */
+ if (strcasecmp(ifa->ifa_name, name) != 0) {
+ continue;
+ }
+
+ status = ares__iface_ips_add(ips, addrflag, ifa->ifa_name, &addr, netmask,
+ ll_scope);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ freeifaddrs(ifap);
+ return status;
+}
+
+#else
+
+static ares_status_t ares__iface_ips_enumerate(ares__iface_ips_t *ips,
+ const char *name)
+{
+ (void)ips;
+ (void)name;
+ return ARES_ENOTIMP;
+}
+
+#endif
+
+
+unsigned int ares__if_nametoindex(const char *name)
+{
+#ifdef HAVE_IF_NAMETOINDEX
+ return if_nametoindex(name);
+#else
+ ares_status_t status;
+ ares__iface_ips_t *ips = NULL;
+ size_t i;
+ unsigned int index = 0;
+
+ status =
+ ares__iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, name);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (i = 0; i < ares__iface_ips_cnt(ips); i++) {
+ if (ares__iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL) {
+ index = ares__iface_ips_get_ll_scope(ips, i);
+ goto done;
+ }
+ }
+
+done:
+ ares__iface_ips_destroy(ips);
+ return index;
+#endif
+}
+
+const char *ares__if_indextoname(unsigned int index, char *name,
+ size_t name_len)
+{
+#ifdef HAVE_IF_INDEXTONAME
+ if (name_len < IF_NAMESIZE) {
+ return NULL;
+ }
+ return if_indextoname(index, name);
+#else
+ ares_status_t status;
+ ares__iface_ips_t *ips = NULL;
+ size_t i;
+ const char *ptr = NULL;
+
+ if (name_len < IF_NAMESIZE) {
+ goto done;
+ }
+
+ if (index == 0) {
+ goto done;
+ }
+
+ status =
+ ares__iface_ips(&ips, ARES_IFACE_IP_V6 | ARES_IFACE_IP_LINKLOCAL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (i = 0; i < ares__iface_ips_cnt(ips); i++) {
+ if (ares__iface_ips_get_flags(ips, i) & ARES_IFACE_IP_LINKLOCAL &&
+ ares__iface_ips_get_ll_scope(ips, i) == index) {
+ ares_strcpy(name, ares__iface_ips_get_name(ips, i), name_len);
+ ptr = name;
+ goto done;
+ }
+ }
+
+done:
+ ares__iface_ips_destroy(ips);
+ return ptr;
+#endif
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__iface_ips.h b/contrib/libs/c-ares/src/lib/ares__iface_ips.h
new file mode 100644
index 0000000000..61ff736a79
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__iface_ips.h
@@ -0,0 +1,139 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__IFACE_IPS_H
+#define __ARES__IFACE_IPS_H
+
+/*! Flags for interface ip addresses. */
+typedef enum {
+ ARES_IFACE_IP_V4 = 1 << 0, /*!< IPv4 address. During enumeration if
+ * this flag is set ARES_IFACE_IP_V6
+ * is not, will only enumerate v4
+ * addresses. */
+ ARES_IFACE_IP_V6 = 1 << 1, /*!< IPv6 address. During enumeration if
+ * this flag is set ARES_IFACE_IP_V4
+ * is not, will only enumerate v6
+ * addresses. */
+ ARES_IFACE_IP_LOOPBACK = 1 << 2, /*!< Loopback adapter */
+ ARES_IFACE_IP_OFFLINE = 1 << 3, /*!< Adapter offline */
+ ARES_IFACE_IP_LINKLOCAL = 1 << 4, /*!< Link-local ip address */
+ /*! Default, enumerate all ips for online interfaces, including loopback */
+ ARES_IFACE_IP_DEFAULT = (ARES_IFACE_IP_V4 | ARES_IFACE_IP_V6 |
+ ARES_IFACE_IP_LOOPBACK | ARES_IFACE_IP_LINKLOCAL)
+} ares__iface_ip_flags_t;
+
+struct ares__iface_ips;
+
+/*! Opaque pointer for holding enumerated interface ip addresses */
+typedef struct ares__iface_ips ares__iface_ips_t;
+
+/*! Destroy ip address enumeration created by ares__iface_ips().
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ */
+void ares__iface_ips_destroy(ares__iface_ips_t *ips);
+
+/*! Enumerate ip addresses on interfaces
+ *
+ * \param[out] ips Returns initialized ip address structure
+ * \param[in] flags Flags for enumeration
+ * \param[in] name Interface name to enumerate, or NULL to enumerate all
+ * \return ARES_ENOMEM on out of memory, ARES_ENOTIMP if not supported on
+ * the system, ARES_SUCCESS on success
+ */
+ares_status_t ares__iface_ips(ares__iface_ips_t **ips,
+ ares__iface_ip_flags_t flags, const char *name);
+
+/*! Count of ips enumerated
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \return count
+ */
+size_t ares__iface_ips_cnt(const ares__iface_ips_t *ips);
+
+/*! Retrieve interface name
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface name
+ */
+const char *ares__iface_ips_get_name(const ares__iface_ips_t *ips, size_t idx);
+
+/*! Retrieve interface address
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface address
+ */
+const struct ares_addr *ares__iface_ips_get_addr(const ares__iface_ips_t *ips,
+ size_t idx);
+
+/*! Retrieve interface address flags
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface address flags
+ */
+ares__iface_ip_flags_t ares__iface_ips_get_flags(const ares__iface_ips_t *ips,
+ size_t idx);
+
+/*! Retrieve interface address netmask
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface address netmask
+ */
+unsigned char ares__iface_ips_get_netmask(const ares__iface_ips_t *ips,
+ size_t idx);
+
+/*! Retrieve interface ipv6 link local scope
+ *
+ * \param[in] ips Initialized IP address enumeration structure
+ * \param[in] idx Index of entry to pull
+ * \return interface ipv6 link local scope
+ */
+unsigned int ares__iface_ips_get_ll_scope(const ares__iface_ips_t *ips,
+ size_t idx);
+
+
+/*! Retrieve the interface index (aka link local scope) from the interface
+ * name.
+ *
+ * \param[in] name Interface name
+ * \return 0 on failure, index otherwise
+ */
+unsigned int ares__if_nametoindex(const char *name);
+
+/*! Retrieves the interface name from the index (aka link local scope)
+ *
+ * \param[in] index Interface index (> 0)
+ * \param[in] name Buffer to hold name
+ * \param[in] name_len Length of provided buffer, must be at least IF_NAMESIZE
+ * \return NULL on failure, or pointer to name on success
+ */
+const char *ares__if_indextoname(unsigned int index, char *name,
+ size_t name_len);
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares__llist.c b/contrib/libs/c-ares/src/lib/ares__llist.c
index 9ccda81a6a..d175da2bd3 100644
--- a/contrib/libs/c-ares/src/lib/ares__llist.c
+++ b/contrib/libs/c-ares/src/lib/ares__llist.c
@@ -35,7 +35,6 @@ struct ares__llist {
size_t cnt;
};
-
struct ares__llist_node {
void *data;
ares__llist_node_t *prev;
@@ -43,56 +42,44 @@ struct ares__llist_node {
ares__llist_t *parent;
};
-
ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct)
{
- ares__llist_t *list = ares_malloc(sizeof(*list));
+ ares__llist_t *list = ares_malloc_zero(sizeof(*list));
- if (list == NULL)
+ if (list == NULL) {
return NULL;
-
- memset(list, 0, sizeof(*list));
+ }
list->destruct = destruct;
return list;
}
-
-void ares__llist_replace_destructor(ares__llist_t *list,
+void ares__llist_replace_destructor(ares__llist_t *list,
ares__llist_destructor_t destruct)
{
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
list->destruct = destruct;
}
-
typedef enum {
ARES__LLIST_INSERT_HEAD,
ARES__LLIST_INSERT_TAIL,
ARES__LLIST_INSERT_BEFORE
} ares__llist_insert_type_t;
-
-static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
- ares__llist_insert_type_t type,
- ares__llist_node_t *at,
- void *val)
+static void ares__llist_attach_at(ares__llist_t *list,
+ ares__llist_insert_type_t type,
+ ares__llist_node_t *at,
+ ares__llist_node_t *node)
{
- ares__llist_node_t *node = NULL;
-
- if (list == NULL || val == NULL)
- return NULL;
-
- node = ares_malloc(sizeof(*node));
-
- if (node == NULL)
- return NULL;
+ if (list == NULL || node == NULL) {
+ return;
+ }
- memset(node, 0, sizeof(*node));
- node->data = val;
node->parent = list;
if (type == ARES__LLIST_INSERT_BEFORE && (at == list->head || at == NULL)) {
@@ -103,15 +90,17 @@ static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
case ARES__LLIST_INSERT_HEAD:
node->next = list->head;
node->prev = NULL;
- if (list->head)
+ if (list->head) {
list->head->prev = node;
+ }
list->head = node;
break;
case ARES__LLIST_INSERT_TAIL:
node->next = NULL;
node->prev = list->tail;
- if (list->tail)
+ if (list->tail) {
list->tail->next = node;
+ }
list->tail = node;
break;
case ARES__LLIST_INSERT_BEFORE:
@@ -120,133 +109,151 @@ static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
at->prev = node;
break;
}
- if (list->tail == NULL)
+ if (list->tail == NULL) {
list->tail = node;
- if (list->head == NULL)
+ }
+ if (list->head == NULL) {
list->head = node;
+ }
list->cnt++;
+}
+
+static ares__llist_node_t *ares__llist_insert_at(ares__llist_t *list,
+ ares__llist_insert_type_t type,
+ ares__llist_node_t *at,
+ void *val)
+{
+ ares__llist_node_t *node = NULL;
+
+ if (list == NULL || val == NULL) {
+ return NULL;
+ }
+
+ node = ares_malloc_zero(sizeof(*node));
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ node->data = val;
+ ares__llist_attach_at(list, type, at, node);
return node;
}
-
ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val)
{
return ares__llist_insert_at(list, ARES__LLIST_INSERT_HEAD, NULL, val);
}
-
ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val)
{
return ares__llist_insert_at(list, ARES__LLIST_INSERT_TAIL, NULL, val);
}
-
ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node,
- void *val)
+ void *val)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE, node,
val);
}
-
ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node,
- void *val)
+ void *val)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
- if (node->next == NULL)
+ if (node->next == NULL) {
return ares__llist_insert_last(node->parent, val);
+ }
return ares__llist_insert_at(node->parent, ARES__LLIST_INSERT_BEFORE,
node->next, val);
}
-
ares__llist_node_t *ares__llist_node_first(ares__llist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->head;
}
-
ares__llist_node_t *ares__llist_node_last(ares__llist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->tail;
}
-
ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->next;
}
-
ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->prev;
}
-
void *ares__llist_node_val(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->data;
}
-
-size_t ares__llist_len(ares__llist_t *list)
+size_t ares__llist_len(const ares__llist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return 0;
+ }
return list->cnt;
}
-
ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->parent;
}
-
void *ares__llist_first_val(ares__llist_t *list)
{
return ares__llist_node_val(ares__llist_node_first(list));
}
-
void *ares__llist_last_val(ares__llist_t *list)
{
return ares__llist_node_val(ares__llist_node_last(list));
}
-
-void *ares__llist_node_claim(ares__llist_node_t *node)
+static void ares__llist_node_detach(ares__llist_node_t *node)
{
- void *val;
ares__llist_t *list;
- if (node == NULL)
- return NULL;
+ if (node == NULL) {
+ return;
+ }
list = node->parent;
- val = node->data;
if (node->prev) {
node->prev->next = node->next;
@@ -263,54 +270,91 @@ void *ares__llist_node_claim(ares__llist_node_t *node)
if (node == list->tail) {
list->tail = node->prev;
}
- ares_free(node);
+ node->parent = NULL;
list->cnt--;
+}
+
+void *ares__llist_node_claim(ares__llist_node_t *node)
+{
+ void *val;
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ val = node->data;
+ ares__llist_node_detach(node);
+ ares_free(node);
return val;
}
-
void ares__llist_node_destroy(ares__llist_node_t *node)
{
ares__llist_destructor_t destruct;
void *val;
- if (node == NULL)
+ if (node == NULL) {
return;
+ }
destruct = node->parent->destruct;
val = ares__llist_node_claim(node);
- if (val != NULL && destruct != NULL)
+ if (val != NULL && destruct != NULL) {
destruct(val);
+ }
}
-
void ares__llist_node_replace(ares__llist_node_t *node, void *val)
{
ares__llist_destructor_t destruct;
-
- if (node == NULL)
+
+ if (node == NULL) {
return;
+ }
destruct = node->parent->destruct;
- if (destruct != NULL)
+ if (destruct != NULL) {
destruct(node->data);
+ }
node->data = val;
}
-
void ares__llist_destroy(ares__llist_t *list)
{
ares__llist_node_t *node;
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
while ((node = ares__llist_node_first(list)) != NULL) {
ares__llist_node_destroy(node);
}
ares_free(list);
}
+
+void ares__llist_node_move_parent_last(ares__llist_node_t *node,
+ ares__llist_t *new_parent)
+{
+ if (node == NULL || new_parent == NULL) {
+ return;
+ }
+
+ ares__llist_node_detach(node);
+ ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_TAIL, NULL, node);
+}
+
+void ares__llist_node_move_parent_first(ares__llist_node_t *node,
+ ares__llist_t *new_parent)
+{
+ if (node == NULL || new_parent == NULL) {
+ return;
+ }
+
+ ares__llist_node_detach(node);
+ ares__llist_attach_at(new_parent, ARES__LLIST_INSERT_HEAD, NULL, node);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__llist.h b/contrib/libs/c-ares/src/lib/ares__llist.h
index 950c7ac1d0..7d57bdab3b 100644
--- a/contrib/libs/c-ares/src/lib/ares__llist.h
+++ b/contrib/libs/c-ares/src/lib/ares__llist.h
@@ -49,29 +49,29 @@ struct ares__llist_node;
typedef struct ares__llist_node ares__llist_node_t;
/*! Callback to free user-defined node data
- *
+ *
* \param[in] data user supplied data
*/
typedef void (*ares__llist_destructor_t)(void *data);
/*! Create a linked list object
- *
+ *
* \param[in] destruct Optional. Destructor to call on all removed nodes
* \return linked list object or NULL on out of memory
*/
-ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct);
+ares__llist_t *ares__llist_create(ares__llist_destructor_t destruct);
/*! Replace destructor for linked list nodes. Typically this is used
* when wanting to disable the destructor by using NULL.
- *
+ *
* \param[in] list Initialized linked list object
* \param[in] destruct replacement destructor, NULL is allowed
*/
-void ares__llist_replace_destructor(ares__llist_t *list,
- ares__llist_destructor_t destruct);
+void ares__llist_replace_destructor(ares__llist_t *list,
+ ares__llist_destructor_t destruct);
/*! Insert value as the first node in the linked list
- *
+ *
* \param[in] list Initialized linked list object
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
@@ -80,7 +80,7 @@ void ares__llist_replace_destructor(ares__llist_t *list,
ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val);
/*! Insert value as the last node in the linked list
- *
+ *
* \param[in] list Initialized linked list object
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
@@ -89,115 +89,132 @@ ares__llist_node_t *ares__llist_insert_first(ares__llist_t *list, void *val);
ares__llist_node_t *ares__llist_insert_last(ares__llist_t *list, void *val);
/*! Insert value before specified node in the linked list
- *
+ *
* \param[in] node node referenced to insert before
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
* misuse
*/
ares__llist_node_t *ares__llist_insert_before(ares__llist_node_t *node,
- void *val);
+ void *val);
/*! Insert value after specified node in the linked list
- *
+ *
* \param[in] node node referenced to insert after
* \param[in] val user-supplied value.
* \return node object referencing place in list, or null if out of memory or
* misuse
*/
ares__llist_node_t *ares__llist_insert_after(ares__llist_node_t *node,
- void *val);
+ void *val);
/*! Obtain first node in list
- *
+ *
* \param[in] list Initialized list object
* \return first node in list or NULL if none
*/
ares__llist_node_t *ares__llist_node_first(ares__llist_t *list);
/*! Obtain last node in list
- *
+ *
* \param[in] list Initialized list object
* \return last node in list or NULL if none
*/
ares__llist_node_t *ares__llist_node_last(ares__llist_t *list);
/*! Obtain next node in respect to specified node
- *
+ *
* \param[in] node Node referenced
* \return node or NULL if none
*/
ares__llist_node_t *ares__llist_node_next(ares__llist_node_t *node);
/*! Obtain previous node in respect to specified node
- *
+ *
* \param[in] node Node referenced
* \return node or NULL if none
*/
ares__llist_node_t *ares__llist_node_prev(ares__llist_node_t *node);
/*! Obtain value from node
- *
+ *
* \param[in] node Node referenced
* \return user provided value from node
*/
-void *ares__llist_node_val(ares__llist_node_t *node);
+void *ares__llist_node_val(ares__llist_node_t *node);
/*! Obtain the number of entries in the list
- *
+ *
* \param[in] list Initialized list object
* \return count
*/
-size_t ares__llist_len(ares__llist_t *list);
+size_t ares__llist_len(const ares__llist_t *list);
/*! Obtain list object from referenced node
- *
+ *
* \param[in] node Node referenced
* \return list object node belongs to
*/
-ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node);
+ares__llist_t *ares__llist_node_parent(ares__llist_node_t *node);
/*! Obtain the first user-supplied value in the list
- *
+ *
* \param[in] list Initialized list object
* \return first user supplied value or NULL if none
*/
-void *ares__llist_first_val(ares__llist_t *list);
+void *ares__llist_first_val(ares__llist_t *list);
/*! Obtain the last user-supplied value in the list
- *
+ *
* \param[in] list Initialized list object
* \return last user supplied value or NULL if none
*/
-void *ares__llist_last_val(ares__llist_t *list);
+void *ares__llist_last_val(ares__llist_t *list);
/*! Take ownership of user-supplied value in list without calling destructor.
* Will unchain entry from list.
- *
+ *
* \param[in] node Node referenced
* \return user supplied value
*/
-void *ares__llist_node_claim(ares__llist_node_t *node);
+void *ares__llist_node_claim(ares__llist_node_t *node);
/*! Replace user-supplied value for node
- *
+ *
* \param[in] node Node referenced
* \param[in] val new user-supplied value
*/
void ares__llist_node_replace(ares__llist_node_t *node, void *val);
/*! Destroy the node, removing it from the list and calling destructor.
- *
+ *
* \param[in] node Node referenced
*/
void ares__llist_node_destroy(ares__llist_node_t *node);
/*! Destroy the list object and all nodes in the list.
- *
+ *
* \param[in] list Initialized list object
*/
void ares__llist_destroy(ares__llist_t *list);
+/*! Detach node from the current list and re-attach it to the new list as the
+ * last entry.
+ *
+ * \param[in] node node to move
+ * \param[in] new_parent new list
+ */
+void ares__llist_node_move_parent_last(ares__llist_node_t *node,
+ ares__llist_t *new_parent);
+
+/*! Detach node from the current list and re-attach it to the new list as the
+ * first entry.
+ *
+ * \param[in] node node to move
+ * \param[in] new_parent new list
+ */
+void ares__llist_node_move_parent_first(ares__llist_node_t *node,
+ ares__llist_t *new_parent);
/*! @} */
#endif /* __ARES__LLIST_H */
diff --git a/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c b/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c
index 73a17ea0ed..90e951c02f 100644
--- a/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares__parse_into_addrinfo.c
@@ -1,6 +1,7 @@
/* MIT License
*
* Copyright (c) 2019 Andrew Selivanov
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -35,8 +36,6 @@
# include <arpa/inet.h>
#endif
-#include "ares_nameser.h"
-
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
@@ -46,194 +45,137 @@
#endif
#include "ares.h"
-#include "ares_dns.h"
#include "ares_private.h"
-int ares__parse_into_addrinfo(const unsigned char *abuf,
- int alen, int cname_only_is_enodata,
- unsigned short port,
- struct ares_addrinfo *ai)
+ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec,
+ ares_bool_t cname_only_is_enodata,
+ unsigned short port,
+ struct ares_addrinfo *ai)
{
- unsigned int qdcount, ancount;
- int status, i, rr_type, rr_class, rr_len, rr_ttl;
- int got_a = 0, got_aaaa = 0, got_cname = 0;
- long len;
- const unsigned char *aptr;
- char *question_hostname = NULL;
- char *hostname, *rr_name = NULL, *rr_data;
- struct ares_addrinfo_cname *cname, *cnames = NULL;
- struct ares_addrinfo_node *nodes = NULL;
-
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
-
- /* Fetch the question and answer count from the header. */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
- if (qdcount != 1)
- return ARES_EBADRESP;
-
-
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares__expand_name_for_response(aptr, abuf, alen, &question_hostname, &len, 0);
- if (status != ARES_SUCCESS)
- return status;
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- goto failed_stat;
+ ares_status_t status;
+ size_t i;
+ size_t ancount;
+ const char *hostname = NULL;
+ ares_bool_t got_a = ARES_FALSE;
+ ares_bool_t got_aaaa = ARES_FALSE;
+ ares_bool_t got_cname = ARES_FALSE;
+ struct ares_addrinfo_cname *cnames = NULL;
+ struct ares_addrinfo_node *nodes = NULL;
+
+ /* Save question hostname */
+ status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ if (ancount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ancount; i++) {
+ ares_dns_rec_type_t rtype;
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) {
+ continue;
}
- hostname = question_hostname;
-
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < (int)ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len, 0);
- if (status != ARES_SUCCESS)
- {
- rr_name = NULL;
- goto failed_stat;
- }
-
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- goto failed_stat;
- }
- rr_type = DNS_RR_TYPE(aptr);
- rr_class = DNS_RR_CLASS(aptr);
- rr_len = DNS_RR_LEN(aptr);
- rr_ttl = DNS_RR_TTL(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- goto failed_stat;
- }
-
- if (rr_class == C_IN && rr_type == T_A
- && rr_len == sizeof(struct in_addr)
- && strcasecmp(rr_name, hostname) == 0)
- {
- got_a = 1;
- if (aptr + sizeof(struct in_addr) > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- goto failed_stat;
- } /* LCOV_EXCL_STOP */
-
- status = ares_append_ai_node(AF_INET, port, rr_ttl, aptr, &nodes);
- if (status != ARES_SUCCESS)
- goto failed_stat;
- }
- else if (rr_class == C_IN && rr_type == T_AAAA
- && rr_len == sizeof(struct ares_in6_addr)
- && strcasecmp(rr_name, hostname) == 0)
- {
- got_aaaa = 1;
- if (aptr + sizeof(struct ares_in6_addr) > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- goto failed_stat;
- } /* LCOV_EXCL_STOP */
-
- status = ares_append_ai_node(AF_INET6, port, rr_ttl, aptr, &nodes);
- if (status != ARES_SUCCESS)
- goto failed_stat;
- }
-
- if (rr_class == C_IN && rr_type == T_CNAME)
- {
- got_cname = 1;
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
- &len, 1);
- if (status != ARES_SUCCESS)
- {
- goto failed_stat;
- }
-
- /* Decode the RR data and replace the hostname with it. */
- /* SA: Seems wrong as it introduses order dependency. */
- hostname = rr_data;
-
- cname = ares__append_addrinfo_cname(&cnames);
- if (!cname)
- {
- status = ARES_ENOMEM;
- ares_free(rr_data);
- goto failed_stat;
- }
- cname->ttl = rr_ttl;
- cname->alias = rr_name;
- cname->name = rr_data;
- rr_name = NULL;
- }
- else
- {
- /* rr_name is only saved for cname */
- ares_free(rr_name);
- rr_name = NULL;
- }
-
-
- aptr += rr_len;
- if (aptr > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- goto failed_stat;
- } /* LCOV_EXCL_STOP */
+ rtype = ares_dns_rr_get_type(rr);
+
+ /* Issue #683
+ * Old code did this hostname sanity check, however it appears this is
+ * flawed logic. Other resolvers don't do this sanity check. Leaving
+ * this code commented out for future reference.
+ *
+ * rname = ares_dns_rr_get_name(rr);
+ * if ((rtype == ARES_REC_TYPE_A || rtype == ARES_REC_TYPE_AAAA) &&
+ * strcasecmp(rname, hostname) != 0) {
+ * continue;
+ * }
+ */
+
+ if (rtype == ARES_REC_TYPE_CNAME) {
+ struct ares_addrinfo_cname *cname;
+
+ got_cname = ARES_TRUE;
+ /* replace hostname with data from cname
+ * SA: Seems wrong as it introduces order dependency. */
+ hostname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME);
+
+ cname = ares__append_addrinfo_cname(&cnames);
+ if (cname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ cname->ttl = (int)ares_dns_rr_get_ttl(rr);
+ cname->alias = ares_strdup(ares_dns_rr_get_name(rr));
+ if (cname->alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ cname->name = ares_strdup(hostname);
+ if (cname->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ } else if (rtype == ARES_REC_TYPE_A) {
+ got_a = ARES_TRUE;
+ status =
+ ares_append_ai_node(AF_INET, port, ares_dns_rr_get_ttl(rr),
+ ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR), &nodes);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ } else if (rtype == ARES_REC_TYPE_AAAA) {
+ got_aaaa = ARES_TRUE;
+ status = ares_append_ai_node(AF_INET6, port, ares_dns_rr_get_ttl(rr),
+ ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR),
+ &nodes);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ } else {
+ continue;
}
-
- if (status == ARES_SUCCESS)
- {
- if (!got_a && !got_aaaa)
- {
- if (!got_cname || (got_cname && cname_only_is_enodata))
- {
- status = ARES_ENODATA;
- goto failed_stat;
- }
- }
-
- /* save the question hostname as ai->name */
- if (ai->name == NULL || strcasecmp(ai->name, question_hostname) != 0)
- {
- ares_free(ai->name);
- ai->name = ares_strdup(question_hostname);
- if (!ai->name)
- {
- status = ARES_ENOMEM;
- goto failed_stat;
- }
- }
-
- if (got_a || got_aaaa)
- {
- ares__addrinfo_cat_nodes(&ai->nodes, nodes);
- nodes = NULL;
- }
-
- if (got_cname)
- {
- ares__addrinfo_cat_cnames(&ai->cnames, cnames);
- cnames = NULL;
- }
+ }
+
+ if (!got_a && !got_aaaa &&
+ (!got_cname || (got_cname && cname_only_is_enodata))) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ /* save the hostname as ai->name */
+ if (ai->name == NULL || strcasecmp(ai->name, hostname) != 0) {
+ ares_free(ai->name);
+ ai->name = ares_strdup(hostname);
+ if (ai->name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ }
- ares_free(question_hostname);
- return status;
+ if (got_a || got_aaaa) {
+ ares__addrinfo_cat_nodes(&ai->nodes, nodes);
+ nodes = NULL;
+ }
-failed_stat:
- ares_free(question_hostname);
- ares_free(rr_name);
+ if (got_cname) {
+ ares__addrinfo_cat_cnames(&ai->cnames, cnames);
+ cnames = NULL;
+ }
+
+done:
ares__freeaddrinfo_cnames(cnames);
ares__freeaddrinfo_nodes(nodes);
+
+ /* compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+
return status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares__read_line.c b/contrib/libs/c-ares/src/lib/ares__read_line.c
deleted file mode 100644
index 38beda6fb0..0000000000
--- a/contrib/libs/c-ares/src/lib/ares__read_line.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#include "ares.h"
-#include "ares_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/src/lib/ares__readaddrinfo.c b/contrib/libs/c-ares/src/lib/ares__readaddrinfo.c
deleted file mode 100644
index fe99946782..0000000000
--- a/contrib/libs/c-ares/src/lib/ares__readaddrinfo.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2019 Andrew Selivanov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <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 = ARES_SUCCESS;
- size_t linesize;
- struct ares_addrinfo_cname *cname = NULL, *cnames = NULL;
- struct ares_addrinfo_node *nodes = NULL;
- int match_with_alias, match_with_canonical;
- int want_cname = hints->ai_flags & ARES_AI_CANONNAME;
-
- /* Validate family */
- switch (hints->ai_family) {
- case AF_INET:
- case AF_INET6:
- case AF_UNSPEC:
- break;
- default:
- return ARES_EBADFAMILY;
- }
-
- ai->name = ares_strdup(name);
- if(!ai->name)
- {
- status = ARES_ENOMEM;
- goto fail;
- }
-
- while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
- {
- match_with_alias = 0;
- match_with_canonical = 0;
- alias_count = 0;
- /* Trim line comment. */
- p = line;
- while (*p && (*p != '#'))
- p++;
- *p = '\0';
-
- /* Trim trailing whitespace. */
- q = p - 1;
- while ((q >= line) && ISSPACE(*q))
- q--;
- *++q = '\0';
-
- /* Skip leading whitespace. */
- p = line;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if empty. */
- continue;
-
- /* Pointer to start of IPv4 or IPv6 address part. */
- txtaddr = p;
-
- /* Advance past address part. */
- while (*p && !ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue;
-
- /* Null terminate address part. */
- *p = '\0';
-
- /* Advance to host name */
- p++;
- while (*p && ISSPACE(*p))
- p++;
- if (!*p)
- /* Ignore line if reached end of line. */
- continue; /* LCOV_EXCL_LINE: trailing whitespace already stripped */
-
- /* Pointer to start of host name. */
- txthost = p;
-
- /* Advance past host name. */
- while (*p && !ISSPACE(*p))
- p++;
-
- /* Pointer to start of first alias. */
- txtalias = NULL;
- if (*p)
- {
- q = p + 1;
- while (*q && ISSPACE(*q))
- q++;
- if (*q)
- txtalias = q;
- }
-
- /* Null terminate host name. */
- *p = '\0';
-
- /* Find out if host name matches with canonical host name. */
- if (strcasecmp(txthost, name) == 0)
- {
- match_with_canonical = 1;
- }
-
- /* Find out if host name matches with one of the aliases. */
- while (txtalias)
- {
- p = txtalias;
- while (*p && !ISSPACE(*p))
- p++;
- q = p;
- while (*q && ISSPACE(*q))
- q++;
- *p = '\0';
- if (strcasecmp(txtalias, name) == 0)
- {
- match_with_alias = 1;
- if (!want_cname)
- break;
- }
- if (alias_count < MAX_ALIASES)
- {
- aliases[alias_count++] = txtalias;
- }
- txtalias = *q ? q : NULL;
- }
-
- /* Try next line if host does not match. */
- if (!match_with_alias && !match_with_canonical)
- {
- continue;
- }
-
- /*
- * Convert address string to network address for the requested families.
- * Actual address family possible values are AF_INET and AF_INET6 only.
- */
- if ((hints->ai_family == AF_INET) || (hints->ai_family == AF_UNSPEC))
- {
- struct in_addr addr4;
- if (ares_inet_pton(AF_INET, txtaddr, &addr4) == 1)
- {
- status = ares_append_ai_node(AF_INET, port, 0, &addr4, &nodes);
- if (status != ARES_SUCCESS)
- {
- goto fail;
- }
- }
- }
- if ((hints->ai_family == AF_INET6) || (hints->ai_family == AF_UNSPEC))
- {
- struct ares_in6_addr addr6;
- if (ares_inet_pton(AF_INET6, txtaddr, &addr6) == 1)
- {
- status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &nodes);
- if (status != ARES_SUCCESS)
- {
- goto fail;
- }
- }
- }
-
- if (want_cname)
- {
- for (i = 0; i < alias_count; ++i)
- {
- cname = ares__append_addrinfo_cname(&cnames);
- if (!cname)
- {
- status = ARES_ENOMEM;
- goto fail;
- }
- cname->alias = ares_strdup(aliases[i]);
- cname->name = ares_strdup(txthost);
- }
- /* No aliases, cname only. */
- if(!alias_count)
- {
- cname = ares__append_addrinfo_cname(&cnames);
- if (!cname)
- {
- status = ARES_ENOMEM;
- goto fail;
- }
- cname->name = ares_strdup(txthost);
- }
- }
- }
-
- /* Last read failed. */
- if (status == ARES_ENOMEM)
- {
- goto fail;
- }
-
- /* If no results, its a failure */
- if (!nodes)
- {
- status = ARES_ENOTFOUND;
- goto fail;
- }
-
- /* Free line buffer. */
- ares_free(line);
- ares__addrinfo_cat_cnames(&ai->cnames, cnames);
- ares__addrinfo_cat_nodes(&ai->nodes, nodes);
-
- return ARES_SUCCESS;
-
-fail:
- ares_free(line);
- ares__freeaddrinfo_cnames(cnames);
- ares__freeaddrinfo_nodes(nodes);
- ares_free(ai->name);
- ai->name = NULL;
- return status;
-}
diff --git a/contrib/libs/c-ares/src/lib/ares__slist.c b/contrib/libs/c-ares/src/lib/ares__slist.c
index 9974bc045a..5b80984355 100644
--- a/contrib/libs/c-ares/src/lib/ares__slist.c
+++ b/contrib/libs/c-ares/src/lib/ares__slist.c
@@ -32,14 +32,13 @@
#define ARES__SLIST_START_LEVELS 4
-
struct ares__slist {
ares_rand_state *rand_state;
unsigned char rand_data[8];
size_t rand_bits;
ares__slist_node_t **head;
- size_t levels;
+ size_t levels;
ares__slist_node_t *tail;
ares__slist_cmp_t cmp;
@@ -47,7 +46,6 @@ struct ares__slist {
size_t cnt;
};
-
struct ares__slist_node {
void *data;
ares__slist_node_t **prev;
@@ -56,41 +54,37 @@ struct ares__slist_node {
ares__slist_t *parent;
};
-
-ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
- ares__slist_cmp_t cmp,
+ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
+ ares__slist_cmp_t cmp,
ares__slist_destructor_t destruct)
{
ares__slist_t *list;
- if (rand_state == NULL || cmp == NULL)
+ if (rand_state == NULL || cmp == NULL) {
return NULL;
+ }
- list = ares_malloc(sizeof(*list));
+ list = ares_malloc_zero(sizeof(*list));
- if (list == NULL)
+ if (list == NULL) {
return NULL;
-
- memset(list, 0, sizeof(*list));
+ }
list->rand_state = rand_state;
list->cmp = cmp;
list->destruct = destruct;
- list->levels = ARES__SLIST_START_LEVELS;
- list->head = ares_malloc(sizeof(*list->head) * list->levels);
+ list->levels = ARES__SLIST_START_LEVELS;
+ list->head = ares_malloc_zero(sizeof(*list->head) * list->levels);
if (list->head == NULL) {
ares_free(list);
return NULL;
}
- memset(list->head, 0, sizeof(*list->head) * list->levels);
-
return list;
}
-
-static unsigned int ares__slist_coin_flip(ares__slist_t *list)
+static ares_bool_t ares__slist_coin_flip(ares__slist_t *list)
{
size_t total_bits = sizeof(list->rand_data) * 8;
size_t bit;
@@ -108,149 +102,59 @@ static unsigned int ares__slist_coin_flip(ares__slist_t *list)
bit = total_bits - list->rand_bits;
list->rand_bits--;
- return (list->rand_data[bit / 8] & (1 << (bit % 8)))?1:0;
+ return (list->rand_data[bit / 8] & (1 << (bit % 8))) ? ARES_TRUE : ARES_FALSE;
}
-
-void ares__slist_replace_destructor(ares__slist_t *list,
+void ares__slist_replace_destructor(ares__slist_t *list,
ares__slist_destructor_t destruct)
{
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
list->destruct = destruct;
}
-/* Uses public domain code snipets from http://graphics.stanford.edu/~seander/bithacks.html */
-
-static size_t ares__round_up_pow2(size_t n)
-{
- n--;
- n |= n >> 1;
- n |= n >> 2;
- n |= n >> 4;
- n |= n >> 8;
- n |= n >> 16;
- if (sizeof(size_t) > 4)
- n |= n >> 32;
- n++;
- return n;
-}
-
-
-static size_t ares__log2(size_t n)
-{
- static const unsigned char tab32[32] = {
- 0, 1, 28, 2, 29, 14, 24, 3,
- 30, 22, 20, 15, 25, 17, 4, 8,
- 31, 27, 13, 23, 21, 19, 16, 7,
- 26, 12, 18, 6, 11, 5, 10, 9
- };
- static const unsigned char tab64[64] = {
- 63, 0, 58, 1, 59, 47, 53, 2,
- 60, 39, 48, 27, 54, 33, 42, 3,
- 61, 51, 37, 40, 49, 18, 28, 20,
- 55, 30, 34, 11, 43, 14, 22, 4,
- 62, 57, 46, 52, 38, 26, 32, 41,
- 50, 36, 17, 19, 29, 10, 13, 21,
- 56, 45, 25, 31, 35, 16, 9, 12,
- 44, 24, 15, 8, 23, 7, 6, 5
- };
-
- if (sizeof(size_t) == 4)
- return tab32[(size_t)(n*0x077CB531) >> 27];
-
- return tab64[((size_t)(n*0x07EDD5E59A4E28C2)) >> 58];
-}
-
-
-static size_t ares__slist_max_level(ares__slist_t *list)
+static size_t ares__slist_max_level(const ares__slist_t *list)
{
size_t max_level = 0;
- if (list->cnt+1 <= (1 << ARES__SLIST_START_LEVELS)) {
+ if (list->cnt + 1 <= (1 << ARES__SLIST_START_LEVELS)) {
max_level = ARES__SLIST_START_LEVELS;
} else {
- max_level = ares__log2(ares__round_up_pow2(list->cnt+1));
+ max_level = ares__log2(ares__round_up_pow2(list->cnt + 1));
}
- if (list->levels > max_level)
+ if (list->levels > max_level) {
max_level = list->levels;
+ }
return max_level;
}
-
static size_t ares__slist_calc_level(ares__slist_t *list)
{
size_t max_level = ares__slist_max_level(list);
size_t level;
- for (level=1; ares__slist_coin_flip(list) && level < max_level; level++)
+ for (level = 1; ares__slist_coin_flip(list) && level < max_level; level++)
;
return level;
}
-
-ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
+static void ares__slist_node_push(ares__slist_t *list, ares__slist_node_t *node)
{
- ares__slist_node_t *node = NULL;
- ares__slist_node_t *left = NULL;
size_t i;
-
- if (list == NULL || val == NULL)
- return NULL;
-
- node = ares_malloc(sizeof(*node));
-
- if (node == NULL)
- goto fail;
-
- memset(node, 0, sizeof(*node));
- node->data = val;
- node->parent = list;
-
- /* Randomly determine the number of levels we want to use */
- node->levels = ares__slist_calc_level(list);
-
- /* Allocate array of next and prev nodes for linking each level */
- node->next = ares_malloc(sizeof(*node->next) * node->levels);
- if (node->next == NULL)
- goto fail;
-
- memset(node->next, 0, sizeof(*node->next) * node->levels);
-
- node->prev = ares_malloc(sizeof(*node->prev) * node->levels);
- if (node->prev == NULL)
- goto fail;
-
- memset(node->prev, 0, sizeof(*node->prev) * node->levels);
-
- /* If the number of levels is greater than we currently support in the slist,
- * increase the count */
- if (list->levels < node->levels) {
- size_t zero_len = sizeof(*list->head) * (node->levels - list->levels);
- size_t offset = sizeof(*list->head) * list->levels;
- void *ptr = ares_realloc(list->head, sizeof(*list->head) * node->levels);
- if (ptr == NULL)
- goto fail;
-
- memset((unsigned char *)ptr + offset, 0, zero_len);
- list->head = ptr;
- list->levels = node->levels;
- }
-
+ ares__slist_node_t *left = NULL;
/* Scan from highest level in the slist, even if we're not using that number
* of levels for this entry as this is what makes it O(log n) */
- for (i=list->levels; i-- > 0; ) {
- /* set left if left is NULL and the current node value is greater than the
+ for (i = list->levels; i-- > 0;) {
+ /* set left if left is NULL and the current node value is greater than the
* head at this level */
- if (left == NULL &&
- list->head[i] != NULL &&
- list->cmp(node->data, list->head[i]->data) > 0
- ) {
+ if (left == NULL && list->head[i] != NULL &&
+ list->cmp(node->data, list->head[i]->data) > 0) {
left = list->head[i];
}
@@ -263,9 +167,10 @@ ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
}
/* search only as we didn't randomly select this number of levels */
- if (i >= node->levels)
+ if (i >= node->levels) {
continue;
-
+ }
+
if (left == NULL) {
/* head insertion */
node->next[i] = list->head[i];
@@ -288,6 +193,54 @@ ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
}
}
}
+}
+
+ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val)
+{
+ ares__slist_node_t *node = NULL;
+
+ if (list == NULL || val == NULL) {
+ return NULL;
+ }
+
+ node = ares_malloc_zero(sizeof(*node));
+
+ if (node == NULL) {
+ goto fail;
+ }
+
+ node->data = val;
+ node->parent = list;
+
+ /* Randomly determine the number of levels we want to use */
+ node->levels = ares__slist_calc_level(list);
+
+ /* Allocate array of next and prev nodes for linking each level */
+ node->next = ares_malloc_zero(sizeof(*node->next) * node->levels);
+ if (node->next == NULL) {
+ goto fail;
+ }
+
+ node->prev = ares_malloc_zero(sizeof(*node->prev) * node->levels);
+ if (node->prev == NULL) {
+ goto fail;
+ }
+
+ /* If the number of levels is greater than we currently support in the slist,
+ * increase the count */
+ if (list->levels < node->levels) {
+ void *ptr =
+ ares_realloc_zero(list->head, sizeof(*list->head) * list->levels,
+ sizeof(*list->head) * node->levels);
+ if (ptr == NULL) {
+ goto fail;
+ }
+
+ list->head = ptr;
+ list->levels = node->levels;
+ }
+
+ ares__slist_node_push(list, node);
list->cnt++;
@@ -302,25 +255,90 @@ fail:
return NULL;
}
+static void ares__slist_node_pop(ares__slist_node_t *node)
+{
+ ares__slist_t *list = node->parent;
+ size_t i;
+
+ /* relink each node at each level */
+ for (i = node->levels; i-- > 0;) {
+ if (node->next[i] == NULL) {
+ if (i == 0) {
+ list->tail = node->prev[0];
+ }
+ } else {
+ node->next[i]->prev[i] = node->prev[i];
+ }
+
+ if (node->prev[i] == NULL) {
+ list->head[i] = node->next[i];
+ } else {
+ node->prev[i]->next[i] = node->next[i];
+ }
+ }
+
+ memset(node->next, 0, sizeof(*node->next) * node->levels);
+ memset(node->prev, 0, sizeof(*node->prev) * node->levels);
+}
+
+void *ares__slist_node_claim(ares__slist_node_t *node)
+{
+ ares__slist_t *list;
+ void *val;
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ list = node->parent;
+ val = node->data;
+
+ ares__slist_node_pop(node);
+
+ ares_free(node->next);
+ ares_free(node->prev);
+ ares_free(node);
+
+ list->cnt--;
+
+ return val;
+}
+
+void ares__slist_node_reinsert(ares__slist_node_t *node)
+{
+ ares__slist_t *list;
+
+ if (node == NULL) {
+ return;
+ }
+
+ list = node->parent;
+
+ ares__slist_node_pop(node);
+ ares__slist_node_push(list, node);
+}
ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val)
{
size_t i;
ares__slist_node_t *node = NULL;
- int rv = -1;
+ int rv = -1;
- if (list == NULL || val == NULL)
+ if (list == NULL || val == NULL) {
return NULL;
+ }
/* Scan nodes starting at the highest level. For each level scan forward
* until the value is between the prior and next node, or if equal quit
* as we found a match */
- for (i=list->levels; i-- > 0; ) {
- if (node == NULL)
+ for (i = list->levels; i-- > 0;) {
+ if (node == NULL) {
node = list->head[i];
+ }
- if (node == NULL)
+ if (node == NULL) {
continue;
+ }
do {
rv = list->cmp(val, node->data);
@@ -359,138 +377,98 @@ ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val)
return node;
}
-
ares__slist_node_t *ares__slist_node_first(ares__slist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->head[0];
}
-
ares__slist_node_t *ares__slist_node_last(ares__slist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return NULL;
+ }
return list->tail;
}
-
ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->next[0];
}
-
ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->prev[0];
}
-
void *ares__slist_node_val(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->data;
}
-
-size_t ares__slist_len(ares__slist_t *list)
+size_t ares__slist_len(const ares__slist_t *list)
{
- if (list == NULL)
+ if (list == NULL) {
return 0;
+ }
return list->cnt;
}
-
ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node)
{
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return node->parent;
}
-
void *ares__slist_first_val(ares__slist_t *list)
{
return ares__slist_node_val(ares__slist_node_first(list));
}
-
void *ares__slist_last_val(ares__slist_t *list)
{
return ares__slist_node_val(ares__slist_node_last(list));
}
-
-void *ares__slist_node_claim(ares__slist_node_t *node)
-{
- void *val;
- ares__slist_t *list;
- size_t i;
-
- if (node == NULL)
- return NULL;
-
- list = node->parent;
- val = node->data;
-
- /* relink each node at each level */
- for (i=node->levels; i-- > 0; ) {
- if (node->next[i] == NULL) {
- if (i == 0) {
- list->tail = node->prev[0];
- }
- } else {
- node->next[i]->prev[i] = node->prev[i];
- }
-
- if (node->prev[i] == NULL) {
- list->head[i] = node->next[i];
- } else {
- node->prev[i]->next[i] = node->next[i];
- }
- }
-
- ares_free(node->next);
- ares_free(node->prev);
- ares_free(node);
-
- list->cnt--;
-
- return val;
-}
-
-
void ares__slist_node_destroy(ares__slist_node_t *node)
{
ares__slist_destructor_t destruct;
void *val;
- if (node == NULL)
+ if (node == NULL) {
return;
+ }
destruct = node->parent->destruct;
- val = ares__slist_node_claim(node);
+ val = ares__slist_node_claim(node);
- if (val != NULL && destruct != NULL)
+ if (val != NULL && destruct != NULL) {
destruct(val);
+ }
}
-
void ares__slist_destroy(ares__slist_t *list)
{
ares__slist_node_t *node;
- if (list == NULL)
+ if (list == NULL) {
return;
+ }
while ((node = ares__slist_node_first(list)) != NULL) {
ares__slist_node_destroy(node);
diff --git a/contrib/libs/c-ares/src/lib/ares__slist.h b/contrib/libs/c-ares/src/lib/ares__slist.h
index 2cce217164..26af88fa78 100644
--- a/contrib/libs/c-ares/src/lib/ares__slist.h
+++ b/contrib/libs/c-ares/src/lib/ares__slist.h
@@ -60,13 +60,13 @@ struct ares__slist_node;
typedef struct ares__slist_node ares__slist_node_t;
/*! SkipList Node Value destructor callback
- *
+ *
* \param[in] data User-defined data to destroy
*/
typedef void (*ares__slist_destructor_t)(void *data);
/*! SkipList comparison function
- *
+ *
* \param[in] data1 First user-defined data object
* \param[in] data2 Second user-defined data object
* \return < 0 if data1 < data1, > 0 if data1 > data2, 0 if data1 == data2
@@ -74,26 +74,26 @@ typedef void (*ares__slist_destructor_t)(void *data);
typedef int (*ares__slist_cmp_t)(const void *data1, const void *data2);
/*! Create SkipList
- *
+ *
* \param[in] rand_state Initialized ares random state.
* \param[in] cmp SkipList comparison function
* \param[in] destruct SkipList Node Value Destructor. Optional, use NULL.
* \return Initialized SkipList Object or NULL on misuse or ENOMEM
- */
-ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
- ares__slist_cmp_t cmp,
- ares__slist_destructor_t destruct);
+ */
+ares__slist_t *ares__slist_create(ares_rand_state *rand_state,
+ ares__slist_cmp_t cmp,
+ ares__slist_destructor_t destruct);
/*! Replace SkipList Node Value Destructor
- *
+ *
* \param[in] list Initialized SkipList Object
* \param[in] destruct Replacement destructor. May be NULL.
*/
-void ares__slist_replace_destructor(ares__slist_t *list,
- ares__slist_destructor_t destruct);
+void ares__slist_replace_destructor(ares__slist_t *list,
+ ares__slist_destructor_t destruct);
/*! Insert Value into SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \param[in] val Node Value. Must not be NULL. Function takes ownership
* and will have destructor called.
@@ -102,35 +102,35 @@ void ares__slist_replace_destructor(ares__slist_t *list,
ares__slist_node_t *ares__slist_insert(ares__slist_t *list, void *val);
/*! Fetch first node in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_first(ares__slist_t *list);
/*! Fetch last node in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_last(ares__slist_t *list);
/*! Fetch next node in SkipList
- *
+ *
* \param[in] node SkipList Node Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_next(ares__slist_node_t *node);
/*! Fetch previous node in SkipList
- *
+ *
* \param[in] node SkipList Node Object
* \return SkipList Node Object or NULL if none
*/
ares__slist_node_t *ares__slist_node_prev(ares__slist_node_t *node);
/*! Fetch SkipList Node Object by Value
- *
+ *
* \param[in] list Initialized SkipList Object
* \param[in] val Object to use for comparison
* \return SkipList Node Object or NULL if not found
@@ -139,58 +139,67 @@ ares__slist_node_t *ares__slist_node_find(ares__slist_t *list, const void *val);
/*! Fetch Node Value
- *
+ *
* \param[in] node SkipList Node Object
* \return user defined node value
*/
-void *ares__slist_node_val(ares__slist_node_t *node);
+void *ares__slist_node_val(ares__slist_node_t *node);
/*! Fetch number of entries in SkipList Object
- *
+ *
* \param[in] list Initialized SkipList Object
* \return number of entries
*/
-size_t ares__slist_len(ares__slist_t *list);
+size_t ares__slist_len(const ares__slist_t *list);
-/*! Fetch SkipList Object from SkipList Node
- *
+/*! Fetch SkipList Object from SkipList Node
+ *
* \param[in] node SkipList Node Object
* \return SkipList Object
*/
-ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node);
+ares__slist_t *ares__slist_node_parent(ares__slist_node_t *node);
/*! Fetch first Node Value in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return user defined node value or NULL if none
*/
-void *ares__slist_first_val(ares__slist_t *list);
+void *ares__slist_first_val(ares__slist_t *list);
/*! Fetch last Node Value in SkipList
- *
+ *
* \param[in] list Initialized SkipList Object
* \return user defined node value or NULL if none
*/
-void *ares__slist_last_val(ares__slist_t *list);
+void *ares__slist_last_val(ares__slist_t *list);
/*! Take back ownership of Node Value in SkipList, remove from SkipList.
- *
+ *
* \param[in] node SkipList Node Object
* \return user defined node value
*/
-void *ares__slist_node_claim(ares__slist_node_t *node);
+void *ares__slist_node_claim(ares__slist_node_t *node);
+
+/*! The internals of the node have changed, thus its position in the sorted
+ * list is no longer valid. This function will remove it and re-add it to
+ * the proper position without needing to perform any memory allocations
+ * and thus cannot fail.
+ *
+ * \param[in] node SkipList Node Object
+ */
+void ares__slist_node_reinsert(ares__slist_node_t *node);
/*! Remove Node from SkipList, calling destructor for Node Value.
- *
+ *
* \param[in] node SkipList Node Object
*/
-void ares__slist_node_destroy(ares__slist_node_t *node);
+void ares__slist_node_destroy(ares__slist_node_t *node);
/*! Destroy SkipList Object. If there are any nodes, they will be destroyed.
- *
+ *
* \param[in] list Initialized SkipList Object
*/
-void ares__slist_destroy(ares__slist_t *list);
+void ares__slist_destroy(ares__slist_t *list);
/*! @} */
diff --git a/contrib/libs/c-ares/src/lib/ares__socket.c b/contrib/libs/c-ares/src/lib/ares__socket.c
new file mode 100644
index 0000000000..da03755a50
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__socket.c
@@ -0,0 +1,480 @@
+/* MIT License
+ *
+ * Copyright (c) Massachusetts Institute of Technology
+ * Copyright (c) The c-ares project and its contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+
+#ifdef HAVE_SYS_UIO_H
+# include <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_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_private.h"
+
+ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len, int flags,
+ struct sockaddr *from,
+ ares_socklen_t *from_len)
+{
+ if (channel->sock_funcs && channel->sock_funcs->arecvfrom) {
+ return channel->sock_funcs->arecvfrom(s, data, data_len, flags, from,
+ from_len, channel->sock_func_cb_data);
+ }
+
+#ifdef HAVE_RECVFROM
+ return (ares_ssize_t)recvfrom(s, data, (RECVFROM_TYPE_ARG3)data_len, flags,
+ from, from_len);
+#else
+ return sread(s, data, data_len);
+#endif
+}
+
+ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len)
+{
+ if (channel->sock_funcs && channel->sock_funcs->arecvfrom) {
+ return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0,
+ channel->sock_func_cb_data);
+ }
+
+ /* sread() is a wrapper for read() or recv() depending on the system */
+ return sread(s, data, data_len);
+}
+
+/*
+ * setsocknonblock sets the given socket to either blocking or non-blocking
+ * mode based on the 'nonblock' boolean argument. This function is highly
+ * portable.
+ */
+static int setsocknonblock(ares_socket_t sockfd, /* operate on this */
+ int nonblock /* TRUE or FALSE */)
+{
+#if defined(USE_BLOCKING_SOCKETS)
+
+ return 0; /* returns success */
+
+#elif defined(HAVE_FCNTL_O_NONBLOCK)
+
+ /* most recent unix versions */
+ int flags;
+ flags = fcntl(sockfd, F_GETFL, 0);
+ if (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, (long)FIONBIO, &flags);
+
+#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
+
+ /* Amiga */
+ long flags = nonblock ? 1L : 0L;
+ return IoctlSocket(sockfd, FIONBIO, flags);
+
+#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
+
+ /* BeOS */
+ long b = nonblock ? 1L : 0L;
+ return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
+
+#else
+# error "no non-blocking method was found/used/set"
+#endif
+}
+
+#if defined(IPV6_V6ONLY) && defined(WIN32)
+/* It makes support for IPv4-mapped IPv6 addresses.
+ * Linux kernel, NetBSD, FreeBSD and Darwin: default is off;
+ * Windows Vista and later: default is on;
+ * DragonFly BSD: acts like off, and dummy setting;
+ * OpenBSD and earlier Windows: unsupported.
+ * Linux: controlled by /proc/sys/net/ipv6/bindv6only.
+ */
+static void set_ipv6_v6only(ares_socket_t sockfd, int on)
+{
+ (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on));
+}
+#else
+# define set_ipv6_v6only(s, v)
+#endif
+
+static int configure_socket(ares_socket_t s, struct server_state *server)
+{
+ union {
+ struct sockaddr sa;
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ } local;
+
+ ares_socklen_t bindlen = 0;
+ ares_channel_t *channel = server->channel;
+
+ /* do not set options for user-managed sockets */
+ if (channel->sock_funcs && channel->sock_funcs->asocket) {
+ return 0;
+ }
+
+ (void)setsocknonblock(s, 1);
+
+#if defined(FD_CLOEXEC) && !defined(MSDOS)
+ /* Configure the socket fd as close-on-exec. */
+ if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
+ return -1; /* LCOV_EXCL_LINE */
+ }
+#endif
+
+ /* Set the socket's send and receive buffer sizes. */
+ if ((channel->socket_send_buffer_size > 0) &&
+ setsockopt(s, SOL_SOCKET, SO_SNDBUF,
+ (void *)&channel->socket_send_buffer_size,
+ sizeof(channel->socket_send_buffer_size)) == -1) {
+ return -1;
+ }
+
+ if ((channel->socket_receive_buffer_size > 0) &&
+ setsockopt(s, SOL_SOCKET, SO_RCVBUF,
+ (void *)&channel->socket_receive_buffer_size,
+ sizeof(channel->socket_receive_buffer_size)) == -1) {
+ return -1;
+ }
+
+#ifdef SO_BINDTODEVICE
+ if (channel->local_dev_name[0] &&
+ setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, channel->local_dev_name,
+ sizeof(channel->local_dev_name))) {
+ /* Only root can do this, and usually not fatal if it doesn't work, so */
+ /* just continue on. */
+ }
+#endif
+
+ if (server->addr.family == AF_INET && 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);
+ bindlen = sizeof(local.sa4);
+ } else if (server->addr.family == AF_INET6 && server->ll_scope == 0 &&
+ memcmp(channel->local_ip6, ares_in6addr_any._S6_un._S6_u8,
+ sizeof(channel->local_ip6)) != 0) {
+ /* Only if not link-local and an ip other than "::" is specified */
+ 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));
+ bindlen = sizeof(local.sa6);
+ }
+
+ if (bindlen && bind(s, &local.sa, bindlen) < 0) {
+ return -1;
+ }
+
+ if (server->addr.family == AF_INET6) {
+ set_ipv6_v6only(s, 0);
+ }
+
+ return 0;
+}
+
+ares_status_t ares__open_connection(ares_channel_t *channel,
+ struct server_state *server,
+ ares_bool_t is_tcp)
+{
+ ares_socket_t s;
+ int opt;
+ ares_socklen_t salen;
+
+ union {
+ struct sockaddr_in sa4;
+ struct sockaddr_in6 sa6;
+ } saddr;
+ struct sockaddr *sa;
+ struct server_connection *conn;
+ ares__llist_node_t *node;
+ int type = is_tcp ? SOCK_STREAM : SOCK_DGRAM;
+#ifdef __OpenBSD__
+ if ((is_tcp && server->tcp_port == 53) ||
+ (!is_tcp && server->udp_port == 53)) {
+ type |= SOCK_DNS;
+ }
+#endif
+
+ switch (server->addr.family) {
+ case AF_INET:
+ sa = (void *)&saddr.sa4;
+ salen = sizeof(saddr.sa4);
+ memset(sa, 0, (size_t)salen);
+ saddr.sa4.sin_family = AF_INET;
+ saddr.sa4.sin_port = htons(is_tcp ? server->tcp_port : server->udp_port);
+ memcpy(&saddr.sa4.sin_addr, &server->addr.addr.addr4,
+ sizeof(saddr.sa4.sin_addr));
+ break;
+ case AF_INET6:
+ sa = (void *)&saddr.sa6;
+ salen = sizeof(saddr.sa6);
+ memset(sa, 0, (size_t)salen);
+ saddr.sa6.sin6_family = AF_INET6;
+ saddr.sa6.sin6_port = htons(is_tcp ? server->tcp_port : server->udp_port);
+ memcpy(&saddr.sa6.sin6_addr, &server->addr.addr.addr6,
+ sizeof(saddr.sa6.sin6_addr));
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ saddr.sa6.sin6_scope_id = server->ll_scope;
+#endif
+ break;
+ default:
+ return ARES_EBADFAMILY; /* LCOV_EXCL_LINE */
+ }
+
+ /* Acquire a socket. */
+ s = ares__open_socket(channel, server->addr.family, type, 0);
+ if (s == ARES_SOCKET_BAD) {
+ return ARES_ECONNREFUSED;
+ }
+
+ /* Configure it. */
+ if (configure_socket(s, server) < 0) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+
+#ifdef TCP_NODELAY
+ if (is_tcp) {
+ /*
+ * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not
+ * in configure_socket). In general, in DNS lookups we're pretty much
+ * interested in firing off a single request and then waiting for a reply,
+ * so batching isn't very interesting.
+ */
+ opt = 1;
+ if ((!channel->sock_funcs || !channel->sock_funcs->asocket) &&
+ setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt)) ==
+ -1) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+#endif
+
+ if (channel->sock_config_cb) {
+ int err = channel->sock_config_cb(s, type, channel->sock_config_cb_data);
+ if (err < 0) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+
+ /* Connect to the server. */
+ if (ares__connect_socket(channel, s, sa, salen) == -1) {
+ int err = SOCKERRNO;
+
+ if (err != EINPROGRESS && err != EWOULDBLOCK) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+
+ if (channel->sock_create_cb) {
+ int err = channel->sock_create_cb(s, type, channel->sock_create_cb_data);
+ if (err < 0) {
+ ares__close_socket(channel, s);
+ return ARES_ECONNREFUSED;
+ }
+ }
+
+ conn = ares_malloc(sizeof(*conn));
+ if (conn == NULL) {
+ ares__close_socket(channel, s);
+ return ARES_ENOMEM;
+ }
+ memset(conn, 0, sizeof(*conn));
+ conn->fd = s;
+ conn->server = server;
+ conn->queries_to_conn = ares__llist_create(NULL);
+ conn->is_tcp = is_tcp;
+ if (conn->queries_to_conn == NULL) {
+ ares__close_socket(channel, s);
+ ares_free(conn);
+ return ARES_ENOMEM;
+ }
+
+ /* TCP connections are thrown to the end as we don't spawn multiple TCP
+ * connections. UDP connections are put on front where the newest connection
+ * can be quickly pulled */
+ if (is_tcp) {
+ node = ares__llist_insert_last(server->connections, conn);
+ } else {
+ node = ares__llist_insert_first(server->connections, conn);
+ }
+ if (node == NULL) {
+ ares__close_socket(channel, s);
+ ares__llist_destroy(conn->queries_to_conn);
+ ares_free(conn);
+ return ARES_ENOMEM;
+ }
+
+ /* Register globally to quickly map event on file descriptor to connection
+ * node object */
+ if (!ares__htable_asvp_insert(channel->connnode_by_socket, s, node)) {
+ ares__close_socket(channel, s);
+ ares__llist_destroy(conn->queries_to_conn);
+ ares__llist_node_claim(node);
+ ares_free(conn);
+ return ARES_ENOMEM;
+ }
+
+ SOCK_STATE_CALLBACK(channel, s, 1, 0);
+
+ if (is_tcp) {
+ server->tcp_conn = conn;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type,
+ int protocol)
+{
+ if (channel->sock_funcs && channel->sock_funcs->asocket) {
+ return channel->sock_funcs->asocket(af, type, protocol,
+ channel->sock_func_cb_data);
+ }
+
+ return socket(af, type, protocol);
+}
+
+int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd,
+ const struct sockaddr *addr, ares_socklen_t addrlen)
+{
+ if (channel->sock_funcs && channel->sock_funcs->aconnect) {
+ return channel->sock_funcs->aconnect(sockfd, addr, addrlen,
+ channel->sock_func_cb_data);
+ }
+
+ return connect(sockfd, addr, addrlen);
+}
+
+void ares__close_socket(ares_channel_t *channel, ares_socket_t s)
+{
+ if (s == ARES_SOCKET_BAD) {
+ return;
+ }
+
+ if (channel->sock_funcs && channel->sock_funcs->aclose) {
+ channel->sock_funcs->aclose(s, channel->sock_func_cb_data);
+ } else {
+ sclose(s);
+ }
+}
+
+#ifndef HAVE_WRITEV
+/* Structure for scatter/gather I/O. */
+struct iovec {
+ void *iov_base; /* Pointer to data. */
+ size_t iov_len; /* Length of data. */
+};
+#endif
+
+ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s,
+ const void *data, size_t len)
+{
+ if (channel->sock_funcs && channel->sock_funcs->asendv) {
+ struct iovec vec;
+ vec.iov_base = (void *)((size_t)data); /* Cast off const */
+ vec.iov_len = len;
+ return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data);
+ }
+ return swrite(s, data, len);
+}
+
+void ares_set_socket_callback(ares_channel_t *channel,
+ ares_sock_create_callback cb, void *data)
+{
+ if (channel == NULL) {
+ return;
+ }
+ channel->sock_create_cb = cb;
+ channel->sock_create_cb_data = data;
+}
+
+void ares_set_socket_configure_callback(ares_channel_t *channel,
+ ares_sock_config_callback cb,
+ void *data)
+{
+ if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) {
+ return;
+ }
+ channel->sock_config_cb = cb;
+ channel->sock_config_cb_data = data;
+}
+
+void ares_set_socket_functions(ares_channel_t *channel,
+ const struct ares_socket_functions *funcs,
+ void *data)
+{
+ if (channel == NULL || channel->optmask & ARES_OPT_EVENT_THREAD) {
+ return;
+ }
+ channel->sock_funcs = funcs;
+ channel->sock_func_cb_data = data;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c b/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c
index 78d8891614..155cc8caf4 100644
--- a/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares__sortaddrinfo.c
@@ -54,151 +54,118 @@
#include "ares.h"
#include "ares_private.h"
-struct addrinfo_sort_elem
-{
+struct addrinfo_sort_elem {
struct ares_addrinfo_node *ai;
- int has_src_addr;
- ares_sockaddr src_addr;
- int original_order;
+ ares_bool_t has_src_addr;
+ ares_sockaddr src_addr;
+ size_t original_order;
};
#define ARES_IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f)
-#define ARES_IPV6_ADDR_SCOPE_NODELOCAL 0x01
-#define ARES_IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
-#define ARES_IPV6_ADDR_SCOPE_LINKLOCAL 0x02
-#define ARES_IPV6_ADDR_SCOPE_SITELOCAL 0x05
-#define ARES_IPV6_ADDR_SCOPE_ORGLOCAL 0x08
-#define ARES_IPV6_ADDR_SCOPE_GLOBAL 0x0e
+#define ARES_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)
+#define ARES_IN_LOOPBACK(a) \
+ ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000)
/* RFC 4193. */
#define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc)
/* These macros are modelled after the ones in <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)))
+#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))
+#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))
-
+#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;
- }
+ 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
+ } 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 {
/*
- * This should never happen.
- * Return a scope with low priority as a last resort.
+ * 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_NODELOCAL;
+ 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)
- {
+ 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 (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.
- */
+ } 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;
+ }
}
/*
@@ -207,77 +174,57 @@ static int get_label(const struct sockaddr *addr)
*/
static int get_precedence(const struct sockaddr *addr)
{
- if (addr->sa_family == AF_INET)
- {
+ 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 (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) ||
+ } 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
- {
+ 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)
+static size_t 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;
- }
+ const unsigned char *p1 = (const unsigned char *)a1;
+ const unsigned char *p2 = (const unsigned char *)a2;
+ size_t i;
+ for (i = 0; i < sizeof(*a1); ++i) {
+ unsigned char x;
+ size_t j;
+ if (p1[i] == p2[i]) {
+ continue;
}
+ x = p1[i] ^ p2[i];
+ for (j = 0; j < CHAR_BIT; ++j) {
+ if (x & (1 << (CHAR_BIT - 1))) {
+ return i * CHAR_BIT + j;
+ }
+ x <<= 1;
+ }
+ }
return sizeof(*a1) * CHAR_BIT;
}
@@ -289,36 +236,46 @@ 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;
+ int scope_src1;
+ int scope_dst1;
+ int scope_match1;
+ int scope_src2;
+ int scope_dst2;
+ int scope_match2;
+ int label_src1;
+ int label_dst1;
+ int label_match1;
+ int label_src2;
+ int label_dst2;
+ int label_match2;
+ int precedence1;
+ int precedence2;
+ size_t prefixlen1;
+ size_t prefixlen2;
/* Rule 1: Avoid unusable destinations. */
- if (a1->has_src_addr != a2->has_src_addr)
- {
- return a2->has_src_addr - a1->has_src_addr;
- }
+ if (a1->has_src_addr != a2->has_src_addr) {
+ return ((int)a2->has_src_addr) - ((int)a1->has_src_addr);
+ }
/* Rule 2: Prefer matching scope. */
scope_src1 = ARES_IPV6_ADDR_SCOPE_NODELOCAL;
- if (a1->has_src_addr)
+ if (a1->has_src_addr) {
scope_src1 = get_scope(&a1->src_addr.sa);
- scope_dst1 = get_scope(a1->ai->ai_addr);
+ }
+ scope_dst1 = get_scope(a1->ai->ai_addr);
scope_match1 = (scope_src1 == scope_dst1);
scope_src2 = ARES_IPV6_ADDR_SCOPE_NODELOCAL;
- if (a2->has_src_addr)
+ if (a2->has_src_addr) {
scope_src2 = get_scope(&a2->src_addr.sa);
- scope_dst2 = get_scope(a2->ai->ai_addr);
+ }
+ scope_dst2 = get_scope(a2->ai->ai_addr);
scope_match2 = (scope_src2 == scope_dst2);
- if (scope_match1 != scope_match2)
- {
- return scope_match2 - scope_match1;
- }
+ if (scope_match1 != scope_match2) {
+ return scope_match2 - scope_match1;
+ }
/* Rule 3: Avoid deprecated addresses. */
@@ -326,81 +283,76 @@ static int rfc6724_compare(const void *ptr1, const void *ptr2)
/* Rule 5: Prefer matching label. */
label_src1 = 1;
- if (a1->has_src_addr)
+ if (a1->has_src_addr) {
label_src1 = get_label(&a1->src_addr.sa);
- label_dst1 = get_label(a1->ai->ai_addr);
+ }
+ label_dst1 = get_label(a1->ai->ai_addr);
label_match1 = (label_src1 == label_dst1);
label_src2 = 1;
- if (a2->has_src_addr)
+ if (a2->has_src_addr) {
label_src2 = get_label(&a2->src_addr.sa);
- label_dst2 = get_label(a2->ai->ai_addr);
+ }
+ label_dst2 = get_label(a2->ai->ai_addr);
label_match2 = (label_src2 == label_dst2);
- if (label_match1 != label_match2)
- {
- return label_match2 - label_match1;
- }
+ 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;
- }
+ 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;
- }
+ 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;
- }
+ a2->has_src_addr && a2->ai->ai_addr->sa_family == AF_INET6) {
+ const struct sockaddr_in6 *a1_src = &a1->src_addr.sa6;
+ const struct sockaddr_in6 *a1_dst =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, a1->ai->ai_addr);
+ const struct sockaddr_in6 *a2_src = &a2->src_addr.sa6;
+ const struct sockaddr_in6 *a2_dst =
+ CARES_INADDR_CAST(const struct sockaddr_in6 *, a2->ai->ai_addr);
+ prefixlen1 = common_prefix_len(&a1_src->sin6_addr, &a1_dst->sin6_addr);
+ prefixlen2 = common_prefix_len(&a2_src->sin6_addr, &a2_dst->sin6_addr);
+ if (prefixlen1 != prefixlen2) {
+ return (int)prefixlen2 - (int)prefixlen1;
}
+ }
/*
* Rule 10: Leave the order unchanged.
* We need this since qsort() is not necessarily stable.
*/
- return a1->original_order - a2->original_order;
+ return ((int)a1->original_order) - ((int)a2->original_order);
}
/*
* Find the source address that will be used if trying to connect to the given
* address.
*
- * Returns 1 if a source address was found, 0 if the address is unreachable,
+ * 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,
+static int find_src_addr(ares_channel_t *channel, const struct sockaddr *addr,
struct sockaddr *src_addr)
{
- ares_socket_t sock;
- int ret;
+ ares_socket_t sock;
+ int ret;
ares_socklen_t len;
- switch (addr->sa_family)
- {
+ switch (addr->sa_family) {
case AF_INET:
len = sizeof(struct sockaddr_in);
break;
@@ -410,38 +362,30 @@ static int find_src_addr(ares_channel channel,
default:
/* No known usable source address for non-INET families. */
return 0;
- }
+ }
sock = ares__open_socket(channel, addr->sa_family, SOCK_DGRAM, IPPROTO_UDP);
- if (sock == ARES_SOCKET_BAD)
- {
- if (errno == EAFNOSUPPORT)
- {
- return 0;
- }
- else
- {
- return -1;
- }
+ if (sock == ARES_SOCKET_BAD) {
+ if (errno == EAFNOSUPPORT) {
+ return 0;
+ } else {
+ return -1;
}
+ }
- do
- {
- ret = ares__connect_socket(channel, sock, addr, len);
- }
- while (ret == -1 && errno == EINTR);
+ 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 (ret == -1) {
+ ares__close_socket(channel, sock);
+ return 0;
+ }
- if (getsockname(sock, src_addr, &len) != 0)
- {
- ares__close_socket(channel, sock);
- return -1;
- }
+ if (getsockname(sock, src_addr, &len) != 0) {
+ ares__close_socket(channel, sock);
+ return -1;
+ }
ares__close_socket(channel, sock);
return 1;
}
@@ -450,47 +394,47 @@ static int find_src_addr(ares_channel channel,
* 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)
+ares_status_t ares__sortaddrinfo(ares_channel_t *channel,
+ struct ares_addrinfo_node *list_sentinel)
{
struct ares_addrinfo_node *cur;
- int nelem = 0, i;
- int has_src_addr;
+ size_t nelem = 0;
+ size_t i;
+ int has_src_addr;
struct addrinfo_sort_elem *elems;
cur = list_sentinel->ai_next;
- while (cur)
- {
- ++nelem;
- cur = cur->ai_next;
- }
+ while (cur) {
+ ++nelem;
+ cur = cur->ai_next;
+ }
- if (!nelem)
- return ARES_ENODATA;
+ if (!nelem) {
+ return ARES_ENODATA;
+ }
elems = (struct addrinfo_sort_elem *)ares_malloc(
- nelem * sizeof(struct addrinfo_sort_elem));
- if (!elems)
- {
- return ARES_ENOMEM;
- }
+ 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;
+ for (i = 0, cur = list_sentinel->ai_next; i < nelem;
+ ++i, cur = cur->ai_next) {
+ assert(cur != NULL);
+ elems[i].ai = cur;
+ elems[i].original_order = i;
+ has_src_addr = find_src_addr(channel, cur->ai_addr, &elems[i].src_addr.sa);
+ if (has_src_addr == -1) {
+ ares_free(elems);
+ return ARES_ENOTFOUND;
}
+ elems[i].has_src_addr = (has_src_addr == 1) ? ARES_TRUE : ARES_FALSE;
+ }
/* Sort the addresses, and rearrange the linked list so it matches the sorted
* order. */
@@ -498,10 +442,9 @@ int ares__sortaddrinfo(ares_channel channel, struct ares_addrinfo_node *list_sen
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;
- }
+ 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);
diff --git a/contrib/libs/c-ares/src/lib/ares__threads.c b/contrib/libs/c-ares/src/lib/ares__threads.c
new file mode 100644
index 0000000000..f6de8c698e
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__threads.c
@@ -0,0 +1,607 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+#ifdef CARES_THREADS
+# ifdef _WIN32
+
+struct ares__thread_mutex {
+ CRITICAL_SECTION mutex;
+};
+
+ares__thread_mutex_t *ares__thread_mutex_create(void)
+{
+ ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut));
+ if (mut == NULL) {
+ return NULL;
+ }
+
+ InitializeCriticalSection(&mut->mutex);
+ return mut;
+}
+
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ DeleteCriticalSection(&mut->mutex);
+ ares_free(mut);
+}
+
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ EnterCriticalSection(&mut->mutex);
+}
+
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ LeaveCriticalSection(&mut->mutex);
+}
+
+struct ares__thread_cond {
+ CONDITION_VARIABLE cond;
+};
+
+ares__thread_cond_t *ares__thread_cond_create(void)
+{
+ ares__thread_cond_t *cond = ares_malloc_zero(sizeof(*cond));
+ if (cond == NULL) {
+ return NULL;
+ }
+ InitializeConditionVariable(&cond->cond);
+ return cond;
+}
+
+void ares__thread_cond_destroy(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ ares_free(cond);
+}
+
+void ares__thread_cond_signal(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ WakeConditionVariable(&cond->cond);
+}
+
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ WakeAllConditionVariable(&cond->cond);
+}
+
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut)
+{
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ SleepConditionVariableCS(&cond->cond, &mut->mutex, INFINITE);
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms)
+{
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (!SleepConditionVariableCS(&cond->cond, &mut->mutex, timeout_ms)) {
+ return ARES_ETIMEOUT;
+ }
+
+ return ARES_SUCCESS;
+}
+
+struct ares__thread {
+ HANDLE thread;
+ DWORD id;
+
+ void *(*func)(void *arg);
+ void *arg;
+ void *rv;
+};
+
+/* Wrap for pthread compatibility */
+static DWORD WINAPI ares__thread_func(LPVOID lpParameter)
+{
+ ares__thread_t *thread = lpParameter;
+
+ thread->rv = thread->func(thread->arg);
+ return 0;
+}
+
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg)
+{
+ ares__thread_t *thr = NULL;
+
+ if (func == NULL || thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ thr = ares_malloc_zero(sizeof(*thr));
+ if (thr == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ thr->func = func;
+ thr->arg = arg;
+ thr->thread = CreateThread(NULL, 0, ares__thread_func, thr, 0, &thr->id);
+ if (thr->thread == NULL) {
+ ares_free(thr);
+ return ARES_ESERVFAIL;
+ }
+
+ *thread = thr;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ if (thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (WaitForSingleObject(thread->thread, INFINITE) != WAIT_OBJECT_0) {
+ status = ARES_ENOTFOUND;
+ } else {
+ CloseHandle(thread->thread);
+ }
+
+ if (status == ARES_SUCCESS && rv != NULL) {
+ *rv = thread->rv;
+ }
+ ares_free(thread);
+
+ return status;
+}
+
+# else /* !WIN32 == PTHREAD */
+# include <pthread.h>
+
+/* for clock_gettime() */
+# ifdef HAVE_TIME_H
+# include <time.h>
+# endif
+
+/* for gettimeofday() */
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# endif
+
+struct ares__thread_mutex {
+ pthread_mutex_t mutex;
+};
+
+ares__thread_mutex_t *ares__thread_mutex_create(void)
+{
+ pthread_mutexattr_t attr;
+ ares__thread_mutex_t *mut = ares_malloc_zero(sizeof(*mut));
+ if (mut == NULL) {
+ return NULL;
+ }
+
+ if (pthread_mutexattr_init(&attr) != 0) {
+ ares_free(mut);
+ return NULL;
+ }
+
+ if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) {
+ goto fail;
+ }
+
+ if (pthread_mutex_init(&mut->mutex, &attr) != 0) {
+ goto fail;
+ }
+
+ pthread_mutexattr_destroy(&attr);
+ return mut;
+
+fail:
+ pthread_mutexattr_destroy(&attr);
+ ares_free(mut);
+ return NULL;
+}
+
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ pthread_mutex_destroy(&mut->mutex);
+ ares_free(mut);
+}
+
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ pthread_mutex_lock(&mut->mutex);
+}
+
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut)
+{
+ if (mut == NULL) {
+ return;
+ }
+ pthread_mutex_unlock(&mut->mutex);
+}
+
+struct ares__thread_cond {
+ pthread_cond_t cond;
+};
+
+ares__thread_cond_t *ares__thread_cond_create(void)
+{
+ ares__thread_cond_t *cond = ares_malloc_zero(sizeof(*cond));
+ if (cond == NULL) {
+ return NULL;
+ }
+ pthread_cond_init(&cond->cond, NULL);
+ return cond;
+}
+
+void ares__thread_cond_destroy(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ pthread_cond_destroy(&cond->cond);
+ ares_free(cond);
+}
+
+void ares__thread_cond_signal(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ pthread_cond_signal(&cond->cond);
+}
+
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond)
+{
+ if (cond == NULL) {
+ return;
+ }
+ pthread_cond_broadcast(&cond->cond);
+}
+
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut)
+{
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ pthread_cond_wait(&cond->cond, &mut->mutex);
+ return ARES_SUCCESS;
+}
+
+static void ares__timespec_timeout(struct timespec *ts, unsigned long add_ms)
+{
+# if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_REALTIME)
+ clock_gettime(CLOCK_REALTIME, ts);
+# elif defined(HAVE_GETTIMEOFDAY)
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+# else
+# error cannot determine current system time
+# endif
+
+ ts->tv_sec += (time_t)(add_ms / 1000);
+ ts->tv_nsec += (long)((add_ms % 1000) * 1000000);
+
+ /* Normalize if needed */
+ if (ts->tv_nsec >= 1000000000) {
+ ts->tv_sec += ts->tv_nsec / 1000000000;
+ ts->tv_nsec %= 1000000000;
+ }
+}
+
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms)
+{
+ struct timespec ts;
+
+ if (cond == NULL || mut == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__timespec_timeout(&ts, timeout_ms);
+
+ if (pthread_cond_timedwait(&cond->cond, &mut->mutex, &ts) != 0) {
+ return ARES_ETIMEOUT;
+ }
+
+ return ARES_SUCCESS;
+}
+
+struct ares__thread {
+ pthread_t thread;
+};
+
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg)
+{
+ ares__thread_t *thr = NULL;
+
+ if (func == NULL || thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ thr = ares_malloc_zero(sizeof(*thr));
+ if (thr == NULL) {
+ return ARES_ENOMEM;
+ }
+ if (pthread_create(&thr->thread, NULL, func, arg) != 0) {
+ ares_free(thr);
+ return ARES_ESERVFAIL;
+ }
+
+ *thread = thr;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv)
+{
+ void *ret = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (thread == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (pthread_join(thread->thread, &ret) != 0) {
+ status = ARES_ENOTFOUND;
+ }
+ ares_free(thread);
+
+ if (status == ARES_SUCCESS && rv != NULL) {
+ *rv = ret;
+ }
+ return status;
+}
+
+# endif
+
+ares_bool_t ares_threadsafety(void)
+{
+ return ARES_TRUE;
+}
+
+#else /* !CARES_THREADS */
+
+/* NoOp */
+ares__thread_mutex_t *ares__thread_mutex_create(void)
+{
+ return NULL;
+}
+
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut)
+{
+ (void)mut;
+}
+
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut)
+{
+ (void)mut;
+}
+
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut)
+{
+ (void)mut;
+}
+
+ares__thread_cond_t *ares__thread_cond_create(void)
+{
+ return NULL;
+}
+
+void ares__thread_cond_destroy(ares__thread_cond_t *cond)
+{
+ (void)cond;
+}
+
+void ares__thread_cond_signal(ares__thread_cond_t *cond)
+{
+ (void)cond;
+}
+
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond)
+{
+ (void)cond;
+}
+
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut)
+{
+ (void)cond;
+ (void)mut;
+ return ARES_ENOTIMP;
+}
+
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms)
+{
+ (void)cond;
+ (void)mut;
+ (void)timeout_ms;
+ return ARES_ENOTIMP;
+}
+
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg)
+{
+ (void)thread;
+ (void)func;
+ (void)arg;
+ return ARES_ENOTIMP;
+}
+
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv)
+{
+ (void)thread;
+ (void)rv;
+ return ARES_ENOTIMP;
+}
+
+ares_bool_t ares_threadsafety(void)
+{
+ return ARES_FALSE;
+}
+#endif
+
+
+ares_status_t ares__channel_threading_init(ares_channel_t *channel)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Threading is optional! */
+ if (!ares_threadsafety()) {
+ return ARES_SUCCESS;
+ }
+
+ channel->lock = ares__thread_mutex_create();
+ if (channel->lock == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ channel->cond_empty = ares__thread_cond_create();
+ if (channel->cond_empty == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__channel_threading_destroy(channel);
+ }
+ return status;
+}
+
+void ares__channel_threading_destroy(ares_channel_t *channel)
+{
+ ares__thread_mutex_destroy(channel->lock);
+ channel->lock = NULL;
+ ares__thread_cond_destroy(channel->cond_empty);
+ channel->cond_empty = NULL;
+}
+
+void ares__channel_lock(ares_channel_t *channel)
+{
+ ares__thread_mutex_lock(channel->lock);
+}
+
+void ares__channel_unlock(ares_channel_t *channel)
+{
+ ares__thread_mutex_unlock(channel->lock);
+}
+
+/* Must not be holding a channel lock already, public function only */
+ares_status_t ares_queue_wait_empty(ares_channel_t *channel, int timeout_ms)
+{
+ ares_status_t status = ARES_SUCCESS;
+ struct timeval tout;
+
+ if (!ares_threadsafety()) {
+ return ARES_ENOTIMP;
+ }
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (timeout_ms >= 0) {
+ tout = ares__tvnow();
+ tout.tv_sec += timeout_ms / 1000;
+ tout.tv_usec += (timeout_ms % 1000) * 1000;
+ }
+
+ ares__thread_mutex_lock(channel->lock);
+ while (ares__llist_len(channel->all_queries)) {
+ if (timeout_ms < 0) {
+ ares__thread_cond_wait(channel->cond_empty, channel->lock);
+ } else {
+ struct timeval tv_remaining;
+ struct timeval tv_now = ares__tvnow();
+ unsigned long tms;
+
+ ares__timeval_remaining(&tv_remaining, &tv_now, &tout);
+ tms = (unsigned long)((tv_remaining.tv_sec * 1000) +
+ (tv_remaining.tv_usec / 1000));
+ if (tms == 0) {
+ status = ARES_ETIMEOUT;
+ } else {
+ status =
+ ares__thread_cond_timedwait(channel->cond_empty, channel->lock, tms);
+ }
+ }
+ }
+ ares__thread_mutex_unlock(channel->lock);
+ return status;
+}
+
+void ares_queue_notify_empty(ares_channel_t *channel)
+{
+ if (channel == NULL) {
+ return;
+ }
+
+ /* We are guaranteed to be holding a channel lock already */
+ if (ares__llist_len(channel->all_queries)) {
+ return;
+ }
+
+ /* Notify all waiters of the conditional */
+ ares__thread_cond_broadcast(channel->cond_empty);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares__threads.h b/contrib/libs/c-ares/src/lib/ares__threads.h
new file mode 100644
index 0000000000..108354dfc1
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares__threads.h
@@ -0,0 +1,60 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__THREADS_H
+#define __ARES__THREADS_H
+
+struct ares__thread_mutex;
+typedef struct ares__thread_mutex ares__thread_mutex_t;
+
+ares__thread_mutex_t *ares__thread_mutex_create(void);
+void ares__thread_mutex_destroy(ares__thread_mutex_t *mut);
+void ares__thread_mutex_lock(ares__thread_mutex_t *mut);
+void ares__thread_mutex_unlock(ares__thread_mutex_t *mut);
+
+
+struct ares__thread_cond;
+typedef struct ares__thread_cond ares__thread_cond_t;
+
+ares__thread_cond_t *ares__thread_cond_create(void);
+void ares__thread_cond_destroy(ares__thread_cond_t *cond);
+void ares__thread_cond_signal(ares__thread_cond_t *cond);
+void ares__thread_cond_broadcast(ares__thread_cond_t *cond);
+ares_status_t ares__thread_cond_wait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut);
+ares_status_t ares__thread_cond_timedwait(ares__thread_cond_t *cond,
+ ares__thread_mutex_t *mut,
+ unsigned long timeout_ms);
+
+
+struct ares__thread;
+typedef struct ares__thread ares__thread_t;
+
+typedef void *(*ares__thread_func_t)(void *arg);
+ares_status_t ares__thread_create(ares__thread_t **thread,
+ ares__thread_func_t func, void *arg);
+ares_status_t ares__thread_join(ares__thread_t *thread, void **rv);
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares__timeval.c b/contrib/libs/c-ares/src/lib/ares__timeval.c
index 5716c53e50..11996f9f11 100644
--- a/contrib/libs/c-ares/src/lib/ares__timeval.c
+++ b/contrib/libs/c-ares/src/lib/ares__timeval.c
@@ -38,9 +38,9 @@ struct timeval ares__tvnow(void)
** 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;
+ DWORD milliseconds = GetTickCount();
+ now.tv_sec = (long)milliseconds / 1000;
+ now.tv_usec = (long)(milliseconds % 1000) * 1000;
return now;
}
@@ -55,26 +55,26 @@ struct timeval ares__tvnow(void)
** in any case the time starting point does not change once that the
** system has started up.
*/
- struct timeval now;
+ 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;
+ if (0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
+ now.tv_sec = tsnow.tv_sec;
+ now.tv_usec = (int)(tsnow.tv_nsec / 1000);
}
/*
** Even when the configure process has truly detected monotonic clock
** availability, it might happen that it is not actually available at
** run-time. When this occurs simply fallback to other time source.
*/
-#ifdef HAVE_GETTIMEOFDAY
+# ifdef HAVE_GETTIMEOFDAY
else
- (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */
-#else
+ (void)gettimeofday(&now, NULL); /* LCOV_EXCL_LINE */
+# else
else {
- now.tv_sec = (long)time(NULL);
+ now.tv_sec = (long)time(NULL);
now.tv_usec = 0;
}
-#endif
+# endif
return now;
}
@@ -100,24 +100,9 @@ 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_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/src/lib/ares_android.c b/contrib/libs/c-ares/src/lib/ares_android.c
index ec0a33872d..778d4d1060 100644
--- a/contrib/libs/c-ares/src/lib/ares_android.c
+++ b/contrib/libs/c-ares/src/lib/ares_android.c
@@ -25,15 +25,15 @@
*/
#if defined(ANDROID) || defined(__ANDROID__)
-#include <jni.h>
+# include <jni.h>
-#include "ares_setup.h"
-#include "ares.h"
-#include "ares_android.h"
-#include "ares_private.h"
+# include "ares_setup.h"
+# include "ares.h"
+# include "ares_android.h"
+# include "ares_private.h"
-static JavaVM *android_jvm = NULL;
-static jobject android_connectivity_manager = NULL;
+static JavaVM *android_jvm = NULL;
+static jobject android_connectivity_manager = NULL;
/* ConnectivityManager.getActiveNetwork */
static jmethodID android_cm_active_net_mid = NULL;
@@ -50,12 +50,13 @@ static jmethodID android_list_get_mid = NULL;
/* InetAddress.getHostAddress */
static jmethodID android_ia_host_addr_mid = NULL;
-static jclass jni_get_class(JNIEnv *env, const char *path)
+static jclass jni_get_class(JNIEnv *env, const char *path)
{
jclass cls = NULL;
- if (env == NULL || path == NULL || *path == '\0')
+ if (env == NULL || path == NULL || *path == '\0') {
return NULL;
+ }
cls = (*env)->FindClass(env, path);
if ((*env)->ExceptionOccurred(env)) {
@@ -71,14 +72,12 @@ static jmethodID jni_get_method_id(JNIEnv *env, jclass cls,
jmethodID mid = NULL;
if (env == NULL || cls == NULL || func_name == NULL || *func_name == '\0' ||
- signature == NULL || *signature == '\0')
- {
+ signature == NULL || *signature == '\0') {
return NULL;
}
mid = (*env)->GetMethodID(env, cls, func_name, signature);
- if ((*env)->ExceptionOccurred(env))
- {
+ if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
return NULL;
}
@@ -93,29 +92,31 @@ void ares_library_init_jvm(JavaVM *jvm)
int ares_library_init_android(jobject connectivity_manager)
{
- JNIEnv *env = NULL;
- int need_detatch = 0;
- int res;
- int ret = ARES_ENOTINITIALIZED;
- jclass obj_cls = NULL;
+ JNIEnv *env = NULL;
+ int need_detatch = 0;
+ int res;
+ ares_status_t ret = ARES_ENOTINITIALIZED;
+ jclass obj_cls = NULL;
- if (android_jvm == NULL)
+ if (android_jvm == NULL) {
goto cleanup;
+ }
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
goto cleanup;
+ }
android_connectivity_manager =
- (*env)->NewGlobalRef(env, connectivity_manager);
- if (android_connectivity_manager == NULL)
+ (*env)->NewGlobalRef(env, connectivity_manager);
+ if (android_connectivity_manager == NULL) {
goto cleanup;
+ }
/* Initialization has succeeded. Now attempt to cache the methods that will be
* called by ares_get_android_server_list. */
@@ -123,166 +124,178 @@ int ares_library_init_android(jobject connectivity_manager)
/* ConnectivityManager in API 1. */
obj_cls = jni_get_class(env, "android/net/ConnectivityManager");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
/* ConnectivityManager.getActiveNetwork in API 23. */
- android_cm_active_net_mid =
- jni_get_method_id(env, obj_cls, "getActiveNetwork",
- "()Landroid/net/Network;");
- if (android_cm_active_net_mid == NULL)
+ android_cm_active_net_mid = jni_get_method_id(
+ env, obj_cls, "getActiveNetwork", "()Landroid/net/Network;");
+ if (android_cm_active_net_mid == NULL) {
goto cleanup;
+ }
/* ConnectivityManager.getLinkProperties in API 21. */
android_cm_link_props_mid =
- jni_get_method_id(env, obj_cls, "getLinkProperties",
- "(Landroid/net/Network;)Landroid/net/LinkProperties;");
- if (android_cm_link_props_mid == NULL)
+ jni_get_method_id(env, obj_cls, "getLinkProperties",
+ "(Landroid/net/Network;)Landroid/net/LinkProperties;");
+ if (android_cm_link_props_mid == NULL) {
goto cleanup;
+ }
/* LinkProperties in API 21. */
(*env)->DeleteLocalRef(env, obj_cls);
obj_cls = jni_get_class(env, "android/net/LinkProperties");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
/* getDnsServers in API 21. */
- android_lp_dns_servers_mid = jni_get_method_id(env, obj_cls, "getDnsServers",
- "()Ljava/util/List;");
- if (android_lp_dns_servers_mid == NULL)
+ android_lp_dns_servers_mid =
+ jni_get_method_id(env, obj_cls, "getDnsServers", "()Ljava/util/List;");
+ if (android_lp_dns_servers_mid == NULL) {
goto cleanup;
+ }
/* getDomains in API 21. */
- android_lp_domains_mid = jni_get_method_id(env, obj_cls, "getDomains",
- "()Ljava/lang/String;");
- if (android_lp_domains_mid == NULL)
+ android_lp_domains_mid =
+ jni_get_method_id(env, obj_cls, "getDomains", "()Ljava/lang/String;");
+ if (android_lp_domains_mid == NULL) {
goto cleanup;
+ }
(*env)->DeleteLocalRef(env, obj_cls);
obj_cls = jni_get_class(env, "java/util/List");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
android_list_size_mid = jni_get_method_id(env, obj_cls, "size", "()I");
- if (android_list_size_mid == NULL)
+ if (android_list_size_mid == NULL) {
goto cleanup;
+ }
- android_list_get_mid = jni_get_method_id(env, obj_cls, "get",
- "(I)Ljava/lang/Object;");
- if (android_list_get_mid == NULL)
+ android_list_get_mid =
+ jni_get_method_id(env, obj_cls, "get", "(I)Ljava/lang/Object;");
+ if (android_list_get_mid == NULL) {
goto cleanup;
+ }
(*env)->DeleteLocalRef(env, obj_cls);
obj_cls = jni_get_class(env, "java/net/InetAddress");
- if (obj_cls == NULL)
+ if (obj_cls == NULL) {
goto cleanup;
+ }
- android_ia_host_addr_mid = jni_get_method_id(env, obj_cls, "getHostAddress",
- "()Ljava/lang/String;");
- if (android_ia_host_addr_mid == NULL)
+ android_ia_host_addr_mid =
+ jni_get_method_id(env, obj_cls, "getHostAddress", "()Ljava/lang/String;");
+ if (android_ia_host_addr_mid == NULL) {
goto cleanup;
+ }
(*env)->DeleteLocalRef(env, obj_cls);
goto done;
cleanup:
- if (obj_cls != NULL)
+ if (obj_cls != NULL) {
(*env)->DeleteLocalRef(env, obj_cls);
+ }
- android_cm_active_net_mid = NULL;
- android_cm_link_props_mid = NULL;
+ android_cm_active_net_mid = NULL;
+ android_cm_link_props_mid = NULL;
android_lp_dns_servers_mid = NULL;
- android_lp_domains_mid = NULL;
- android_list_size_mid = NULL;
- android_list_get_mid = NULL;
- android_ia_host_addr_mid = NULL;
+ android_lp_domains_mid = NULL;
+ android_list_size_mid = NULL;
+ android_list_get_mid = NULL;
+ android_ia_host_addr_mid = NULL;
done:
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
return ret;
}
int ares_library_android_initialized(void)
{
- if (android_jvm == NULL || android_connectivity_manager == NULL)
+ if (android_jvm == NULL || android_connectivity_manager == NULL) {
return ARES_ENOTINITIALIZED;
+ }
return ARES_SUCCESS;
}
void ares_library_cleanup_android(void)
{
- JNIEnv *env = NULL;
- int need_detatch = 0;
- int res;
+ JNIEnv *env = NULL;
+ int need_detatch = 0;
+ int res;
- if (android_jvm == NULL || android_connectivity_manager == NULL)
+ if (android_jvm == NULL || android_connectivity_manager == NULL) {
return;
+ }
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
return;
+ }
- android_cm_active_net_mid = NULL;
- android_cm_link_props_mid = NULL;
+ android_cm_active_net_mid = NULL;
+ android_cm_link_props_mid = NULL;
android_lp_dns_servers_mid = NULL;
- android_lp_domains_mid = NULL;
- android_list_size_mid = NULL;
- android_list_get_mid = NULL;
- android_ia_host_addr_mid = NULL;
+ android_lp_domains_mid = NULL;
+ android_list_size_mid = NULL;
+ android_list_get_mid = NULL;
+ android_ia_host_addr_mid = NULL;
(*env)->DeleteGlobalRef(env, android_connectivity_manager);
android_connectivity_manager = NULL;
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
}
-char **ares_get_android_server_list(size_t max_servers,
- size_t *num_servers)
+char **ares_get_android_server_list(size_t max_servers, size_t *num_servers)
{
- JNIEnv *env = NULL;
- jobject active_network = NULL;
- jobject link_properties = NULL;
- jobject server_list = NULL;
- jobject server = NULL;
- jstring str = NULL;
- jint nserv;
+ JNIEnv *env = NULL;
+ jobject active_network = NULL;
+ jobject link_properties = NULL;
+ jobject server_list = NULL;
+ jobject server = NULL;
+ jstring str = NULL;
+ jint nserv;
const char *ch_server_address;
- int res;
- size_t i;
- char **dns_list = NULL;
- int need_detatch = 0;
+ int res;
+ size_t i;
+ char **dns_list = NULL;
+ int need_detatch = 0;
if (android_jvm == NULL || android_connectivity_manager == NULL ||
- max_servers == 0 || num_servers == NULL)
- {
+ max_servers == 0 || num_servers == NULL) {
return NULL;
}
if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL ||
android_lp_dns_servers_mid == NULL || android_list_size_mid == NULL ||
- android_list_get_mid == NULL || android_ia_host_addr_mid == NULL)
- {
+ android_list_get_mid == NULL || android_ia_host_addr_mid == NULL) {
return NULL;
}
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
goto done;
+ }
/* JNI below is equivalent to this Java code.
import android.content.Context;
@@ -307,93 +320,100 @@ char **ares_get_android_server_list(size_t max_servers,
active_network = (*env)->CallObjectMethod(env, android_connectivity_manager,
android_cm_active_net_mid);
- if (active_network == NULL)
+ if (active_network == NULL) {
goto done;
+ }
link_properties =
- (*env)->CallObjectMethod(env, android_connectivity_manager,
- android_cm_link_props_mid, active_network);
- if (link_properties == NULL)
+ (*env)->CallObjectMethod(env, android_connectivity_manager,
+ android_cm_link_props_mid, active_network);
+ if (link_properties == NULL) {
goto done;
+ }
- server_list = (*env)->CallObjectMethod(env, link_properties,
- android_lp_dns_servers_mid);
- if (server_list == NULL)
+ server_list =
+ (*env)->CallObjectMethod(env, link_properties, android_lp_dns_servers_mid);
+ if (server_list == NULL) {
goto done;
+ }
nserv = (*env)->CallIntMethod(env, server_list, android_list_size_mid);
- if (nserv > (jint)max_servers)
+ if (nserv > (jint)max_servers) {
nserv = (jint)max_servers;
- if (nserv <= 0)
+ }
+ if (nserv <= 0) {
goto done;
+ }
*num_servers = (size_t)nserv;
- dns_list = ares_malloc(sizeof(*dns_list)*(*num_servers));
- for (i=0; i<*num_servers; i++)
- {
- server = (*env)->CallObjectMethod(env, server_list, android_list_get_mid,
- (jint)i);
- dns_list[i] = ares_malloc(64);
+ dns_list = ares_malloc(sizeof(*dns_list) * (*num_servers));
+ for (i = 0; i < *num_servers; i++) {
+ size_t len = 64;
+ server =
+ (*env)->CallObjectMethod(env, server_list, android_list_get_mid, (jint)i);
+ dns_list[i] = ares_malloc(len);
dns_list[i][0] = 0;
- if (server == NULL)
- {
+ if (server == NULL) {
continue;
}
str = (*env)->CallObjectMethod(env, server, android_ia_host_addr_mid);
ch_server_address = (*env)->GetStringUTFChars(env, str, 0);
- strncpy(dns_list[i], ch_server_address, 64);
+ ares_strcpy(dns_list[i], ch_server_address, len);
(*env)->ReleaseStringUTFChars(env, str, ch_server_address);
(*env)->DeleteLocalRef(env, str);
(*env)->DeleteLocalRef(env, server);
}
done:
- if ((*env)->ExceptionOccurred(env))
+ if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
+ }
- if (server_list != NULL)
+ if (server_list != NULL) {
(*env)->DeleteLocalRef(env, server_list);
- if (link_properties != NULL)
+ }
+ if (link_properties != NULL) {
(*env)->DeleteLocalRef(env, link_properties);
- if (active_network != NULL)
+ }
+ if (active_network != NULL) {
(*env)->DeleteLocalRef(env, active_network);
+ }
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
return dns_list;
}
char *ares_get_android_search_domains_list(void)
{
- JNIEnv *env = NULL;
- jobject active_network = NULL;
- jobject link_properties = NULL;
- jstring domains = NULL;
+ JNIEnv *env = NULL;
+ jobject active_network = NULL;
+ jobject link_properties = NULL;
+ jstring domains = NULL;
const char *domain;
- int res;
- char *domain_list = NULL;
- int need_detatch = 0;
+ int res;
+ char *domain_list = NULL;
+ int need_detatch = 0;
- if (android_jvm == NULL || android_connectivity_manager == NULL)
- {
+ if (android_jvm == NULL || android_connectivity_manager == NULL) {
return NULL;
}
if (android_cm_active_net_mid == NULL || android_cm_link_props_mid == NULL ||
- android_lp_domains_mid == NULL)
- {
+ android_lp_domains_mid == NULL) {
return NULL;
}
res = (*android_jvm)->GetEnv(android_jvm, (void **)&env, JNI_VERSION_1_6);
- if (res == JNI_EDETACHED)
- {
- env = NULL;
- res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
+ if (res == JNI_EDETACHED) {
+ env = NULL;
+ res = (*android_jvm)->AttachCurrentThread(android_jvm, &env, NULL);
need_detatch = 1;
}
- if (res != JNI_OK || env == NULL)
+ if (res != JNI_OK || env == NULL) {
goto done;
+ }
/* JNI below is equivalent to this Java code.
import android.content.Context;
@@ -404,7 +424,7 @@ char *ares_get_android_search_domains_list(void)
.getSystemService(Context.CONNECTIVITY_SERVICE);
Network an = cm.getActiveNetwork();
LinkProperties lp = cm.getLinkProperties(an);
- String domains = lp.getDomains();
+ String domains = lp.getDomains();
for (String domain: domains.split(",")) {
String d = domain;
}
@@ -415,38 +435,45 @@ char *ares_get_android_search_domains_list(void)
active_network = (*env)->CallObjectMethod(env, android_connectivity_manager,
android_cm_active_net_mid);
- if (active_network == NULL)
+ if (active_network == NULL) {
goto done;
+ }
link_properties =
- (*env)->CallObjectMethod(env, android_connectivity_manager,
- android_cm_link_props_mid, active_network);
- if (link_properties == NULL)
+ (*env)->CallObjectMethod(env, android_connectivity_manager,
+ android_cm_link_props_mid, active_network);
+ if (link_properties == NULL) {
goto done;
+ }
/* Get the domains. It is a common separated list of domains to search. */
- domains = (*env)->CallObjectMethod(env, link_properties,
- android_lp_domains_mid);
- if (domains == NULL)
+ domains =
+ (*env)->CallObjectMethod(env, link_properties, android_lp_domains_mid);
+ if (domains == NULL) {
goto done;
+ }
/* Split on , */
- domain = (*env)->GetStringUTFChars(env, domains, 0);
+ domain = (*env)->GetStringUTFChars(env, domains, 0);
domain_list = ares_strdup(domain);
(*env)->ReleaseStringUTFChars(env, domains, domain);
(*env)->DeleteLocalRef(env, domains);
done:
- if ((*env)->ExceptionOccurred(env))
+ if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionClear(env);
+ }
- if (link_properties != NULL)
+ if (link_properties != NULL) {
(*env)->DeleteLocalRef(env, link_properties);
- if (active_network != NULL)
+ }
+ if (active_network != NULL) {
(*env)->DeleteLocalRef(env, active_network);
+ }
- if (need_detatch)
+ if (need_detatch) {
(*android_jvm)->DetachCurrentThread(android_jvm);
+ }
return domain_list;
}
#else
diff --git a/contrib/libs/c-ares/src/lib/ares_android.h b/contrib/libs/c-ares/src/lib/ares_android.h
index 73b8d8ee83..5caadb4fe4 100644
--- a/contrib/libs/c-ares/src/lib/ares_android.h
+++ b/contrib/libs/c-ares/src/lib/ares_android.h
@@ -30,8 +30,8 @@
#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);
+char *ares_get_android_search_domains_list(void);
+void ares_library_cleanup_android(void);
#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_cancel.c b/contrib/libs/c-ares/src/lib/ares_cancel.c
index 353624a111..5a9fb722cb 100644
--- a/contrib/libs/c-ares/src/lib/ares_cancel.c
+++ b/contrib/libs/c-ares/src/lib/ares_cancel.c
@@ -35,10 +35,15 @@
* on the given channel. It does NOT kill the channel, use ares_destroy() for
* that.
*/
-void ares_cancel(ares_channel channel)
+void ares_cancel(ares_channel_t *channel)
{
- if (ares__llist_len(channel->all_queries) > 0)
- {
+ if (channel == NULL) {
+ return;
+ }
+
+ ares__channel_lock(channel);
+
+ if (ares__llist_len(channel->all_queries) > 0) {
ares__llist_node_t *node = NULL;
ares__llist_node_t *next = NULL;
@@ -46,42 +51,43 @@ void ares_cancel(ares_channel channel)
* into this function are cancelled. New queries added by callbacks of
* queries being cancelled will not be cancelled themselves.
*/
- ares__llist_t *list_copy = channel->all_queries;
- channel->all_queries = ares__llist_create(NULL);
+ ares__llist_t *list_copy = channel->all_queries;
+ channel->all_queries = ares__llist_create(NULL);
/* Out of memory, this function doesn't return a result code though so we
* can't report to caller */
if (channel->all_queries == NULL) {
channel->all_queries = list_copy;
- return;
+ goto done;
}
node = ares__llist_node_first(list_copy);
while (node != NULL) {
- struct query *query;
- ares_socket_t fd = ARES_SOCKET_BAD;
+ struct query *query;
+ struct server_connection *conn;
/* Cache next since this node is being deleted */
next = ares__llist_node_next(node);
- query = ares__llist_node_claim(node);
+ query = ares__llist_node_claim(node);
+ conn = query->conn;
query->node_all_queries = NULL;
- /* Cache file descriptor for connection so we can clean it up possibly */
- if (query->conn)
- fd = query->conn->fd;
-
/* NOTE: its possible this may enqueue new queries */
- query->callback(query->arg, ARES_ECANCELLED, 0, NULL, 0);
+ query->callback(query->arg, ARES_ECANCELLED, 0, NULL);
ares__free_query(query);
/* See if the connection should be cleaned up */
- if (fd != ARES_SOCKET_BAD)
- ares__check_cleanup_conn(channel, fd);
+ ares__check_cleanup_conn(channel, conn);
node = next;
}
ares__llist_destroy(list_copy);
}
+
+ ares_queue_notify_empty(channel);
+
+done:
+ ares__channel_unlock(channel);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_config-linux.h b/contrib/libs/c-ares/src/lib/ares_config-linux.h
index fb69cd17c3..ff485b0d38 100644
--- a/contrib/libs/c-ares/src/lib/ares_config-linux.h
+++ b/contrib/libs/c-ares/src/lib/ares_config-linux.h
@@ -7,20 +7,8 @@
/* 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
-
-/* Defined for build that exposes internal static functions for testing. */
-#undef CARES_EXPOSE_STATICS
-
/* Defined for build with symbol hiding. */
-#undef CARES_SYMBOL_HIDING
-
-/* Definition to make a library symbol externally visible. */
-#undef CARES_SYMBOL_SCOPE_EXTERN
+/* #undef CARES_SYMBOL_HIDING */
/* Use resolver library to configure cares */
/* #undef CARES_USE_LIBRESOLV */
@@ -67,12 +55,6 @@
/* Define to 1 if you have the <assert.h> header file. */
#define HAVE_ASSERT_H
-/* 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
-
/* Define to 1 if you have the clock_gettime function and monotonic timer. */
#define HAVE_CLOCK_GETTIME_MONOTONIC
@@ -94,6 +76,24 @@
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H
+/* Define to 1 if you have the <poll.h> header file. */
+#define HAVE_POLL_H
+
+/* Define to 1 if you have the poll function. */
+#define HAVE_POLL
+
+/* Define to 1 if you have the pipe function. */
+#define HAVE_PIPE
+
+/* Define to 1 if you have the pipe2 function. */
+#define HAVE_PIPE2
+
+/* Define to 1 if you have the kqueue function. */
+/* #undef HAVE_KQUEUE */
+
+/* Define to 1 if you have the epoll{_create,ctl,wait} functions. */
+#define HAVE_EPOLL
+
/* Define to 1 if you have the fcntl function. */
#define HAVE_FCNTL
@@ -115,12 +115,6 @@
/* Define to 1 if you have the getenv function. */
#define HAVE_GETENV
-/* Define to 1 if you have the gethostbyaddr function. */
-#define HAVE_GETHOSTBYADDR
-
-/* Define to 1 if you have the gethostbyname function. */
-#define HAVE_GETHOSTBYNAME
-
/* Define to 1 if you have the gethostname function. */
#define HAVE_GETHOSTNAME
@@ -142,6 +136,15 @@
/* Define to 1 if you have the `if_indextoname' function. */
#define HAVE_IF_INDEXTONAME
+/* Define to 1 if you have the `if_nametoindex' function. */
+#define HAVE_IF_NAMETOINDEX
+
+/* Define to 1 if you have the `ConvertInterfaceIndexToLuid' function. */
+/* #undef HAVE_CONVERTINTERFACEINDEXTOLUID */
+
+/* Define to 1 if you have the `ConvertInterfaceLuidToNameA' function. */
+/* #undef HAVE_CONVERTINTERFACELUIDTONAMEA */
+
/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */
/* #undef HAVE_INET_NET_PTON */
@@ -179,12 +182,15 @@
/* Define to 1 if you have the `resolve' library (-lresolve). */
/* #undef HAVE_LIBRESOLV */
+/* Define to 1 if you have iphlpapi.h */
+/* #undef HAVE_IPHLPAPI_H */
+
+/* Define to 1 if you have netioapi.h */
+/* #undef HAVE_NETIOAPI_H */
+
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H
-/* if your compiler supports LL */
-#define HAVE_LL
-
/* Define to 1 if the compiler supports the 'long long' data type. */
#define HAVE_LONGLONG
@@ -194,6 +200,9 @@
/* Define to 1 if you have the memory.h header file. */
#define HAVE_MEMORY_H
+/* Define to 1 if you have the AvailabilityMacros.h header file. */
+/* #undef HAVE_AVAILABILITYMACROS_H */
+
/* Define to 1 if you have the MSG_NOSIGNAL flag. */
#define HAVE_MSG_NOSIGNAL
@@ -203,6 +212,9 @@
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H
+/* Define to 1 if you have the <netinet6/in6.h> header file. */
+/* #undef HAVE_NETINET6_IN6_H */
+
/* Define to 1 if you have the <netinet/tcp.h> header file. */
#define HAVE_NETINET_TCP_H
@@ -230,14 +242,8 @@
/* Define to 1 if you have the <signal.h> header file. */
#define HAVE_SIGNAL_H
-/* Define to 1 if sig_atomic_t is an available typedef. */
-#define HAVE_SIG_ATOMIC_T
-
-/* 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
+#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
/* Define to 1 if you have the socket function. */
#define HAVE_SOCKET
@@ -305,6 +311,15 @@
/* Define to 1 if you have the <sys/param.h> header file. */
#define HAVE_SYS_PARAM_H
+/* Define to 1 if you have the <sys/random.h> header file. */
+#define HAVE_SYS_RANDOM_H
+
+/* Define to 1 if you have the <sys/event.h> header file. */
+/* #undef HAVE_SYS_EVENT_H */
+
+/* Define to 1 if you have the <sys/epoll.h> header file. */
+#define HAVE_SYS_EPOLL_H
+
/* Define to 1 if you have the <sys/select.h> header file. */
#define HAVE_SYS_SELECT_H
@@ -326,6 +341,9 @@
/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H
+/* Define to 1 if you have the <ifaddrs.h> header file. */
+#define HAVE_IFADDRS_H
+
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H
@@ -338,6 +356,18 @@
/* Define to 1 if you have the winsock.h header file. */
/* #undef HAVE_WINSOCK_H */
+/* Define to 1 if you have the mswsock.h header file. */
+/* #undef HAVE_MSWSOCK_H */
+
+/* Define to 1 if you have the winternl.h header file. */
+/* #undef HAVE_WINTERNL_H */
+
+/* Define to 1 if you have the ntstatus.h header file. */
+/* #undef HAVE_NTSTATUS_H */
+
+/* Define to 1 if you have the ntdef.h header file. */
+/* #undef HAVE_NTDEF_H */
+
/* Define to 1 if you have the writev function. */
#define HAVE_WRITEV
@@ -356,6 +386,12 @@
/* Define if have arc4random_buf() */
/* #undef HAVE_ARC4RANDOM_BUF */
+/* Define if have getifaddrs() */
+#define HAVE_GETIFADDRS
+
+/* Define if have stat() */
+#define HAVE_STAT
+
/* a suitable file/device to read random data from */
#define CARES_RANDOM_FILE "/dev/urandom"
@@ -407,9 +443,6 @@
/* 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
-
/* Define to the type qualifier of arg 2 for send. */
#define SEND_QUAL_ARG2
@@ -428,15 +461,21 @@
/* Define to the function return type for send. */
#define SEND_TYPE_RETV ssize_t
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME
-
/* Define to disable non-blocking sockets. */
#undef USE_BLOCKING_SOCKETS
/* Define to avoid automatic inclusion of winsock.h */
#undef WIN32_LEAN_AND_MEAN
-/* Type to use in place of in_addr_t when system does not provide it. */
-#undef in_addr_t
+/* Define to 1 if you have the pthread.h header file. */
+#define HAVE_PTHREAD_H
+
+/* Define to 1 if you have the pthread_np.h header file. */
+/* #undef HAVE_PTHREAD_NP_H */
+
+/* Define to 1 if threads are enabled */
+#define CARES_THREADS
+
+/* Define to 1 if pthread_init() exists */
+/* #undef HAVE_PTHREAD_INIT */
diff --git a/contrib/libs/c-ares/src/lib/ares_create_query.c b/contrib/libs/c-ares/src/lib/ares_create_query.c
index 21c6be08bd..a2f2caac6e 100644
--- a/contrib/libs/c-ares/src/lib/ares_create_query.c
+++ b/contrib/libs/c-ares/src/lib/ares_create_query.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,183 +25,56 @@
*/
#include "ares_setup.h"
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_private.h"
-
-/* Header format, from RFC 1035:
- * 1 1 1 1 1 1
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | ID |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * |QR| Opcode |AA|TC|RD|RA| Z | RCODE |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | QDCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | ANCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | NSCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | ARCOUNT |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- *
- * AA, TC, RA, and RCODE are only set in responses. Brief description
- * of the remaining fields:
- * ID Identifier to match responses with queries
- * QR Query (0) or response (1)
- * Opcode For our purposes, always O_QUERY
- * RD Recursion desired
- * Z Reserved (zero)
- * QDCOUNT Number of queries
- * ANCOUNT Number of answers
- * NSCOUNT Number of name server records
- * ARCOUNT Number of additional records
- *
- * Question format, from RFC 1035:
- * 1 1 1 1 1 1
- * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | |
- * / QNAME /
- * / /
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | QTYPE |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- * | QCLASS |
- * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- *
- * The query name is encoded as a series of labels, each represented
- * as a one-byte length (maximum 63) followed by the text of the
- * label. The list is terminated by a label of length zero (which can
- * be thought of as the root domain).
- */
-
-int ares_create_query(const char *name, int dnsclass, int type,
- unsigned short id, int rd, unsigned char **bufp,
- int *buflenp, int max_udp_size)
+static int ares_create_query_int(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;
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t len;
+ ares_dns_flags_t rd_flag = rd ? ARES_FLAG_RD : 0;
+
+ if (name == NULL || bufp == NULL || buflenp == NULL) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
- /* Set our results early, in case we bail out early with an error. */
+ *bufp = NULL;
*buflenp = 0;
- *bufp = NULL;
-
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name))
- return ARES_ENOTFOUND;
- /* Allocate a memory area for the maximum size this packet might need. +2
- * is for the length byte and zero termination if no dots or ecscaping is
- * used.
- */
- len = strlen(name) + 2 + HFIXEDSZ + QFIXEDSZ +
- (max_udp_size ? EDNSFIXEDSZ : 0);
- buf = ares_malloc(len);
- if (!buf)
- return ARES_ENOMEM;
-
- /* Set up the header. */
- q = buf;
- memset(q, 0, HFIXEDSZ);
- DNS_HEADER_SET_QID(q, id);
- DNS_HEADER_SET_OPCODE(q, O_QUERY);
- if (rd) {
- DNS_HEADER_SET_RD(q, 1);
- }
- else {
- DNS_HEADER_SET_RD(q, 0);
+ status = ares_dns_record_create_query(
+ &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, id,
+ rd_flag, (size_t)max_udp_size);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- DNS_HEADER_SET_QDCOUNT(q, 1);
- if (max_udp_size) {
- DNS_HEADER_SET_ARCOUNT(q, 1);
+ status = ares_dns_write(dnsrec, bufp, &len);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- /* A name of "." is a screw case for the loop below, so adjust it. */
- if (strcmp(name, ".") == 0)
- name++;
+ *buflenp = (int)len;
- /* 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;
- }
+done:
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
+}
- /* we know this fits in an int at this point */
- *buflenp = (int) buflen;
- *bufp = buf;
+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)
+{
+ return ares_create_query_int(name, dnsclass, type, id, rd, bufp, buflenp,
+ max_udp_size);
+}
- return ARES_SUCCESS;
+int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
+ int rd, unsigned char **buf, int *buflen)
+{
+ return ares_create_query_int(name, dnsclass, type, id, rd, buf, buflen, 0);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_data.c b/contrib/libs/c-ares/src/lib/ares_data.c
index 9e22339327..e37088283b 100644
--- a/contrib/libs/c-ares/src/lib/ares_data.c
+++ b/contrib/libs/c-ares/src/lib/ares_data.c
@@ -33,7 +33,6 @@
#include "ares_data.h"
#include "ares_private.h"
-
/*
** ares_free_data() - c-ares external API function.
**
@@ -52,12 +51,12 @@ void ares_free_data(void *dataptr)
{
while (dataptr != NULL) {
struct ares_data *ptr;
- void *next_data = NULL;
+ void *next_data = NULL;
#ifdef __INTEL_COMPILER
# pragma warning(push)
-# pragma warning(disable:1684)
- /* 1684: conversion from pointer to same-sized integral type */
+# pragma warning(disable : 1684)
+ /* 1684: conversion from pointer to same-sized integral type */
#endif
ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data));
@@ -66,97 +65,68 @@ void ares_free_data(void *dataptr)
# pragma warning(pop)
#endif
- if (ptr->mark != ARES_DATATYPE_MARK)
+ if (ptr->mark != ARES_DATATYPE_MARK) {
return;
+ }
- switch (ptr->type)
- {
- case ARES_DATATYPE_MX_REPLY:
-
- if (ptr->data.mx_reply.next)
- next_data = ptr->data.mx_reply.next;
- if (ptr->data.mx_reply.host)
- ares_free(ptr->data.mx_reply.host);
- break;
-
- case ARES_DATATYPE_SRV_REPLY:
-
- if (ptr->data.srv_reply.next)
- next_data = ptr->data.srv_reply.next;
- if (ptr->data.srv_reply.host)
- ares_free(ptr->data.srv_reply.host);
- break;
-
- case ARES_DATATYPE_URI_REPLY:
-
- if (ptr->data.uri_reply.next)
- next_data = ptr->data.uri_reply.next;
- if (ptr->data.uri_reply.uri)
- ares_free(ptr->data.uri_reply.uri);
- break;
-
- case ARES_DATATYPE_TXT_REPLY:
- case ARES_DATATYPE_TXT_EXT:
-
- if (ptr->data.txt_reply.next)
- next_data = ptr->data.txt_reply.next;
- if (ptr->data.txt_reply.txt)
- ares_free(ptr->data.txt_reply.txt);
- break;
+ switch (ptr->type) {
+ case ARES_DATATYPE_MX_REPLY:
+ next_data = ptr->data.mx_reply.next;
+ ares_free(ptr->data.mx_reply.host);
+ break;
- case ARES_DATATYPE_ADDR_NODE:
+ case ARES_DATATYPE_SRV_REPLY:
+ next_data = ptr->data.srv_reply.next;
+ ares_free(ptr->data.srv_reply.host);
+ break;
- if (ptr->data.addr_node.next)
- next_data = ptr->data.addr_node.next;
- break;
+ case ARES_DATATYPE_URI_REPLY:
+ next_data = ptr->data.uri_reply.next;
+ ares_free(ptr->data.uri_reply.uri);
+ break;
- case ARES_DATATYPE_ADDR_PORT_NODE:
+ case ARES_DATATYPE_TXT_REPLY:
+ case ARES_DATATYPE_TXT_EXT:
+ next_data = ptr->data.txt_reply.next;
+ ares_free(ptr->data.txt_reply.txt);
+ break;
- if (ptr->data.addr_port_node.next)
- next_data = ptr->data.addr_port_node.next;
- break;
+ case ARES_DATATYPE_ADDR_NODE:
+ next_data = ptr->data.addr_node.next;
+ break;
- case ARES_DATATYPE_NAPTR_REPLY:
+ case ARES_DATATYPE_ADDR_PORT_NODE:
+ next_data = ptr->data.addr_port_node.next;
+ break;
- 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_NAPTR_REPLY:
+ next_data = ptr->data.naptr_reply.next;
+ ares_free(ptr->data.naptr_reply.flags);
+ ares_free(ptr->data.naptr_reply.service);
+ ares_free(ptr->data.naptr_reply.regexp);
+ ares_free(ptr->data.naptr_reply.replacement);
+ break;
- case ARES_DATATYPE_SOA_REPLY:
- if (ptr->data.soa_reply.nsname)
- ares_free(ptr->data.soa_reply.nsname);
- if (ptr->data.soa_reply.hostmaster)
- ares_free(ptr->data.soa_reply.hostmaster);
- break;
+ case ARES_DATATYPE_SOA_REPLY:
+ ares_free(ptr->data.soa_reply.nsname);
+ ares_free(ptr->data.soa_reply.hostmaster);
+ break;
- case ARES_DATATYPE_CAA_REPLY:
-
- if (ptr->data.caa_reply.next)
- next_data = ptr->data.caa_reply.next;
- if (ptr->data.caa_reply.property)
- ares_free(ptr->data.caa_reply.property);
- if (ptr->data.caa_reply.value)
- ares_free(ptr->data.caa_reply.value);
- break;
+ case ARES_DATATYPE_CAA_REPLY:
+ next_data = ptr->data.caa_reply.next;
+ ares_free(ptr->data.caa_reply.property);
+ ares_free(ptr->data.caa_reply.value);
+ break;
- default:
- return;
- }
+ default:
+ return;
+ }
ares_free(ptr);
dataptr = next_data;
}
}
-
/*
** ares_malloc_data() - c-ares internal helper function.
**
@@ -172,92 +142,28 @@ void *ares_malloc_data(ares_datatype type)
{
struct ares_data *ptr;
- ptr = ares_malloc(sizeof(struct ares_data));
- if (!ptr)
+ ptr = ares_malloc_zero(sizeof(*ptr));
+ if (!ptr) {
return NULL;
+ }
- switch (type)
- {
- case ARES_DATATYPE_MX_REPLY:
- ptr->data.mx_reply.next = NULL;
- ptr->data.mx_reply.host = NULL;
- ptr->data.mx_reply.priority = 0;
- break;
-
- case ARES_DATATYPE_SRV_REPLY:
- ptr->data.srv_reply.next = NULL;
- ptr->data.srv_reply.host = NULL;
- ptr->data.srv_reply.priority = 0;
- ptr->data.srv_reply.weight = 0;
- ptr->data.srv_reply.port = 0;
- break;
-
- case ARES_DATATYPE_URI_REPLY:
- ptr->data.uri_reply.next = NULL;
- ptr->data.uri_reply.priority = 0;
- ptr->data.uri_reply.weight = 0;
- ptr->data.uri_reply.uri = NULL;
- ptr->data.uri_reply.ttl = 0;
- break;
-
- case ARES_DATATYPE_TXT_EXT:
- ptr->data.txt_ext.record_start = 0;
- /* FALLTHROUGH */
-
- case ARES_DATATYPE_TXT_REPLY:
- ptr->data.txt_reply.next = NULL;
- ptr->data.txt_reply.txt = NULL;
- ptr->data.txt_reply.length = 0;
- break;
-
- case ARES_DATATYPE_CAA_REPLY:
- ptr->data.caa_reply.next = NULL;
- ptr->data.caa_reply.plength = 0;
- ptr->data.caa_reply.property = NULL;
- ptr->data.caa_reply.length = 0;
- ptr->data.caa_reply.value = NULL;
- break;
-
- case ARES_DATATYPE_ADDR_NODE:
- ptr->data.addr_node.next = NULL;
- ptr->data.addr_node.family = 0;
- memset(&ptr->data.addr_node.addrV6, 0,
- sizeof(ptr->data.addr_node.addrV6));
- break;
-
- case ARES_DATATYPE_ADDR_PORT_NODE:
- ptr->data.addr_port_node.next = NULL;
- ptr->data.addr_port_node.family = 0;
- ptr->data.addr_port_node.udp_port = 0;
- ptr->data.addr_port_node.tcp_port = 0;
- memset(&ptr->data.addr_port_node.addrV6, 0,
- sizeof(ptr->data.addr_port_node.addrV6));
- break;
-
- case ARES_DATATYPE_NAPTR_REPLY:
- ptr->data.naptr_reply.next = NULL;
- ptr->data.naptr_reply.flags = NULL;
- ptr->data.naptr_reply.service = NULL;
- ptr->data.naptr_reply.regexp = NULL;
- ptr->data.naptr_reply.replacement = NULL;
- ptr->data.naptr_reply.order = 0;
- ptr->data.naptr_reply.preference = 0;
- break;
-
- case ARES_DATATYPE_SOA_REPLY:
- ptr->data.soa_reply.nsname = NULL;
- ptr->data.soa_reply.hostmaster = NULL;
- ptr->data.soa_reply.serial = 0;
- ptr->data.soa_reply.refresh = 0;
- ptr->data.soa_reply.retry = 0;
- ptr->data.soa_reply.expire = 0;
- ptr->data.soa_reply.minttl = 0;
- break;
-
- default:
- ares_free(ptr);
- return NULL;
- }
+ switch (type) {
+ case ARES_DATATYPE_MX_REPLY:
+ case ARES_DATATYPE_SRV_REPLY:
+ case ARES_DATATYPE_URI_REPLY:
+ case ARES_DATATYPE_TXT_EXT:
+ case ARES_DATATYPE_TXT_REPLY:
+ case ARES_DATATYPE_CAA_REPLY:
+ case ARES_DATATYPE_ADDR_NODE:
+ case ARES_DATATYPE_ADDR_PORT_NODE:
+ case ARES_DATATYPE_NAPTR_REPLY:
+ case ARES_DATATYPE_SOA_REPLY:
+ break;
+
+ default:
+ ares_free(ptr);
+ return NULL;
+ }
ptr->mark = ARES_DATATYPE_MARK;
ptr->type = type;
diff --git a/contrib/libs/c-ares/src/lib/ares_data.h b/contrib/libs/c-ares/src/lib/ares_data.h
index 6965cf2a73..b2c4d22b86 100644
--- a/contrib/libs/c-ares/src/lib/ares_data.h
+++ b/contrib/libs/c-ares/src/lib/ares_data.h
@@ -27,24 +27,25 @@
#define __ARES_DATA_H
typedef enum {
- ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */
- ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */
- ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */
- ARES_DATATYPE_TXT_EXT, /* struct ares_txt_ext - introduced in 1.11.0 */
- ARES_DATATYPE_ADDR_NODE, /* struct ares_addr_node - introduced in 1.7.1 */
+ ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */
+ ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */
+ ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */
+ ARES_DATATYPE_TXT_EXT, /* struct ares_txt_ext - introduced in 1.11.0 */
+ ARES_DATATYPE_ADDR_NODE, /* struct ares_addr_node - introduced in 1.7.1 */
ARES_DATATYPE_MX_REPLY, /* struct ares_mx_reply - introduced in 1.7.2 */
- ARES_DATATYPE_NAPTR_REPLY,/* struct ares_naptr_reply - introduced in 1.7.6 */
- ARES_DATATYPE_SOA_REPLY, /* struct ares_soa_reply - introduced in 1.9.0 */
- ARES_DATATYPE_URI_REPLY, /* struct ares_uri_reply */
+ ARES_DATATYPE_NAPTR_REPLY, /* struct ares_naptr_reply - introduced in 1.7.6 */
+ ARES_DATATYPE_SOA_REPLY, /* struct ares_soa_reply - introduced in 1.9.0 */
+ ARES_DATATYPE_URI_REPLY, /* struct ares_uri_reply */
#if 0
ARES_DATATYPE_ADDR6TTL, /* struct ares_addrttl */
ARES_DATATYPE_ADDRTTL, /* struct ares_addr6ttl */
ARES_DATATYPE_HOSTENT, /* struct hostent */
ARES_DATATYPE_OPTIONS, /* struct ares_options */
#endif
- ARES_DATATYPE_ADDR_PORT_NODE, /* struct ares_addr_port_node - introduced in 1.11.0 */
- ARES_DATATYPE_CAA_REPLY, /* struct ares_caa_reply - introduced in 1.17 */
- ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */
+ ARES_DATATYPE_ADDR_PORT_NODE, /* struct ares_addr_port_node - introduced
+ in 1.11.0 */
+ ARES_DATATYPE_CAA_REPLY, /* struct ares_caa_reply - introduced in 1.17 */
+ ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */
} ares_datatype;
#define ARES_DATATYPE_MARK 0xbead
@@ -68,19 +69,20 @@ typedef enum {
*/
struct ares_data {
- ares_datatype type; /* Actual data type identifier. */
- unsigned int mark; /* Private ares_data signature. */
+ ares_datatype type; /* Actual data type identifier. */
+ unsigned int mark; /* Private ares_data signature. */
+
union {
- struct ares_txt_reply txt_reply;
- struct ares_txt_ext txt_ext;
- struct ares_srv_reply srv_reply;
- struct ares_addr_node addr_node;
- struct ares_addr_port_node addr_port_node;
- struct ares_mx_reply mx_reply;
- struct ares_naptr_reply naptr_reply;
- struct ares_soa_reply soa_reply;
- struct ares_caa_reply caa_reply;
- struct ares_uri_reply uri_reply;
+ struct ares_txt_reply txt_reply;
+ struct ares_txt_ext txt_ext;
+ struct ares_srv_reply srv_reply;
+ struct ares_addr_node addr_node;
+ struct ares_addr_port_node addr_port_node;
+ struct ares_mx_reply mx_reply;
+ struct ares_naptr_reply naptr_reply;
+ struct ares_soa_reply soa_reply;
+ struct ares_caa_reply caa_reply;
+ struct ares_uri_reply uri_reply;
} data;
};
diff --git a/contrib/libs/c-ares/src/lib/ares_destroy.c b/contrib/libs/c-ares/src/lib/ares_destroy.c
index 560082fd0c..6965b601e7 100644
--- a/contrib/libs/c-ares/src/lib/ares_destroy.c
+++ b/contrib/libs/c-ares/src/lib/ares_destroy.c
@@ -32,33 +32,17 @@
#include "ares.h"
#include "ares_private.h"
-void ares_destroy_options(struct ares_options *options)
+void ares_destroy(ares_channel_t *channel)
{
- int i;
-
- if(options->servers)
- ares_free(options->servers);
- for (i = 0; i < options->ndomains; i++)
- ares_free(options->domains[i]);
- if(options->domains)
- ares_free(options->domains);
- if(options->sortlist)
- ares_free(options->sortlist);
- if(options->lookups)
- ares_free(options->lookups);
- if(options->resolvconf_path)
- ares_free(options->resolvconf_path);
- if(options->hosts_path)
- ares_free(options->hosts_path);
-}
-
-void ares_destroy(ares_channel channel)
-{
- int i;
+ size_t i;
ares__llist_node_t *node = NULL;
- if (!channel)
+ if (channel == NULL) {
return;
+ }
+
+ /* Lock because callbacks will be triggered */
+ ares__channel_lock(channel);
/* Destroy all queries */
node = ares__llist_node_first(channel->all_queries);
@@ -67,19 +51,20 @@ void ares_destroy(ares_channel channel)
struct query *query = ares__llist_node_claim(node);
query->node_all_queries = NULL;
- query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0);
+ query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL);
ares__free_query(query);
node = next;
}
+ ares_queue_notify_empty(channel);
#ifndef NDEBUG
/* Freeing the query should remove it from all the lists in which it sits,
* so all query lists should be empty now.
*/
assert(ares__llist_len(channel->all_queries) == 0);
- assert(ares__htable_stvp_num_keys(channel->queries_by_qid) == 0);
+ assert(ares__htable_szvp_num_keys(channel->queries_by_qid) == 0);
assert(ares__slist_len(channel->queries_by_timeout) == 0);
#endif
@@ -89,52 +74,63 @@ void ares_destroy(ares_channel channel)
assert(ares__htable_asvp_num_keys(channel->connnode_by_socket) == 0);
#endif
+ /* No more callbacks will be triggered after this point, unlock */
+ ares__channel_unlock(channel);
+
+ /* Shut down the event thread */
+ if (channel->optmask & ARES_OPT_EVENT_THREAD) {
+ ares_event_thread_destroy(channel);
+ }
+
if (channel->domains) {
- for (i = 0; i < channel->ndomains; i++)
+ for (i = 0; i < channel->ndomains; i++) {
ares_free(channel->domains[i]);
+ }
ares_free(channel->domains);
}
ares__llist_destroy(channel->all_queries);
ares__slist_destroy(channel->queries_by_timeout);
- ares__htable_stvp_destroy(channel->queries_by_qid);
+ ares__htable_szvp_destroy(channel->queries_by_qid);
ares__htable_asvp_destroy(channel->connnode_by_socket);
- if(channel->sortlist)
- ares_free(channel->sortlist);
-
- if (channel->lookups)
- ares_free(channel->lookups);
+ ares_free(channel->sortlist);
+ ares_free(channel->lookups);
+ ares_free(channel->resolvconf_path);
+ ares_free(channel->hosts_path);
+ ares__destroy_rand_state(channel->rand_state);
- if (channel->resolvconf_path)
- ares_free(channel->resolvconf_path);
+ ares__hosts_file_destroy(channel->hf);
- if (channel->hosts_path)
- ares_free(channel->hosts_path);
+ ares__qcache_destroy(channel->qcache);
- if (channel->rand_state)
- ares__destroy_rand_state(channel->rand_state);
+ ares__channel_threading_destroy(channel);
ares_free(channel);
}
-void ares__destroy_servers_state(ares_channel channel)
+void ares__destroy_server(struct server_state *server)
{
- struct server_state *server;
- int i;
-
- if (channel->servers)
- {
- for (i = 0; i < channel->nservers; i++)
- {
- server = &channel->servers[i];
- ares__close_sockets(server);
- ares__llist_destroy(server->connections);
- ares__buf_destroy(server->tcp_parser);
- ares__buf_destroy(server->tcp_send);
- }
- ares_free(channel->servers);
- channel->servers = NULL;
- }
- channel->nservers = -1;
+ if (server == NULL) {
+ return;
+ }
+
+ ares__close_sockets(server);
+ ares__llist_destroy(server->connections);
+ ares__buf_destroy(server->tcp_parser);
+ ares__buf_destroy(server->tcp_send);
+ ares_free(server);
+}
+
+void ares__destroy_servers_state(ares_channel_t *channel)
+{
+ ares__slist_node_t *node;
+
+ while ((node = ares__slist_node_first(channel->servers)) != NULL) {
+ struct server_state *server = ares__slist_node_claim(node);
+ ares__destroy_server(server);
+ }
+
+ ares__slist_destroy(channel->servers);
+ channel->servers = NULL;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_mapping.c b/contrib/libs/c-ares/src/lib/ares_dns_mapping.c
new file mode 100644
index 0000000000..2b463fe831
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_mapping.c
@@ -0,0 +1,919 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode)
+{
+ switch (opcode) {
+ case ARES_OPCODE_QUERY:
+ case ARES_OPCODE_IQUERY:
+ case ARES_OPCODE_STATUS:
+ case ARES_OPCODE_NOTIFY:
+ case ARES_OPCODE_UPDATE:
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode)
+{
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ case ARES_RCODE_FORMERR:
+ case ARES_RCODE_SERVFAIL:
+ case ARES_RCODE_NXDOMAIN:
+ case ARES_RCODE_NOTIMP:
+ case ARES_RCODE_REFUSED:
+ case ARES_RCODE_YXDOMAIN:
+ case ARES_RCODE_YXRRSET:
+ case ARES_RCODE_NXRRSET:
+ case ARES_RCODE_NOTAUTH:
+ case ARES_RCODE_NOTZONE:
+ case ARES_RCODE_DSOTYPEI:
+ case ARES_RCODE_BADSIG:
+ case ARES_RCODE_BADKEY:
+ case ARES_RCODE_BADTIME:
+ case ARES_RCODE_BADMODE:
+ case ARES_RCODE_BADNAME:
+ case ARES_RCODE_BADALG:
+ case ARES_RCODE_BADTRUNC:
+ case ARES_RCODE_BADCOOKIE:
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_flags_arevalid(unsigned short flags)
+{
+ unsigned short allflags = ARES_FLAG_QR | ARES_FLAG_AA | ARES_FLAG_TC |
+ ARES_FLAG_RD | ARES_FLAG_RA | ARES_FLAG_AD |
+ ARES_FLAG_CD;
+
+ if (flags & ~allflags) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type,
+ ares_bool_t is_query)
+{
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ case ARES_REC_TYPE_NS:
+ case ARES_REC_TYPE_CNAME:
+ case ARES_REC_TYPE_SOA:
+ case ARES_REC_TYPE_PTR:
+ case ARES_REC_TYPE_HINFO:
+ case ARES_REC_TYPE_MX:
+ case ARES_REC_TYPE_TXT:
+ case ARES_REC_TYPE_AAAA:
+ case ARES_REC_TYPE_SRV:
+ case ARES_REC_TYPE_NAPTR:
+ case ARES_REC_TYPE_OPT:
+ case ARES_REC_TYPE_TLSA:
+ case ARES_REC_TYPE_SVCB:
+ case ARES_REC_TYPE_HTTPS:
+ case ARES_REC_TYPE_ANY:
+ case ARES_REC_TYPE_URI:
+ case ARES_REC_TYPE_CAA:
+ return ARES_TRUE;
+ case ARES_REC_TYPE_RAW_RR:
+ return is_query ? ARES_FALSE : ARES_TRUE;
+ default:
+ break;
+ }
+ return is_query ? ARES_TRUE : ARES_FALSE;
+}
+
+ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type)
+{
+ /* Only record types defined in RFC1035 allow name compression within the
+ * RDATA. Otherwise nameservers that don't understand an RR may not be
+ * able to pass along the RR in a proper manner */
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ case ARES_REC_TYPE_NS:
+ case ARES_REC_TYPE_CNAME:
+ case ARES_REC_TYPE_SOA:
+ case ARES_REC_TYPE_PTR:
+ case ARES_REC_TYPE_HINFO:
+ case ARES_REC_TYPE_MX:
+ case ARES_REC_TYPE_TXT:
+ return ARES_TRUE;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass,
+ ares_bool_t is_query)
+{
+ switch (qclass) {
+ case ARES_CLASS_IN:
+ case ARES_CLASS_CHAOS:
+ case ARES_CLASS_HESOID:
+ case ARES_CLASS_NONE:
+ return ARES_TRUE;
+ case ARES_CLASS_ANY:
+ return is_query ? ARES_TRUE : ARES_FALSE;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect)
+{
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ case ARES_SECTION_AUTHORITY:
+ case ARES_SECTION_ADDITIONAL:
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key)
+{
+ /* NOTE: due to the way we've numerated the keys, we can simply divide by
+ * 100 to get the type rather than having to do a huge switch
+ * statement. That said, we do then validate the type returned is
+ * valid in case something completely bogus is passed in */
+ ares_dns_rec_type_t type = key / 100;
+ if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) {
+ return 0;
+ }
+ return type;
+}
+
+const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type)
+{
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ return "A";
+ case ARES_REC_TYPE_NS:
+ return "NS";
+ case ARES_REC_TYPE_CNAME:
+ return "CNAME";
+ case ARES_REC_TYPE_SOA:
+ return "SOA";
+ case ARES_REC_TYPE_PTR:
+ return "PTR";
+ case ARES_REC_TYPE_HINFO:
+ return "HINFO";
+ case ARES_REC_TYPE_MX:
+ return "MX";
+ case ARES_REC_TYPE_TXT:
+ return "TXT";
+ case ARES_REC_TYPE_AAAA:
+ return "AAAA";
+ case ARES_REC_TYPE_SRV:
+ return "SRV";
+ case ARES_REC_TYPE_NAPTR:
+ return "NAPTR";
+ case ARES_REC_TYPE_OPT:
+ return "OPT";
+ case ARES_REC_TYPE_TLSA:
+ return "TLSA";
+ case ARES_REC_TYPE_SVCB:
+ return "SVCB";
+ case ARES_REC_TYPE_HTTPS:
+ return "HTTPS";
+ case ARES_REC_TYPE_ANY:
+ return "ANY";
+ case ARES_REC_TYPE_URI:
+ return "URI";
+ case ARES_REC_TYPE_CAA:
+ return "CAA";
+ case ARES_REC_TYPE_RAW_RR:
+ return "RAWRR";
+ }
+ return "UNKNOWN";
+}
+
+const char *ares_dns_class_tostr(ares_dns_class_t qclass)
+{
+ switch (qclass) {
+ case ARES_CLASS_IN:
+ return "IN";
+ case ARES_CLASS_CHAOS:
+ return "CH";
+ case ARES_CLASS_HESOID:
+ return "HS";
+ case ARES_CLASS_ANY:
+ return "ANY";
+ case ARES_CLASS_NONE:
+ return "NONE";
+ }
+ return "UNKNOWN";
+}
+
+const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode)
+{
+ switch (opcode) {
+ case ARES_OPCODE_QUERY:
+ return "QUERY";
+ case ARES_OPCODE_IQUERY:
+ return "IQUERY";
+ case ARES_OPCODE_STATUS:
+ return "STATUS";
+ case ARES_OPCODE_NOTIFY:
+ return "NOTIFY";
+ case ARES_OPCODE_UPDATE:
+ return "UPDATE";
+ }
+ return "UNKNOWN";
+}
+
+const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key)
+{
+ switch (key) {
+ case ARES_RR_A_ADDR:
+ return "ADDR";
+
+ case ARES_RR_NS_NSDNAME:
+ return "NSDNAME";
+
+ case ARES_RR_CNAME_CNAME:
+ return "CNAME";
+
+ case ARES_RR_SOA_MNAME:
+ return "MNAME";
+
+ case ARES_RR_SOA_RNAME:
+ return "RNAME";
+
+ case ARES_RR_SOA_SERIAL:
+ return "SERIAL";
+
+ case ARES_RR_SOA_REFRESH:
+ return "REFRESH";
+
+ case ARES_RR_SOA_RETRY:
+ return "RETRY";
+
+ case ARES_RR_SOA_EXPIRE:
+ return "EXPIRE";
+
+ case ARES_RR_SOA_MINIMUM:
+ return "MINIMUM";
+
+ case ARES_RR_PTR_DNAME:
+ return "DNAME";
+
+ case ARES_RR_AAAA_ADDR:
+ return "ADDR";
+
+ case ARES_RR_HINFO_CPU:
+ return "CPU";
+
+ case ARES_RR_HINFO_OS:
+ return "OS";
+
+ case ARES_RR_MX_PREFERENCE:
+ return "PREFERENCE";
+
+ case ARES_RR_MX_EXCHANGE:
+ return "EXCHANGE";
+
+ case ARES_RR_TXT_DATA:
+ return "DATA";
+
+ case ARES_RR_SRV_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_SRV_WEIGHT:
+ return "WEIGHT";
+
+ case ARES_RR_SRV_PORT:
+ return "PORT";
+
+ case ARES_RR_SRV_TARGET:
+ return "TARGET";
+
+ case ARES_RR_NAPTR_ORDER:
+ return "ORDER";
+
+ case ARES_RR_NAPTR_PREFERENCE:
+ return "PREFERENCE";
+
+ case ARES_RR_NAPTR_FLAGS:
+ return "FLAGS";
+
+ case ARES_RR_NAPTR_SERVICES:
+ return "SERVICES";
+
+ case ARES_RR_NAPTR_REGEXP:
+ return "REGEXP";
+
+ case ARES_RR_NAPTR_REPLACEMENT:
+ return "REPLACEMENT";
+
+ case ARES_RR_OPT_UDP_SIZE:
+ return "UDP_SIZE";
+
+ case ARES_RR_OPT_VERSION:
+ return "VERSION";
+
+ case ARES_RR_OPT_FLAGS:
+ return "FLAGS";
+
+ case ARES_RR_OPT_OPTIONS:
+ return "OPTIONS";
+
+ case ARES_RR_TLSA_CERT_USAGE:
+ return "CERT_USAGE";
+
+ case ARES_RR_TLSA_SELECTOR:
+ return "SELECTOR";
+
+ case ARES_RR_TLSA_MATCH:
+ return "MATCH";
+
+ case ARES_RR_TLSA_DATA:
+ return "DATA";
+
+ case ARES_RR_SVCB_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_SVCB_TARGET:
+ return "TARGET";
+
+ case ARES_RR_SVCB_PARAMS:
+ return "PARAMS";
+
+ case ARES_RR_HTTPS_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_HTTPS_TARGET:
+ return "TARGET";
+
+ case ARES_RR_HTTPS_PARAMS:
+ return "PARAMS";
+
+ case ARES_RR_URI_PRIORITY:
+ return "PRIORITY";
+
+ case ARES_RR_URI_WEIGHT:
+ return "WEIGHT";
+
+ case ARES_RR_URI_TARGET:
+ return "TARGET";
+
+ case ARES_RR_CAA_CRITICAL:
+ return "CRITICAL";
+
+ case ARES_RR_CAA_TAG:
+ return "TAG";
+
+ case ARES_RR_CAA_VALUE:
+ return "VALUE";
+
+ case ARES_RR_RAW_RR_TYPE:
+ return "TYPE";
+
+ case ARES_RR_RAW_RR_DATA:
+ return "DATA";
+ }
+
+ return "UNKNOWN";
+}
+
+ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key)
+{
+ switch (key) {
+ case ARES_RR_A_ADDR:
+ return ARES_DATATYPE_INADDR;
+
+ case ARES_RR_AAAA_ADDR:
+ return ARES_DATATYPE_INADDR6;
+
+ case ARES_RR_NS_NSDNAME:
+ case ARES_RR_CNAME_CNAME:
+ case ARES_RR_SOA_MNAME:
+ case ARES_RR_SOA_RNAME:
+ case ARES_RR_PTR_DNAME:
+ case ARES_RR_MX_EXCHANGE:
+ case ARES_RR_SRV_TARGET:
+ case ARES_RR_SVCB_TARGET:
+ case ARES_RR_HTTPS_TARGET:
+ case ARES_RR_NAPTR_REPLACEMENT:
+ case ARES_RR_URI_TARGET:
+ return ARES_DATATYPE_NAME;
+
+ case ARES_RR_HINFO_CPU:
+ case ARES_RR_HINFO_OS:
+ case ARES_RR_NAPTR_FLAGS:
+ case ARES_RR_NAPTR_SERVICES:
+ case ARES_RR_NAPTR_REGEXP:
+ case ARES_RR_CAA_TAG:
+ return ARES_DATATYPE_STR;
+
+ case ARES_RR_SOA_SERIAL:
+ case ARES_RR_SOA_REFRESH:
+ case ARES_RR_SOA_RETRY:
+ case ARES_RR_SOA_EXPIRE:
+ case ARES_RR_SOA_MINIMUM:
+ return ARES_DATATYPE_U32;
+
+ case ARES_RR_MX_PREFERENCE:
+ case ARES_RR_SRV_PRIORITY:
+ case ARES_RR_SRV_WEIGHT:
+ case ARES_RR_SRV_PORT:
+ case ARES_RR_NAPTR_ORDER:
+ case ARES_RR_NAPTR_PREFERENCE:
+ case ARES_RR_OPT_UDP_SIZE:
+ case ARES_RR_OPT_FLAGS:
+ case ARES_RR_SVCB_PRIORITY:
+ case ARES_RR_HTTPS_PRIORITY:
+ case ARES_RR_URI_PRIORITY:
+ case ARES_RR_URI_WEIGHT:
+ case ARES_RR_RAW_RR_TYPE:
+ return ARES_DATATYPE_U16;
+
+ case ARES_RR_OPT_VERSION:
+ case ARES_RR_TLSA_CERT_USAGE:
+ case ARES_RR_TLSA_SELECTOR:
+ case ARES_RR_TLSA_MATCH:
+ case ARES_RR_CAA_CRITICAL:
+ return ARES_DATATYPE_U8;
+
+ case ARES_RR_CAA_VALUE:
+ case ARES_RR_TXT_DATA:
+ return ARES_DATATYPE_BINP;
+
+ case ARES_RR_TLSA_DATA:
+ case ARES_RR_RAW_RR_DATA:
+ return ARES_DATATYPE_BIN;
+
+ case ARES_RR_OPT_OPTIONS:
+ case ARES_RR_SVCB_PARAMS:
+ case ARES_RR_HTTPS_PARAMS:
+ return ARES_DATATYPE_OPT;
+ }
+
+ return 0;
+}
+
+static const ares_dns_rr_key_t rr_a_keys[] = { ARES_RR_A_ADDR };
+static const ares_dns_rr_key_t rr_ns_keys[] = { ARES_RR_NS_NSDNAME };
+static const ares_dns_rr_key_t rr_cname_keys[] = { ARES_RR_CNAME_CNAME };
+static const ares_dns_rr_key_t rr_soa_keys[] = {
+ ARES_RR_SOA_MNAME, ARES_RR_SOA_RNAME, ARES_RR_SOA_SERIAL,
+ ARES_RR_SOA_REFRESH, ARES_RR_SOA_RETRY, ARES_RR_SOA_EXPIRE,
+ ARES_RR_SOA_MINIMUM
+};
+static const ares_dns_rr_key_t rr_ptr_keys[] = { ARES_RR_PTR_DNAME };
+static const ares_dns_rr_key_t rr_hinfo_keys[] = { ARES_RR_HINFO_CPU,
+ ARES_RR_HINFO_OS };
+static const ares_dns_rr_key_t rr_mx_keys[] = { ARES_RR_MX_PREFERENCE,
+ ARES_RR_MX_EXCHANGE };
+static const ares_dns_rr_key_t rr_txt_keys[] = { ARES_RR_TXT_DATA };
+static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR };
+static const ares_dns_rr_key_t rr_srv_keys[] = {
+ ARES_RR_SRV_PRIORITY, ARES_RR_SRV_WEIGHT, ARES_RR_SRV_PORT, ARES_RR_SRV_TARGET
+};
+static const ares_dns_rr_key_t rr_naptr_keys[] = {
+ ARES_RR_NAPTR_ORDER, ARES_RR_NAPTR_PREFERENCE, ARES_RR_NAPTR_FLAGS,
+ ARES_RR_NAPTR_SERVICES, ARES_RR_NAPTR_REGEXP, ARES_RR_NAPTR_REPLACEMENT
+};
+static const ares_dns_rr_key_t rr_opt_keys[] = { ARES_RR_OPT_UDP_SIZE,
+ ARES_RR_OPT_VERSION,
+ ARES_RR_OPT_FLAGS,
+ ARES_RR_OPT_OPTIONS };
+static const ares_dns_rr_key_t rr_tlsa_keys[] = { ARES_RR_TLSA_CERT_USAGE,
+ ARES_RR_TLSA_SELECTOR,
+ ARES_RR_TLSA_MATCH,
+ ARES_RR_TLSA_DATA };
+static const ares_dns_rr_key_t rr_svcb_keys[] = { ARES_RR_SVCB_PRIORITY,
+ ARES_RR_SVCB_TARGET,
+ ARES_RR_SVCB_PARAMS };
+static const ares_dns_rr_key_t rr_https_keys[] = { ARES_RR_HTTPS_PRIORITY,
+ ARES_RR_HTTPS_TARGET,
+ ARES_RR_HTTPS_PARAMS };
+static const ares_dns_rr_key_t rr_uri_keys[] = { ARES_RR_URI_PRIORITY,
+ ARES_RR_URI_WEIGHT,
+ ARES_RR_URI_TARGET };
+static const ares_dns_rr_key_t rr_caa_keys[] = { ARES_RR_CAA_CRITICAL,
+ ARES_RR_CAA_TAG,
+ ARES_RR_CAA_VALUE };
+static const ares_dns_rr_key_t rr_raw_rr_keys[] = { ARES_RR_RAW_RR_TYPE,
+ ARES_RR_RAW_RR_DATA };
+
+const ares_dns_rr_key_t *ares_dns_rr_get_keys(ares_dns_rec_type_t type,
+ size_t *cnt)
+{
+ if (cnt == NULL) {
+ return NULL;
+ }
+
+ *cnt = 0;
+
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ *cnt = sizeof(rr_a_keys) / sizeof(*rr_a_keys);
+ return rr_a_keys;
+ case ARES_REC_TYPE_NS:
+ *cnt = sizeof(rr_ns_keys) / sizeof(*rr_ns_keys);
+ return rr_ns_keys;
+ case ARES_REC_TYPE_CNAME:
+ *cnt = sizeof(rr_cname_keys) / sizeof(*rr_cname_keys);
+ return rr_cname_keys;
+ case ARES_REC_TYPE_SOA:
+ *cnt = sizeof(rr_soa_keys) / sizeof(*rr_soa_keys);
+ return rr_soa_keys;
+ case ARES_REC_TYPE_PTR:
+ *cnt = sizeof(rr_ptr_keys) / sizeof(*rr_ptr_keys);
+ return rr_ptr_keys;
+ case ARES_REC_TYPE_HINFO:
+ *cnt = sizeof(rr_hinfo_keys) / sizeof(*rr_hinfo_keys);
+ return rr_hinfo_keys;
+ case ARES_REC_TYPE_MX:
+ *cnt = sizeof(rr_mx_keys) / sizeof(*rr_mx_keys);
+ return rr_mx_keys;
+ case ARES_REC_TYPE_TXT:
+ *cnt = sizeof(rr_txt_keys) / sizeof(*rr_txt_keys);
+ return rr_txt_keys;
+ case ARES_REC_TYPE_AAAA:
+ *cnt = sizeof(rr_aaaa_keys) / sizeof(*rr_aaaa_keys);
+ return rr_aaaa_keys;
+ case ARES_REC_TYPE_SRV:
+ *cnt = sizeof(rr_srv_keys) / sizeof(*rr_srv_keys);
+ return rr_srv_keys;
+ case ARES_REC_TYPE_NAPTR:
+ *cnt = sizeof(rr_naptr_keys) / sizeof(*rr_naptr_keys);
+ return rr_naptr_keys;
+ case ARES_REC_TYPE_OPT:
+ *cnt = sizeof(rr_opt_keys) / sizeof(*rr_opt_keys);
+ return rr_opt_keys;
+ case ARES_REC_TYPE_TLSA:
+ *cnt = sizeof(rr_tlsa_keys) / sizeof(*rr_tlsa_keys);
+ return rr_tlsa_keys;
+ case ARES_REC_TYPE_SVCB:
+ *cnt = sizeof(rr_svcb_keys) / sizeof(*rr_svcb_keys);
+ return rr_svcb_keys;
+ case ARES_REC_TYPE_HTTPS:
+ *cnt = sizeof(rr_https_keys) / sizeof(*rr_https_keys);
+ return rr_https_keys;
+ case ARES_REC_TYPE_ANY:
+ /* Not real */
+ break;
+ case ARES_REC_TYPE_URI:
+ *cnt = sizeof(rr_uri_keys) / sizeof(*rr_uri_keys);
+ return rr_uri_keys;
+ case ARES_REC_TYPE_CAA:
+ *cnt = sizeof(rr_caa_keys) / sizeof(*rr_caa_keys);
+ return rr_caa_keys;
+ case ARES_REC_TYPE_RAW_RR:
+ *cnt = sizeof(rr_raw_rr_keys) / sizeof(*rr_raw_rr_keys);
+ return rr_raw_rr_keys;
+ }
+
+ return NULL;
+}
+
+ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str)
+{
+ size_t i;
+
+ static const struct {
+ const char *name;
+ ares_dns_class_t qclass;
+ } list[] = {
+ {"IN", ARES_CLASS_IN },
+ { "CH", ARES_CLASS_CHAOS },
+ { "HS", ARES_CLASS_HESOID},
+ { "NONE", ARES_CLASS_NONE },
+ { "ANY", ARES_CLASS_ANY },
+ { NULL, 0 }
+ };
+
+ if (qclass == NULL || str == NULL) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; list[i].name != NULL; i++) {
+ if (strcasecmp(list[i].name, str) == 0) {
+ *qclass = list[i].qclass;
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype,
+ const char *str)
+{
+ size_t i;
+
+ static const struct {
+ const char *name;
+ ares_dns_rec_type_t type;
+ } list[] = {
+ {"A", ARES_REC_TYPE_A },
+ { "NS", ARES_REC_TYPE_NS },
+ { "CNAME", ARES_REC_TYPE_CNAME },
+ { "SOA", ARES_REC_TYPE_SOA },
+ { "PTR", ARES_REC_TYPE_PTR },
+ { "HINFO", ARES_REC_TYPE_HINFO },
+ { "MX", ARES_REC_TYPE_MX },
+ { "TXT", ARES_REC_TYPE_TXT },
+ { "AAAA", ARES_REC_TYPE_AAAA },
+ { "SRV", ARES_REC_TYPE_SRV },
+ { "NAPTR", ARES_REC_TYPE_NAPTR },
+ { "OPT", ARES_REC_TYPE_OPT },
+ { "TLSA", ARES_REC_TYPE_TLSA },
+ { "SVCB", ARES_REC_TYPE_SVCB },
+ { "HTTPS", ARES_REC_TYPE_HTTPS },
+ { "ANY", ARES_REC_TYPE_ANY },
+ { "URI", ARES_REC_TYPE_URI },
+ { "CAA", ARES_REC_TYPE_CAA },
+ { "RAW_RR", ARES_REC_TYPE_RAW_RR},
+ { NULL, 0 }
+ };
+
+ if (qtype == NULL || str == NULL) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; list[i].name != NULL; i++) {
+ if (strcasecmp(list[i].name, str) == 0) {
+ *qtype = list[i].type;
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+const char *ares_dns_section_tostr(ares_dns_section_t section)
+{
+ switch (section) {
+ case ARES_SECTION_ANSWER:
+ return "ANSWER";
+ case ARES_SECTION_AUTHORITY:
+ return "AUTHORITY";
+ case ARES_SECTION_ADDITIONAL:
+ return "ADDITIONAL";
+ }
+ return "UNKNOWN";
+}
+
+static ares_dns_opt_datatype_t ares_dns_opt_get_type_opt(unsigned short opt)
+{
+ ares_opt_param_t param = (ares_opt_param_t)opt;
+ switch (param) {
+ case ARES_OPT_PARAM_LLQ:
+ /* Really it is u16 version, u16 opcode, u16 error, u64 id, u32 lease */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_UL:
+ return ARES_OPT_DATATYPE_U32;
+ case ARES_OPT_PARAM_NSID:
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_DAU:
+ return ARES_OPT_DATATYPE_U8_LIST;
+ case ARES_OPT_PARAM_DHU:
+ return ARES_OPT_DATATYPE_U8_LIST;
+ case ARES_OPT_PARAM_N3U:
+ return ARES_OPT_DATATYPE_U8_LIST;
+ case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET:
+ /* Really it is a u16 address family, u8 source prefix length,
+ * u8 scope prefix length, address */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_EDNS_EXPIRE:
+ return ARES_OPT_DATATYPE_U32;
+ case ARES_OPT_PARAM_COOKIE:
+ /* 8 bytes for client, 16-40 bytes for server */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE:
+ /* Timeout in 100ms intervals */
+ return ARES_OPT_DATATYPE_U16;
+ case ARES_OPT_PARAM_PADDING:
+ /* Arbitrary padding */
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_OPT_PARAM_CHAIN:
+ return ARES_OPT_DATATYPE_NAME;
+ case ARES_OPT_PARAM_EDNS_KEY_TAG:
+ return ARES_OPT_DATATYPE_U16_LIST;
+ case ARES_OPT_PARAM_EXTENDED_DNS_ERROR:
+ /* Really 16bit code followed by textual message */
+ return ARES_OPT_DATATYPE_BIN;
+ }
+ return ARES_OPT_DATATYPE_BIN;
+}
+
+static ares_dns_opt_datatype_t ares_dns_opt_get_type_svcb(unsigned short opt)
+{
+ ares_svcb_param_t param = (ares_svcb_param_t)opt;
+ switch (param) {
+ case ARES_SVCB_PARAM_NO_DEFAULT_ALPN:
+ return ARES_OPT_DATATYPE_NONE;
+ case ARES_SVCB_PARAM_ECH:
+ return ARES_OPT_DATATYPE_BIN;
+ case ARES_SVCB_PARAM_MANDATORY:
+ return ARES_OPT_DATATYPE_U16_LIST;
+ case ARES_SVCB_PARAM_ALPN:
+ return ARES_OPT_DATATYPE_STR_LIST;
+ case ARES_SVCB_PARAM_PORT:
+ return ARES_OPT_DATATYPE_U16;
+ case ARES_SVCB_PARAM_IPV4HINT:
+ return ARES_OPT_DATATYPE_INADDR4_LIST;
+ case ARES_SVCB_PARAM_IPV6HINT:
+ return ARES_OPT_DATATYPE_INADDR6_LIST;
+ }
+ return ARES_OPT_DATATYPE_BIN;
+}
+
+ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key,
+ unsigned short opt)
+{
+ switch (key) {
+ case ARES_RR_OPT_OPTIONS:
+ return ares_dns_opt_get_type_opt(opt);
+ case ARES_RR_SVCB_PARAMS:
+ case ARES_RR_HTTPS_PARAMS:
+ return ares_dns_opt_get_type_svcb(opt);
+ default:
+ break;
+ }
+ return ARES_OPT_DATATYPE_BIN;
+}
+
+static const char *ares_dns_opt_get_name_opt(unsigned short opt)
+{
+ ares_opt_param_t param = (ares_opt_param_t)opt;
+ switch (param) {
+ case ARES_OPT_PARAM_LLQ:
+ return "LLQ";
+ case ARES_OPT_PARAM_UL:
+ return "UL";
+ case ARES_OPT_PARAM_NSID:
+ return "NSID";
+ case ARES_OPT_PARAM_DAU:
+ return "DAU";
+ case ARES_OPT_PARAM_DHU:
+ return "DHU";
+ case ARES_OPT_PARAM_N3U:
+ return "N3U";
+ case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET:
+ return "edns-client-subnet";
+ case ARES_OPT_PARAM_EDNS_EXPIRE:
+ return "edns-expire";
+ case ARES_OPT_PARAM_COOKIE:
+ return "COOKIE";
+ case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE:
+ return "edns-tcp-keepalive";
+ case ARES_OPT_PARAM_PADDING:
+ return "Padding";
+ case ARES_OPT_PARAM_CHAIN:
+ return "CHAIN";
+ case ARES_OPT_PARAM_EDNS_KEY_TAG:
+ return "edns-key-tag";
+ case ARES_OPT_PARAM_EXTENDED_DNS_ERROR:
+ return "extended-dns-error";
+ }
+ return NULL;
+}
+
+static const char *ares_dns_opt_get_name_svcb(unsigned short opt)
+{
+ ares_svcb_param_t param = (ares_svcb_param_t)opt;
+ switch (param) {
+ case ARES_SVCB_PARAM_NO_DEFAULT_ALPN:
+ return "no-default-alpn";
+ case ARES_SVCB_PARAM_ECH:
+ return "ech";
+ case ARES_SVCB_PARAM_MANDATORY:
+ return "mandatory";
+ case ARES_SVCB_PARAM_ALPN:
+ return "alpn";
+ case ARES_SVCB_PARAM_PORT:
+ return "port";
+ case ARES_SVCB_PARAM_IPV4HINT:
+ return "ipv4hint";
+ case ARES_SVCB_PARAM_IPV6HINT:
+ return "ipv6hint";
+ }
+ return NULL;
+}
+
+const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt)
+{
+ switch (key) {
+ case ARES_RR_OPT_OPTIONS:
+ return ares_dns_opt_get_name_opt(opt);
+ case ARES_RR_SVCB_PARAMS:
+ case ARES_RR_HTTPS_PARAMS:
+ return ares_dns_opt_get_name_svcb(opt);
+ default:
+ break;
+ }
+ return NULL;
+}
+
+const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode)
+{
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ return "NOERROR";
+ case ARES_RCODE_FORMERR:
+ return "FORMERR";
+ case ARES_RCODE_SERVFAIL:
+ return "SERVFAIL";
+ case ARES_RCODE_NXDOMAIN:
+ return "NXDOMAIN";
+ case ARES_RCODE_NOTIMP:
+ return "NOTIMP";
+ case ARES_RCODE_REFUSED:
+ return "REFUSED";
+ case ARES_RCODE_YXDOMAIN:
+ return "YXDOMAIN";
+ case ARES_RCODE_YXRRSET:
+ return "YXRRSET";
+ case ARES_RCODE_NXRRSET:
+ return "NXRRSET";
+ case ARES_RCODE_NOTAUTH:
+ return "NOTAUTH";
+ case ARES_RCODE_NOTZONE:
+ return "NOTZONE";
+ case ARES_RCODE_DSOTYPEI:
+ return "DSOTYPEI";
+ case ARES_RCODE_BADSIG:
+ return "BADSIG";
+ case ARES_RCODE_BADKEY:
+ return "BADKEY";
+ case ARES_RCODE_BADTIME:
+ return "BADTIME";
+ case ARES_RCODE_BADMODE:
+ return "BADMODE";
+ case ARES_RCODE_BADNAME:
+ return "BADNAME";
+ case ARES_RCODE_BADALG:
+ return "BADALG";
+ case ARES_RCODE_BADTRUNC:
+ return "BADTRUNC";
+ case ARES_RCODE_BADCOOKIE:
+ return "BADCOOKIE";
+ }
+
+ return "UNKNOWN";
+}
+
+/* Convert an rcode and ancount from a query reply into an ares_status_t
+ * value. Used internally by ares_search() and ares_query().
+ */
+ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
+ size_t ancount)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ switch (rcode) {
+ case ARES_RCODE_NOERROR:
+ status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
+ break;
+ case ARES_RCODE_FORMERR:
+ status = ARES_EFORMERR;
+ break;
+ case ARES_RCODE_SERVFAIL:
+ status = ARES_ESERVFAIL;
+ break;
+ case ARES_RCODE_NXDOMAIN:
+ status = ARES_ENOTFOUND;
+ break;
+ case ARES_RCODE_NOTIMP:
+ status = ARES_ENOTIMP;
+ break;
+ case ARES_RCODE_REFUSED:
+ status = ARES_EREFUSED;
+ break;
+ default:
+ break;
+ }
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_name.c b/contrib/libs/c-ares/src/lib/ares_dns_name.c
new file mode 100644
index 0000000000..f4085ab2cb
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_name.c
@@ -0,0 +1,676 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+typedef struct {
+ char *name;
+ size_t name_len;
+ size_t idx;
+} ares_nameoffset_t;
+
+static void ares__nameoffset_free(void *arg)
+{
+ ares_nameoffset_t *off = arg;
+ if (off == NULL) {
+ return;
+ }
+ ares_free(off->name);
+ ares_free(off);
+}
+
+static ares_status_t ares__nameoffset_create(ares__llist_t **list,
+ const char *name, size_t idx)
+{
+ ares_status_t status;
+ ares_nameoffset_t *off = NULL;
+
+ if (list == NULL || name == NULL || ares_strlen(name) == 0 ||
+ ares_strlen(name) > 255) {
+ return ARES_EFORMERR;
+ }
+
+ if (*list == NULL) {
+ *list = ares__llist_create(ares__nameoffset_free);
+ }
+ if (*list == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ off = ares_malloc_zero(sizeof(*off));
+ if (off == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ off->name = ares_strdup(name);
+ off->name_len = ares_strlen(off->name);
+ off->idx = idx;
+
+ if (ares__llist_insert_last(*list, off) == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares__nameoffset_free(off);
+ return status;
+}
+
+static const ares_nameoffset_t *ares__nameoffset_find(ares__llist_t *list,
+ const char *name)
+{
+ size_t name_len = ares_strlen(name);
+ ares__llist_node_t *node;
+ const ares_nameoffset_t *longest_match = NULL;
+
+ if (list == NULL || name == NULL || name_len == 0) {
+ return NULL;
+ }
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares_nameoffset_t *val = ares__llist_node_val(node);
+ size_t prefix_len;
+
+ /* Can't be a match if the stored name is longer */
+ if (val->name_len > name_len) {
+ continue;
+ }
+
+ /* Can't be the longest match if our existing longest match is longer */
+ if (longest_match != NULL && longest_match->name_len > val->name_len) {
+ continue;
+ }
+
+ prefix_len = name_len - val->name_len;
+
+ if (strcasecmp(val->name, name + prefix_len) != 0) {
+ continue;
+ }
+
+ /* We need to make sure if `val->name` is "example.com" that name is
+ * is separated by a label, e.g. "myexample.com" is not ok, however
+ * "my.example.com" is, so we look for the preceding "." */
+ if (prefix_len != 0 && name[prefix_len - 1] != '.') {
+ continue;
+ }
+
+ longest_match = val;
+ }
+
+ return longest_match;
+}
+
+typedef struct {
+ ares__buf_t **label;
+ size_t num;
+} ares_dns_labels_t;
+
+static void ares_dns_labels_free(ares_dns_labels_t *labels)
+{
+ size_t i;
+
+ if (labels == NULL) {
+ return;
+ }
+
+ for (i = 0; i < labels->num; i++) {
+ ares__buf_destroy(labels->label[i]);
+ labels->label[i] = NULL;
+ }
+ ares_free(labels->label);
+ labels->label = NULL;
+ labels->num = 0;
+}
+
+static ares__buf_t *ares_dns_labels_add(ares_dns_labels_t *labels)
+{
+ void *temp;
+
+ if (labels == NULL) {
+ return NULL;
+ }
+
+ temp = ares_realloc_zero(labels->label, sizeof(*labels->label) * labels->num,
+ sizeof(*labels->label) * (labels->num + 1));
+ if (temp == NULL) {
+ return NULL;
+ }
+
+ labels->label = temp;
+
+ labels->label[labels->num] = ares__buf_create();
+ if (labels->label[labels->num] == NULL) {
+ return NULL;
+ }
+
+ labels->num++;
+ return labels->label[labels->num - 1];
+}
+
+static const ares__buf_t *
+ ares_dns_labels_get_last(const ares_dns_labels_t *labels)
+{
+ if (labels == NULL || labels->num == 0) {
+ return NULL;
+ }
+
+ return labels->label[labels->num - 1];
+}
+
+static void ares_dns_name_labels_del_last(ares_dns_labels_t *labels)
+{
+ if (labels == NULL || labels->num == 0) {
+ return;
+ }
+
+ ares__buf_destroy(labels->label[labels->num - 1]);
+ labels->label[labels->num - 1] = NULL;
+ labels->num--;
+}
+
+static ares_status_t ares_parse_dns_name_escape(ares__buf_t *namebuf,
+ ares__buf_t *label,
+ ares_bool_t validate_hostname)
+{
+ ares_status_t status;
+ unsigned char c;
+
+ status = ares__buf_fetch_bytes(namebuf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ return ARES_EBADNAME;
+ }
+
+ /* If next character is a digit, read 2 more digits */
+ if (isdigit(c)) {
+ size_t i;
+ unsigned int val = 0;
+
+ val = c - '0';
+
+ for (i = 0; i < 2; i++) {
+ status = ares__buf_fetch_bytes(namebuf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ return ARES_EBADNAME;
+ }
+
+ if (!isdigit(c)) {
+ return ARES_EBADNAME;
+ }
+ val *= 10;
+ val += c - '0';
+ }
+
+ /* Out of range */
+ if (val > 255) {
+ return ARES_EBADNAME;
+ }
+
+ if (validate_hostname && !ares__is_hostnamech((unsigned char)val)) {
+ return ARES_EBADNAME;
+ }
+
+ return ares__buf_append_byte(label, (unsigned char)val);
+ }
+
+ /* We can just output the character */
+ if (validate_hostname && !ares__is_hostnamech(c)) {
+ return ARES_EBADNAME;
+ }
+
+ return ares__buf_append_byte(label, c);
+}
+
+static ares_status_t ares_split_dns_name(ares_dns_labels_t *labels,
+ ares_bool_t validate_hostname,
+ const char *name)
+{
+ ares_status_t status;
+ ares__buf_t *label = NULL;
+ ares__buf_t *namebuf = NULL;
+ size_t i;
+ size_t total_len = 0;
+ unsigned char c;
+
+ if (name == NULL || labels == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Put name into a buffer for parsing */
+ namebuf = ares__buf_create();
+ if (namebuf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ if (*name != '\0') {
+ status =
+ ares__buf_append(namebuf, (const unsigned char *)name, ares_strlen(name));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* Start with 1 label */
+ label = ares_dns_labels_add(labels);
+ if (label == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ while (ares__buf_fetch_bytes(namebuf, &c, 1) == ARES_SUCCESS) {
+ /* New label */
+ if (c == '.') {
+ label = ares_dns_labels_add(labels);
+ if (label == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ continue;
+ }
+
+ /* Escape */
+ if (c == '\\') {
+ status = ares_parse_dns_name_escape(namebuf, label, validate_hostname);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ continue;
+ }
+
+ /* Output direct character */
+ if (validate_hostname && !ares__is_hostnamech(c)) {
+ status = ARES_EBADNAME;
+ goto done;
+ }
+
+ status = ares__buf_append_byte(label, c);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* Remove trailing blank label */
+ if (ares__buf_len(ares_dns_labels_get_last(labels)) == 0) {
+ ares_dns_name_labels_del_last(labels);
+ }
+
+ /* If someone passed in "." there could have been 2 blank labels, check for
+ * that */
+ if (labels->num == 1 &&
+ ares__buf_len(ares_dns_labels_get_last(labels)) == 0) {
+ ares_dns_name_labels_del_last(labels);
+ }
+
+ /* Scan to make sure label lengths are valid */
+ for (i = 0; i < labels->num; i++) {
+ size_t len = ares__buf_len(labels->label[i]);
+ /* No 0-length labels, and no labels over 63 bytes */
+ if (len == 0 || len > 63) {
+ status = ARES_EBADNAME;
+ goto done;
+ }
+ total_len += len;
+ }
+
+ /* Can't exceed maximum (unescaped) length */
+ if (labels->num && total_len + labels->num - 1 > 255) {
+ status = ARES_EBADNAME;
+ goto done;
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__buf_destroy(namebuf);
+ if (status != ARES_SUCCESS) {
+ ares_dns_labels_free(labels);
+ }
+ return status;
+}
+
+ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list,
+ ares_bool_t validate_hostname,
+ const char *name)
+{
+ const ares_nameoffset_t *off = NULL;
+ size_t name_len;
+ size_t pos = ares__buf_len(buf);
+ ares_dns_labels_t labels;
+ char name_copy[512];
+ ares_status_t status;
+
+ if (buf == NULL || name == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ memset(&labels, 0, sizeof(labels));
+
+ /* NOTE: due to possible escaping, name_copy buffer is > 256 to allow for
+ * this */
+ name_len = ares_strcpy(name_copy, name, sizeof(name_copy));
+
+ /* Find longest match */
+ if (list != NULL) {
+ off = ares__nameoffset_find(*list, name_copy);
+ if (off != NULL && off->name_len != name_len) {
+ /* truncate */
+ name_len -= (off->name_len + 1);
+ name_copy[name_len] = 0;
+ }
+ }
+
+ /* Output labels */
+ if (off == NULL || off->name_len != name_len) {
+ size_t i;
+
+ status = ares_split_dns_name(&labels, validate_hostname, name_copy);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (i = 0; i < labels.num; i++) {
+ size_t len = 0;
+ const unsigned char *ptr = ares__buf_peek(labels.label[i], &len);
+
+ status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append(buf, ptr, len);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* If we are NOT jumping to another label, output terminator */
+ if (off == NULL) {
+ status = ares__buf_append_byte(buf, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+ }
+
+ /* Output name compression offset jump */
+ if (off != NULL) {
+ unsigned short u16 =
+ (unsigned short)0xC000 | (unsigned short)(off->idx & 0x3FFF);
+ status = ares__buf_append_be16(buf, u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* Store pointer for future jumps as long as its not an exact match for
+ * a prior entry */
+ if (list != NULL && (off == NULL || off->name_len != name_len) &&
+ name_len > 0) {
+ status = ares__nameoffset_create(list, name /* not truncated copy! */, pos);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares_dns_labels_free(&labels);
+ return status;
+}
+
+/* Reserved characters for names that need to be escaped */
+static ares_bool_t is_reservedch(int ch)
+{
+ switch (ch) {
+ case '"':
+ case '.':
+ case ';':
+ case '\\':
+ case '(':
+ case ')':
+ case '@':
+ case '$':
+ return ARES_TRUE;
+ default:
+ break;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__fetch_dnsname_into_buf(ares__buf_t *buf,
+ ares__buf_t *dest, size_t len,
+ ares_bool_t is_hostname)
+{
+ size_t remaining_len;
+ const unsigned char *ptr = ares__buf_peek(buf, &remaining_len);
+ ares_status_t status;
+ size_t i;
+
+ if (buf == NULL || len == 0 || remaining_len < len) {
+ return ARES_EBADRESP;
+ }
+
+ for (i = 0; i < len; i++) {
+ unsigned char c = ptr[i];
+
+ /* Hostnames have a very specific allowed character set. Anything outside
+ * of that (non-printable and reserved included) are disallowed */
+ if (is_hostname && !ares__is_hostnamech(c)) {
+ status = ARES_EBADRESP;
+ goto fail;
+ }
+
+ /* NOTE: dest may be NULL if the user is trying to skip the name. validation
+ * still occurs above. */
+ if (dest == NULL) {
+ continue;
+ }
+
+ /* Non-printable characters need to be output as \DDD */
+ if (!ares__isprint(c)) {
+ unsigned char escape[4];
+
+ escape[0] = '\\';
+ escape[1] = '0' + (c / 100);
+ escape[2] = '0' + ((c % 100) / 10);
+ escape[3] = '0' + (c % 10);
+
+ status = ares__buf_append(dest, escape, sizeof(escape));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ continue;
+ }
+
+ /* Reserved characters need to be escaped, otherwise normal */
+ if (is_reservedch(c)) {
+ status = ares__buf_append_byte(dest, '\\');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ status = ares__buf_append_byte(dest, c);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ares__buf_consume(buf, len);
+
+fail:
+ return status;
+}
+
+ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name,
+ ares_bool_t is_hostname)
+{
+ size_t save_offset = 0;
+ unsigned char c;
+ ares_status_t status;
+ ares__buf_t *namebuf = NULL;
+ size_t label_start = ares__buf_get_position(buf);
+
+ if (buf == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (name != NULL) {
+ namebuf = ares__buf_create();
+ if (namebuf == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ }
+
+ /* The compression scheme allows a domain name in a message to be
+ * represented as either:
+ *
+ * - a sequence of labels ending in a zero octet
+ * - a pointer
+ * - a sequence of labels ending with a pointer
+ */
+ while (1) {
+ /* Keep track of the minimum label starting position to prevent forward
+ * jumping */
+ if (label_start > ares__buf_get_position(buf)) {
+ label_start = ares__buf_get_position(buf);
+ }
+
+ status = ares__buf_fetch_bytes(buf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Pointer/Redirect */
+ if ((c & 0xc0) == 0xc0) {
+ /* The pointer takes the form of a two octet sequence:
+ *
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | 1 1| OFFSET |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ *
+ * The first two bits are ones. This allows a pointer to be distinguished
+ * from a label, since the label must begin with two zero bits because
+ * labels are restricted to 63 octets or less. (The 10 and 01
+ * combinations are reserved for future use.) The OFFSET field specifies
+ * an offset from the start of the message (i.e., the first octet of the
+ * ID field in the domain header). A zero offset specifies the first byte
+ * of the ID field, etc.
+ */
+ size_t offset = (size_t)((c & 0x3F) << 8);
+
+ /* Fetch second byte of the redirect length */
+ status = ares__buf_fetch_bytes(buf, &c, 1);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ offset |= ((size_t)c);
+
+ /* According to RFC 1035 4.1.4:
+ * In this scheme, an entire domain name or a list of labels at
+ * the end of a domain name is replaced with a pointer to a prior
+ * occurrence of the same name.
+ * Note the word "prior", meaning it must go backwards. This was
+ * confirmed via the ISC BIND code that it also prevents forward
+ * pointers.
+ */
+ if (offset >= label_start) {
+ status = ARES_EBADNAME;
+ goto fail;
+ }
+
+ /* First time we make a jump, save the current position */
+ if (save_offset == 0) {
+ save_offset = ares__buf_get_position(buf);
+ }
+
+ status = ares__buf_set_position(buf, offset);
+ if (status != ARES_SUCCESS) {
+ status = ARES_EBADNAME;
+ goto fail;
+ }
+
+ continue;
+ } else if ((c & 0xc0) != 0) {
+ /* 10 and 01 are reserved */
+ status = ARES_EBADNAME;
+ goto fail;
+ } else if (c == 0) {
+ /* termination via zero octet*/
+ break;
+ }
+
+ /* New label */
+
+ /* Labels are separated by periods */
+ if (ares__buf_len(namebuf) != 0 && name != NULL) {
+ status = ares__buf_append_byte(namebuf, '.');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ status = ares__fetch_dnsname_into_buf(buf, namebuf, c, is_hostname);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Restore offset read after first redirect/pointer as this is where the DNS
+ * message continues */
+ if (save_offset) {
+ ares__buf_set_position(buf, save_offset);
+ }
+
+ if (name != NULL) {
+ *name = ares__buf_finish_str(namebuf, NULL);
+ if (*name == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ /* We want badname response if we couldn't parse */
+ if (status == ARES_EBADRESP) {
+ status = ARES_EBADNAME;
+ }
+
+ ares__buf_destroy(namebuf);
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_parse.c b/contrib/libs/c-ares/src/lib/ares_dns_parse.c
new file mode 100644
index 0000000000..169fd5b63d
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_parse.c
@@ -0,0 +1,1255 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include <limits.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+static size_t ares_dns_rr_remaining_len(const ares__buf_t *buf, size_t orig_len,
+ size_t rdlength)
+{
+ size_t used_len = orig_len - ares__buf_len(buf);
+ if (used_len >= rdlength) {
+ return 0;
+ }
+ return rdlength - used_len;
+}
+
+static ares_status_t ares_dns_parse_and_set_dns_name(ares__buf_t *buf,
+ ares_bool_t is_hostname,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ char *name = NULL;
+
+ status = ares__dns_name_parse(buf, &name, is_hostname);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_str_own(rr, key, name);
+ if (status != ARES_SUCCESS) {
+ ares_free(name);
+ return status;
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_and_set_dns_str(
+ ares__buf_t *buf, size_t max_len, ares_bool_t allow_multiple,
+ ares_dns_rr_t *rr, ares_dns_rr_key_t key, ares_bool_t blank_allowed)
+{
+ ares_status_t status;
+ char *str = NULL;
+
+ status = ares__buf_parse_dns_str(buf, max_len, &str, allow_multiple);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (!blank_allowed && ares_strlen(str) == 0) {
+ ares_free(str);
+ return ARES_EBADRESP;
+ }
+
+ status = ares_dns_rr_set_str_own(rr, key, str);
+ if (status != ARES_SUCCESS) {
+ ares_free(str);
+ return status;
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t
+ ares_dns_parse_and_set_dns_binstr(ares__buf_t *buf, size_t max_len,
+ ares_bool_t allow_multiple,
+ ares_dns_rr_t *rr, ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned char *bin = NULL;
+ size_t bin_len = 0;
+
+ status =
+ ares__buf_parse_dns_binstr(buf, max_len, &bin, &bin_len, allow_multiple);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, key, bin, bin_len);
+ if (status != ARES_SUCCESS) {
+ ares_free(bin);
+ return status;
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_and_set_be32(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned int u32;
+
+ status = ares__buf_fetch_be32(buf, &u32);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_u32(rr, key, u32);
+}
+
+static ares_status_t ares_dns_parse_and_set_be16(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned short u16;
+
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_u16(rr, key, u16);
+}
+
+static ares_status_t ares_dns_parse_and_set_u8(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ ares_status_t status;
+ unsigned char u8;
+
+ status = ares__buf_fetch_bytes(buf, &u8, 1);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_u8(rr, key, u8);
+}
+
+static ares_status_t ares_dns_parse_rr_a(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ struct in_addr addr;
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_addr(rr, ARES_RR_A_ADDR, &addr);
+}
+
+static ares_status_t ares_dns_parse_rr_ns(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ (void)rdlength; /* Not needed */
+
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_NS_NSDNAME);
+}
+
+static ares_status_t ares_dns_parse_rr_cname(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ (void)rdlength; /* Not needed */
+
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_CNAME_CNAME);
+}
+
+static ares_status_t ares_dns_parse_rr_soa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ /* MNAME */
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_MNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RNAME */
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SOA_RNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERIAL */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_SERIAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REFRESH */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_REFRESH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RETRY */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_RETRY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXPIRE */
+ status = ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_EXPIRE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* MINIMUM */
+ return ares_dns_parse_and_set_be32(buf, rr, ARES_RR_SOA_MINIMUM);
+}
+
+static ares_status_t ares_dns_parse_rr_ptr(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ (void)rdlength; /* Not needed */
+
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_PTR_DNAME);
+}
+
+static ares_status_t ares_dns_parse_rr_hinfo(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ (void)rdlength; /* Not needed */
+
+ /* CPU */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_HINFO_CPU, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* OS */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_HINFO_OS, ARES_TRUE);
+
+ return status;
+}
+
+static ares_status_t ares_dns_parse_rr_mx(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ /* PREFERENCE */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_MX_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXCHANGE */
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_MX_EXCHANGE);
+}
+
+static ares_status_t ares_dns_parse_rr_txt(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ return ares_dns_parse_and_set_dns_binstr(buf, rdlength, ARES_TRUE, rr,
+ ARES_RR_TXT_DATA);
+}
+
+static ares_status_t ares_dns_parse_rr_aaaa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ struct ares_in6_addr addr;
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ status = ares__buf_fetch_bytes(buf, (unsigned char *)&addr, sizeof(addr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ares_dns_rr_set_addr6(rr, ARES_RR_AAAA_ADDR, &addr);
+}
+
+static ares_status_t ares_dns_parse_rr_srv(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+
+ (void)rdlength; /* Not needed */
+
+ /* PRIORITY */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PORT */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SRV_PORT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_SRV_TARGET);
+}
+
+static ares_status_t ares_dns_parse_rr_naptr(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ /* ORDER */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_ORDER);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PREFERENCE */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* FLAGS */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_NAPTR_FLAGS, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERVICES */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_NAPTR_SERVICES, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REGEXP */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_NAPTR_REGEXP, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REPLACEMENT */
+ return ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr,
+ ARES_RR_NAPTR_REPLACEMENT);
+}
+
+static ares_status_t ares_dns_parse_rr_opt(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength,
+ unsigned short raw_class,
+ unsigned int raw_ttl)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+ unsigned short rcode_high;
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE, raw_class);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* First 8 bits of TTL are an extended RCODE, and they go in the higher order
+ * after the original 4-bit rcode */
+ rcode_high = (unsigned short)((raw_ttl >> 20) & 0x0FF0);
+ rr->parent->raw_rcode |= rcode_high;
+
+ status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION,
+ (unsigned char)(raw_ttl >> 16) & 0xFF);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS,
+ (unsigned short)(raw_ttl & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse options */
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
+ unsigned short opt = 0;
+ unsigned short len = 0;
+ unsigned char *val = NULL;
+
+ /* Fetch be16 option */
+ status = ares__buf_fetch_be16(buf, &opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Fetch be16 length */
+ status = ares__buf_fetch_be16(buf, &len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len) {
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_OPT_OPTIONS, opt, val, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_tlsa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+ size_t len;
+ unsigned char *data;
+
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_SELECTOR);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_TLSA_MATCH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
+ if (len == 0) {
+ return ARES_EBADRESP;
+ }
+
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_FALSE, &data);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_TLSA_DATA, data, len);
+ if (status != ARES_SUCCESS) {
+ ares_free(data);
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_svcb(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_SVCB_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_SVCB_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse params */
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
+ unsigned short opt = 0;
+ unsigned short len = 0;
+ unsigned char *val = NULL;
+
+ /* Fetch be16 option */
+ status = ares__buf_fetch_be16(buf, &opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Fetch be16 length */
+ status = ares__buf_fetch_be16(buf, &len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len) {
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_SVCB_PARAMS, opt, val, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_https(ares__buf_t *buf,
+ ares_dns_rr_t *rr, size_t rdlength)
+{
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_HTTPS_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status =
+ ares_dns_parse_and_set_dns_name(buf, ARES_FALSE, rr, ARES_RR_HTTPS_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse params */
+ while (ares_dns_rr_remaining_len(buf, orig_len, rdlength)) {
+ unsigned short opt = 0;
+ unsigned short len = 0;
+ unsigned char *val = NULL;
+
+ /* Fetch be16 option */
+ status = ares__buf_fetch_be16(buf, &opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Fetch be16 length */
+ status = ares__buf_fetch_be16(buf, &len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len) {
+ status = ares__buf_fetch_bytes_dup(buf, len, ARES_TRUE, &val);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ status = ares_dns_rr_set_opt_own(rr, ARES_RR_HTTPS_PARAMS, opt, val, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_uri(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ char *name = NULL;
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+ size_t remaining_len;
+
+ /* PRIORITY */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_parse_and_set_be16(buf, rr, ARES_RR_URI_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET -- not in string format, rest of buffer, required to be
+ * non-zero length */
+ remaining_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
+ if (remaining_len == 0) {
+ status = ARES_EBADRESP;
+ return status;
+ }
+
+ /* NOTE: Not in DNS string format */
+ status = ares__buf_fetch_str_dup(buf, remaining_len, &name);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_str_own(rr, ARES_RR_URI_TARGET, name);
+ if (status != ARES_SUCCESS) {
+ ares_free(name);
+ return status;
+ }
+ name = NULL;
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_caa(ares__buf_t *buf, ares_dns_rr_t *rr,
+ size_t rdlength)
+{
+ unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_status_t status;
+ size_t orig_len = ares__buf_len(buf);
+
+ /* CRITICAL */
+ status = ares_dns_parse_and_set_u8(buf, rr, ARES_RR_CAA_CRITICAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Tag */
+ status = ares_dns_parse_and_set_dns_str(
+ buf, ares_dns_rr_remaining_len(buf, orig_len, rdlength), ARES_FALSE, rr,
+ ARES_RR_CAA_TAG, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value - binary! (remaining buffer */
+ data_len = ares_dns_rr_remaining_len(buf, orig_len, rdlength);
+ if (data_len == 0) {
+ status = ARES_EBADRESP;
+ return status;
+ }
+ status = ares__buf_fetch_bytes_dup(buf, data_len, ARES_TRUE, &data);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_CAA_VALUE, data, data_len);
+ if (status != ARES_SUCCESS) {
+ ares_free(data);
+ return status;
+ }
+ data = NULL;
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_rr_raw_rr(ares__buf_t *buf,
+ ares_dns_rr_t *rr,
+ size_t rdlength,
+ unsigned short raw_type)
+{
+ ares_status_t status;
+ unsigned char *bytes = NULL;
+
+ if (rdlength == 0) {
+ return ARES_SUCCESS;
+ }
+
+ status = ares__buf_fetch_bytes_dup(buf, rdlength, ARES_FALSE, &bytes);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Can't fail */
+ status = ares_dns_rr_set_u16(rr, ARES_RR_RAW_RR_TYPE, raw_type);
+ if (status != ARES_SUCCESS) {
+ ares_free(bytes);
+ return status;
+ }
+
+ status = ares_dns_rr_set_bin_own(rr, ARES_RR_RAW_RR_DATA, bytes, rdlength);
+ if (status != ARES_SUCCESS) {
+ ares_free(bytes);
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_parse_header(ares__buf_t *buf, unsigned int flags,
+ ares_dns_record_t **dnsrec,
+ unsigned short *qdcount,
+ unsigned short *ancount,
+ unsigned short *nscount,
+ unsigned short *arcount)
+{
+ ares_status_t status = ARES_EBADRESP;
+ unsigned short u16;
+ unsigned short id;
+ unsigned short dns_flags = 0;
+ ares_dns_opcode_t opcode;
+ unsigned short rcode;
+
+ (void)flags; /* currently unused */
+
+ if (buf == NULL || dnsrec == NULL || qdcount == NULL || ancount == NULL ||
+ nscount == NULL || arcount == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ /*
+ * RFC 1035 4.1.1. Header section format.
+ * and Updated by RFC 2065 to add AD and CD bits.
+ * 1 1 1 1 1 1
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | ID |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | QDCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | ANCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | NSCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | ARCOUNT |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ */
+
+ /* ID */
+ status = ares__buf_fetch_be16(buf, &id);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Flags */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* QR */
+ if (u16 & 0x8000) {
+ dns_flags |= ARES_FLAG_QR;
+ }
+
+ /* OPCODE */
+ opcode = (u16 >> 11) & 0xf;
+
+ /* AA */
+ if (u16 & 0x400) {
+ dns_flags |= ARES_FLAG_AA;
+ }
+
+ /* TC */
+ if (u16 & 0x200) {
+ dns_flags |= ARES_FLAG_TC;
+ }
+
+ /* RD */
+ if (u16 & 0x100) {
+ dns_flags |= ARES_FLAG_RD;
+ }
+
+ /* RA */
+ if (u16 & 0x80) {
+ dns_flags |= ARES_FLAG_RA;
+ }
+
+ /* Z -- unused */
+
+ /* AD */
+ if (u16 & 0x20) {
+ dns_flags |= ARES_FLAG_AD;
+ }
+
+ /* CD */
+ if (u16 & 0x10) {
+ dns_flags |= ARES_FLAG_CD;
+ }
+
+ /* RCODE */
+ rcode = u16 & 0xf;
+
+ /* QDCOUNT */
+ status = ares__buf_fetch_be16(buf, qdcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* ANCOUNT */
+ status = ares__buf_fetch_be16(buf, ancount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* NSCOUNT */
+ status = ares__buf_fetch_be16(buf, nscount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* ARCOUNT */
+ status = ares__buf_fetch_be16(buf, arcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares_dns_record_create(dnsrec, id, dns_flags, opcode,
+ ARES_RCODE_NOERROR /* Temporary */);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ (*dnsrec)->raw_rcode = rcode;
+
+ if (*ancount > 0) {
+ status =
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ANSWER, *ancount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (*nscount > 0) {
+ status =
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_AUTHORITY, *nscount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (*arcount > 0) {
+ status =
+ ares_dns_record_rr_prealloc(*dnsrec, ARES_SECTION_ADDITIONAL, *arcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ *qdcount = 0;
+ *ancount = 0;
+ *nscount = 0;
+ *arcount = 0;
+
+ return status;
+}
+
+static ares_status_t
+ ares_dns_parse_rr_data(ares__buf_t *buf, size_t rdlength, ares_dns_rr_t *rr,
+ ares_dns_rec_type_t type, unsigned short raw_type,
+ unsigned short raw_class, unsigned int raw_ttl)
+{
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ return ares_dns_parse_rr_a(buf, rr, rdlength);
+ case ARES_REC_TYPE_NS:
+ return ares_dns_parse_rr_ns(buf, rr, rdlength);
+ case ARES_REC_TYPE_CNAME:
+ return ares_dns_parse_rr_cname(buf, rr, rdlength);
+ case ARES_REC_TYPE_SOA:
+ return ares_dns_parse_rr_soa(buf, rr, rdlength);
+ case ARES_REC_TYPE_PTR:
+ return ares_dns_parse_rr_ptr(buf, rr, rdlength);
+ case ARES_REC_TYPE_HINFO:
+ return ares_dns_parse_rr_hinfo(buf, rr, rdlength);
+ case ARES_REC_TYPE_MX:
+ return ares_dns_parse_rr_mx(buf, rr, rdlength);
+ case ARES_REC_TYPE_TXT:
+ return ares_dns_parse_rr_txt(buf, rr, rdlength);
+ case ARES_REC_TYPE_AAAA:
+ return ares_dns_parse_rr_aaaa(buf, rr, rdlength);
+ case ARES_REC_TYPE_SRV:
+ return ares_dns_parse_rr_srv(buf, rr, rdlength);
+ case ARES_REC_TYPE_NAPTR:
+ return ares_dns_parse_rr_naptr(buf, rr, rdlength);
+ case ARES_REC_TYPE_ANY:
+ return ARES_EBADRESP;
+ case ARES_REC_TYPE_OPT:
+ return ares_dns_parse_rr_opt(buf, rr, rdlength, raw_class, raw_ttl);
+ case ARES_REC_TYPE_TLSA:
+ return ares_dns_parse_rr_tlsa(buf, rr, rdlength);
+ case ARES_REC_TYPE_SVCB:
+ return ares_dns_parse_rr_svcb(buf, rr, rdlength);
+ case ARES_REC_TYPE_HTTPS:
+ return ares_dns_parse_rr_https(buf, rr, rdlength);
+ case ARES_REC_TYPE_URI:
+ return ares_dns_parse_rr_uri(buf, rr, rdlength);
+ case ARES_REC_TYPE_CAA:
+ return ares_dns_parse_rr_caa(buf, rr, rdlength);
+ case ARES_REC_TYPE_RAW_RR:
+ return ares_dns_parse_rr_raw_rr(buf, rr, rdlength, raw_type);
+ }
+ return ARES_EFORMERR;
+}
+
+static ares_status_t ares_dns_parse_qd(ares__buf_t *buf,
+ ares_dns_record_t *dnsrec)
+{
+ char *name = NULL;
+ unsigned short u16;
+ ares_status_t status;
+ ares_dns_rec_type_t type;
+ ares_dns_class_t qclass;
+ /* The question section is used to carry the "question" in most queries,
+ * i.e., the parameters that define what is being asked. The section
+ * contains QDCOUNT (usually 1) entries, each of the following format:
+ * 1 1 1 1 1 1
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | |
+ * / QNAME /
+ * / /
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | QTYPE |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | QCLASS |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ */
+
+ /* Name */
+ status = ares__dns_name_parse(buf, &name, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Type */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ type = u16;
+
+ /* Class */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ qclass = u16;
+
+ /* Add question */
+ status = ares_dns_record_query_add(dnsrec, name, type, qclass);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares_free(name);
+ return status;
+}
+
+static ares_status_t ares_dns_parse_rr(ares__buf_t *buf, unsigned int flags,
+ ares_dns_section_t sect,
+ ares_dns_record_t *dnsrec)
+{
+ char *name = NULL;
+ unsigned short u16;
+ unsigned short raw_type;
+ ares_status_t status;
+ ares_dns_rec_type_t type;
+ ares_dns_class_t qclass;
+ unsigned int ttl;
+ size_t rdlength;
+ ares_dns_rr_t *rr = NULL;
+ size_t remaining_len = 0;
+ size_t processed_len = 0;
+ ares_bool_t namecomp;
+
+ /* All RRs have the same top level format shown below:
+ * 1 1 1 1 1 1
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | |
+ * / /
+ * / NAME /
+ * | |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | TYPE |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | CLASS |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | TTL |
+ * | |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ * | RDLENGTH |
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
+ * / RDATA /
+ * / /
+ * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+ */
+
+ /* Name */
+ status = ares__dns_name_parse(buf, &name, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Type */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ type = u16;
+ raw_type = u16; /* Only used for raw rr data */
+
+ /* Class */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ qclass = u16;
+
+ /* TTL */
+ status = ares__buf_fetch_be32(buf, &ttl);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Length */
+ status = ares__buf_fetch_be16(buf, &u16);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ rdlength = u16;
+
+ if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+
+ namecomp = ares_dns_rec_type_allow_name_compression(type);
+ if (sect == ARES_SECTION_ANSWER &&
+ (flags &
+ (namecomp ? ARES_DNS_PARSE_AN_BASE_RAW : ARES_DNS_PARSE_AN_EXT_RAW))) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+ if (sect == ARES_SECTION_AUTHORITY &&
+ (flags &
+ (namecomp ? ARES_DNS_PARSE_NS_BASE_RAW : ARES_DNS_PARSE_NS_EXT_RAW))) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+ if (sect == ARES_SECTION_ADDITIONAL &&
+ (flags &
+ (namecomp ? ARES_DNS_PARSE_AR_BASE_RAW : ARES_DNS_PARSE_AR_EXT_RAW))) {
+ type = ARES_REC_TYPE_RAW_RR;
+ }
+
+ /* Pull into another buffer for safety */
+ if (rdlength > ares__buf_len(buf)) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
+
+ /* Add the base rr */
+ status =
+ ares_dns_record_rr_add(&rr, dnsrec, sect, name, type,
+ type == ARES_REC_TYPE_OPT ? ARES_CLASS_IN : qclass,
+ type == ARES_REC_TYPE_OPT ? 0 : ttl);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Record the current remaining length in the buffer so we can tell how
+ * much was processed */
+ remaining_len = ares__buf_len(buf);
+
+ /* Fill in the data for the rr */
+ status = ares_dns_parse_rr_data(buf, rdlength, rr, type, raw_type,
+ (unsigned short)qclass, ttl);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Determine how many bytes were processed */
+ processed_len = remaining_len - ares__buf_len(buf);
+
+ /* If too many bytes were processed, error! */
+ if (processed_len > rdlength) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
+
+ /* If too few bytes were processed, consume the unprocessed data for this
+ * record as the parser may not have wanted/needed to use it */
+ if (processed_len < rdlength) {
+ ares__buf_consume(buf, rdlength - processed_len);
+ }
+
+
+done:
+ ares_free(name);
+ return status;
+}
+
+static ares_status_t ares_dns_parse_buf(ares__buf_t *buf, unsigned int flags,
+ ares_dns_record_t **dnsrec)
+{
+ ares_status_t status;
+ unsigned short qdcount;
+ unsigned short ancount;
+ unsigned short nscount;
+ unsigned short arcount;
+ unsigned short i;
+
+ if (buf == NULL || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Maximum DNS packet size is 64k, even over TCP */
+ if (ares__buf_len(buf) > 0xFFFF) {
+ return ARES_EFORMERR;
+ }
+
+ /* All communications inside of the domain protocol are carried in a single
+ * format called a message. The top level format of message is divided
+ * into 5 sections (some of which are empty in certain cases) shown below:
+ *
+ * +---------------------+
+ * | Header |
+ * +---------------------+
+ * | Question | the question for the name server
+ * +---------------------+
+ * | Answer | RRs answering the question
+ * +---------------------+
+ * | Authority | RRs pointing toward an authority
+ * +---------------------+
+ * | Additional | RRs holding additional information
+ * +---------------------+
+ */
+
+ /* Parse header */
+ status = ares_dns_parse_header(buf, flags, dnsrec, &qdcount, &ancount,
+ &nscount, &arcount);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Must have questions */
+ if (qdcount == 0) {
+ status = ARES_EBADRESP;
+ goto fail;
+ }
+
+ /* XXX: this should be controlled by a flag in case we want to allow
+ * multiple questions. I think mDNS allows this */
+ if (qdcount > 1) {
+ status = ARES_EBADRESP;
+ goto fail;
+ }
+
+ /* Parse questions */
+ for (i = 0; i < qdcount; i++) {
+ status = ares_dns_parse_qd(buf, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Parse Answers */
+ for (i = 0; i < ancount; i++) {
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ANSWER, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Parse Authority */
+ for (i = 0; i < nscount; i++) {
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_AUTHORITY, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Parse Additional */
+ for (i = 0; i < arcount; i++) {
+ status = ares_dns_parse_rr(buf, flags, ARES_SECTION_ADDITIONAL, *dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ /* Finalize rcode now that if we have OPT it is processed */
+ if (!ares_dns_rcode_isvalid((*dnsrec)->raw_rcode)) {
+ (*dnsrec)->rcode = ARES_RCODE_SERVFAIL;
+ } else {
+ (*dnsrec)->rcode = (ares_dns_rcode_t)(*dnsrec)->raw_rcode;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ return status;
+}
+
+ares_status_t ares_dns_parse(const unsigned char *buf, size_t buf_len,
+ unsigned int flags, ares_dns_record_t **dnsrec)
+{
+ ares__buf_t *parser = NULL;
+ ares_status_t status;
+
+ if (buf == NULL || buf_len == 0 || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ parser = ares__buf_create_const(buf, buf_len);
+ if (parser == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares_dns_parse_buf(parser, flags, dnsrec);
+ ares__buf_destroy(parser);
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_private.h b/contrib/libs/c-ares/src/lib/ares_dns_private.h
new file mode 100644
index 0000000000..3af4b3c992
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_private.h
@@ -0,0 +1,263 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES_DNS_PRIVATE_H
+#define __ARES_DNS_PRIVATE_H
+
+ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type);
+ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode);
+ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode);
+ares_bool_t ares_dns_flags_arevalid(unsigned short flags);
+ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type,
+ ares_bool_t is_query);
+ares_bool_t ares_dns_class_isvalid(ares_dns_class_t qclass,
+ ares_bool_t is_query);
+ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect);
+ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, char *val);
+ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned char *val,
+ size_t len);
+ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned short opt,
+ unsigned char *val, size_t val_len);
+ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t cnt);
+ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec);
+void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec,
+ unsigned int ttl_decrement);
+
+/*! Create a DNS record object for a query. The arguments are the same as
+ * those for ares_create_query().
+ *
+ * \param[out] dnsrec DNS record object to create.
+ * \param[in] name NUL-terminated name for the query.
+ * \param[in] dnsclass Class for the query.
+ * \param[in] type Type for the query.
+ * \param[in] id Identifier for the query.
+ * \param[in] flags Flags for the query.
+ * \param[in] max_udp_size Maximum size of a UDP packet for EDNS.
+ * \return ARES_SUCCESS on success, otherwise an error code.
+ */
+ares_status_t
+ ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type, unsigned short id,
+ ares_dns_flags_t flags, size_t max_udp_size);
+
+/*! Convert the RCODE and ANCOUNT from a DNS query reply into a status code.
+ *
+ * \param[in] rcode The RCODE from the reply.
+ * \param[in] ancount The ANCOUNT from the reply.
+ * \return An appropriate status code.
+ */
+ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
+ size_t ancount);
+
+struct ares_dns_qd {
+ char *name;
+ ares_dns_rec_type_t qtype;
+ ares_dns_class_t qclass;
+};
+
+typedef struct {
+ struct in_addr addr;
+} ares__dns_a_t;
+
+typedef struct {
+ char *nsdname;
+} ares__dns_ns_t;
+
+typedef struct {
+ char *cname;
+} ares__dns_cname_t;
+
+typedef struct {
+ char *mname;
+ char *rname;
+ unsigned int serial;
+ unsigned int refresh;
+ unsigned int retry;
+ unsigned int expire;
+ unsigned int minimum;
+} ares__dns_soa_t;
+
+typedef struct {
+ char *dname;
+} ares__dns_ptr_t;
+
+typedef struct {
+ char *cpu;
+ char *os;
+} ares__dns_hinfo_t;
+
+typedef struct {
+ unsigned short preference;
+ char *exchange;
+} ares__dns_mx_t;
+
+typedef struct {
+ char *data;
+ size_t data_len;
+} ares__dns_txt_t;
+
+typedef struct {
+ struct ares_in6_addr addr;
+} ares__dns_aaaa_t;
+
+typedef struct {
+ unsigned short priority;
+ unsigned short weight;
+ unsigned short port;
+ char *target;
+} ares__dns_srv_t;
+
+typedef struct {
+ unsigned short order;
+ unsigned short preference;
+ char *flags;
+ char *services;
+ char *regexp;
+ char *replacement;
+} ares__dns_naptr_t;
+
+typedef struct {
+ unsigned short opt;
+ unsigned char *val;
+ size_t val_len;
+} ares__dns_optval_t;
+
+typedef struct {
+ ares__dns_optval_t *optval; /*!< Attribute/value pairs */
+ size_t cnt; /*!< Count of Attribute/Value pairs */
+ size_t alloc; /*!< Allocated count of attribute/value
+ * pairs */
+} ares__dns_options_t;
+
+typedef struct {
+ unsigned short udp_size; /*!< taken from class */
+ unsigned char version; /*!< taken from bits 8-16 of ttl */
+ unsigned short flags; /*!< Flags, remaining 16 bits, though only
+ * 1 currently defined */
+ ares__dns_options_t *options; /*!< Attribute/Value pairs */
+} ares__dns_opt_t;
+
+typedef struct {
+ unsigned char cert_usage;
+ unsigned char selector;
+ unsigned char match;
+ unsigned char *data;
+ size_t data_len;
+} ares__dns_tlsa_t;
+
+typedef struct {
+ unsigned short priority;
+ char *target;
+ ares__dns_options_t *params;
+} ares__dns_svcb_t;
+
+typedef struct {
+ unsigned short priority;
+ unsigned short weight;
+ char *target;
+} ares__dns_uri_t;
+
+typedef struct {
+ unsigned char critical;
+ char *tag;
+ unsigned char *value;
+ size_t value_len;
+} ares__dns_caa_t;
+
+/*! Raw, unparsed RR data */
+typedef struct {
+ unsigned short type; /*!< Not ares_rec_type_t because it likely isn't one
+ * of those values since it wasn't parsed */
+ unsigned char *data; /*!< Raw RR data */
+ size_t length; /*!< Length of raw RR data */
+} ares__dns_raw_rr_t;
+
+/*! DNS RR data structure */
+struct ares_dns_rr {
+ ares_dns_record_t *parent;
+ char *name;
+ ares_dns_rec_type_t type;
+ ares_dns_class_t rclass;
+ unsigned int ttl;
+
+ union {
+ ares__dns_a_t a;
+ ares__dns_ns_t ns;
+ ares__dns_cname_t cname;
+ ares__dns_soa_t soa;
+ ares__dns_ptr_t ptr;
+ ares__dns_hinfo_t hinfo;
+ ares__dns_mx_t mx;
+ ares__dns_txt_t txt;
+ ares__dns_aaaa_t aaaa;
+ ares__dns_srv_t srv;
+ ares__dns_naptr_t naptr;
+ ares__dns_opt_t opt;
+ ares__dns_tlsa_t tlsa;
+ ares__dns_svcb_t svcb;
+ ares__dns_svcb_t https; /*!< https is a type of svcb, so this is right */
+ ares__dns_uri_t uri;
+ ares__dns_caa_t caa;
+ ares__dns_raw_rr_t raw_rr;
+ } r;
+};
+
+/*! DNS data structure */
+struct ares_dns_record {
+ unsigned short id; /*!< DNS query id */
+ unsigned short flags; /*!< One or more ares_dns_flags_t */
+ ares_dns_opcode_t opcode; /*!< DNS Opcode */
+ ares_dns_rcode_t rcode; /*!< DNS RCODE */
+ unsigned short raw_rcode; /*!< Raw rcode, used to ultimately form real
+ * rcode after reading OPT record if it
+ * exists */
+ unsigned int ttl_decrement; /*!< Special case to apply to writing out
+ * this record, where it will decrement
+ * the ttl of any resource records by
+ * this amount. Used for cache */
+
+ ares_dns_qd_t *qd;
+ size_t qdcount;
+ size_t qdalloc;
+
+ ares_dns_rr_t *an;
+ size_t ancount;
+ size_t analloc;
+
+ ares_dns_rr_t *ns;
+ size_t nscount;
+ size_t nsalloc;
+
+ ares_dns_rr_t *ar;
+ size_t arcount;
+ size_t aralloc;
+};
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_record.c b/contrib/libs/c-ares/src/lib/ares_dns_record.c
new file mode 100644
index 0000000000..ec7f7e7343
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_record.c
@@ -0,0 +1,1449 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include <limits.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+
+ares_status_t ares_dns_record_create(ares_dns_record_t **dnsrec,
+ unsigned short id, unsigned short flags,
+ ares_dns_opcode_t opcode,
+ ares_dns_rcode_t rcode)
+{
+ if (dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ if (!ares_dns_opcode_isvalid(opcode) || !ares_dns_rcode_isvalid(rcode) ||
+ !ares_dns_flags_arevalid(flags)) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = ares_malloc_zero(sizeof(**dnsrec));
+ if (*dnsrec == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ (*dnsrec)->id = id;
+ (*dnsrec)->flags = flags;
+ (*dnsrec)->opcode = opcode;
+ (*dnsrec)->rcode = rcode;
+ return ARES_SUCCESS;
+}
+
+unsigned short ares_dns_record_get_id(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->id;
+}
+
+unsigned short ares_dns_record_get_flags(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->flags;
+}
+
+ares_dns_opcode_t ares_dns_record_get_opcode(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->opcode;
+}
+
+ares_dns_rcode_t ares_dns_record_get_rcode(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->rcode;
+}
+
+static void ares__dns_options_free(ares__dns_options_t *options)
+{
+ size_t i;
+
+ if (options == NULL) {
+ return;
+ }
+
+ for (i = 0; i < options->cnt; i++) {
+ ares_free(options->optval[i].val);
+ }
+ ares_free(options->optval);
+ ares_free(options);
+}
+
+static void ares__dns_rr_free(ares_dns_rr_t *rr)
+{
+ ares_free(rr->name);
+
+ switch (rr->type) {
+ case ARES_REC_TYPE_A:
+ case ARES_REC_TYPE_AAAA:
+ case ARES_REC_TYPE_ANY:
+ /* Nothing to free */
+ break;
+
+ case ARES_REC_TYPE_NS:
+ ares_free(rr->r.ns.nsdname);
+ break;
+
+ case ARES_REC_TYPE_CNAME:
+ ares_free(rr->r.cname.cname);
+ break;
+
+ case ARES_REC_TYPE_SOA:
+ ares_free(rr->r.soa.mname);
+ ares_free(rr->r.soa.rname);
+ break;
+
+ case ARES_REC_TYPE_PTR:
+ ares_free(rr->r.ptr.dname);
+ break;
+
+ case ARES_REC_TYPE_HINFO:
+ ares_free(rr->r.hinfo.cpu);
+ ares_free(rr->r.hinfo.os);
+ break;
+
+ case ARES_REC_TYPE_MX:
+ ares_free(rr->r.mx.exchange);
+ break;
+
+ case ARES_REC_TYPE_TXT:
+ ares_free(rr->r.txt.data);
+ break;
+
+ case ARES_REC_TYPE_SRV:
+ ares_free(rr->r.srv.target);
+ break;
+
+ case ARES_REC_TYPE_NAPTR:
+ ares_free(rr->r.naptr.flags);
+ ares_free(rr->r.naptr.services);
+ ares_free(rr->r.naptr.regexp);
+ ares_free(rr->r.naptr.replacement);
+ break;
+
+ case ARES_REC_TYPE_OPT:
+ ares__dns_options_free(rr->r.opt.options);
+ break;
+
+ case ARES_REC_TYPE_TLSA:
+ ares_free(rr->r.tlsa.data);
+ break;
+
+ case ARES_REC_TYPE_SVCB:
+ ares_free(rr->r.svcb.target);
+ ares__dns_options_free(rr->r.svcb.params);
+ break;
+
+ case ARES_REC_TYPE_HTTPS:
+ ares_free(rr->r.https.target);
+ ares__dns_options_free(rr->r.https.params);
+ break;
+
+ case ARES_REC_TYPE_URI:
+ ares_free(rr->r.uri.target);
+ break;
+
+ case ARES_REC_TYPE_CAA:
+ ares_free(rr->r.caa.tag);
+ ares_free(rr->r.caa.value);
+ break;
+
+ case ARES_REC_TYPE_RAW_RR:
+ ares_free(rr->r.raw_rr.data);
+ break;
+ }
+}
+
+void ares_dns_record_destroy(ares_dns_record_t *dnsrec)
+{
+ size_t i;
+
+ if (dnsrec == NULL) {
+ return;
+ }
+
+ /* Free questions */
+ for (i = 0; i < dnsrec->qdcount; i++) {
+ ares_free(dnsrec->qd[i].name);
+ }
+ ares_free(dnsrec->qd);
+
+ /* Free answers */
+ for (i = 0; i < dnsrec->ancount; i++) {
+ ares__dns_rr_free(&dnsrec->an[i]);
+ }
+ ares_free(dnsrec->an);
+
+ /* Free authority */
+ for (i = 0; i < dnsrec->nscount; i++) {
+ ares__dns_rr_free(&dnsrec->ns[i]);
+ }
+ ares_free(dnsrec->ns);
+
+ /* Free additional */
+ for (i = 0; i < dnsrec->arcount; i++) {
+ ares__dns_rr_free(&dnsrec->ar[i]);
+ }
+ ares_free(dnsrec->ar);
+
+ ares_free(dnsrec);
+}
+
+size_t ares_dns_record_query_cnt(const ares_dns_record_t *dnsrec)
+{
+ if (dnsrec == NULL) {
+ return 0;
+ }
+ return dnsrec->qdcount;
+}
+
+ares_status_t ares_dns_record_query_add(ares_dns_record_t *dnsrec,
+ const char *name,
+ ares_dns_rec_type_t qtype,
+ ares_dns_class_t qclass)
+{
+ ares_dns_qd_t *temp = NULL;
+ size_t idx;
+
+ if (dnsrec == NULL || name == NULL ||
+ !ares_dns_rec_type_isvalid(qtype, ARES_TRUE) ||
+ !ares_dns_class_isvalid(qclass, ARES_TRUE)) {
+ return ARES_EFORMERR;
+ }
+
+ if (dnsrec->qdcount >= dnsrec->qdalloc) {
+ size_t alloc_cnt = ares__round_up_pow2(dnsrec->qdcount + 1);
+
+ temp = ares_realloc_zero(dnsrec->qd, sizeof(*temp) * (dnsrec->qdalloc),
+ sizeof(*temp) * alloc_cnt);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ dnsrec->qdalloc = alloc_cnt;
+ dnsrec->qd = temp;
+ }
+
+ idx = dnsrec->qdcount;
+
+ dnsrec->qd[idx].name = ares_strdup(name);
+ if (dnsrec->qd[idx].name == NULL) {
+ /* No need to clean up anything */
+ return ARES_ENOMEM;
+ }
+
+ dnsrec->qd[idx].qtype = qtype;
+ dnsrec->qd[idx].qclass = qclass;
+ dnsrec->qdcount++;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_set_name(ares_dns_record_t *dnsrec,
+ size_t idx, const char *name)
+{
+ char *orig_name = NULL;
+
+ if (dnsrec == NULL || idx >= dnsrec->qdcount || name == NULL) {
+ return ARES_EFORMERR;
+ }
+ orig_name = dnsrec->qd[idx].name;
+ dnsrec->qd[idx].name = ares_strdup(name);
+ if (dnsrec->qd[idx].name == NULL) {
+ dnsrec->qd[idx].name = orig_name;
+ return ARES_ENOMEM;
+ }
+
+ ares_free(orig_name);
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_set_type(ares_dns_record_t *dnsrec,
+ size_t idx,
+ ares_dns_rec_type_t qtype)
+{
+ if (dnsrec == NULL || idx >= dnsrec->qdcount ||
+ !ares_dns_rec_type_isvalid(qtype, ARES_TRUE)) {
+ return ARES_EFORMERR;
+ }
+
+ dnsrec->qd[idx].qtype = qtype;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_query_get(const ares_dns_record_t *dnsrec,
+ size_t idx, const char **name,
+ ares_dns_rec_type_t *qtype,
+ ares_dns_class_t *qclass)
+{
+ if (dnsrec == NULL || idx >= dnsrec->qdcount) {
+ return ARES_EFORMERR;
+ }
+
+ if (name != NULL) {
+ *name = dnsrec->qd[idx].name;
+ }
+
+ if (qtype != NULL) {
+ *qtype = dnsrec->qd[idx].qtype;
+ }
+
+ if (qclass != NULL) {
+ *qclass = dnsrec->qd[idx].qclass;
+ }
+
+ return ARES_SUCCESS;
+}
+
+size_t ares_dns_record_rr_cnt(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect)
+{
+ if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) {
+ return 0;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ return dnsrec->ancount;
+ case ARES_SECTION_AUTHORITY:
+ return dnsrec->nscount;
+ case ARES_SECTION_ADDITIONAL:
+ return dnsrec->arcount;
+ }
+
+ return 0;
+}
+
+ares_status_t ares_dns_record_rr_prealloc(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t cnt)
+{
+ ares_dns_rr_t **rr_ptr = NULL;
+ size_t *rr_alloc = NULL;
+ ares_dns_rr_t *temp = NULL;
+
+ if (dnsrec == NULL || cnt == 0 || !ares_dns_section_isvalid(sect)) {
+ return ARES_EFORMERR;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = &dnsrec->an;
+ rr_alloc = &dnsrec->analloc;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = &dnsrec->ns;
+ rr_alloc = &dnsrec->nsalloc;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = &dnsrec->ar;
+ rr_alloc = &dnsrec->aralloc;
+ break;
+ }
+
+ /* Round up cnt to a power of 2 */
+ cnt = ares__round_up_pow2(cnt);
+
+ /* Already have that */
+ if (cnt <= *rr_alloc) {
+ return ARES_SUCCESS;
+ }
+
+ temp = ares_realloc_zero(*rr_ptr, sizeof(*temp) * (*rr_alloc),
+ sizeof(*temp) * cnt);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ *rr_alloc = cnt;
+ *rr_ptr = temp;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_rr_add(ares_dns_rr_t **rr_out,
+ ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, const char *name,
+ ares_dns_rec_type_t type,
+ ares_dns_class_t rclass, unsigned int ttl)
+{
+ ares_dns_rr_t **rr_ptr = NULL;
+ ares_dns_rr_t *rr = NULL;
+ size_t *rr_len = NULL;
+ ares_status_t status;
+ size_t idx;
+
+ if (dnsrec == NULL || name == NULL || rr_out == NULL ||
+ !ares_dns_section_isvalid(sect) ||
+ !ares_dns_rec_type_isvalid(type, ARES_FALSE) ||
+ !ares_dns_class_isvalid(rclass, ARES_FALSE)) {
+ return ARES_EFORMERR;
+ }
+
+ *rr_out = NULL;
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = &dnsrec->an;
+ rr_len = &dnsrec->ancount;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = &dnsrec->ns;
+ rr_len = &dnsrec->nscount;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = &dnsrec->ar;
+ rr_len = &dnsrec->arcount;
+ break;
+ }
+
+ status = ares_dns_record_rr_prealloc(dnsrec, sect, *rr_len + 1);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ idx = *rr_len;
+ rr = &(*rr_ptr)[idx];
+
+ rr->name = ares_strdup(name);
+ if (rr->name == NULL) {
+ /* No need to clean up anything */
+ return ARES_ENOMEM;
+ }
+
+ rr->parent = dnsrec;
+ rr->type = type;
+ rr->rclass = rclass;
+ rr->ttl = ttl;
+ (*rr_len)++;
+
+ *rr_out = rr;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_record_rr_del(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx)
+{
+ ares_dns_rr_t *rr_ptr = NULL;
+ size_t *rr_len = NULL;
+ size_t cnt_after;
+
+ if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) {
+ return ARES_EFORMERR;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = dnsrec->an;
+ rr_len = &dnsrec->ancount;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = dnsrec->ns;
+ rr_len = &dnsrec->nscount;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = dnsrec->ar;
+ rr_len = &dnsrec->arcount;
+ break;
+ }
+
+ if (idx >= *rr_len) {
+ return ARES_EFORMERR;
+ }
+
+ ares__dns_rr_free(&rr_ptr[idx]);
+
+ cnt_after = *rr_len - idx - 1;
+
+ if (cnt_after) {
+ memmove(&rr_ptr[idx], &rr_ptr[idx + 1], sizeof(*rr_ptr) * cnt_after);
+ }
+
+ (*rr_len)--;
+ return ARES_SUCCESS;
+}
+
+ares_dns_rr_t *ares_dns_record_rr_get(ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx)
+{
+ ares_dns_rr_t *rr_ptr = NULL;
+ size_t rr_len = 0;
+
+ if (dnsrec == NULL || !ares_dns_section_isvalid(sect)) {
+ return NULL;
+ }
+
+ switch (sect) {
+ case ARES_SECTION_ANSWER:
+ rr_ptr = dnsrec->an;
+ rr_len = dnsrec->ancount;
+ break;
+ case ARES_SECTION_AUTHORITY:
+ rr_ptr = dnsrec->ns;
+ rr_len = dnsrec->nscount;
+ break;
+ case ARES_SECTION_ADDITIONAL:
+ rr_ptr = dnsrec->ar;
+ rr_len = dnsrec->arcount;
+ break;
+ }
+
+ if (idx >= rr_len) {
+ return NULL;
+ }
+
+ return &rr_ptr[idx];
+}
+
+const ares_dns_rr_t *
+ ares_dns_record_rr_get_const(const ares_dns_record_t *dnsrec,
+ ares_dns_section_t sect, size_t idx)
+{
+ return ares_dns_record_rr_get((void *)((size_t)dnsrec), sect, idx);
+}
+
+const char *ares_dns_rr_get_name(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return NULL;
+ }
+ return rr->name;
+}
+
+ares_dns_rec_type_t ares_dns_rr_get_type(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return 0;
+ }
+ return rr->type;
+}
+
+ares_dns_class_t ares_dns_rr_get_class(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return 0;
+ }
+ return rr->rclass;
+}
+
+unsigned int ares_dns_rr_get_ttl(const ares_dns_rr_t *rr)
+{
+ if (rr == NULL) {
+ return 0;
+ }
+ return rr->ttl;
+}
+
+static void *ares_dns_rr_data_ptr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ size_t **lenptr)
+{
+ if (dns_rr == NULL || dns_rr->type != ares_dns_rr_key_to_rec_type(key)) {
+ return NULL;
+ }
+
+ switch (key) {
+ case ARES_RR_A_ADDR:
+ return &dns_rr->r.a.addr;
+
+ case ARES_RR_NS_NSDNAME:
+ return &dns_rr->r.ns.nsdname;
+
+ case ARES_RR_CNAME_CNAME:
+ return &dns_rr->r.cname.cname;
+
+ case ARES_RR_SOA_MNAME:
+ return &dns_rr->r.soa.mname;
+
+ case ARES_RR_SOA_RNAME:
+ return &dns_rr->r.soa.rname;
+
+ case ARES_RR_SOA_SERIAL:
+ return &dns_rr->r.soa.serial;
+
+ case ARES_RR_SOA_REFRESH:
+ return &dns_rr->r.soa.refresh;
+
+ case ARES_RR_SOA_RETRY:
+ return &dns_rr->r.soa.retry;
+
+ case ARES_RR_SOA_EXPIRE:
+ return &dns_rr->r.soa.expire;
+
+ case ARES_RR_SOA_MINIMUM:
+ return &dns_rr->r.soa.minimum;
+
+ case ARES_RR_PTR_DNAME:
+ return &dns_rr->r.ptr.dname;
+
+ case ARES_RR_AAAA_ADDR:
+ return &dns_rr->r.aaaa.addr;
+
+ case ARES_RR_HINFO_CPU:
+ return &dns_rr->r.hinfo.cpu;
+
+ case ARES_RR_HINFO_OS:
+ return &dns_rr->r.hinfo.os;
+
+ case ARES_RR_MX_PREFERENCE:
+ return &dns_rr->r.mx.preference;
+
+ case ARES_RR_MX_EXCHANGE:
+ return &dns_rr->r.mx.exchange;
+
+ case ARES_RR_TXT_DATA:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.txt.data_len;
+ return &dns_rr->r.txt.data;
+
+ case ARES_RR_SRV_PRIORITY:
+ return &dns_rr->r.srv.priority;
+
+ case ARES_RR_SRV_WEIGHT:
+ return &dns_rr->r.srv.weight;
+
+ case ARES_RR_SRV_PORT:
+ return &dns_rr->r.srv.port;
+
+ case ARES_RR_SRV_TARGET:
+ return &dns_rr->r.srv.target;
+
+ case ARES_RR_NAPTR_ORDER:
+ return &dns_rr->r.naptr.order;
+
+ case ARES_RR_NAPTR_PREFERENCE:
+ return &dns_rr->r.naptr.preference;
+
+ case ARES_RR_NAPTR_FLAGS:
+ return &dns_rr->r.naptr.flags;
+
+ case ARES_RR_NAPTR_SERVICES:
+ return &dns_rr->r.naptr.services;
+
+ case ARES_RR_NAPTR_REGEXP:
+ return &dns_rr->r.naptr.regexp;
+
+ case ARES_RR_NAPTR_REPLACEMENT:
+ return &dns_rr->r.naptr.replacement;
+
+ case ARES_RR_OPT_UDP_SIZE:
+ return &dns_rr->r.opt.udp_size;
+
+ case ARES_RR_OPT_VERSION:
+ return &dns_rr->r.opt.version;
+
+ case ARES_RR_OPT_FLAGS:
+ return &dns_rr->r.opt.flags;
+
+ case ARES_RR_OPT_OPTIONS:
+ return &dns_rr->r.opt.options;
+
+ case ARES_RR_TLSA_CERT_USAGE:
+ return &dns_rr->r.tlsa.cert_usage;
+
+ case ARES_RR_TLSA_SELECTOR:
+ return &dns_rr->r.tlsa.selector;
+
+ case ARES_RR_TLSA_MATCH:
+ return &dns_rr->r.tlsa.match;
+
+ case ARES_RR_TLSA_DATA:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.tlsa.data_len;
+ return &dns_rr->r.tlsa.data;
+
+ case ARES_RR_SVCB_PRIORITY:
+ return &dns_rr->r.svcb.priority;
+
+ case ARES_RR_SVCB_TARGET:
+ return &dns_rr->r.svcb.target;
+
+ case ARES_RR_SVCB_PARAMS:
+ return &dns_rr->r.svcb.params;
+
+ case ARES_RR_HTTPS_PRIORITY:
+ return &dns_rr->r.https.priority;
+
+ case ARES_RR_HTTPS_TARGET:
+ return &dns_rr->r.https.target;
+
+ case ARES_RR_HTTPS_PARAMS:
+ return &dns_rr->r.https.params;
+
+ case ARES_RR_URI_PRIORITY:
+ return &dns_rr->r.uri.priority;
+
+ case ARES_RR_URI_WEIGHT:
+ return &dns_rr->r.uri.weight;
+
+ case ARES_RR_URI_TARGET:
+ return &dns_rr->r.uri.target;
+
+ case ARES_RR_CAA_CRITICAL:
+ return &dns_rr->r.caa.critical;
+
+ case ARES_RR_CAA_TAG:
+ return &dns_rr->r.caa.tag;
+
+ case ARES_RR_CAA_VALUE:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.caa.value_len;
+ return &dns_rr->r.caa.value;
+
+ case ARES_RR_RAW_RR_TYPE:
+ return &dns_rr->r.raw_rr.type;
+
+ case ARES_RR_RAW_RR_DATA:
+ if (lenptr == NULL) {
+ return NULL;
+ }
+ *lenptr = &dns_rr->r.raw_rr.length;
+ return &dns_rr->r.raw_rr.data;
+ }
+
+ return NULL;
+}
+
+static const void *ares_dns_rr_data_ptr_const(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const size_t **lenptr)
+{
+ /* We're going to cast off the const */
+ return ares_dns_rr_data_ptr((void *)((size_t)dns_rr), key,
+ (void *)((size_t)lenptr));
+}
+
+const struct in_addr *ares_dns_rr_get_addr(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const struct in_addr *addr;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR) {
+ return NULL;
+ }
+
+ addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (addr == NULL) {
+ return NULL;
+ }
+
+ return addr;
+}
+
+const struct ares_in6_addr *ares_dns_rr_get_addr6(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const struct ares_in6_addr *addr;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6) {
+ return NULL;
+ }
+
+ addr = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (addr == NULL) {
+ return NULL;
+ }
+
+ return addr;
+}
+
+unsigned char ares_dns_rr_get_u8(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned char *u8;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) {
+ return 0;
+ }
+
+ u8 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (u8 == NULL) {
+ return 0;
+ }
+
+ return *u8;
+}
+
+unsigned short ares_dns_rr_get_u16(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned short *u16;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) {
+ return 0;
+ }
+
+ u16 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (u16 == NULL) {
+ return 0;
+ }
+
+ return *u16;
+}
+
+unsigned int ares_dns_rr_get_u32(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned int *u32;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) {
+ return 0;
+ }
+
+ u32 = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (u32 == NULL) {
+ return 0;
+ }
+
+ return *u32;
+}
+
+const unsigned char *ares_dns_rr_get_bin(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, size_t *len)
+{
+ unsigned char * const *bin = NULL;
+ size_t const *bin_len = NULL;
+
+ if ((ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) ||
+ len == NULL) {
+ return NULL;
+ }
+
+ bin = ares_dns_rr_data_ptr_const(dns_rr, key, &bin_len);
+ if (bin == NULL) {
+ return 0;
+ }
+
+ /* Shouldn't be possible */
+ if (bin_len == NULL) {
+ return NULL;
+ }
+
+ *len = *bin_len;
+
+ return *bin;
+}
+
+const char *ares_dns_rr_get_str(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ char * const *str;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) {
+ return NULL;
+ }
+
+ str = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (str == NULL) {
+ return NULL;
+ }
+
+ return *str;
+}
+
+size_t ares_dns_rr_get_opt_cnt(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key)
+{
+ ares__dns_options_t * const *opts;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return 0;
+ }
+
+ opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (opts == NULL || *opts == NULL) {
+ return 0;
+ }
+
+ return (*opts)->cnt;
+}
+
+unsigned short ares_dns_rr_get_opt(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, size_t idx,
+ const unsigned char **val, size_t *val_len)
+{
+ ares__dns_options_t * const *opts;
+
+ if (val) {
+ *val = NULL;
+ }
+ if (val_len) {
+ *val_len = 0;
+ }
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return 65535;
+ }
+
+ opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (opts == NULL || *opts == NULL) {
+ return 65535;
+ }
+
+ if (idx >= (*opts)->cnt) {
+ return 65535;
+ }
+
+ if (val) {
+ *val = (*opts)->optval[idx].val;
+ }
+ if (val_len) {
+ *val_len = (*opts)->optval[idx].val_len;
+ }
+
+ return (*opts)->optval[idx].opt;
+}
+
+ares_bool_t ares_dns_rr_get_opt_byid(const ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned short opt,
+ const unsigned char **val, size_t *val_len)
+{
+ ares__dns_options_t * const *opts;
+ size_t i;
+
+ if (val) {
+ *val = NULL;
+ }
+ if (val_len) {
+ *val_len = 0;
+ }
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return ARES_FALSE;
+ }
+
+ opts = ares_dns_rr_data_ptr_const(dns_rr, key, NULL);
+ if (opts == NULL || *opts == NULL) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; i < (*opts)->cnt; i++) {
+ if ((*opts)->optval[i].opt == opt) {
+ break;
+ }
+ }
+
+ if (i >= (*opts)->cnt) {
+ return ARES_FALSE;
+ }
+
+ if (val) {
+ *val = (*opts)->optval[i].val;
+ }
+ if (val_len) {
+ *val_len = (*opts)->optval[i].val_len;
+ }
+ return ARES_TRUE;
+}
+
+ares_status_t ares_dns_rr_set_addr(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const struct in_addr *addr)
+{
+ struct in_addr *a;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ a = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (a == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ memcpy(a, addr, sizeof(*a));
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_addr6(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key,
+ const struct ares_in6_addr *addr)
+{
+ struct ares_in6_addr *a;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_INADDR6 || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ a = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (a == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ memcpy(a, addr, sizeof(*a));
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_u8(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned char val)
+{
+ unsigned char *u8;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) {
+ return ARES_EFORMERR;
+ }
+
+ u8 = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (u8 == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *u8 = val;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_u16(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned short val)
+{
+ unsigned short *u16;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) {
+ return ARES_EFORMERR;
+ }
+
+ u16 = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (u16 == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *u16 = val;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_u32(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned int val)
+{
+ unsigned int *u32;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) {
+ return ARES_EFORMERR;
+ }
+
+ u32 = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (u32 == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *u32 = val;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_bin_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned char *val,
+ size_t len)
+{
+ unsigned char **bin;
+ size_t *bin_len = NULL;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BIN &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_BINP) {
+ return ARES_EFORMERR;
+ }
+
+ bin = ares_dns_rr_data_ptr(dns_rr, key, &bin_len);
+ if (bin == NULL || bin_len == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*bin) {
+ ares_free(*bin);
+ }
+ *bin = val;
+ *bin_len = len;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_bin(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const unsigned char *val, size_t len)
+{
+ ares_status_t status;
+ ares_dns_datatype_t datatype = ares_dns_rr_key_datatype(key);
+ size_t alloclen = (datatype == ARES_DATATYPE_BINP) ? len + 1 : len;
+ unsigned char *temp = ares_malloc(alloclen);
+
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ memcpy(temp, val, len);
+
+ /* NULL-term BINP */
+ if (datatype == ARES_DATATYPE_BINP) {
+ temp[len] = 0;
+ }
+
+ status = ares_dns_rr_set_bin_own(dns_rr, key, temp, len);
+ if (status != ARES_SUCCESS) {
+ ares_free(temp);
+ }
+
+ return status;
+}
+
+ares_status_t ares_dns_rr_set_str_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, char *val)
+{
+ char **str;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_STR &&
+ ares_dns_rr_key_datatype(key) != ARES_DATATYPE_NAME) {
+ return ARES_EFORMERR;
+ }
+
+ str = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (str == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*str) {
+ ares_free(*str);
+ }
+ *str = val;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_str(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ const char *val)
+{
+ ares_status_t status;
+ char *temp = NULL;
+
+ if (val != NULL) {
+ temp = ares_strdup(val);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ status = ares_dns_rr_set_str_own(dns_rr, key, temp);
+ if (status != ARES_SUCCESS) {
+ ares_free(temp);
+ }
+
+ return status;
+}
+
+ares_status_t ares_dns_rr_set_opt_own(ares_dns_rr_t *dns_rr,
+ ares_dns_rr_key_t key, unsigned short opt,
+ unsigned char *val, size_t val_len)
+{
+ ares__dns_options_t **options;
+ size_t idx;
+
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_OPT) {
+ return ARES_EFORMERR;
+ }
+
+ options = ares_dns_rr_data_ptr(dns_rr, key, NULL);
+ if (options == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*options == NULL) {
+ *options = ares_malloc_zero(sizeof(**options));
+ }
+ if (*options == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ for (idx = 0; idx < (*options)->cnt; idx++) {
+ if ((*options)->optval[idx].opt == opt) {
+ break;
+ }
+ }
+
+ /* Duplicate entry, replace */
+ if (idx != (*options)->cnt) {
+ goto done;
+ }
+
+ idx = (*options)->cnt;
+
+ /* Expand by powers of 2 */
+ if (idx >= (*options)->alloc) {
+ size_t alloc_size = (*options)->alloc;
+ void *temp;
+
+ if (alloc_size == 0) {
+ alloc_size = 1;
+ } else {
+ alloc_size <<= 1;
+ }
+
+ temp = ares_realloc_zero((*options)->optval,
+ (*options)->alloc * sizeof(*(*options)->optval),
+ alloc_size * sizeof(*(*options)->optval));
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ (*options)->optval = temp;
+ (*options)->alloc = alloc_size;
+ }
+
+ (*options)->cnt++;
+
+done:
+ ares_free((*options)->optval[idx].val);
+ (*options)->optval[idx].opt = opt;
+ (*options)->optval[idx].val = val;
+ (*options)->optval[idx].val_len = val_len;
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_rr_set_opt(ares_dns_rr_t *dns_rr, ares_dns_rr_key_t key,
+ unsigned short opt, const unsigned char *val,
+ size_t val_len)
+{
+ unsigned char *temp = NULL;
+ ares_status_t status;
+
+ if (val != NULL) {
+ temp = ares_malloc(val_len + 1);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ memcpy(temp, val, val_len);
+ temp[val_len] = 0;
+ }
+
+ status = ares_dns_rr_set_opt_own(dns_rr, key, opt, temp, val_len);
+ if (status != ARES_SUCCESS) {
+ ares_free(temp);
+ }
+
+ return status;
+}
+
+char *ares_dns_addr_to_ptr(const struct ares_addr *addr)
+{
+ ares__buf_t *buf = NULL;
+ const unsigned char *ptr = NULL;
+ size_t ptr_len = 0;
+ size_t i;
+ ares_status_t status;
+ static const unsigned char hexbytes[] = "0123456789abcdef";
+
+ if (addr->family != AF_INET && addr->family != AF_INET6) {
+ goto fail;
+ }
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ goto fail;
+ }
+
+ if (addr->family == AF_INET) {
+ ptr = (const unsigned char *)&addr->addr.addr4;
+ ptr_len = 4;
+ } else {
+ ptr = (const unsigned char *)&addr->addr.addr6;
+ ptr_len = 16;
+ }
+
+ for (i = ptr_len; i > 0; i--) {
+ if (addr->family == AF_INET) {
+ status = ares__buf_append_num_dec(buf, (size_t)ptr[i - 1], 0);
+ } else {
+ unsigned char c;
+
+ c = ptr[i - 1] & 0xF;
+ status = ares__buf_append_byte(buf, hexbytes[c]);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '.');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ c = (ptr[i - 1] >> 4) & 0xF;
+ status = ares__buf_append_byte(buf, hexbytes[c]);
+ }
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '.');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ if (addr->family == AF_INET) {
+ status = ares__buf_append(buf, (const unsigned char *)"in-addr.arpa", 12);
+ } else {
+ status = ares__buf_append(buf, (const unsigned char *)"ip6.arpa", 8);
+ }
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ return ares__buf_finish_str(buf, NULL);
+
+fail:
+ ares__buf_destroy(buf);
+ return NULL;
+}
+
+/* search for an OPT RR in the response */
+ares_bool_t ares_dns_has_opt_rr(const ares_dns_record_t *rec)
+{
+ size_t i;
+ for (i = 0; i < ares_dns_record_rr_cnt(rec, ARES_SECTION_ADDITIONAL); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get_const(rec, ARES_SECTION_ADDITIONAL, i);
+
+ if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) {
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+/* Construct a DNS record for a name with given class and type. Used internally
+ * by ares_search() and ares_create_query().
+ */
+ares_status_t
+ ares_dns_record_create_query(ares_dns_record_t **dnsrec, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type, unsigned short id,
+ ares_dns_flags_t flags, size_t max_udp_size)
+{
+ ares_status_t status;
+ ares_dns_rr_t *rr = NULL;
+
+ if (dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *dnsrec = NULL;
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN */
+ if (ares__is_onion_domain(name)) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ status = ares_dns_record_create(dnsrec, id, (unsigned short)flags,
+ ARES_OPCODE_QUERY, ARES_RCODE_NOERROR);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_record_query_add(*dnsrec, name, type, dnsclass);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* max_udp_size > 0 indicates EDNS, so send OPT RR as an additional record */
+ if (max_udp_size > 0) {
+ /* max_udp_size must fit into a 16 bit unsigned integer field on the OPT
+ * RR, so check here that it fits
+ */
+ if (max_udp_size > 65535) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
+
+ status = ares_dns_record_rr_add(&rr, *dnsrec, ARES_SECTION_ADDITIONAL, "",
+ ARES_REC_TYPE_OPT, ARES_CLASS_IN, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_UDP_SIZE,
+ (unsigned short)max_udp_size);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u8(rr, ARES_RR_OPT_VERSION, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_rr_set_u16(rr, ARES_RR_OPT_FLAGS, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_dns_record_destroy(*dnsrec);
+ *dnsrec = NULL;
+ }
+ return status;
+}
+
+ares_dns_record_t *ares_dns_record_duplicate(const ares_dns_record_t *dnsrec)
+{
+ unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_dns_record_t *out = NULL;
+ ares_status_t status;
+
+ if (dnsrec == NULL) {
+ return NULL;
+ }
+
+ status = ares_dns_write(dnsrec, &data, &data_len);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+
+ status = ares_dns_parse(data, data_len, 0, &out);
+ ares_free(data);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+ return out;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_dns_write.c b/contrib/libs/c-ares/src/lib/ares_dns_write.c
new file mode 100644
index 0000000000..b49ec07bcb
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_dns_write.c
@@ -0,0 +1,1054 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include <limits.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+
+static ares_status_t ares_dns_write_header(const ares_dns_record_t *dnsrec,
+ ares__buf_t *buf)
+{
+ unsigned short u16;
+ unsigned short opcode;
+ unsigned short rcode;
+
+ ares_status_t status;
+
+ /* ID */
+ status = ares__buf_append_be16(buf, dnsrec->id);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Flags */
+ u16 = 0;
+
+ /* QR */
+ if (dnsrec->flags & ARES_FLAG_QR) {
+ u16 |= 0x8000;
+ }
+
+ /* OPCODE */
+ opcode = (unsigned short)(dnsrec->opcode & 0xF);
+ opcode <<= 11;
+ u16 |= opcode;
+
+ /* AA */
+ if (dnsrec->flags & ARES_FLAG_AA) {
+ u16 |= 0x400;
+ }
+
+ /* TC */
+ if (dnsrec->flags & ARES_FLAG_TC) {
+ u16 |= 0x200;
+ }
+
+ /* RD */
+ if (dnsrec->flags & ARES_FLAG_RD) {
+ u16 |= 0x100;
+ }
+
+ /* RA */
+ if (dnsrec->flags & ARES_FLAG_RA) {
+ u16 |= 0x80;
+ }
+
+ /* Z -- unused */
+
+ /* AD */
+ if (dnsrec->flags & ARES_FLAG_AD) {
+ u16 |= 0x20;
+ }
+
+ /* CD */
+ if (dnsrec->flags & ARES_FLAG_CD) {
+ u16 |= 0x10;
+ }
+
+ /* RCODE */
+ if (dnsrec->rcode > 15 && !ares_dns_has_opt_rr(dnsrec)) {
+ /* Must have OPT RR in order to write extended error codes */
+ rcode = ARES_RCODE_SERVFAIL;
+ } else {
+ rcode = (unsigned short)(dnsrec->rcode & 0xF);
+ }
+ u16 |= rcode;
+
+ status = ares__buf_append_be16(buf, u16);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* QDCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->qdcount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* ANCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->ancount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* NSCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->nscount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* ARCOUNT */
+ status = ares__buf_append_be16(buf, (unsigned short)dnsrec->arcount);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_questions(const ares_dns_record_t *dnsrec,
+ ares__llist_t **namelist,
+ ares__buf_t *buf)
+{
+ size_t i;
+
+ for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) {
+ ares_status_t status;
+ const char *name = NULL;
+ ares_dns_rec_type_t qtype;
+ ares_dns_class_t qclass;
+
+ status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Name */
+ status = ares__dns_name_write(buf, namelist, ARES_TRUE, name);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Type */
+ status = ares__buf_append_be16(buf, (unsigned short)qtype);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Class */
+ status = ares__buf_append_be16(buf, (unsigned short)qclass);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_name(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist,
+ ares_bool_t validate_hostname,
+ ares_dns_rr_key_t key)
+{
+ const char *name;
+
+ name = ares_dns_rr_get_str(rr, key);
+ if (name == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__dns_name_write(buf, namelist, validate_hostname, name);
+}
+
+static ares_status_t ares_dns_write_rr_str(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ const char *str;
+ size_t len;
+ ares_status_t status;
+
+ str = ares_dns_rr_get_str(rr, key);
+ if (str == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ len = ares_strlen(str);
+ if (len > 255) {
+ return ARES_EFORMERR;
+ }
+
+ /* Write 1 byte length */
+ status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (len == 0) {
+ return ARES_SUCCESS;
+ }
+
+ /* Write string */
+ return ares__buf_append(buf, (const unsigned char *)str, len);
+}
+
+static ares_status_t ares_dns_write_rr_binstrs(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ const unsigned char *bin;
+ const unsigned char *ptr;
+ size_t bin_len;
+ size_t ptr_len;
+ ares_status_t status;
+
+ bin = ares_dns_rr_get_bin(rr, key, &bin_len);
+ if (bin == NULL) {
+ return ARES_EFORMERR;
+ }
+ /* split into possible multiple 255-byte or less length strings */
+ ptr = bin;
+ ptr_len = bin_len;
+ do {
+ size_t len = ptr_len;
+ if (len > 255) {
+ len = 255;
+ }
+
+ /* Length */
+ status = ares__buf_append_byte(buf, (unsigned char)(len & 0xFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* String */
+ if (len) {
+ status = ares__buf_append(buf, ptr, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ ptr += len;
+ ptr_len -= len;
+ } while (ptr_len > 0);
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_be32(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U32) {
+ return ARES_EFORMERR;
+ }
+ return ares__buf_append_be32(buf, ares_dns_rr_get_u32(rr, key));
+}
+
+static ares_status_t ares_dns_write_rr_be16(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U16) {
+ return ARES_EFORMERR;
+ }
+ return ares__buf_append_be16(buf, ares_dns_rr_get_u16(rr, key));
+}
+
+static ares_status_t ares_dns_write_rr_u8(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares_dns_rr_key_t key)
+{
+ if (ares_dns_rr_key_datatype(key) != ARES_DATATYPE_U8) {
+ return ARES_EFORMERR;
+ }
+ return ares__buf_append_byte(buf, ares_dns_rr_get_u8(rr, key));
+}
+
+static ares_status_t ares_dns_write_rr_a(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ const struct in_addr *addr;
+ (void)namelist;
+
+ addr = ares_dns_rr_get_addr(rr, ARES_RR_A_ADDR);
+ if (addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr));
+}
+
+static ares_status_t ares_dns_write_rr_ns(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_NS_NSDNAME);
+}
+
+static ares_status_t ares_dns_write_rr_cname(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_CNAME_CNAME);
+}
+
+static ares_status_t ares_dns_write_rr_soa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* MNAME */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_MNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RNAME */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SOA_RNAME);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERIAL */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_SERIAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REFRESH */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_REFRESH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* RETRY */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_RETRY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXPIRE */
+ status = ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_EXPIRE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* MINIMUM */
+ return ares_dns_write_rr_be32(buf, rr, ARES_RR_SOA_MINIMUM);
+}
+
+static ares_status_t ares_dns_write_rr_ptr(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_PTR_DNAME);
+}
+
+static ares_status_t ares_dns_write_rr_hinfo(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ (void)namelist;
+
+ /* CPU */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_CPU);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* OS */
+ return ares_dns_write_rr_str(buf, rr, ARES_RR_HINFO_OS);
+}
+
+static ares_status_t ares_dns_write_rr_mx(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* PREFERENCE */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_MX_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* EXCHANGE */
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_MX_EXCHANGE);
+}
+
+static ares_status_t ares_dns_write_rr_txt(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ (void)namelist;
+ return ares_dns_write_rr_binstrs(buf, rr, ARES_RR_TXT_DATA);
+}
+
+static ares_status_t ares_dns_write_rr_aaaa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ const struct ares_in6_addr *addr;
+ (void)namelist;
+
+ addr = ares_dns_rr_get_addr6(rr, ARES_RR_AAAA_ADDR);
+ if (addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, (const unsigned char *)addr, sizeof(*addr));
+}
+
+static ares_status_t ares_dns_write_rr_srv(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PORT */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SRV_PORT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_SRV_TARGET);
+}
+
+static ares_status_t ares_dns_write_rr_naptr(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+
+ /* ORDER */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_ORDER);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* PREFERENCE */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_NAPTR_PREFERENCE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* FLAGS */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_FLAGS);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SERVICES */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_SERVICES);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REGEXP */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_NAPTR_REGEXP);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* REPLACEMENT */
+ return ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE,
+ ARES_RR_NAPTR_REPLACEMENT);
+}
+
+static ares_status_t ares_dns_write_rr_opt(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ size_t len = ares__buf_len(buf);
+ ares_status_t status;
+ unsigned int ttl = 0;
+ size_t i;
+ unsigned short rcode = (unsigned short)((rr->parent->rcode >> 4) & 0xFF);
+
+ (void)namelist;
+
+ /* We need to go back and overwrite the class and ttl that were emitted as
+ * the OPT record overloads them for its own use (yes, very strange!) */
+ status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */
+ - 4 /* TTL */
+ - 2 /* CLASS */);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Class -> UDP Size */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_OPT_UDP_SIZE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TTL -> rcode (u8) << 24 | version (u8) << 16 | flags (u16) */
+ ttl |= (unsigned int)rcode << 24;
+ ttl |= (unsigned int)ares_dns_rr_get_u8(rr, ARES_RR_OPT_VERSION) << 16;
+ ttl |= (unsigned int)ares_dns_rr_get_u16(rr, ARES_RR_OPT_FLAGS);
+
+ status = ares__buf_append_be32(buf, ttl);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Now go back to real end */
+ status = ares__buf_set_length(buf, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Append Options */
+ for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_OPT_OPTIONS); i++) {
+ unsigned short opt;
+ size_t val_len;
+ const unsigned char *val;
+
+ opt = ares_dns_rr_get_opt(rr, ARES_RR_OPT_OPTIONS, i, &val, &val_len);
+
+ /* BE16 option */
+ status = ares__buf_append_be16(buf, opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* BE16 length */
+ status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value */
+ if (val && val_len) {
+ status = ares__buf_append(buf, val, val_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_tlsa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ const unsigned char *data;
+ size_t len = 0;
+
+ (void)namelist;
+
+ /* CERT_USAGE */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_CERT_USAGE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* SELECTOR */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_SELECTOR);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* MATCH */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_TLSA_MATCH);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* DATA -- binary, rest of buffer, required to be non-zero length */
+ data = ares_dns_rr_get_bin(rr, ARES_RR_TLSA_DATA, &len);
+ if (data == NULL || len == 0) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, data, len);
+}
+
+static ares_status_t ares_dns_write_rr_svcb(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ size_t i;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_SVCB_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_SVCB_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Append Params */
+ for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_SVCB_PARAMS); i++) {
+ unsigned short opt;
+ size_t val_len;
+ const unsigned char *val;
+
+ opt = ares_dns_rr_get_opt(rr, ARES_RR_SVCB_PARAMS, i, &val, &val_len);
+
+ /* BE16 option */
+ status = ares__buf_append_be16(buf, opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* BE16 length */
+ status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value */
+ if (val && val_len) {
+ status = ares__buf_append(buf, val, val_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_https(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ size_t i;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_HTTPS_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET */
+ status =
+ ares_dns_write_rr_name(buf, rr, namelist, ARES_FALSE, ARES_RR_HTTPS_TARGET);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Append Params */
+ for (i = 0; i < ares_dns_rr_get_opt_cnt(rr, ARES_RR_HTTPS_PARAMS); i++) {
+ unsigned short opt;
+ size_t val_len;
+ const unsigned char *val;
+
+ opt = ares_dns_rr_get_opt(rr, ARES_RR_HTTPS_PARAMS, i, &val, &val_len);
+
+ /* BE16 option */
+ status = ares__buf_append_be16(buf, opt);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* BE16 length */
+ status = ares__buf_append_be16(buf, (unsigned short)(val_len & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value */
+ if (val && val_len) {
+ status = ares__buf_append(buf, val, val_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares_dns_write_rr_uri(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ ares_status_t status;
+ const char *target;
+
+ (void)namelist;
+
+ /* PRIORITY */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_PRIORITY);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* WEIGHT */
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_URI_WEIGHT);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TARGET -- not in DNS string format, rest of buffer, required to be
+ * non-zero length */
+ target = ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET);
+ if (target == NULL || ares_strlen(target) == 0) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, (const unsigned char *)target,
+ ares_strlen(target));
+}
+
+static ares_status_t ares_dns_write_rr_caa(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ const unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_status_t status;
+
+ (void)namelist;
+
+ /* CRITICAL */
+ status = ares_dns_write_rr_u8(buf, rr, ARES_RR_CAA_CRITICAL);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Tag */
+ status = ares_dns_write_rr_str(buf, rr, ARES_RR_CAA_TAG);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Value - binary! (remaining buffer */
+ data = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &data_len);
+ if (data == NULL || data_len == 0) {
+ return ARES_EFORMERR;
+ }
+
+ return ares__buf_append(buf, data, data_len);
+}
+
+static ares_status_t ares_dns_write_rr_raw_rr(ares__buf_t *buf,
+ const ares_dns_rr_t *rr,
+ ares__llist_t **namelist)
+{
+ size_t len = ares__buf_len(buf);
+ ares_status_t status;
+ const unsigned char *data = NULL;
+ size_t data_len = 0;
+
+ (void)namelist;
+
+ /* We need to go back and overwrite the type that was emitted by the parent
+ * function */
+ status = ares__buf_set_length(buf, len - 2 /* RDLENGTH */
+ - 4 /* TTL */
+ - 2 /* CLASS */
+ - 2 /* TYPE */);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares_dns_write_rr_be16(buf, rr, ARES_RR_RAW_RR_TYPE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Now go back to real end */
+ status = ares__buf_set_length(buf, len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Output raw data */
+ data = ares_dns_rr_get_bin(rr, ARES_RR_RAW_RR_DATA, &data_len);
+ if (data == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (data_len == 0) {
+ return ARES_SUCCESS;
+ }
+
+ return ares__buf_append(buf, data, data_len);
+}
+
+static ares_status_t ares_dns_write_rr(const ares_dns_record_t *dnsrec,
+ ares__llist_t **namelist,
+ ares_dns_section_t section,
+ ares__buf_t *buf)
+{
+ size_t i;
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, section); i++) {
+ const ares_dns_rr_t *rr;
+ ares_dns_rec_type_t type;
+ ares_bool_t allow_compress;
+ ares__llist_t **namelistptr = NULL;
+ size_t pos_len;
+ ares_status_t status;
+ size_t rdlength;
+ size_t end_length;
+ unsigned int ttl;
+
+ rr = ares_dns_record_rr_get_const(dnsrec, section, i);
+ if (rr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ type = ares_dns_rr_get_type(rr);
+ allow_compress = ares_dns_rec_type_allow_name_compression(type);
+ if (allow_compress) {
+ namelistptr = namelist;
+ }
+
+ /* Name */
+ status =
+ ares__dns_name_write(buf, namelist, ARES_TRUE, ares_dns_rr_get_name(rr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Type */
+ status = ares__buf_append_be16(buf, (unsigned short)type);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Class */
+ status =
+ ares__buf_append_be16(buf, (unsigned short)ares_dns_rr_get_class(rr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* TTL */
+ ttl = ares_dns_rr_get_ttl(rr);
+ if (rr->parent->ttl_decrement > ttl) {
+ ttl = 0;
+ } else {
+ ttl -= rr->parent->ttl_decrement;
+ }
+ status = ares__buf_append_be32(buf, ttl);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Length */
+ pos_len = ares__buf_len(buf); /* Save to write real length later */
+ status = ares__buf_append_be16(buf, 0);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Data */
+ switch (type) {
+ case ARES_REC_TYPE_A:
+ status = ares_dns_write_rr_a(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_NS:
+ status = ares_dns_write_rr_ns(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_CNAME:
+ status = ares_dns_write_rr_cname(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_SOA:
+ status = ares_dns_write_rr_soa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_PTR:
+ status = ares_dns_write_rr_ptr(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_HINFO:
+ status = ares_dns_write_rr_hinfo(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_MX:
+ status = ares_dns_write_rr_mx(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_TXT:
+ status = ares_dns_write_rr_txt(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_AAAA:
+ status = ares_dns_write_rr_aaaa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_SRV:
+ status = ares_dns_write_rr_srv(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_NAPTR:
+ status = ares_dns_write_rr_naptr(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_ANY:
+ status = ARES_EFORMERR;
+ break;
+ case ARES_REC_TYPE_OPT:
+ status = ares_dns_write_rr_opt(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_TLSA:
+ status = ares_dns_write_rr_tlsa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_SVCB:
+ status = ares_dns_write_rr_svcb(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_HTTPS:
+ status = ares_dns_write_rr_https(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_URI:
+ status = ares_dns_write_rr_uri(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_CAA:
+ status = ares_dns_write_rr_caa(buf, rr, namelistptr);
+ break;
+ case ARES_REC_TYPE_RAW_RR:
+ status = ares_dns_write_rr_raw_rr(buf, rr, namelistptr);
+ break;
+ }
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Back off write pointer, write real length, then go back to proper
+ * position */
+ end_length = ares__buf_len(buf);
+ rdlength = end_length - pos_len - 2;
+
+ status = ares__buf_set_length(buf, pos_len);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_append_be16(buf, (unsigned short)(rdlength & 0xFFFF));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status = ares__buf_set_length(buf, end_length);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares_dns_write(const ares_dns_record_t *dnsrec,
+ unsigned char **buf, size_t *buf_len)
+{
+ ares__buf_t *b = NULL;
+ ares_status_t status;
+ ares__llist_t *namelist = NULL;
+
+ if (buf == NULL || buf_len == NULL || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *buf = NULL;
+ *buf_len = 0;
+
+ b = ares__buf_create();
+ if (b == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares_dns_write_header(dnsrec, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_questions(dnsrec, &namelist, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ANSWER, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_AUTHORITY, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_dns_write_rr(dnsrec, &namelist, ARES_SECTION_ADDITIONAL, b);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares__llist_destroy(namelist);
+
+ if (status != ARES_SUCCESS) {
+ ares__buf_destroy(b);
+ return status;
+ }
+
+ *buf = ares__buf_finish_bin(b, buf_len);
+ return status;
+}
+
+void ares_dns_record_write_ttl_decrement(ares_dns_record_t *dnsrec,
+ unsigned int ttl_decrement)
+{
+ if (dnsrec == NULL) {
+ return;
+ }
+ dnsrec->ttl_decrement = ttl_decrement;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_event.h b/contrib/libs/c-ares/src/lib/ares_event.h
new file mode 100644
index 0000000000..23e9637924
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event.h
@@ -0,0 +1,174 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES__EVENT_H
+#define __ARES__EVENT_H
+
+#include "ares_setup.h"
+
+struct ares_event;
+typedef struct ares_event ares_event_t;
+
+typedef enum {
+ ARES_EVENT_FLAG_NONE = 0,
+ ARES_EVENT_FLAG_READ = 1 << 0,
+ ARES_EVENT_FLAG_WRITE = 1 << 1,
+ ARES_EVENT_FLAG_OTHER = 1 << 2
+} ares_event_flags_t;
+
+typedef void (*ares_event_cb_t)(ares_event_thread_t *e, ares_socket_t fd,
+ void *data, ares_event_flags_t flags);
+
+typedef void (*ares_event_free_data_t)(void *data);
+
+typedef void (*ares_event_signal_cb_t)(const ares_event_t *event);
+
+struct ares_event {
+ /*! Registered event thread this event is bound to */
+ ares_event_thread_t *e;
+ /*! Flags to monitor. OTHER is only allowed if the socket is ARES_SOCKET_BAD.
+ */
+ ares_event_flags_t flags;
+ /*! Callback to be called when event is triggered */
+ ares_event_cb_t cb;
+ /*! Socket to monitor, allowed to be ARES_SOCKET_BAD if not monitoring a
+ * socket. */
+ ares_socket_t fd;
+ /*! Data associated with event handle that will be passed to the callback.
+ * Typically OS/event subsystem specific data.
+ * Optional, may be NULL. */
+ /*! Data to be passed to callback. Optional, may be NULL. */
+ void *data;
+ /*! When cleaning up the registered event (either when removed or during
+ * shutdown), this function will be called to clean up the user-supplied
+ * data. Optional, May be NULL. */
+ ares_event_free_data_t free_data_cb;
+ /*! Callback to call to trigger an event. */
+ ares_event_signal_cb_t signal_cb;
+};
+
+typedef struct {
+ const char *name;
+ ares_bool_t (*init)(ares_event_thread_t *e);
+ void (*destroy)(ares_event_thread_t *e);
+ ares_bool_t (*event_add)(ares_event_t *event);
+ void (*event_del)(ares_event_t *event);
+ void (*event_mod)(ares_event_t *event, ares_event_flags_t new_flags);
+ size_t (*wait)(ares_event_thread_t *e, unsigned long timeout_ms);
+} ares_event_sys_t;
+
+struct ares_event_thread {
+ /*! Whether the event thread should be online or not. Checked on every wake
+ * event before sleeping. */
+ ares_bool_t isup;
+ /*! Handle to the thread for joining during shutdown */
+ ares__thread_t *thread;
+ /*! Lock to protect the data contained within the event thread itself */
+ ares__thread_mutex_t *mutex;
+ /*! Reference to the ares channel, for being able to call things like
+ * ares_timeout() and ares_process_fd(). */
+ ares_channel_t *channel;
+ /*! Not-yet-processed event handle updates. These will get enqueued by a
+ * thread other than the event thread itself. The event thread will then
+ * be woken then process these updates itself */
+ ares__llist_t *ev_updates;
+ /*! Registered event handles. */
+ ares__htable_asvp_t *ev_handles;
+ /*! Pointer to the event handle which is used to signal and wake the event
+ * thread itself. This is needed to be able to do things like update the
+ * file descriptors being waited on and to wake the event subsystem during
+ * shutdown */
+ ares_event_t *ev_signal;
+ /* Event subsystem callbacks */
+ const ares_event_sys_t *ev_sys;
+ /* Event subsystem private data */
+ void *ev_sys_data;
+};
+
+/*! Queue an update for the event handle.
+ *
+ * Will search by the fd passed if not ARES_SOCKET_BAD to find a match and
+ * perform an update or delete (depending on flags). Otherwise will add.
+ * Do not use the event handle returned if its not guaranteed to be an add
+ * operation.
+ *
+ * \param[out] event Event handle. Optional, can be NULL. This handle
+ * will be invalidate quickly if the result of the
+ * operation is not an ADD.
+ * \param[in] e pointer to event thread handle
+ * \param[in] flags flags for the event handle. Use
+ * ARES_EVENT_FLAG_NONE if removing a socket from
+ * queue (not valid if socket is ARES_SOCKET_BAD).
+ * Non-socket events cannot be removed, and must have
+ * ARES_EVENT_FLAG_OTHER set.
+ * \param[in] cb Callback to call when
+ * event is triggered. Required. Not allowed to be
+ * changed, ignored on modification.
+ * \param[in] fd File descriptor/socket to monitor. May
+ * be ARES_SOCKET_BAD if not monitoring file
+ * descriptor.
+ * \param[in] data Optional. Caller-supplied data to be passed to
+ * callback. Only allowed on initial add, cannot be
+ * modified later, ignored on modification.
+ * \param[in] free_data_cb Optional. Callback to clean up caller-supplied
+ * data. Only allowed on initial add, cannot be
+ * modified later, ignored on modification.
+ * \param[in] signal_cb Optional. Callback to call to trigger an event.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e,
+ ares_event_flags_t flags, ares_event_cb_t cb,
+ ares_socket_t fd, void *data,
+ ares_event_free_data_t free_data_cb,
+ ares_event_signal_cb_t signal_cb);
+
+
+#ifdef HAVE_PIPE
+ares_event_t *ares_pipeevent_create(ares_event_thread_t *e);
+#endif
+
+#ifdef HAVE_POLL
+extern const ares_event_sys_t ares_evsys_poll;
+#endif
+
+#ifdef HAVE_KQUEUE
+extern const ares_event_sys_t ares_evsys_kqueue;
+#endif
+
+#ifdef HAVE_EPOLL
+extern const ares_event_sys_t ares_evsys_epoll;
+#endif
+
+#ifdef _WIN32
+extern const ares_event_sys_t ares_evsys_win32;
+#endif
+
+/* All systems have select(), but not all have a way to wake, so we require
+ * pipe() to wake the select() */
+#ifdef HAVE_PIPE
+extern const ares_event_sys_t ares_evsys_select;
+#endif
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_epoll.c b/contrib/libs/c-ares/src/lib/ares_event_epoll.c
new file mode 100644
index 0000000000..9d3c097f8e
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_epoll.c
@@ -0,0 +1,198 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+
+#ifdef HAVE_SYS_EPOLL_H
+# include <sys/epoll.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_EPOLL
+
+typedef struct {
+ int epoll_fd;
+} ares_evsys_epoll_t;
+
+static void ares_evsys_epoll_destroy(ares_event_thread_t *e)
+{
+ ares_evsys_epoll_t *ep = NULL;
+
+ if (e == NULL) {
+ return;
+ }
+
+ ep = e->ev_sys_data;
+ if (ep == NULL) {
+ return;
+ }
+
+ if (ep->epoll_fd != -1) {
+ close(ep->epoll_fd);
+ }
+
+ ares_free(ep);
+ e->ev_sys_data = NULL;
+}
+
+static ares_bool_t ares_evsys_epoll_init(ares_event_thread_t *e)
+{
+ ares_evsys_epoll_t *ep = NULL;
+
+ ep = ares_malloc_zero(sizeof(*ep));
+ if (ep == NULL) {
+ return ARES_FALSE;
+ }
+
+ e->ev_sys_data = ep;
+
+ ep->epoll_fd = epoll_create1(0);
+ if (ep->epoll_fd == -1) {
+ ares_evsys_epoll_destroy(e);
+ return ARES_FALSE;
+ }
+
+# ifdef FD_CLOEXEC
+ fcntl(ep->epoll_fd, F_SETFD, FD_CLOEXEC);
+# endif
+
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ ares_evsys_epoll_destroy(e);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static ares_bool_t ares_evsys_epoll_event_add(ares_event_t *event)
+{
+ const ares_event_thread_t *e = event->e;
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ struct epoll_event epev;
+
+ memset(&epev, 0, sizeof(epev));
+ epev.data.fd = event->fd;
+ epev.events = EPOLLRDHUP | EPOLLERR | EPOLLHUP;
+ if (event->flags & ARES_EVENT_FLAG_READ) {
+ epev.events |= EPOLLIN;
+ }
+ if (event->flags & ARES_EVENT_FLAG_WRITE) {
+ epev.events |= EPOLLOUT;
+ }
+ if (epoll_ctl(ep->epoll_fd, EPOLL_CTL_ADD, event->fd, &epev) != 0) {
+ return ARES_FALSE;
+ }
+ return ARES_TRUE;
+}
+
+static void ares_evsys_epoll_event_del(ares_event_t *event)
+{
+ const ares_event_thread_t *e = event->e;
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ struct epoll_event epev;
+
+ memset(&epev, 0, sizeof(epev));
+ epev.data.fd = event->fd;
+ epoll_ctl(ep->epoll_fd, EPOLL_CTL_DEL, event->fd, &epev);
+}
+
+static void ares_evsys_epoll_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ const ares_event_thread_t *e = event->e;
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ struct epoll_event epev;
+
+ memset(&epev, 0, sizeof(epev));
+ epev.data.fd = event->fd;
+ epev.events = EPOLLRDHUP | EPOLLERR | EPOLLHUP;
+ if (new_flags & ARES_EVENT_FLAG_READ) {
+ epev.events |= EPOLLIN;
+ }
+ if (new_flags & ARES_EVENT_FLAG_WRITE) {
+ epev.events |= EPOLLOUT;
+ }
+ epoll_ctl(ep->epoll_fd, EPOLL_CTL_MOD, event->fd, &epev);
+}
+
+static size_t ares_evsys_epoll_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ struct epoll_event events[8];
+ size_t nevents = sizeof(events) / sizeof(*events);
+ const ares_evsys_epoll_t *ep = e->ev_sys_data;
+ int rv;
+ size_t i;
+ size_t cnt = 0;
+
+ memset(events, 0, sizeof(events));
+
+ rv = epoll_wait(ep->epoll_fd, events, (int)nevents,
+ (timeout_ms == 0) ? -1 : (int)timeout_ms);
+ if (rv < 0) {
+ return 0;
+ }
+
+ nevents = (size_t)rv;
+
+ for (i = 0; i < nevents; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles,
+ (ares_socket_t)events[i].data.fd);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ cnt++;
+
+ if (events[i].events & (EPOLLIN | EPOLLRDHUP | EPOLLHUP | EPOLLERR)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+ if (events[i].events & EPOLLOUT) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ ev->cb(e, ev->fd, ev->data, flags);
+ }
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_epoll = { "epoll",
+ ares_evsys_epoll_init,
+ ares_evsys_epoll_destroy,
+ ares_evsys_epoll_event_add,
+ ares_evsys_epoll_event_del,
+ ares_evsys_epoll_event_mod,
+ ares_evsys_epoll_wait };
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_kqueue.c b/contrib/libs/c-ares/src/lib/ares_event_kqueue.c
new file mode 100644
index 0000000000..944c4b003b
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_kqueue.c
@@ -0,0 +1,249 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_EVENT_H
+# include <sys/event.h>
+#endif
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_KQUEUE
+
+typedef struct {
+ int kqueue_fd;
+ struct kevent *changelist;
+ size_t nchanges;
+ size_t nchanges_alloc;
+} ares_evsys_kqueue_t;
+
+static void ares_evsys_kqueue_destroy(ares_event_thread_t *e)
+{
+ ares_evsys_kqueue_t *kq = NULL;
+
+ if (e == NULL) {
+ return;
+ }
+
+ kq = e->ev_sys_data;
+ if (kq == NULL) {
+ return;
+ }
+
+ if (kq->kqueue_fd != -1) {
+ close(kq->kqueue_fd);
+ }
+
+ ares_free(kq->changelist);
+ ares_free(kq);
+ e->ev_sys_data = NULL;
+}
+
+static ares_bool_t ares_evsys_kqueue_init(ares_event_thread_t *e)
+{
+ ares_evsys_kqueue_t *kq = NULL;
+
+ kq = ares_malloc_zero(sizeof(*kq));
+ if (kq == NULL) {
+ return ARES_FALSE;
+ }
+
+ e->ev_sys_data = kq;
+
+ kq->kqueue_fd = kqueue();
+ if (kq->kqueue_fd == -1) {
+ ares_evsys_kqueue_destroy(e);
+ return ARES_FALSE;
+ }
+
+# ifdef FD_CLOEXEC
+ fcntl(kq->kqueue_fd, F_SETFD, FD_CLOEXEC);
+# endif
+
+ kq->nchanges_alloc = 8;
+ kq->changelist =
+ ares_malloc_zero(sizeof(*kq->changelist) * kq->nchanges_alloc);
+ if (kq->changelist == NULL) {
+ ares_evsys_kqueue_destroy(e);
+ return ARES_FALSE;
+ }
+
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ ares_evsys_kqueue_destroy(e);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static void ares_evsys_kqueue_enqueue(ares_evsys_kqueue_t *kq, int fd,
+ int16_t filter, uint16_t flags)
+{
+ size_t idx;
+
+ if (kq == NULL) {
+ return;
+ }
+
+ idx = kq->nchanges;
+
+ kq->nchanges++;
+
+ if (kq->nchanges > kq->nchanges_alloc) {
+ kq->nchanges_alloc <<= 1;
+ kq->changelist = ares_realloc_zero(kq->changelist, kq->nchanges_alloc >> 1,
+ kq->nchanges_alloc);
+ }
+
+ EV_SET(&kq->changelist[idx], fd, filter, flags, 0, 0, 0);
+}
+
+static void ares_evsys_kqueue_event_process(ares_event_t *event,
+ ares_event_flags_t old_flags,
+ ares_event_flags_t new_flags)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_kqueue_t *kq;
+
+ if (e == NULL) {
+ return;
+ }
+
+ kq = e->ev_sys_data;
+ if (kq == NULL) {
+ return;
+ }
+
+ if (new_flags & ARES_EVENT_FLAG_READ && !(old_flags & ARES_EVENT_FLAG_READ)) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_READ, EV_ADD | EV_ENABLE);
+ }
+
+ if (!(new_flags & ARES_EVENT_FLAG_READ) && old_flags & ARES_EVENT_FLAG_READ) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_READ, EV_DELETE);
+ }
+
+ if (new_flags & ARES_EVENT_FLAG_WRITE &&
+ !(old_flags & ARES_EVENT_FLAG_WRITE)) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_WRITE, EV_ADD | EV_ENABLE);
+ }
+
+ if (!(new_flags & ARES_EVENT_FLAG_WRITE) &&
+ old_flags & ARES_EVENT_FLAG_WRITE) {
+ ares_evsys_kqueue_enqueue(kq, event->fd, EVFILT_WRITE, EV_DELETE);
+ }
+}
+
+static ares_bool_t ares_evsys_kqueue_event_add(ares_event_t *event)
+{
+ ares_evsys_kqueue_event_process(event, 0, event->flags);
+ return ARES_TRUE;
+}
+
+static void ares_evsys_kqueue_event_del(ares_event_t *event)
+{
+ ares_evsys_kqueue_event_process(event, event->flags, 0);
+}
+
+static void ares_evsys_kqueue_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ ares_evsys_kqueue_event_process(event, event->flags, new_flags);
+}
+
+static size_t ares_evsys_kqueue_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ struct kevent events[8];
+ size_t nevents = sizeof(events) / sizeof(*events);
+ ares_evsys_kqueue_t *kq = e->ev_sys_data;
+ int rv;
+ size_t i;
+ struct timespec ts;
+ struct timespec *timeout = NULL;
+ size_t cnt = 0;
+
+ if (timeout_ms != 0) {
+ ts.tv_sec = timeout_ms / 1000;
+ ts.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
+ timeout = &ts;
+ }
+
+ memset(events, 0, sizeof(events));
+
+ rv = kevent(kq->kqueue_fd, kq->changelist, (int)kq->nchanges, events,
+ (int)nevents, timeout);
+ if (rv < 0) {
+ return 0;
+ }
+
+ /* Changelist was consumed */
+ kq->nchanges = 0;
+ nevents = (size_t)rv;
+
+ for (i = 0; i < nevents; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles,
+ (ares_socket_t)events[i].ident);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ cnt++;
+
+ if (events[i].filter == EVFILT_READ ||
+ events[i].flags & (EV_EOF | EV_ERROR)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ } else {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ ev->cb(e, ev->fd, ev->data, flags);
+ }
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_kqueue = { "kqueue",
+ ares_evsys_kqueue_init,
+ ares_evsys_kqueue_destroy,
+ ares_evsys_kqueue_event_add,
+ ares_evsys_kqueue_event_del,
+ ares_evsys_kqueue_event_mod,
+ ares_evsys_kqueue_wait };
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_poll.c b/contrib/libs/c-ares/src/lib/ares_event_poll.c
new file mode 100644
index 0000000000..33b1d6dfd5
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_poll.c
@@ -0,0 +1,141 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#ifdef HAVE_POLL_H
+# include <poll.h>
+#endif
+
+#if defined(HAVE_POLL)
+
+static ares_bool_t ares_evsys_poll_init(ares_event_thread_t *e)
+{
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ return ARES_FALSE;
+ }
+ return ARES_TRUE;
+}
+
+static void ares_evsys_poll_destroy(ares_event_thread_t *e)
+{
+ (void)e;
+}
+
+static ares_bool_t ares_evsys_poll_event_add(ares_event_t *event)
+{
+ (void)event;
+ return ARES_TRUE;
+}
+
+static void ares_evsys_poll_event_del(ares_event_t *event)
+{
+ (void)event;
+}
+
+static void ares_evsys_poll_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ (void)event;
+ (void)new_flags;
+}
+
+static size_t ares_evsys_poll_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ size_t num_fds = 0;
+ ares_socket_t *fdlist = ares__htable_asvp_keys(e->ev_handles, &num_fds);
+ struct pollfd *pollfd = NULL;
+ int rv;
+ size_t cnt = 0;
+ size_t i;
+
+ if (fdlist != NULL && num_fds) {
+ pollfd = ares_malloc_zero(sizeof(*pollfd) * num_fds);
+ if (pollfd == NULL) {
+ goto done;
+ }
+ for (i = 0; i < num_fds; i++) {
+ const ares_event_t *ev =
+ ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
+ pollfd[i].fd = ev->fd;
+ if (ev->flags & ARES_EVENT_FLAG_READ) {
+ pollfd[i].events |= POLLIN;
+ }
+ if (ev->flags & ARES_EVENT_FLAG_WRITE) {
+ pollfd[i].events |= POLLOUT;
+ }
+ }
+ }
+ ares_free(fdlist);
+
+ rv = poll(pollfd, (nfds_t)num_fds, (timeout_ms == 0) ? -1 : (int)timeout_ms);
+ if (rv <= 0) {
+ goto done;
+ }
+
+ for (i = 0; pollfd != NULL && i < num_fds; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ if (pollfd[i].revents == 0) {
+ continue;
+ }
+
+ cnt++;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles, pollfd[i].fd);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ if (pollfd[i].revents & (POLLERR | POLLHUP | POLLIN)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+
+ if (pollfd[i].revents & POLLOUT) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ ev->cb(e, pollfd[i].fd, ev->data, flags);
+ }
+
+done:
+ ares_free(pollfd);
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_poll = { "poll",
+ ares_evsys_poll_init,
+ ares_evsys_poll_destroy, /* NoOp */
+ ares_evsys_poll_event_add, /* NoOp */
+ ares_evsys_poll_event_del, /* NoOp */
+ ares_evsys_poll_event_mod, /* NoOp */
+ ares_evsys_poll_wait };
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_select.c b/contrib/libs/c-ares/src/lib/ares_event_select.c
new file mode 100644
index 0000000000..4823e808f1
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_select.c
@@ -0,0 +1,151 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+/* All systems have select(), but not all have a way to wake, so we require
+ * pipe() to wake the select() */
+#if defined(HAVE_PIPE)
+
+static ares_bool_t ares_evsys_select_init(ares_event_thread_t *e)
+{
+ e->ev_signal = ares_pipeevent_create(e);
+ if (e->ev_signal == NULL) {
+ return ARES_FALSE;
+ }
+ return ARES_TRUE;
+}
+
+static void ares_evsys_select_destroy(ares_event_thread_t *e)
+{
+ (void)e;
+}
+
+static ares_bool_t ares_evsys_select_event_add(ares_event_t *event)
+{
+ (void)event;
+ return ARES_TRUE;
+}
+
+static void ares_evsys_select_event_del(ares_event_t *event)
+{
+ (void)event;
+}
+
+static void ares_evsys_select_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ (void)event;
+ (void)new_flags;
+}
+
+static size_t ares_evsys_select_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ size_t num_fds = 0;
+ ares_socket_t *fdlist = ares__htable_asvp_keys(e->ev_handles, &num_fds);
+ int rv;
+ size_t cnt = 0;
+ size_t i;
+ fd_set read_fds;
+ fd_set write_fds;
+ int nfds = 0;
+ struct timeval tv;
+ struct timeval *tout = NULL;
+
+ FD_ZERO(&read_fds);
+ FD_ZERO(&write_fds);
+
+ for (i = 0; i < num_fds; i++) {
+ const ares_event_t *ev =
+ ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
+ if (ev->flags & ARES_EVENT_FLAG_READ) {
+ FD_SET(ev->fd, &read_fds);
+ }
+ if (ev->flags & ARES_EVENT_FLAG_WRITE) {
+ FD_SET(ev->fd, &write_fds);
+ }
+ if (ev->fd + 1 > nfds) {
+ nfds = ev->fd + 1;
+ }
+ }
+
+ if (timeout_ms) {
+ tv.tv_sec = (int)(timeout_ms / 1000);
+ tv.tv_usec = (int)((timeout_ms % 1000) * 1000);
+ tout = &tv;
+ }
+
+ rv = select(nfds, &read_fds, &write_fds, NULL, tout);
+ if (rv > 0) {
+ for (i = 0; i < num_fds; i++) {
+ ares_event_t *ev;
+ ares_event_flags_t flags = 0;
+
+ ev = ares__htable_asvp_get_direct(e->ev_handles, fdlist[i]);
+ if (ev == NULL || ev->cb == NULL) {
+ continue;
+ }
+
+ if (FD_ISSET(fdlist[i], &read_fds)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+
+ if (FD_ISSET(fdlist[i], &write_fds)) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ if (flags == 0) {
+ continue;
+ }
+
+ cnt++;
+
+ ev->cb(e, fdlist[i], ev->data, flags);
+ }
+ }
+
+ ares_free(fdlist);
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_select = {
+ "select",
+ ares_evsys_select_init,
+ ares_evsys_select_destroy, /* NoOp */
+ ares_evsys_select_event_add, /* NoOp */
+ ares_evsys_select_event_del, /* NoOp */
+ ares_evsys_select_event_mod, /* NoOp */
+ ares_evsys_select_wait
+};
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_thread.c b/contrib/libs/c-ares/src/lib/ares_event_thread.c
new file mode 100644
index 0000000000..6dd7b502a3
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_thread.c
@@ -0,0 +1,452 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+
+static void ares_event_destroy_cb(void *arg)
+{
+ ares_event_t *event = arg;
+ if (event == NULL) {
+ return;
+ }
+
+ /* Unregister from the event thread if it was registered with one */
+ if (event->e) {
+ const ares_event_thread_t *e = event->e;
+ e->ev_sys->event_del(event);
+ event->e = NULL;
+ }
+
+ if (event->free_data_cb && event->data) {
+ event->free_data_cb(event->data);
+ }
+
+ ares_free(event);
+}
+
+/* See if a pending update already exists. We don't want to enqueue multiple
+ * updates for the same event handle. Right now this is O(n) based on number
+ * of updates already enqueued. In the future, it might make sense to make
+ * this O(1) with a hashtable.
+ * NOTE: in some cases a delete then re-add of the same fd, but really pointing
+ * to a different destination can happen due to a quick close of a
+ * connection then creation of a new one. So we need to look at the
+ * flags and ignore any delete events when finding a match since we
+ * need to process the delete always, it can't be combined with other
+ * updates. */
+static ares_event_t *ares_event_update_find(ares_event_thread_t *e,
+ ares_socket_t fd, const void *data)
+{
+ ares__llist_node_t *node;
+
+ for (node = ares__llist_node_first(e->ev_updates); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares_event_t *ev = ares__llist_node_val(node);
+
+ if (fd != ARES_SOCKET_BAD && fd == ev->fd && ev->flags != 0) {
+ return ev;
+ }
+
+ if (fd == ARES_SOCKET_BAD && ev->fd == ARES_SOCKET_BAD &&
+ data == ev->data && ev->flags != 0) {
+ return ev;
+ }
+ }
+
+ return NULL;
+}
+
+ares_status_t ares_event_update(ares_event_t **event, ares_event_thread_t *e,
+ ares_event_flags_t flags, ares_event_cb_t cb,
+ ares_socket_t fd, void *data,
+ ares_event_free_data_t free_data_cb,
+ ares_event_signal_cb_t signal_cb)
+{
+ ares_event_t *ev = NULL;
+
+ if (e == NULL || cb == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (event != NULL) {
+ *event = NULL;
+ }
+
+ /* Validate flags */
+ if (fd == ARES_SOCKET_BAD) {
+ if (flags & (ARES_EVENT_FLAG_READ | ARES_EVENT_FLAG_WRITE)) {
+ return ARES_EFORMERR;
+ }
+ if (!(flags & ARES_EVENT_FLAG_OTHER)) {
+ return ARES_EFORMERR;
+ }
+ } else {
+ if (flags & ARES_EVENT_FLAG_OTHER) {
+ return ARES_EFORMERR;
+ }
+ }
+
+ /* That's all the validation we can really do */
+
+ /* See if we have a queued update already */
+ ev = ares_event_update_find(e, fd, data);
+ if (ev == NULL) {
+ /* Allocate a new one */
+ ev = ares_malloc_zero(sizeof(*ev));
+ if (ev == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ if (ares__llist_insert_last(e->ev_updates, ev) == NULL) {
+ ares_free(ev);
+ return ARES_ENOMEM;
+ }
+ }
+
+ ev->flags = flags;
+ ev->fd = fd;
+ if (ev->cb == NULL) {
+ ev->cb = cb;
+ }
+ if (ev->data == NULL) {
+ ev->data = data;
+ }
+ if (ev->free_data_cb == NULL) {
+ ev->free_data_cb = free_data_cb;
+ }
+ if (ev->signal_cb == NULL) {
+ ev->signal_cb = signal_cb;
+ }
+
+ if (event != NULL) {
+ *event = ev;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static void ares_event_signal(const ares_event_t *event)
+{
+ if (event == NULL || event->signal_cb == NULL) {
+ return;
+ }
+ event->signal_cb(event);
+}
+
+static void ares_event_thread_wake(const ares_event_thread_t *e)
+{
+ if (e == NULL) {
+ return;
+ }
+
+ ares_event_signal(e->ev_signal);
+}
+
+static void ares_event_thread_process_fd(ares_event_thread_t *e,
+ ares_socket_t fd, void *data,
+ ares_event_flags_t flags)
+{
+ (void)data;
+
+ ares_process_fd(e->channel,
+ (flags & ARES_EVENT_FLAG_READ) ? fd : ARES_SOCKET_BAD,
+ (flags & ARES_EVENT_FLAG_WRITE) ? fd : ARES_SOCKET_BAD);
+}
+
+static void ares_event_thread_sockstate_cb(void *data, ares_socket_t socket_fd,
+ int readable, int writable)
+{
+ ares_event_thread_t *e = data;
+ ares_event_flags_t flags = ARES_EVENT_FLAG_NONE;
+
+ if (readable) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+
+ if (writable) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ /* Update channel fd */
+ ares__thread_mutex_lock(e->mutex);
+ ares_event_update(NULL, e, flags, ares_event_thread_process_fd, socket_fd,
+ NULL, NULL, NULL);
+
+ /* Wake the event thread so it properly enqueues any updates */
+ ares_event_thread_wake(e);
+
+ ares__thread_mutex_unlock(e->mutex);
+}
+
+static void ares_event_process_updates(ares_event_thread_t *e)
+{
+ ares__llist_node_t *node;
+
+ /* Iterate across all updates and apply to internal list, removing from update
+ * list */
+ while ((node = ares__llist_node_first(e->ev_updates)) != NULL) {
+ ares_event_t *newev = ares__llist_node_claim(node);
+ ares_event_t *oldev =
+ ares__htable_asvp_get_direct(e->ev_handles, newev->fd);
+
+ /* Adding new */
+ if (oldev == NULL) {
+ newev->e = e;
+ /* Don't try to add a new event if all flags are cleared, that's basically
+ * someone trying to delete something already deleted. Also if it fails
+ * to add, cleanup. */
+ if (newev->flags == ARES_EVENT_FLAG_NONE ||
+ !e->ev_sys->event_add(newev)) {
+ newev->e = NULL;
+ ares_event_destroy_cb(newev);
+ } else {
+ ares__htable_asvp_insert(e->ev_handles, newev->fd, newev);
+ }
+ continue;
+ }
+
+ /* Removal request */
+ if (newev->flags == ARES_EVENT_FLAG_NONE) {
+ /* the callback for the removal will call e->ev_sys->event_del(e, event)
+ */
+ ares__htable_asvp_remove(e->ev_handles, newev->fd);
+ ares_free(newev);
+ continue;
+ }
+
+ /* Modify request -- only flags can be changed */
+ e->ev_sys->event_mod(oldev, newev->flags);
+ oldev->flags = newev->flags;
+ ares_free(newev);
+ }
+}
+
+static void *ares_event_thread(void *arg)
+{
+ ares_event_thread_t *e = arg;
+ ares__thread_mutex_lock(e->mutex);
+
+ while (e->isup) {
+ struct timeval tv;
+ const struct timeval *tvout;
+ unsigned long timeout_ms = 0; /* 0 = unlimited */
+
+ tvout = ares_timeout(e->channel, NULL, &tv);
+ if (tvout != NULL) {
+ timeout_ms =
+ (unsigned long)((tvout->tv_sec * 1000) + (tvout->tv_usec / 1000) + 1);
+ }
+
+ ares_event_process_updates(e);
+
+ /* Don't hold a mutex while waiting on events */
+ ares__thread_mutex_unlock(e->mutex);
+ e->ev_sys->wait(e, timeout_ms);
+
+ /* Each iteration should do timeout processing */
+ if (e->isup) {
+ ares_process_fd(e->channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
+ }
+
+ /* Relock before we loop again */
+ ares__thread_mutex_lock(e->mutex);
+ }
+
+ ares__thread_mutex_unlock(e->mutex);
+ return NULL;
+}
+
+static void ares_event_thread_destroy_int(ares_event_thread_t *e)
+{
+ ares__llist_node_t *node;
+
+ /* Wake thread and tell it to shutdown if it exists */
+ ares__thread_mutex_lock(e->mutex);
+ if (e->isup) {
+ e->isup = ARES_FALSE;
+ ares_event_thread_wake(e);
+ }
+ ares__thread_mutex_unlock(e->mutex);
+
+ /* Wait for thread to shutdown */
+ if (e->thread) {
+ ares__thread_join(e->thread, NULL);
+ e->thread = NULL;
+ }
+
+ /* Manually free any updates that weren't processed */
+ while ((node = ares__llist_node_first(e->ev_updates)) != NULL) {
+ ares_event_destroy_cb(ares__llist_node_claim(node));
+ }
+ ares__llist_destroy(e->ev_updates);
+ e->ev_updates = NULL;
+
+ ares__htable_asvp_destroy(e->ev_handles);
+ e->ev_handles = NULL;
+
+ if (e->ev_sys->destroy) {
+ e->ev_sys->destroy(e);
+ }
+
+ ares__thread_mutex_destroy(e->mutex);
+ e->mutex = NULL;
+
+ ares_free(e);
+}
+
+void ares_event_thread_destroy(ares_channel_t *channel)
+{
+ ares_event_thread_t *e = channel->sock_state_cb_data;
+
+ if (e == NULL) {
+ return;
+ }
+
+ ares_event_thread_destroy_int(e);
+}
+
+static const ares_event_sys_t *ares_event_fetch_sys(ares_evsys_t evsys)
+{
+ switch (evsys) {
+ case ARES_EVSYS_WIN32:
+#if defined(_WIN32)
+ return &ares_evsys_win32;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_EPOLL:
+#if defined(HAVE_EPOLL)
+ return &ares_evsys_epoll;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_KQUEUE:
+#if defined(HAVE_KQUEUE)
+ return &ares_evsys_kqueue;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_POLL:
+#if defined(HAVE_POLL)
+ return &ares_evsys_poll;
+#else
+ return NULL;
+#endif
+
+ case ARES_EVSYS_SELECT:
+#if defined(HAVE_PIPE)
+ return &ares_evsys_select;
+#else
+ return NULL;
+#endif
+
+ /* case ARES_EVSYS_DEFAULT: */
+ default:
+#if defined(_WIN32)
+ return &ares_evsys_win32;
+#elif defined(HAVE_KQUEUE)
+ return &ares_evsys_kqueue;
+#elif defined(HAVE_EPOLL)
+ return &ares_evsys_epoll;
+#elif defined(HAVE_POLL)
+ return &ares_evsys_poll;
+#elif defined(HAVE_PIPE)
+ return &ares_evsys_select;
+#else
+ break;
+#endif
+ }
+
+ return NULL;
+}
+
+ares_status_t ares_event_thread_init(ares_channel_t *channel)
+{
+ ares_event_thread_t *e;
+
+ e = ares_malloc_zero(sizeof(*e));
+ if (e == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ e->mutex = ares__thread_mutex_create();
+ if (e->mutex == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOMEM;
+ }
+
+ e->ev_updates = ares__llist_create(NULL);
+ if (e->ev_updates == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOMEM;
+ }
+
+ e->ev_handles = ares__htable_asvp_create(ares_event_destroy_cb);
+ if (e->ev_handles == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOMEM;
+ }
+
+ e->channel = channel;
+ e->isup = ARES_TRUE;
+ e->ev_sys = ares_event_fetch_sys(channel->evsys);
+ if (e->ev_sys == NULL) {
+ ares_event_thread_destroy_int(e);
+ return ARES_ENOTIMP;
+ }
+
+ channel->sock_state_cb = ares_event_thread_sockstate_cb;
+ channel->sock_state_cb_data = e;
+
+ if (!e->ev_sys->init(e)) {
+ ares_event_thread_destroy_int(e);
+ channel->sock_state_cb = NULL;
+ channel->sock_state_cb_data = NULL;
+ return ARES_ESERVFAIL;
+ }
+
+ /* Before starting the thread, process any possible events the initialization
+ * might have enqueued as we may actually depend on these being valid
+ * immediately upon return, which may mean before the thread is fully spawned
+ * and processed the list itself. We don't want any sort of race conditions
+ * (like the event system wake handle itself). */
+ ares_event_process_updates(e);
+
+ /* Start thread */
+ if (ares__thread_create(&e->thread, ares_event_thread, e) != ARES_SUCCESS) {
+ ares_event_thread_destroy_int(e);
+ channel->sock_state_cb = NULL;
+ channel->sock_state_cb_data = NULL;
+ return ARES_ESERVFAIL;
+ }
+
+ return ARES_SUCCESS;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c b/contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c
new file mode 100644
index 0000000000..a2cd6f609a
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_wake_pipe.c
@@ -0,0 +1,166 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_PIPE
+typedef struct {
+ int filedes[2];
+} ares_pipeevent_t;
+
+static void ares_pipeevent_destroy(ares_pipeevent_t *p)
+{
+ if (p->filedes[0] != -1) {
+ close(p->filedes[0]);
+ }
+ if (p->filedes[1] != -1) {
+ close(p->filedes[1]);
+ }
+
+ ares_free(p);
+}
+
+static void ares_pipeevent_destroy_cb(void *arg)
+{
+ ares_pipeevent_destroy(arg);
+}
+
+static ares_pipeevent_t *ares_pipeevent_init(void)
+{
+ ares_pipeevent_t *p = ares_malloc_zero(sizeof(*p));
+ if (p == NULL) {
+ return NULL;
+ }
+
+ p->filedes[0] = -1;
+ p->filedes[1] = -1;
+
+# ifdef HAVE_PIPE2
+ if (pipe2(p->filedes, O_NONBLOCK | O_CLOEXEC) != 0) {
+ ares_pipeevent_destroy(p);
+ return NULL;
+ }
+# else
+ if (pipe(p->filedes) != 0) {
+ ares_pipeevent_destroy(p);
+ return NULL;
+ }
+
+# ifdef O_NONBLOCK
+ {
+ int val;
+ val = fcntl(p->filedes[0], F_GETFL, 0);
+ if (val >= 0) {
+ val |= O_NONBLOCK;
+ }
+ fcntl(p->filedes[0], F_SETFL, val);
+
+ val = fcntl(p->filedes[1], F_GETFL, 0);
+ if (val >= 0) {
+ val |= O_NONBLOCK;
+ }
+ fcntl(p->filedes[1], F_SETFL, val);
+ }
+# endif
+
+# ifdef O_CLOEXEC
+ fcntl(p->filedes[0], F_SETFD, O_CLOEXEC);
+ fcntl(p->filedes[1], F_SETFD, O_CLOEXEC);
+# endif
+# endif
+
+# ifdef F_SETNOSIGPIPE
+ fcntl(p->filedes[0], F_SETNOSIGPIPE, 1);
+ fcntl(p->filedes[1], F_SETNOSIGPIPE, 1);
+# endif
+
+ return p;
+}
+
+static void ares_pipeevent_signal(const ares_event_t *e)
+{
+ const ares_pipeevent_t *p;
+
+ if (e == NULL || e->data == NULL) {
+ return;
+ }
+
+ p = e->data;
+ (void)write(p->filedes[1], "1", 1);
+}
+
+static void ares_pipeevent_cb(ares_event_thread_t *e, ares_socket_t fd,
+ void *data, ares_event_flags_t flags)
+{
+ unsigned char buf[32];
+ const ares_pipeevent_t *p = NULL;
+
+ (void)e;
+ (void)fd;
+ (void)flags;
+
+ if (data == NULL) {
+ return;
+ }
+
+ p = data;
+
+ while (read(p->filedes[0], buf, sizeof(buf)) == sizeof(buf)) {
+ /* Do nothing */
+ }
+}
+
+ares_event_t *ares_pipeevent_create(ares_event_thread_t *e)
+{
+ ares_event_t *event = NULL;
+ ares_pipeevent_t *p = NULL;
+ ares_status_t status;
+
+ p = ares_pipeevent_init();
+ if (p == NULL) {
+ return NULL;
+ }
+
+ status = ares_event_update(&event, e, ARES_EVENT_FLAG_READ, ares_pipeevent_cb,
+ p->filedes[0], p, ares_pipeevent_destroy_cb,
+ ares_pipeevent_signal);
+ if (status != ARES_SUCCESS) {
+ ares_pipeevent_destroy(p);
+ return NULL;
+ }
+
+ return event;
+}
+
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_win32.c b/contrib/libs/c-ares/src/lib/ares_event_win32.c
new file mode 100644
index 0000000000..718e865085
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_win32.c
@@ -0,0 +1,601 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+#include "ares_event.h"
+#include "ares_event_win32.h"
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#ifdef _WIN32
+
+/* IMPLEMENTATION NOTES
+ * ====================
+ *
+ * This implementation uses some undocumented functionality within Windows for
+ * monitoring sockets. The Ancillary Function Driver (AFD) is the low level
+ * implementation that Winsock2 sits on top of. Winsock2 unfortunately does
+ * not expose the equivalent of epoll() or kqueue(), but it is possible to
+ * access AFD directly and use along with IOCP to simulate the functionality.
+ * We want to use IOCP if possible as it gives us the ability to monitor more
+ * than just sockets (WSAPoll is not an option), and perform arbitrary callbacks
+ * which means we can hook in non-socket related events.
+ *
+ * The information for this implementation was gathered from "wepoll" and
+ * "libuv" which both use slight variants on this, but this implementation
+ * doesn't directly follow either methodology.
+ *
+ * Initialization:
+ * 1. Dynamically load the NtDeviceIoControlFile and NtCancelIoFileEx internal
+ * symbols from ntdll.dll. These functions are used to submit the AFD POLL
+ * request and to cancel a prior request, respectively.
+ * 2. Create an IO Completion Port base handle via CreateIoCompletionPort()
+ * that all socket events will be delivered through.
+ * 3. Create a callback to be used to be able to interrupt waiting for IOCP
+ * events, this may be called for allowing enqueuing of additional socket
+ * events or removing socket events. PostQueuedCompletionStatus() is the
+ * obvious choice. Use the same container structure as used with a Socket
+ * but tagged indicating it is not as the CompletionKey (important!).
+ *
+ * Socket Add:
+ * 1. Create/Allocate a container for holding metadata about a socket:
+ * - SOCKET base_socket;
+ * - SOCKET peer_socket;
+ * - OVERLAPPED overlapped; -- Used by AFD POLL
+ * - AFD_POLL_INFO afd_poll_info; -- Used by AFD POLL
+ * 2. Call WSAIoctl(..., SIO_BASE_HANDLE, ...) to unwrap the SOCKET and get
+ * the "base socket" we can use for polling. It appears this may fail so
+ * we should call WSAIoctl(..., SIO_BSP_HANDLE_POLL, ...) as a fallback.
+ * 3. The SOCKET handle we have is most likely not capable of supporting
+ * OVERLAPPED, and we need to have a way to unbind a socket from IOCP
+ * (which is done via a simple closesocket()) so we need to duplicate the
+ * "base socket" using WSADuplicateSocketW() followed by
+ * WSASocketW(..., WSA_FLAG_OVERLAPPED) to create this "peer socket" for
+ * submitting AFD POLL requests.
+ * 4. Bind to IOCP using CreateIoCompletionPort() referencing the "peer
+ * socket" and the base IOCP handle from "Initialization". Use the
+ * pointer to the socket container as the "CompletionKey" which will be
+ * returned when an event occurs.
+ * 5. Submit AFD POLL request (see "AFD POLL Request" section)
+ *
+ * Socket Delete:
+ * 1. Call "AFD Poll Cancel" (see Section of same name)
+ * 2. If a cancel was requested (not bypassed due to no events, etc), tag the
+ * "container" for the socket as pending delete, and when the next IOCP
+ * event for the socket is dequeued, cleanup.
+ * 3. Otherwise, call closesocket(peer_socket) then free() the container
+ * which will officially delete it.
+ * NOTE: Deferring delete may be completely unnecessary. In theory closing
+ * the peer_socket() should guarantee no additional events will be
+ * delivered. But maybe if there's a pending event that hasn't been
+ * read yet but already trigggered it would be an issue, so this is
+ * "safer" unless we can prove its not necessary.
+ *
+ * Socket Modify:
+ * 1. Call "AFD Poll Cancel" (see Section of same name)
+ * 2. If a cancel was not enqueued because there is no pending request,
+ * submit AFD POLL request (see "AFD POLL Request" section), otherwise
+ * defer until next socket event.
+ *
+ * Event Wait:
+ * 1. Call GetQueuedCompletionStatusEx() with the base IOCP handle, a
+ * stack allocated array of OVERLAPPED_ENTRY's, and an appropriate
+ * timeout.
+ * 2. Iterate across returned events, the CompletionKey is a pointer to the
+ * container registered with CreateIoCompletionPort() or
+ * PostQueuedCompletionStatus()
+ * 3. If object indicates it is pending delete, go ahead and
+ * closesocket(peer_socket) and free() the container. Go to the next event.
+ * 4. Submit AFD POLL Request (see "AFD POLL Request"). We must re-enable
+ * the request each time we receive a response, it is not persistent.
+ * 5. Notify of any events received as indicated in the AFD_POLL_INFO
+ * Handles[0].Events (NOTE: check NumberOfHandles first, make sure it is
+ * > 0, otherwise we might not have events such as if our last request
+ * was cancelled).
+ *
+ * AFD Poll Request:
+ * 1. Initialize the AFD_POLL_INFO structure:
+ * Exclusive = TRUE; // Auto cancel duplicates for same socket
+ * NumberOfHandles = 1;
+ * Timeout.QuadPart = LLONG_MAX;
+ * Handles[0].Handle = (HANDLE)base_socket;
+ * Handles[0].Status = 0;
+ * Handles[0].Events = ... set as appropriate AFD_POLL_RECEIVE, etc;
+ * 2. Zero out the OVERLAPPED structure
+ * 3. Create an IO_STATUS_BLOCK pointer (iosb) and set it to the address of
+ * the OVERLAPPED "Internal" member.
+ * 4. Set the "Status" member of IO_STATUS_BLOCK to STATUS_PENDING
+ * 5. Call
+ * NtDeviceIoControlFile((HANDLE)peer_socket, NULL, NULL, &overlapped,
+ * iosb, IOCTL_AFD_POLL
+ * &afd_poll_info, sizeof(afd_poll_info),
+ * &afd_poll_info, sizeof(afd_poll_info));
+ * NOTE: Its not clear to me if the IO_STATUS_BLOCK pointing to OVERLAPPED
+ * is for efficiency or if its a requirement for AFD. This is what
+ * libuv does, so I'm doing it here too.
+ *
+ * AFD Poll Cancel:
+ * 1. Check to see if the IO_STATUS_BLOCK "Status" member for the socket
+ * is still STATUS_PENDING, if not, no cancel request is necessary.
+ * 2. Call
+ * NtCancelIoFileEx((HANDLE)peer_socket, iosb, &temp_iosb);
+ *
+ *
+ * References:
+ * - https://github.com/piscisaureus/wepoll/
+ * - https://github.com/libuv/libuv/
+ */
+
+typedef struct {
+ /* Dynamically loaded symbols */
+ NtDeviceIoControlFile_t NtDeviceIoControlFile;
+ NtCancelIoFileEx_t NtCancelIoFileEx;
+
+ /* Implementation details */
+ HANDLE iocp_handle;
+} ares_evsys_win32_t;
+
+typedef struct {
+ /*! Pointer to parent event container */
+ ares_event_t *event;
+ /*! Socket passed in to monitor */
+ SOCKET socket;
+ /*! Base socket derived from provided socket */
+ SOCKET base_socket;
+ /*! New socket (duplicate base_socket handle) supporting OVERLAPPED operation
+ */
+ SOCKET peer_socket;
+ /*! Structure for submitting AFD POLL requests (Internals!) */
+ AFD_POLL_INFO afd_poll_info;
+ /*! Overlapped structure submitted with AFD POLL requests and returned with
+ * IOCP results */
+ OVERLAPPED overlapped;
+} ares_evsys_win32_eventdata_t;
+
+static void ares_iocpevent_signal(const ares_event_t *event)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+
+ if (e == NULL) {
+ return;
+ }
+
+ PostQueuedCompletionStatus(ew->iocp_handle, 0, (ULONG_PTR)event->data, NULL);
+}
+
+static void ares_iocpevent_cb(ares_event_thread_t *e, ares_socket_t fd,
+ void *data, ares_event_flags_t flags)
+{
+ (void)e;
+ (void)data;
+ (void)fd;
+ (void)flags;
+}
+
+static ares_event_t *ares_iocpevent_create(ares_event_thread_t *e)
+{
+ ares_event_t *event = NULL;
+ ares_status_t status;
+
+ status =
+ ares_event_update(&event, e, ARES_EVENT_FLAG_OTHER, ares_iocpevent_cb,
+ ARES_SOCKET_BAD, NULL, NULL, ares_iocpevent_signal);
+ if (status != ARES_SUCCESS) {
+ return NULL;
+ }
+
+ return event;
+}
+
+static void ares_evsys_win32_destroy(ares_event_thread_t *e)
+{
+ ares_evsys_win32_t *ew = NULL;
+
+ if (e == NULL) {
+ return;
+ }
+
+ ew = e->ev_sys_data;
+ if (ew == NULL) {
+ return;
+ }
+
+ if (ew->iocp_handle != NULL) {
+ CloseHandle(ew->iocp_handle);
+ }
+
+ ares_free(ew);
+ e->ev_sys_data = NULL;
+}
+
+static ares_bool_t ares_evsys_win32_init(ares_event_thread_t *e)
+{
+ ares_evsys_win32_t *ew = NULL;
+ HMODULE ntdll;
+
+ ew = ares_malloc_zero(sizeof(*ew));
+ if (ew == NULL) {
+ return ARES_FALSE;
+ }
+
+ e->ev_sys_data = ew;
+
+ /* All apps should have ntdll.dll already loaded, so just get a handle to
+ * this */
+ ntdll = GetModuleHandleA("ntdll.dll");
+ if (ntdll == NULL) {
+ goto fail;
+ }
+
+ /* Load Internal symbols not typically accessible */
+ ew->NtDeviceIoControlFile = (NtDeviceIoControlFile_t)(void *)GetProcAddress(
+ ntdll, "NtDeviceIoControlFile");
+ ew->NtCancelIoFileEx =
+ (NtCancelIoFileEx_t)(void *)GetProcAddress(ntdll, "NtCancelIoFileEx");
+
+ if (ew->NtCancelIoFileEx == NULL || ew->NtDeviceIoControlFile == NULL) {
+ goto fail;
+ }
+
+ ew->iocp_handle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
+ if (ew->iocp_handle == NULL) {
+ goto fail;
+ }
+
+ e->ev_signal = ares_iocpevent_create(e);
+ if (e->ev_signal == NULL) {
+ goto fail;
+ }
+
+ return ARES_TRUE;
+
+fail:
+ ares_evsys_win32_destroy(e);
+ return ARES_FALSE;
+}
+
+static ares_socket_t ares_evsys_win32_basesocket(ares_socket_t socket)
+{
+ while (1) {
+ DWORD bytes; /* Not used */
+ ares_socket_t base_socket = ARES_SOCKET_BAD;
+ int rv;
+
+ rv = WSAIoctl(socket, SIO_BASE_HANDLE, NULL, 0, &base_socket,
+ sizeof(base_socket), &bytes, NULL, NULL);
+ if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD) {
+ socket = base_socket;
+ break;
+ }
+
+ /* If we're here, an error occurred */
+ if (GetLastError() == WSAENOTSOCK) {
+ /* This is critical, exit */
+ return ARES_SOCKET_BAD;
+ }
+
+ /* Work around known bug in Komodia based LSPs, use ARES_BSP_HANDLE_POLL
+ * to retrieve the underlying socket to then loop and get the base socket:
+ * https://docs.microsoft.com/en-us/windows/win32/winsock/winsock-ioctls
+ * https://www.komodia.com/newwiki/index.php?title=Komodia%27s_Redirector_bug_fixes#Version_2.2.2.6
+ */
+ base_socket = ARES_SOCKET_BAD;
+ rv = WSAIoctl(socket, SIO_BSP_HANDLE_POLL, NULL, 0, &base_socket,
+ sizeof(base_socket), &bytes, NULL, NULL);
+
+ if (rv != SOCKET_ERROR && base_socket != ARES_SOCKET_BAD &&
+ base_socket != socket) {
+ socket = base_socket;
+ continue; /* loop! */
+ }
+
+ return ARES_SOCKET_BAD;
+ }
+
+ return socket;
+}
+
+static ares_bool_t ares_evsys_win32_afd_enqueue(ares_event_t *event,
+ ares_event_flags_t flags)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+ ares_evsys_win32_eventdata_t *ed = event->data;
+ NTSTATUS status;
+ IO_STATUS_BLOCK *iosb_ptr;
+
+ if (e == NULL || ed == NULL || ew == NULL) {
+ return ARES_FALSE;
+ }
+
+ /* Enqueue AFD Poll */
+ ed->afd_poll_info.Exclusive = TRUE;
+ ed->afd_poll_info.NumberOfHandles = 1;
+ ed->afd_poll_info.Timeout.QuadPart = LLONG_MAX;
+ ed->afd_poll_info.Handles[0].Handle = (HANDLE)ed->base_socket;
+ ed->afd_poll_info.Handles[0].Status = 0;
+ ed->afd_poll_info.Handles[0].Events = 0;
+
+ if (flags & ARES_EVENT_FLAG_READ) {
+ ed->afd_poll_info.Handles[0].Events |=
+ (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT |
+ AFD_POLL_ABORT);
+ }
+ if (flags & ARES_EVENT_FLAG_WRITE) {
+ ed->afd_poll_info.Handles[0].Events |=
+ (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL);
+ }
+ if (flags == 0) {
+ ed->afd_poll_info.Handles[0].Events |= AFD_POLL_DISCONNECT;
+ }
+
+ memset(&ed->overlapped, 0, sizeof(ed->overlapped));
+ iosb_ptr = (IO_STATUS_BLOCK *)&ed->overlapped.Internal;
+ iosb_ptr->Status = STATUS_PENDING;
+
+ status = ew->NtDeviceIoControlFile(
+ (HANDLE)ed->peer_socket, NULL, NULL, &ed->overlapped, iosb_ptr,
+ IOCTL_AFD_POLL, &ed->afd_poll_info, sizeof(ed->afd_poll_info),
+ &ed->afd_poll_info, sizeof(ed->afd_poll_info));
+ if (status != STATUS_SUCCESS && status != STATUS_PENDING) {
+ printf("%s(): failed to perform IOCTL_AFD_POLL operation\n", __FUNCTION__);
+ fflush(stdout);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static ares_bool_t ares_evsys_win32_afd_cancel(ares_evsys_win32_eventdata_t *ed)
+{
+ IO_STATUS_BLOCK *iosb_ptr;
+ IO_STATUS_BLOCK cancel_iosb;
+ ares_evsys_win32_t *ew;
+ NTSTATUS status;
+
+ /* Detached due to destroy */
+ if (ed->event == NULL) {
+ return ARES_FALSE;
+ }
+
+ iosb_ptr = (IO_STATUS_BLOCK *)&ed->overlapped.Internal;
+ /* Not pending, nothing to do */
+ if (iosb_ptr->Status != STATUS_PENDING) {
+ return ARES_FALSE;
+ }
+
+ ew = ed->event->e->ev_sys_data;
+ status =
+ ew->NtCancelIoFileEx((HANDLE)ed->peer_socket, iosb_ptr, &cancel_iosb);
+
+ /* NtCancelIoFileEx() may return STATUS_NOT_FOUND if the operation completed
+ * just before calling NtCancelIoFileEx(), but we have not yet received the
+ * notifiction (but it should be queued for the next IOCP event). */
+ if (status == STATUS_SUCCESS || status == STATUS_NOT_FOUND) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static void ares_evsys_win32_eventdata_destroy(ares_evsys_win32_eventdata_t *ed)
+{
+ if (ed == NULL) {
+ return;
+ }
+
+ if (ed->peer_socket != ARES_SOCKET_BAD) {
+ closesocket(ed->peer_socket);
+ }
+
+ ares_free(ed);
+}
+
+static ares_bool_t ares_evsys_win32_event_add(ares_event_t *event)
+{
+ ares_event_thread_t *e = event->e;
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+ ares_evsys_win32_eventdata_t *ed;
+ WSAPROTOCOL_INFOW protocol_info;
+
+ ed = ares_malloc_zero(sizeof(*ed));
+ ed->event = event;
+ ed->socket = event->fd;
+ ed->base_socket = ARES_SOCKET_BAD;
+ ed->peer_socket = ARES_SOCKET_BAD;
+
+ /* Likely a signal event, not something we will directly handle. We create
+ * the ares_evsys_win32_eventdata_t as the placeholder to use as the
+ * IOCP Completion Key */
+ if (ed->socket == ARES_SOCKET_BAD) {
+ event->data = ed;
+ return ARES_TRUE;
+ }
+
+ ed->base_socket = ares_evsys_win32_basesocket(ed->socket);
+ if (ed->base_socket == ARES_SOCKET_BAD) {
+ fprintf(stderr, "%s(): could not determine base socket for fd %d\n",
+ __FUNCTION__, (int)event->fd);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ /* Create a peer socket that supports OVERLAPPED so we can use IOCP on the
+ * socket handle */
+ if (WSADuplicateSocketW(ed->base_socket, GetCurrentProcessId(),
+ &protocol_info) != 0) {
+ fprintf(stderr,
+ "%s(): could not retrieve protocol info for creating peer socket\n",
+ __FUNCTION__);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ ed->peer_socket =
+ WSASocketW(protocol_info.iAddressFamily, protocol_info.iSocketType,
+ protocol_info.iProtocol, &protocol_info, 0, WSA_FLAG_OVERLAPPED);
+ if (ed->peer_socket == ARES_SOCKET_BAD) {
+ fprintf(stderr, "%s(): could not create peer socket\n", __FUNCTION__);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ SetHandleInformation((HANDLE)ed->peer_socket, HANDLE_FLAG_INHERIT, 0);
+
+ if (CreateIoCompletionPort((HANDLE)ed->peer_socket, ew->iocp_handle,
+ (ULONG_PTR)ed, 0) == NULL) {
+ fprintf(stderr, "%s(): failed to bind peer socket to IOCP\n", __FUNCTION__);
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ event->data = ed;
+
+ if (!ares_evsys_win32_afd_enqueue(event, event->flags)) {
+ event->data = NULL;
+ ares_evsys_win32_eventdata_destroy(ed);
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+static void ares_evsys_win32_event_del(ares_event_t *event)
+{
+ ares_evsys_win32_eventdata_t *ed = event->data;
+ ares_event_thread_t *e = event->e;
+
+ if (event->fd == ARES_SOCKET_BAD || !e->isup || ed == NULL ||
+ !ares_evsys_win32_afd_cancel(ed)) {
+ /* Didn't need to enqueue a cancellation, for one of these reasons:
+ * - Not an IOCP socket
+ * - This is during shutdown of the event thread, no more signals can be
+ * delivered.
+ * - It has been determined there is no AFD POLL queued currently for the
+ * socket.
+ */
+ ares_evsys_win32_eventdata_destroy(ed);
+ event->data = NULL;
+ } else {
+ /* Detach from event, so when the cancel event comes through,
+ * it will clean up */
+ ed->event = NULL;
+ event->data = NULL;
+ }
+}
+
+static void ares_evsys_win32_event_mod(ares_event_t *event,
+ ares_event_flags_t new_flags)
+{
+ ares_evsys_win32_eventdata_t *ed = event->data;
+
+ /* Not for us */
+ if (event->fd == ARES_SOCKET_BAD || ed == NULL) {
+ return;
+ }
+
+ /* Try to cancel any current outstanding poll, if one is not running,
+ * go ahead and queue it up */
+ if (!ares_evsys_win32_afd_cancel(ed)) {
+ ares_evsys_win32_afd_enqueue(event, new_flags);
+ }
+}
+
+static size_t ares_evsys_win32_wait(ares_event_thread_t *e,
+ unsigned long timeout_ms)
+{
+ ares_evsys_win32_t *ew = e->ev_sys_data;
+ OVERLAPPED_ENTRY entries[16];
+ ULONG nentries = sizeof(entries) / sizeof(*entries);
+ BOOL status;
+ size_t i;
+ size_t cnt = 0;
+
+ status = GetQueuedCompletionStatusEx(
+ ew->iocp_handle, entries, nentries, &nentries,
+ (timeout_ms == 0) ? INFINITE : (DWORD)timeout_ms, FALSE);
+
+ if (!status) {
+ return 0;
+ }
+
+ for (i = 0; i < (size_t)nentries; i++) {
+ ares_event_flags_t flags = 0;
+ ares_evsys_win32_eventdata_t *ed =
+ (ares_evsys_win32_eventdata_t *)entries[i].lpCompletionKey;
+ ares_event_t *event = ed->event;
+
+ if (ed->socket == ARES_SOCKET_BAD) {
+ /* Some sort of signal event */
+ flags = ARES_EVENT_FLAG_OTHER;
+ } else {
+ /* Process events */
+ if (ed->afd_poll_info.NumberOfHandles > 0) {
+ if (ed->afd_poll_info.Handles[0].Events &
+ (AFD_POLL_RECEIVE | AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT |
+ AFD_POLL_ABORT)) {
+ flags |= ARES_EVENT_FLAG_READ;
+ }
+ if (ed->afd_poll_info.Handles[0].Events &
+ (AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL)) {
+ flags |= ARES_EVENT_FLAG_WRITE;
+ }
+
+ /* XXX: Handle ed->afd_poll_info.Handles[0].Events &
+ * AFD_POLL_LOCAL_CLOSE */
+ }
+
+ if (event == NULL) {
+ /* This means we need to cleanup the private event data as we've been
+ * detached */
+ ares_evsys_win32_eventdata_destroy(ed);
+ } else {
+ /* Re-enqueue so we can get more events on the socket */
+ ares_evsys_win32_afd_enqueue(event, event->flags);
+ }
+ }
+
+ if (event != NULL && flags != 0) {
+ cnt++;
+ event->cb(e, event->fd, event->data, flags);
+ }
+ }
+
+ return cnt;
+}
+
+const ares_event_sys_t ares_evsys_win32 = { "win32",
+ ares_evsys_win32_init,
+ ares_evsys_win32_destroy,
+ ares_evsys_win32_event_add,
+ ares_evsys_win32_event_del,
+ ares_evsys_win32_event_mod,
+ ares_evsys_win32_wait };
+#endif
diff --git a/contrib/libs/c-ares/src/lib/ares_event_win32.h b/contrib/libs/c-ares/src/lib/ares_event_win32.h
new file mode 100644
index 0000000000..99cd5c90f3
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_event_win32.h
@@ -0,0 +1,119 @@
+/* MIT License
+ *
+ * Copyright (c) 2024 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#ifndef __ARES_EVENT_WIN32_H
+#define __ARES_EVENT_WIN32_H
+
+#ifdef _WIN32
+# ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+# endif
+# ifdef HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+# endif
+# ifdef HAVE_MSWSOCK_H
+# include <mswsock.h>
+# endif
+# ifdef HAVE_WINDOWS_H
+# include <windows.h>
+# endif
+
+/* From winternl.h */
+
+/* If WDK is not installed and not using MinGW, provide the needed definitions
+ */
+typedef LONG NTSTATUS;
+
+typedef struct _IO_STATUS_BLOCK {
+ union {
+ NTSTATUS Status;
+ PVOID Pointer;
+ };
+
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef VOID(NTAPI *PIO_APC_ROUTINE)(PVOID ApcContext,
+ PIO_STATUS_BLOCK IoStatusBlock,
+ ULONG Reserved);
+
+/* From ntstatus.h */
+# define STATUS_SUCCESS ((NTSTATUS)0x00000000)
+# ifndef STATUS_PENDING
+# define STATUS_PENDING ((NTSTATUS)0x00000103L)
+# endif
+# define STATUS_CANCELLED ((NTSTATUS)0xC0000120L)
+# define STATUS_NOT_FOUND ((NTSTATUS)0xC0000225L)
+
+/* Not sure what headers might have these */
+# define IOCTL_AFD_POLL 0x00012024
+
+# define AFD_POLL_RECEIVE 0x0001
+# define AFD_POLL_RECEIVE_EXPEDITED 0x0002
+# define AFD_POLL_SEND 0x0004
+# define AFD_POLL_DISCONNECT 0x0008
+# define AFD_POLL_ABORT 0x0010
+# define AFD_POLL_LOCAL_CLOSE 0x0020
+# define AFD_POLL_ACCEPT 0x0080
+# define AFD_POLL_CONNECT_FAIL 0x0100
+
+typedef struct _AFD_POLL_HANDLE_INFO {
+ HANDLE Handle;
+ ULONG Events;
+ NTSTATUS Status;
+} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
+
+typedef struct _AFD_POLL_INFO {
+ LARGE_INTEGER Timeout;
+ ULONG NumberOfHandles;
+ ULONG Exclusive;
+ AFD_POLL_HANDLE_INFO Handles[1];
+} AFD_POLL_INFO, *PAFD_POLL_INFO;
+
+/* Prototypes for dynamically loaded functions from ntdll.dll */
+typedef NTSTATUS(NTAPI *NtCancelIoFileEx_t)(HANDLE FileHandle,
+ PIO_STATUS_BLOCK IoRequestToCancel,
+ PIO_STATUS_BLOCK IoStatusBlock);
+typedef NTSTATUS(NTAPI *NtDeviceIoControlFile_t)(
+ HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext,
+ PIO_STATUS_BLOCK IoStatusBlock, ULONG IoControlCode, PVOID InputBuffer,
+ ULONG InputBufferLength, PVOID OutputBuffer, ULONG OutputBufferLength);
+
+/* On UWP/Windows Store, these definitions aren't there for some reason */
+# ifndef SIO_BSP_HANDLE_POLL
+# define SIO_BSP_HANDLE_POLL 0x4800001D
+# endif
+
+# ifndef SIO_BASE_HANDLE
+# define SIO_BASE_HANDLE 0x48000022
+# endif
+
+# ifndef HANDLE_FLAG_INHERIT
+# define HANDLE_FLAG_INHERIT 0x00000001
+# endif
+
+#endif /* _WIN32 */
+
+#endif /* __ARES_EVENT_WIN32_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_expand_name.c b/contrib/libs/c-ares/src/lib/ares_expand_name.c
index 21c4e93d85..280490b86a 100644
--- a/contrib/libs/c-ares/src/lib/ares_expand_name.c
+++ b/contrib/libs/c-ares/src/lib/ares_expand_name.c
@@ -34,289 +34,85 @@
#include "ares_nameser.h"
#include "ares.h"
-#include "ares_nowarn.h"
#include "ares_private.h" /* for the memdebug */
-/* Maximum number of indirections allowed for a name */
-#define MAX_INDIRS 50
-
-static int name_length(const unsigned char *encoded, const unsigned char *abuf,
- int alen, int is_hostname);
-
-/* Reserved characters for names that need to be escaped */
-static int is_reservedch(int ch)
-{
- switch (ch) {
- case '"':
- case '.':
- case ';':
- case '\\':
- case '(':
- case ')':
- case '@':
- case '$':
- return 1;
- default:
- break;
- }
-
- return 0;
-}
-
-static int ares__isprint(int ch)
+ares_status_t ares__expand_name_validated(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s, size_t *enclen,
+ ares_bool_t is_hostname)
{
- if (ch >= 0x20 && ch <= 0x7E)
- return 1;
- return 0;
-}
+ ares_status_t status;
+ ares__buf_t *buf = NULL;
+ size_t start_len;
-/* Character set allowed by hostnames. This is to include the normal
- * domain name character set plus:
- * - underscores which are used in SRV records.
- * - Forward slashes such as are used for classless in-addr.arpa
- * delegation (CNAMEs)
- * - Asterisks may be used for wildcard domains in CNAMEs as seen in the
- * real world.
- * While RFC 2181 section 11 does state not to do validation,
- * that applies to servers, not clients. Vulnerabilities have been
- * reported when this validation is not performed. Security is more
- * important than edge-case compatibility (which is probably invalid
- * anyhow). */
-static int is_hostnamech(int ch)
-{
- /* [A-Za-z0-9-*._/]
- * Don't use isalnum() as it is locale-specific
- */
- if (ch >= 'A' && ch <= 'Z')
- return 1;
- if (ch >= 'a' && ch <= 'z')
- return 1;
- if (ch >= '0' && ch <= '9')
- return 1;
- if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*')
- return 1;
+ if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) {
+ return ARES_EBADNAME; /* EFORMERR would be better */
+ }
- return 0;
-}
+ if (encoded < abuf || encoded >= abuf + alen) {
+ return ARES_EBADNAME; /* EFORMERR would be better */
+ }
-/* Expand an RFC1035-encoded domain name given by encoded. The
- * containing message is given by abuf and alen. The result given by
- * *s, which is set to a NUL-terminated allocated buffer. *enclen is
- * set to the length of the encoded name (not the length of the
- * expanded name; the goal is to tell the caller how many bytes to
- * move forward to get past the encoded name).
- *
- * In the simple case, an encoded name is a series of labels, each
- * composed of a one-byte length (limited to values between 0 and 63
- * inclusive) followed by the label contents. The name is terminated
- * by a zero-length label.
- *
- * In the more complicated case, a label may be terminated by an
- * indirection pointer, specified by two bytes with the high bits of
- * the first byte (corresponding to INDIR_MASK) set to 11. With the
- * two high bits of the first byte stripped off, the indirection
- * pointer gives an offset from the beginning of the containing
- * message with more labels to decode. Indirection can happen an
- * arbitrary number of times, so we have to detect loops.
- *
- * Since the expanded name uses '.' as a label separator, we use
- * backslashes to escape periods or backslashes in the expanded name.
- *
- * If the result is expected to be a hostname, then no escaped data is allowed
- * and will return error.
- */
+ *enclen = 0;
-int ares__expand_name_validated(const unsigned char *encoded,
- const unsigned char *abuf,
- int alen, char **s, long *enclen,
- int is_hostname)
-{
- int len, indir = 0;
- char *q;
- const unsigned char *p;
- union {
- ares_ssize_t sig;
- size_t uns;
- } nlen;
+ /* NOTE: we allow 's' to be NULL to skip it */
+ if (s) {
+ *s = NULL;
+ }
- nlen.sig = name_length(encoded, abuf, alen, is_hostname);
- if (nlen.sig < 0)
- return ARES_EBADNAME;
+ buf = ares__buf_create_const(abuf, alen);
- *s = ares_malloc(nlen.uns + 1);
- if (!*s)
+ if (buf == NULL) {
return ARES_ENOMEM;
- q = *s;
-
- if (nlen.uns == 0) {
- /* RFC2181 says this should be ".": the root of the DNS tree.
- * Since this function strips trailing dots though, it becomes ""
- */
- q[0] = '\0';
-
- /* indirect root label (like 0xc0 0x0c) is 2 bytes long (stupid, but
- valid) */
- if ((*encoded & INDIR_MASK) == INDIR_MASK)
- *enclen = 2L;
- else
- *enclen = 1L; /* the caller should move one byte to get past this */
-
- return ARES_SUCCESS;
}
- /* No error-checking necessary; it was all done by name_length(). */
- p = encoded;
- while (*p)
- {
- if ((*p & INDIR_MASK) == INDIR_MASK)
- {
- if (!indir)
- {
- *enclen = aresx_uztosl(p + 2U - encoded);
- indir = 1;
- }
- p = abuf + ((*p & ~INDIR_MASK) << 8 | *(p + 1));
- }
- else
- {
- int name_len = *p;
- len = name_len;
- p++;
-
- while (len--)
- {
- /* Output as \DDD for consistency with RFC1035 5.1, except
- * for the special case of a root name response */
- if (!ares__isprint(*p) && !(name_len == 1 && *p == 0))
- {
- *q++ = '\\';
- *q++ = (char)('0' + *p / 100);
- *q++ = (char)('0' + (*p % 100) / 10);
- *q++ = (char)('0' + (*p % 10));
- }
- else if (is_reservedch(*p))
- {
- *q++ = '\\';
- *q++ = *p;
- }
- else
- {
- *q++ = *p;
- }
- p++;
- }
- *q++ = '.';
- }
- }
+ status = ares__buf_set_position(buf, (size_t)(encoded - abuf));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- if (!indir)
- *enclen = aresx_uztosl(p + 1U - encoded);
+ start_len = ares__buf_len(buf);
+ status = ares__dns_name_parse(buf, s, is_hostname);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* 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 */
+ *enclen = start_len - ares__buf_len(buf);
- return ARES_SUCCESS;
+done:
+ ares__buf_destroy(buf);
+ return status;
}
-
int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
int alen, char **s, long *enclen)
{
- return ares__expand_name_validated(encoded, abuf, alen, s, enclen, 0);
-}
-
-/* Return the length of the expansion of an encoded domain name, or
- * -1 if the encoding is invalid.
- */
-static int name_length(const unsigned char *encoded, const unsigned char *abuf,
- int alen, int is_hostname)
-{
- int n = 0, offset, indir = 0, top;
-
- /* Allow the caller to pass us abuf + alen and have us check for it. */
- if (encoded >= abuf + alen)
- return -1;
-
- while (*encoded)
- {
- top = (*encoded & INDIR_MASK);
- if (top == INDIR_MASK)
- {
- /* Check the offset and go there. */
- if (encoded + 1 >= abuf + alen)
- return -1;
- offset = (*encoded & ~INDIR_MASK) << 8 | *(encoded + 1);
- if (offset >= alen)
- return -1;
- encoded = abuf + offset;
+ /* Keep public API compatible */
+ size_t enclen_temp = 0;
+ ares_status_t status;
- /* If we've seen more indirects than the message length,
- * then there's a loop.
- */
- ++indir;
- if (indir > alen || indir > MAX_INDIRS)
- return -1;
- }
- else if (top == 0x00)
- {
- int name_len = *encoded;
- offset = name_len;
- if (encoded + offset + 1 >= abuf + alen)
- return -1;
- encoded++;
-
- while (offset--)
- {
- if (!ares__isprint(*encoded) && !(name_len == 1 && *encoded == 0))
- {
- if (is_hostname)
- return -1;
- n += 4;
- }
- else if (is_reservedch(*encoded))
- {
- if (is_hostname)
- return -1;
- n += 2;
- }
- else
- {
- if (is_hostname && !is_hostnamech(*encoded))
- return -1;
- n += 1;
- }
- encoded++;
- }
-
- n++;
- }
- else
- {
- /* RFC 1035 4.1.4 says other options (01, 10) for top 2
- * bits are reserved.
- */
- return -1;
- }
- }
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
- /* 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;
+ status = ares__expand_name_validated(encoded, abuf, (size_t)alen, s,
+ &enclen_temp, ARES_FALSE);
+ *enclen = (long)enclen_temp;
+ return (int)status;
}
/* Like ares_expand_name_validated but returns EBADRESP in case of invalid
* input. */
-int ares__expand_name_for_response(const unsigned char *encoded,
- const unsigned char *abuf, int alen,
- char **s, long *enclen, int is_hostname)
+ares_status_t ares__expand_name_for_response(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s,
+ size_t *enclen,
+ ares_bool_t is_hostname)
{
- int status = ares__expand_name_validated(encoded, abuf, alen, s, enclen,
- is_hostname);
- if (status == ARES_EBADNAME)
+ ares_status_t status =
+ ares__expand_name_validated(encoded, abuf, alen, s, enclen, is_hostname);
+ if (status == ARES_EBADNAME) {
status = ARES_EBADRESP;
+ }
return status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_expand_string.c b/contrib/libs/c-ares/src/lib/ares_expand_string.c
index 2d6daa1497..be7034e271 100644
--- a/contrib/libs/c-ares/src/lib/ares_expand_string.c
+++ b/contrib/libs/c-ares/src/lib/ares_expand_string.c
@@ -41,38 +41,71 @@
* 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)
+ares_status_t ares_expand_string_ex(const unsigned char *encoded,
+ const unsigned char *abuf, size_t alen,
+ unsigned char **s, size_t *enclen)
{
- unsigned char *q;
- union {
- ares_ssize_t sig;
- size_t uns;
- } elen;
+ ares_status_t status;
+ ares__buf_t *buf = NULL;
+ size_t start_len;
+ size_t len = 0;
- if (encoded == abuf+alen)
- return ARES_EBADSTR;
+ if (encoded == NULL || abuf == NULL || alen == 0 || enclen == NULL) {
+ return ARES_EBADSTR; /* EFORMERR would be better */
+ }
- elen.uns = *encoded;
- if (encoded+elen.sig+1 > abuf+alen)
- return ARES_EBADSTR;
+ if (encoded < abuf || encoded >= abuf + alen) {
+ return ARES_EBADSTR; /* EFORMERR would be better */
+ }
- encoded++;
+ *enclen = 0;
- *s = ares_malloc(elen.uns+1);
- if (*s == NULL)
+ /* NOTE: we allow 's' to be NULL to skip it */
+ if (s) {
+ *s = NULL;
+ }
+
+ buf = ares__buf_create_const(abuf, alen);
+
+ if (buf == NULL) {
return ARES_ENOMEM;
- q = *s;
- strncpy((char *)q, (char *)encoded, elen.uns);
- q[elen.uns] = '\0';
+ }
- *s = q;
+ status = ares__buf_set_position(buf, (size_t)(encoded - abuf));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- *enclen = (long)(elen.sig+1);
+ start_len = ares__buf_len(buf);
+ status =
+ ares__buf_parse_dns_binstr(buf, ares__buf_len(buf), s, &len, ARES_FALSE);
+ /* hrm, no way to pass back 'len' with the prototype */
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- return ARES_SUCCESS;
+ *enclen = start_len - ares__buf_len(buf);
+
+done:
+ ares__buf_destroy(buf);
+ if (status == ARES_EBADNAME || status == ARES_EBADRESP) {
+ status = ARES_EBADSTR;
+ }
+ return status;
}
+int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf,
+ int alen, unsigned char **s, long *enclen)
+{
+ ares_status_t status;
+ size_t temp_enclen = 0;
+
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+
+ status = ares_expand_string_ex(encoded, abuf, (size_t)alen, s, &temp_enclen);
+
+ *enclen = (long)temp_enclen;
+ return (int)status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_fds.c b/contrib/libs/c-ares/src/lib/ares_fds.c
index 5ee149f904..e726d4f012 100644
--- a/contrib/libs/c-ares/src/lib/ares_fds.c
+++ b/contrib/libs/c-ares/src/lib/ares_fds.c
@@ -28,42 +28,56 @@
#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)
+int ares_fds(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds)
{
- struct server_state *server;
- ares_socket_t nfds;
- int i;
-
+ ares_socket_t nfds;
+ ares__slist_node_t *snode;
/* Are there any active queries? */
- size_t active_queries = ares__llist_len(channel->all_queries);
+ size_t active_queries;
+
+ if (channel == NULL || read_fds == NULL || write_fds == NULL) {
+ return 0;
+ }
+
+ ares__channel_lock(channel);
+
+ active_queries = ares__llist_len(channel->all_queries);
nfds = 0;
- for (i = 0; i < channel->nservers; i++) {
- ares__llist_node_t *node;
- server = &channel->servers[i];
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ struct server_state *server = ares__slist_node_val(snode);
+ ares__llist_node_t *node;
- for (node = ares__llist_node_first(server->connections);
- node != NULL;
+ for (node = ares__llist_node_first(server->connections); node != NULL;
node = ares__llist_node_next(node)) {
- struct server_connection *conn = ares__llist_node_val(node);
+ const struct server_connection *conn = ares__llist_node_val(node);
+
+ if (!active_queries && !conn->is_tcp) {
+ continue;
+ }
+
+ /* Silence coverity, shouldn't be possible */
+ if (conn->fd == ARES_SOCKET_BAD) {
+ continue;
+ }
+
+ /* Always wait on read */
+ FD_SET(conn->fd, read_fds);
- /* We only need to register interest in UDP sockets if we have
- * outstanding queries.
- */
- if (active_queries || conn->is_tcp) {
- FD_SET(conn->fd, read_fds);
- if (conn->fd >= nfds)
- nfds = conn->fd + 1;
+ if (conn->fd >= nfds) {
+ nfds = conn->fd + 1;
}
+ /* TCP only wait on write if we have buffered data */
if (conn->is_tcp && ares__buf_len(server->tcp_send)) {
FD_SET(conn->fd, write_fds);
}
}
}
+ ares__channel_unlock(channel);
return (int)nfds;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_free_hostent.c b/contrib/libs/c-ares/src/lib/ares_free_hostent.c
index 0d20673163..a088c1b15c 100644
--- a/contrib/libs/c-ares/src/lib/ares_free_hostent.c
+++ b/contrib/libs/c-ares/src/lib/ares_free_hostent.c
@@ -28,7 +28,7 @@
#include "ares_setup.h"
#ifdef HAVE_NETDB_H
-#include <netdb.h>
+# include <netdb.h>
#endif
#include "ares.h"
@@ -38,16 +38,19 @@ void ares_free_hostent(struct hostent *host)
{
char **p;
- if (!host)
+ if (!host) {
return;
+ }
- ares_free((char *)(host->h_name));
- for (p = host->h_aliases; p && *p; p++)
+ ares_free(host->h_name);
+ for (p = host->h_aliases; p && *p; p++) {
ares_free(*p);
+ }
ares_free(host->h_aliases);
if (host->h_addr_list) {
- ares_free(host->h_addr_list[0]); /* no matter if there is one or many entries,
- there is only one malloc for all of them */
+ ares_free(
+ host->h_addr_list[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/src/lib/ares_freeaddrinfo.c b/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c
index fe458735ee..45d931a3f8 100644
--- a/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares_freeaddrinfo.c
@@ -37,34 +37,34 @@
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);
- }
+ 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);
- }
+ while (head) {
+ current = head;
+ head = head->ai_next;
+ ares_free(current->ai_addr);
+ ares_free(current);
+ }
}
void ares_freeaddrinfo(struct ares_addrinfo *ai)
{
- if (ai == NULL)
+ if (ai == NULL) {
return;
+ }
ares__freeaddrinfo_cnames(ai->cnames);
ares__freeaddrinfo_nodes(ai->nodes);
+
ares_free(ai->name);
ares_free(ai);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c b/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c
index a3a2add1a2..cfc889c70a 100644
--- a/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares_getaddrinfo.c
@@ -29,9 +29,9 @@
#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"
+# if !defined(GETSERVBYNAME_R_ARGS) || (GETSERVBYNAME_R_ARGS < 4) || \
+ (GETSERVBYNAME_R_ARGS > 6)
+# error "you MUST specify a valid number of arguments for getservbyname_r"
# endif
#endif
@@ -48,45 +48,51 @@
#include "ares_nameser.h"
#ifdef HAVE_STRINGS_H
-#include <strings.h>
+# include <strings.h>
#endif
#include <assert.h>
#ifdef HAVE_LIMITS_H
-#include <limits.h>
+# include <limits.h>
#endif
#include "ares.h"
-#include "bitncmp.h"
#include "ares_private.h"
#include "ares_dns.h"
#ifdef WATT32
-#undef WIN32
+# 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 host_query {
+ ares_channel_t *channel;
+ char *name;
+ unsigned short port; /* in host order */
+ ares_addrinfo_callback callback;
+ void *arg;
struct ares_addrinfo_hints hints;
- int sent_family; /* this family is what was is being used */
- int timeouts; /* number of timeouts we saw for this request */
+ int sent_family; /* this family is what was is being used */
+ size_t timeouts; /* number of timeouts we saw for this request */
+ char *lookups; /* Duplicate memory from channel because of ares_reinit() */
const char *remaining_lookups; /* types of lookup we need to perform ("fb" by
default, file and dns respectively) */
- struct ares_addrinfo *ai; /* store results between lookups */
- unsigned short qid_a; /* qid for A request */
- unsigned short qid_aaaa; /* qid for AAAA request */
- int remaining; /* number of DNS answers waiting for */
- int next_domain; /* next search domain to try */
- int nodata_cnt; /* Track nodata responses to possibly override final result */
+ /* Search order for names */
+ char **names;
+ size_t names_cnt;
+ size_t next_name_idx; /* next name index being attempted */
+
+ struct ares_addrinfo *ai; /* store results between lookups */
+ unsigned short qid_a; /* qid for A request */
+ unsigned short qid_aaaa; /* qid for AAAA request */
+
+ size_t remaining; /* number of DNS answers waiting for */
+
+ /* Track nodata responses to possibly override final result */
+ size_t nodata_cnt;
};
static const struct ares_addrinfo_hints default_hints = {
@@ -96,139 +102,84 @@ static const struct ares_addrinfo_hints default_hints = {
0, /* ai_protocol */
};
-static const struct ares_addrinfo_cname empty_addrinfo_cname = {
- INT_MAX, /* ttl */
- NULL, /* alias */
- NULL, /* name */
- NULL, /* next */
-};
-
-static const struct ares_addrinfo_node empty_addrinfo_node = {
- 0, /* ai_ttl */
- 0, /* ai_flags */
- 0, /* ai_family */
- 0, /* ai_socktype */
- 0, /* ai_protocol */
- 0, /* ai_addrlen */
- NULL, /* ai_addr */
- NULL /* ai_next */
-};
-
-static const struct ares_addrinfo empty_addrinfo = {
- NULL, /* cnames */
- NULL, /* nodes */
- NULL /* name */
-};
-
/* forward declarations */
-static void host_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static int as_is_first(const struct host_query *hquery);
-static int as_is_only(const struct host_query* hquery);
-static int next_dns_lookup(struct host_query *hquery);
+static ares_bool_t next_dns_lookup(struct host_query *hquery);
-static struct ares_addrinfo_cname *ares__malloc_addrinfo_cname(void)
+struct ares_addrinfo_cname *
+ ares__append_addrinfo_cname(struct ares_addrinfo_cname **head)
{
- struct ares_addrinfo_cname *cname = ares_malloc(sizeof(struct ares_addrinfo_cname));
- if (!cname)
- return NULL;
+ struct ares_addrinfo_cname *tail = ares_malloc_zero(sizeof(*tail));
+ struct ares_addrinfo_cname *last = *head;
- *cname = empty_addrinfo_cname;
- return cname;
-}
+ if (tail == NULL) {
+ return NULL;
+ }
-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;
- }
+ if (!last) {
+ *head = tail;
+ return tail;
+ }
- while (last->next)
- {
- last = last->next;
- }
+ 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 *tail)
{
struct ares_addrinfo_cname *last = *head;
- if (!last)
- {
- *head = tail;
- return;
- }
+ if (!last) {
+ *head = tail;
+ return;
+ }
- while (last->next)
- {
- last = last->next;
- }
+ while (last->next) {
+ last = last->next;
+ }
last->next = tail;
}
-static struct ares_addrinfo *ares__malloc_addrinfo(void)
+/* Allocate new addrinfo and append to the tail. */
+struct ares_addrinfo_node *
+ ares__append_addrinfo_node(struct ares_addrinfo_node **head)
{
- struct ares_addrinfo *ai = ares_malloc(sizeof(struct ares_addrinfo));
- if (!ai)
- return NULL;
-
- *ai = empty_addrinfo;
- return ai;
-}
+ struct ares_addrinfo_node *tail = ares_malloc_zero(sizeof(*tail));
+ struct ares_addrinfo_node *last = *head;
-static struct ares_addrinfo_node *ares__malloc_addrinfo_node(void)
-{
- struct ares_addrinfo_node *node =
- ares_malloc(sizeof(*node));
- if (!node)
+ if (tail == NULL) {
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;
- }
+ if (!last) {
+ *head = tail;
+ return tail;
+ }
- while (last->ai_next)
- {
- last = last->ai_next;
- }
+ 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 *tail)
{
struct ares_addrinfo_node *last = *head;
- if (!last)
- {
- *head = tail;
- return;
- }
+ if (!last) {
+ *head = tail;
+ return;
+ }
- while (last->ai_next)
- {
- last = last->ai_next;
- }
+ while (last->ai_next) {
+ last = last->ai_next;
+ }
last->ai_next = tail;
}
@@ -238,385 +189,331 @@ void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head,
*/
static unsigned short lookup_service(const char *service, int flags)
{
- const char *proto;
+ const char *proto;
struct servent *sep;
#ifdef HAVE_GETSERVBYNAME_R
struct servent se;
- char tmpbuf[4096];
+ 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";
+ 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);
+ 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
- sep = getservbyname(service, proto);
-#endif
+ /* 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 (sep ? ntohs((unsigned short)sep->s_port) : 0);
+ }
return 0;
}
-/* If the name looks like an IP address or an error occured,
+/* If the name looks like an IP address or an error occurred,
* fake up a host entry, end the query immediately, and return true.
* Otherwise return false.
*/
-static 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)
+static ares_bool_t fake_addrinfo(const char *name, unsigned short port,
+ const struct ares_addrinfo_hints *hints,
+ struct ares_addrinfo *ai,
+ ares_addrinfo_callback callback, void *arg)
{
struct ares_addrinfo_cname *cname;
- int status = ARES_SUCCESS;
- int result = 0;
- int family = hints->ai_family;
- if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC)
- {
- /* It only looks like an IP address if it's all numbers and dots. */
- int numdots = 0, valid = 1;
- const char *p;
- for (p = name; *p; p++)
- {
- if (!ISDIGIT(*p) && *p != '.')
- {
- valid = 0;
- break;
- }
- else if (*p == '.')
- {
- numdots++;
- }
- }
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t result = ARES_FALSE;
+ int family = hints->ai_family;
+ if (family == AF_INET || family == AF_INET6 || family == AF_UNSPEC) {
+ /* It only looks like an IP address if it's all numbers and dots. */
+ size_t numdots = 0;
+ ares_bool_t valid = ARES_TRUE;
+ const char *p;
+ for (p = name; *p; p++) {
+ if (!ISDIGIT(*p) && *p != '.') {
+ valid = ARES_FALSE;
+ break;
+ } else if (*p == '.') {
+ numdots++;
+ }
+ }
- /* if we don't have 3 dots, it is illegal
- * (although inet_pton doesn't think so).
- */
- if (numdots != 3 || !valid)
- result = 0;
- else
- {
- struct in_addr addr4;
- result = ares_inet_pton(AF_INET, name, &addr4) < 1 ? 0 : 1;
- if (result)
- {
- status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes);
- if (status != ARES_SUCCESS)
- {
- callback(arg, status, 0, NULL);
- return 1;
- }
- }
+ /* if we don't have 3 dots, it is illegal
+ * (although inet_pton doesn't think so).
+ */
+ if (numdots != 3 || !valid) {
+ result = ARES_FALSE;
+ } else {
+ struct in_addr addr4;
+ result =
+ ares_inet_pton(AF_INET, name, &addr4) < 1 ? ARES_FALSE : ARES_TRUE;
+ if (result) {
+ status = ares_append_ai_node(AF_INET, port, 0, &addr4, &ai->nodes);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL);
+ return ARES_TRUE;
}
+ }
}
+ }
- if (!result && (family == AF_INET6 || family == AF_UNSPEC))
- {
- struct ares_in6_addr addr6;
- result = ares_inet_pton(AF_INET6, name, &addr6) < 1 ? 0 : 1;
- if (result)
- {
- status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes);
- if (status != ARES_SUCCESS)
- {
- callback(arg, status, 0, NULL);
- return 1;
- }
- }
+ if (!result && (family == AF_INET6 || family == AF_UNSPEC)) {
+ struct ares_in6_addr addr6;
+ result =
+ ares_inet_pton(AF_INET6, name, &addr6) < 1 ? ARES_FALSE : ARES_TRUE;
+ if (result) {
+ status = ares_append_ai_node(AF_INET6, port, 0, &addr6, &ai->nodes);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL);
+ return ARES_TRUE;
+ }
}
+ }
- if (!result)
- return 0;
-
- if (hints->ai_flags & ARES_AI_CANONNAME)
- {
- cname = ares__append_addrinfo_cname(&ai->cnames);
- if (!cname)
- {
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return 1;
- }
+ if (!result) {
+ return ARES_FALSE;
+ }
- /* 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;
- }
+ if (hints->ai_flags & ARES_AI_CANONNAME) {
+ cname = ares__append_addrinfo_cname(&ai->cnames);
+ if (!cname) {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return ARES_TRUE;
+ }
+
+ /* Duplicate the name, to avoid a constness violation. */
+ cname->name = ares_strdup(name);
+ if (!cname->name) {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return ARES_TRUE;
}
+ }
ai->nodes->ai_socktype = hints->ai_socktype;
ai->nodes->ai_protocol = hints->ai_protocol;
callback(arg, ARES_SUCCESS, 0, ai);
- return 1;
+ return ARES_TRUE;
}
-static void end_hquery(struct host_query *hquery, int status)
+static void hquery_free(struct host_query *hquery, ares_bool_t cleanup_ai)
{
- struct ares_addrinfo_node sentinel;
- struct ares_addrinfo_node *next;
+ if (cleanup_ai) {
+ ares_freeaddrinfo(hquery->ai);
+ }
+ ares__strsplit_free(hquery->names, hquery->names_cnt);
+ ares_free(hquery->name);
+ ares_free(hquery->lookups);
+ ares_free(hquery);
+}
- if (status == ARES_SUCCESS)
- {
- if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes)
- {
- sentinel.ai_next = hquery->ai->nodes;
- ares__sortaddrinfo(hquery->channel, &sentinel);
- hquery->ai->nodes = sentinel.ai_next;
- }
- next = hquery->ai->nodes;
+static void end_hquery(struct host_query *hquery, ares_status_t status)
+{
+ struct ares_addrinfo_node sentinel;
+ struct ares_addrinfo_node *next;
- while (next)
- {
- next->ai_socktype = hquery->hints.ai_socktype;
- next->ai_protocol = hquery->hints.ai_protocol;
- next = next->ai_next;
- }
- }
- else
- {
- /* Clean up what we have collected by so far. */
- ares_freeaddrinfo(hquery->ai);
- hquery->ai = NULL;
- }
+ if (status == ARES_SUCCESS) {
+ if (!(hquery->hints.ai_flags & ARES_AI_NOSORT) && hquery->ai->nodes) {
+ sentinel.ai_next = hquery->ai->nodes;
+ ares__sortaddrinfo(hquery->channel, &sentinel);
+ hquery->ai->nodes = sentinel.ai_next;
+ }
+ next = hquery->ai->nodes;
+
+ while (next) {
+ next->ai_socktype = hquery->hints.ai_socktype;
+ next->ai_protocol = hquery->hints.ai_protocol;
+ next = next->ai_next;
+ }
+ } else {
+ /* Clean up what we have collected by so far. */
+ ares_freeaddrinfo(hquery->ai);
+ hquery->ai = NULL;
+ }
- hquery->callback(hquery->arg, status, hquery->timeouts, hquery->ai);
- ares_free(hquery->name);
- ares_free(hquery);
+ hquery->callback(hquery->arg, (int)status, (int)hquery->timeouts, hquery->ai);
+ hquery_free(hquery, ARES_FALSE);
}
-static int is_localhost(const char *name)
+ares_bool_t ares__is_localhost(const char *name)
{
- /* RFC6761 6.3 says : The domain "localhost." and any names falling within ".localhost." */
+ /* RFC6761 6.3 says : The domain "localhost." and any names falling within
+ * ".localhost." */
size_t len;
- if (name == NULL)
- return 0;
+ if (name == NULL) {
+ return ARES_FALSE;
+ }
- if (strcmp(name, "localhost") == 0)
- return 1;
+ if (strcmp(name, "localhost") == 0) {
+ return ARES_TRUE;
+ }
- len = strlen(name);
- if (len < 10 /* strlen(".localhost") */)
- return 0;
+ len = ares_strlen(name);
+ if (len < 10 /* strlen(".localhost") */) {
+ return ARES_FALSE;
+ }
- if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0)
- return 1;
+ if (strcmp(name + (len - 10 /* strlen(".localhost") */), ".localhost") == 0) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
-static int file_lookup(struct host_query *hquery)
+static ares_status_t file_lookup(struct host_query *hquery)
{
- FILE *fp;
- int error;
- int status;
- char *path_hosts = NULL;
-
- if (hquery->hints.ai_flags & ARES_AI_ENVHOSTS)
- {
- path_hosts = ares_strdup(getenv("CARES_HOSTS"));
- if (!path_hosts)
- return ARES_ENOMEM;
- }
+ const ares_hosts_entry_t *entry;
+ ares_status_t status;
- if (hquery->channel->hosts_path)
- {
- path_hosts = ares_strdup(hquery->channel->hosts_path);
- if (!path_hosts)
- return ARES_ENOMEM;
- }
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(hquery->name)) {
+ return ARES_ENOTFOUND;
+ }
- 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;
+ status = ares__hosts_search_host(
+ hquery->channel,
+ (hquery->hints.ai_flags & ARES_AI_ENVHOSTS) ? ARES_TRUE : ARES_FALSE,
+ hquery->name, &entry);
- strcat(PATH_HOSTS, WIN_PATH_HOSTS);
-#elif defined(WATT32)
- const char *PATH_HOSTS = _w32_GetHostsFile();
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- if (!PATH_HOSTS)
- return ARES_ENOTFOUND;
-#endif
- path_hosts = ares_strdup(PATH_HOSTS);
- if (!path_hosts)
- return ARES_ENOMEM;
- }
+ status = ares__hosts_entry_to_addrinfo(
+ entry, hquery->name, hquery->hints.ai_family, hquery->port,
+ (hquery->hints.ai_flags & ARES_AI_CANONNAME) ? ARES_TRUE : ARES_FALSE,
+ hquery->ai);
+
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- fp = fopen(path_hosts, "r");
- if (!fp)
- {
- error = ERRNO;
- switch (error)
- {
- case ENOENT:
- case ESRCH:
- status = ARES_ENOTFOUND;
- break;
- default:
- DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n", error,
- strerror(error)));
- DEBUGF(fprintf(stderr, "Error opening file: %s\n", path_hosts));
- status = ARES_EFILE;
- break;
- }
- }
- else
- {
- status = ares__readaddrinfo(fp, hquery->name, hquery->port, &hquery->hints, hquery->ai);
- fclose(fp);
- }
- ares_free(path_hosts);
+done:
/* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries
* SHOULD recognize localhost names as special and SHOULD always return the
* IP loopback address for address queries".
* We will also ignore ALL errors when trying to resolve localhost, such
* as permissions errors reading /etc/hosts or a malformed /etc/hosts */
- if (status != ARES_SUCCESS && is_localhost(hquery->name))
- {
- return ares__addrinfo_localhost(hquery->name, hquery->port,
- &hquery->hints, hquery->ai);
- }
+ if (status != ARES_SUCCESS && status != ARES_ENOMEM &&
+ ares__is_localhost(hquery->name)) {
+ return ares__addrinfo_localhost(hquery->name, hquery->port, &hquery->hints,
+ hquery->ai);
+ }
return status;
}
-static void next_lookup(struct host_query *hquery, int status)
+static void next_lookup(struct host_query *hquery, ares_status_t status)
{
- switch (*hquery->remaining_lookups)
- {
- case 'b':
- /* RFC6761 section 6.3 #3 says "Name resolution APIs SHOULD NOT send
- * queries for localhost names to their configured caching DNS
- * server(s)." */
- if (!is_localhost(hquery->name))
- {
- /* DNS lookup */
- if (next_dns_lookup(hquery))
- break;
- }
-
- hquery->remaining_lookups++;
- next_lookup(hquery, status);
- break;
-
- case 'f':
- /* Host file lookup */
- if (file_lookup(hquery) == ARES_SUCCESS)
- {
- end_hquery(hquery, ARES_SUCCESS);
- break;
- }
- hquery->remaining_lookups++;
- next_lookup(hquery, status);
- break;
- default:
- /* No lookup left */
- end_hquery(hquery, status);
- break;
- }
-}
+ switch (*hquery->remaining_lookups) {
+ case 'b':
+ /* RFC6761 section 6.3 #3 says "Name resolution APIs SHOULD NOT send
+ * queries for localhost names to their configured caching DNS
+ * server(s)."
+ * Otherwise, DNS lookup. */
+ if (!ares__is_localhost(hquery->name) && next_dns_lookup(hquery)) {
+ break;
+ }
+
+ hquery->remaining_lookups++;
+ next_lookup(hquery, status);
+ break;
+ case 'f':
+ /* Host file lookup */
+ if (file_lookup(hquery) == ARES_SUCCESS) {
+ end_hquery(hquery, ARES_SUCCESS);
+ break;
+ }
+ hquery->remaining_lookups++;
+ next_lookup(hquery, status);
+ break;
+ default:
+ /* No lookup left */
+ end_hquery(hquery, status);
+ break;
+ }
+}
-static void terminate_retries(struct host_query *hquery, unsigned short qid)
+static void terminate_retries(const struct host_query *hquery,
+ unsigned short qid)
{
- unsigned short term_qid = (qid == hquery->qid_a)?hquery->qid_aaaa:hquery->qid_a;
- ares_channel channel = hquery->channel;
- struct query *query = NULL;
+ unsigned short term_qid =
+ (qid == hquery->qid_a) ? hquery->qid_aaaa : hquery->qid_a;
+ const ares_channel_t *channel = hquery->channel;
+ struct query *query = NULL;
/* No other outstanding queries, nothing to do */
- if (!hquery->remaining)
+ if (!hquery->remaining) {
return;
+ }
- query = ares__htable_stvp_get_direct(channel->queries_by_qid, term_qid);
- if (query == NULL)
+ query = ares__htable_szvp_get_direct(channel->queries_by_qid, term_qid);
+ if (query == NULL) {
return;
+ }
- query->no_retries = 1;
+ query->no_retries = ARES_TRUE;
}
-
-static void host_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static void host_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- struct host_query *hquery = (struct host_query*)arg;
- int addinfostatus = ARES_SUCCESS;
- unsigned short qid = 0;
- hquery->timeouts += timeouts;
+ struct host_query *hquery = (struct host_query *)arg;
+ ares_status_t addinfostatus = ARES_SUCCESS;
+ hquery->timeouts += timeouts;
hquery->remaining--;
if (status == ARES_SUCCESS) {
- addinfostatus = ares__parse_into_addrinfo(abuf, alen, 1, hquery->port,
- hquery->ai);
- if (addinfostatus == ARES_SUCCESS && alen >= HFIXEDSZ) {
- qid = DNS_HEADER_QID(abuf); /* Converts to host byte order */
- terminate_retries(hquery, qid);
+ if (dnsrec == NULL) {
+ addinfostatus = ARES_EBADRESP;
+ } else {
+ addinfostatus =
+ ares__parse_into_addrinfo(dnsrec, ARES_TRUE, hquery->port, hquery->ai);
+ }
+ if (addinfostatus == ARES_SUCCESS) {
+ terminate_retries(hquery, ares_dns_record_get_id(dnsrec));
}
}
if (!hquery->remaining) {
- if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) {
+ if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
+ /* must make sure we don't do next_lookup() on destroy or cancel,
+ * and return the appropriate status. We won't return a partial
+ * result in this case. */
+ end_hquery(hquery, status);
+ } else if (addinfostatus != ARES_SUCCESS && addinfostatus != ARES_ENODATA) {
/* error in parsing result e.g. no memory */
if (addinfostatus == ARES_EBADRESP && hquery->ai->nodes) {
/* We got a bad response from server, but at least one query
@@ -628,14 +525,12 @@ static void host_callback(void *arg, int status, int timeouts,
} else if (hquery->ai->nodes) {
/* at least one query ended with ARES_SUCCESS */
end_hquery(hquery, ARES_SUCCESS);
- } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
- /* must make sure we don't do next_lookup() on destroy or cancel */
- end_hquery(hquery, status);
} else if (status == ARES_ENOTFOUND || status == ARES_ENODATA ||
addinfostatus == ARES_ENODATA) {
- if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA)
+ if (status == ARES_ENODATA || addinfostatus == ARES_ENODATA) {
hquery->nodata_cnt++;
- next_lookup(hquery, hquery->nodata_cnt?ARES_ENODATA:status);
+ }
+ next_lookup(hquery, hquery->nodata_cnt ? ARES_ENODATA : status);
} else {
end_hquery(hquery, status);
}
@@ -644,234 +539,162 @@ static void host_callback(void *arg, int status, int timeouts,
/* 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)
+static void ares_getaddrinfo_int(ares_channel_t *channel, const char *name,
+ const char *service,
+ const struct ares_addrinfo_hints *hints,
+ ares_addrinfo_callback callback, void *arg)
{
- struct host_query *hquery;
- unsigned short port = 0;
- int family;
+ struct host_query *hquery;
+ unsigned short port = 0;
+ int family;
struct ares_addrinfo *ai;
- char *alias_name = NULL;
- int status;
+ ares_status_t status;
- if (!hints)
- {
- hints = &default_hints;
- }
+ 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 (family != AF_INET && family != AF_INET6 && family != AF_UNSPEC) {
+ callback(arg, ARES_ENOTIMP, 0, NULL);
+ return;
+ }
- /* perform HOSTALIAS resolution (technically this function does some other
- * things we are going to ignore) */
- status = ares__single_domain(channel, name, &alias_name);
- if (status != ARES_SUCCESS) {
- callback(arg, status, 0, NULL);
+ if (ares__is_onion_domain(name)) {
+ callback(arg, ARES_ENOTFOUND, 0, NULL);
return;
}
- if (alias_name)
- name = alias_name;
-
- if (service)
- {
- if (hints->ai_flags & ARES_AI_NUMERICSERV)
- {
- unsigned long val;
- errno = 0;
- val = strtoul(service, NULL, 0);
- if ((val == 0 && errno != 0) || val > 65535)
- {
- ares_free(alias_name);
- callback(arg, ARES_ESERVICE, 0, NULL);
- return;
- }
- port = (unsigned short)val;
- }
- else
- {
- port = lookup_service(service, 0);
- if (!port)
- {
- unsigned long val;
- errno = 0;
- val = strtoul(service, NULL, 0);
- if ((val == 0 && errno != 0) || val > 65535)
- {
- ares_free(alias_name);
- callback(arg, ARES_ESERVICE, 0, NULL);
- return;
- }
- port = (unsigned short)val;
- }
+ if (service) {
+ if (hints->ai_flags & ARES_AI_NUMERICSERV) {
+ unsigned long val;
+ errno = 0;
+ val = strtoul(service, NULL, 0);
+ if ((val == 0 && errno != 0) || val > 65535) {
+ callback(arg, ARES_ESERVICE, 0, NULL);
+ return;
+ }
+ port = (unsigned short)val;
+ } else {
+ port = lookup_service(service, 0);
+ if (!port) {
+ unsigned long val;
+ errno = 0;
+ val = strtoul(service, NULL, 0);
+ if ((val == 0 && errno != 0) || val > 65535) {
+ callback(arg, ARES_ESERVICE, 0, NULL);
+ return;
}
+ port = (unsigned short)val;
+ }
}
+ }
- ai = ares__malloc_addrinfo();
- if (!ai)
- {
- ares_free(alias_name);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ ai = ares_malloc_zero(sizeof(*ai));
+ if (!ai) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- if (fake_addrinfo(name, port, hints, ai, callback, arg))
- {
- ares_free(alias_name);
- return;
- }
+ if (fake_addrinfo(name, port, hints, ai, callback, arg)) {
+ return;
+ }
/* Allocate and fill in the host query structure. */
- hquery = ares_malloc(sizeof(*hquery));
- if (!hquery)
- {
- ares_free(alias_name);
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
- memset(hquery, 0, sizeof(*hquery));
- hquery->name = ares_strdup(name);
- ares_free(alias_name);
- if (!hquery->name)
- {
- ares_free(hquery);
- ares_freeaddrinfo(ai);
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ hquery = ares_malloc_zero(sizeof(*hquery));
+ if (!hquery) {
+ ares_freeaddrinfo(ai);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- hquery->port = port;
- hquery->channel = channel;
- hquery->hints = *hints;
+ 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->ai = ai;
- hquery->next_domain = -1;
+ hquery->callback = callback;
+ hquery->arg = arg;
+ hquery->ai = ai;
+ hquery->name = ares_strdup(name);
+ if (hquery->name == NULL) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- /* Start performing lookups according to channel->lookups. */
- next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
-}
+ status =
+ ares__search_name_list(channel, name, &hquery->names, &hquery->names_cnt);
+ if (status != ARES_SUCCESS) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, (int)status, 0, NULL);
+ return;
+ }
+ hquery->next_name_idx = 0;
-static int next_dns_lookup(struct host_query *hquery)
-{
- char *s = NULL;
- int is_s_allocated = 0;
- int status;
-
- /* if next_domain == -1 and as_is_first is true, try hquery->name */
- if (hquery->next_domain == -1)
- {
- if (as_is_first(hquery))
- {
- s = hquery->name;
- }
- hquery->next_domain = 0;
- }
- /* if as_is_first is false, try hquery->name at last */
- if (!s && hquery->next_domain == hquery->channel->ndomains) {
- if (!as_is_first(hquery))
- {
- s = hquery->name;
- }
- hquery->next_domain++;
- }
-
- if (!s && hquery->next_domain < hquery->channel->ndomains && !as_is_only(hquery))
- {
- status = ares__cat_domain(
- hquery->name,
- hquery->channel->domains[hquery->next_domain++],
- &s);
- if (status == ARES_SUCCESS)
- {
- is_s_allocated = 1;
- }
- }
+ hquery->lookups = ares_strdup(channel->lookups);
+ if (hquery->lookups == NULL) {
+ hquery_free(hquery, ARES_TRUE);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+ hquery->remaining_lookups = hquery->lookups;
- if (s)
- {
- /* NOTE: hquery may be invalidated during the call to ares_query_qid(),
- * so should not be referenced after this point */
- switch (hquery->hints.ai_family)
- {
- case AF_INET:
- hquery->remaining += 1;
- ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback, hquery,
- &hquery->qid_a);
- break;
- case AF_INET6:
- hquery->remaining += 1;
- ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback,
- hquery, &hquery->qid_aaaa);
- break;
- case AF_UNSPEC:
- hquery->remaining += 2;
- ares_query_qid(hquery->channel, s, C_IN, T_A, host_callback,
- hquery, &hquery->qid_a);
- ares_query_qid(hquery->channel, s, C_IN, T_AAAA, host_callback,
- hquery, &hquery->qid_aaaa);
- break;
- default: break;
- }
- if (is_s_allocated)
- {
- ares_free(s);
- }
- return 1;
- }
- else
- {
- assert(!hquery->ai->nodes);
- return 0;
- }
+ /* Start performing lookups according to channel->lookups. */
+ next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
}
-static int as_is_first(const struct host_query* hquery)
+void ares_getaddrinfo(ares_channel_t *channel, const char *name,
+ const char *service,
+ const struct ares_addrinfo_hints *hints,
+ ares_addrinfo_callback callback, void *arg)
{
- char* p;
- int ndots = 0;
- size_t nname = hquery->name?strlen(hquery->name):0;
- for (p = hquery->name; p && *p; p++)
- {
- if (*p == '.')
- {
- ndots++;
- }
- }
- if (nname && hquery->name[nname-1] == '.')
- {
- /* prevent ARES_EBADNAME for valid FQDN, where ndots < channel->ndots */
- return 1;
- }
- return ndots >= hquery->channel->ndots;
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
+ ares_getaddrinfo_int(channel, name, service, hints, callback, arg);
+ ares__channel_unlock(channel);
}
-static int as_is_only(const struct host_query* hquery)
+static ares_bool_t next_dns_lookup(struct host_query *hquery)
{
- size_t nname = hquery->name?strlen(hquery->name):0;
- if (nname && hquery->name[nname-1] == '.')
- return 1;
- return 0;
-}
+ const char *name = NULL;
+
+ if (hquery->next_name_idx >= hquery->names_cnt) {
+ return ARES_FALSE;
+ }
+ name = hquery->names[hquery->next_name_idx++];
+
+ /* NOTE: hquery may be invalidated during the call to ares_query_qid(),
+ * so should not be referenced after this point */
+ switch (hquery->hints.ai_family) {
+ case AF_INET:
+ hquery->remaining += 1;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A,
+ host_callback, hquery, &hquery->qid_a);
+ break;
+ case AF_INET6:
+ hquery->remaining += 1;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_AAAA, host_callback, hquery,
+ &hquery->qid_aaaa);
+ break;
+ case AF_UNSPEC:
+ hquery->remaining += 2;
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN, ARES_REC_TYPE_A,
+ host_callback, hquery, &hquery->qid_a);
+ ares_query_dnsrec(hquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_AAAA, host_callback, hquery,
+ &hquery->qid_aaaa);
+ break;
+ default:
+ break;
+ }
+
+ return ARES_TRUE;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c b/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c
index 628813057b..453673260d 100644
--- a/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c
+++ b/contrib/libs/c-ares/src/lib/ares_gethostbyaddr.c
@@ -45,255 +45,190 @@
#include "ares_private.h"
#ifdef WATT32
-#undef WIN32
+# undef WIN32
#endif
struct addr_query {
/* Arguments passed to ares_gethostbyaddr() */
- ares_channel channel;
- struct ares_addr addr;
+ ares_channel_t *channel;
+ struct ares_addr addr;
ares_host_callback callback;
- void *arg;
-
+ void *arg;
+ char *lookups; /* duplicate memory from channel for ares_reinit() */
const char *remaining_lookups;
- int timeouts;
+ size_t timeouts;
};
static void next_lookup(struct addr_query *aquery);
-static void addr_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static void end_aquery(struct addr_query *aquery, int status,
+static void addr_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+static void end_aquery(struct addr_query *aquery, ares_status_t status,
struct hostent *host);
-static int file_lookup(struct ares_addr *addr, struct hostent **host);
-static void ptr_rr_name(char *name, int name_size, const struct ares_addr *addr);
+static ares_status_t file_lookup(ares_channel_t *channel,
+ const struct ares_addr *addr,
+ struct hostent **host);
-void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
- int family, ares_host_callback callback, void *arg)
+static void ares_gethostbyaddr_int(ares_channel_t *channel, const void *addr,
+ int addrlen, int family,
+ ares_host_callback callback, void *arg)
{
struct addr_query *aquery;
- if (family != AF_INET && family != AF_INET6)
- {
- callback(arg, ARES_ENOTIMP, 0, NULL);
- return;
- }
+ if (family != AF_INET && 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;
- }
+ if ((family == AF_INET && addrlen != sizeof(aquery->addr.addr.addr4)) ||
+ (family == AF_INET6 && addrlen != sizeof(aquery->addr.addr.addr6))) {
+ callback(arg, ARES_ENOTIMP, 0, NULL);
+ return;
+ }
aquery = ares_malloc(sizeof(struct addr_query));
- if (!aquery)
- {
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ if (!aquery) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
+ aquery->lookups = ares_strdup(channel->lookups);
+ if (aquery->lookups == NULL) {
+ ares_free(aquery);
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
aquery->channel = channel;
- if (family == AF_INET)
- memcpy(&aquery->addr.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;
+ if (family == AF_INET) {
+ memcpy(&aquery->addr.addr.addr4, addr, sizeof(aquery->addr.addr.addr4));
+ } else {
+ memcpy(&aquery->addr.addr.addr6, addr, sizeof(aquery->addr.addr.addr6));
+ }
+ aquery->addr.family = family;
+ aquery->callback = callback;
+ aquery->arg = arg;
+ aquery->remaining_lookups = aquery->lookups;
+ aquery->timeouts = 0;
next_lookup(aquery);
}
+void ares_gethostbyaddr(ares_channel_t *channel, const void *addr, int addrlen,
+ int family, ares_host_callback callback, void *arg)
+{
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
+ ares_gethostbyaddr_int(channel, addr, addrlen, family, callback, arg);
+ ares__channel_unlock(channel);
+}
+
static void next_lookup(struct addr_query *aquery)
{
- const char *p;
- char name[128];
- int status;
+ const char *p;
+ ares_status_t status;
struct hostent *host;
-
- for (p = aquery->remaining_lookups; *p; p++)
- {
- switch (*p)
- {
- case 'b':
- ptr_rr_name(name, sizeof(name), &aquery->addr);
- aquery->remaining_lookups = p + 1;
- ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
- aquery);
+ char *name;
+
+ for (p = aquery->remaining_lookups; *p; p++) {
+ switch (*p) {
+ case 'b':
+ name = ares_dns_addr_to_ptr(&aquery->addr);
+ if (name == NULL) {
+ end_aquery(aquery, ARES_ENOMEM, NULL);
+ return;
+ }
+ aquery->remaining_lookups = p + 1;
+ ares_query_dnsrec(aquery->channel, name, ARES_CLASS_IN,
+ ARES_REC_TYPE_PTR, addr_callback, aquery, NULL);
+ ares_free(name);
+ return;
+ case 'f':
+ status = file_lookup(aquery->channel, &aquery->addr, &host);
+
+ /* this status check below previously checked for !ARES_ENOTFOUND,
+ but we should not assume that this single error code is the one
+ that can occur, as that is in fact no longer the case */
+ if (status == ARES_SUCCESS) {
+ end_aquery(aquery, status, host);
return;
- 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;
}
+ break;
+ default:
+ break;
}
+ }
end_aquery(aquery, ARES_ENOTFOUND, NULL);
}
-static void addr_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static void addr_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- struct addr_query *aquery = (struct addr_query *) arg;
- struct hostent *host;
- size_t addrlen;
+ struct addr_query *aquery = (struct addr_query *)arg;
+ struct hostent *host;
+ size_t addrlen;
aquery->timeouts += timeouts;
- if (status == ARES_SUCCESS)
- {
- if (aquery->addr.family == AF_INET)
- {
- addrlen = sizeof(aquery->addr.addrV4);
- status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV4,
- (int)addrlen, AF_INET, &host);
- }
- else
- {
- addrlen = sizeof(aquery->addr.addrV6);
- status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addrV6,
- (int)addrlen, AF_INET6, &host);
- }
- end_aquery(aquery, status, host);
+ if (status == ARES_SUCCESS) {
+ if (aquery->addr.family == AF_INET) {
+ addrlen = sizeof(aquery->addr.addr.addr4);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr4,
+ (int)addrlen, AF_INET, &host);
+ } else {
+ addrlen = sizeof(aquery->addr.addr.addr6);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, &aquery->addr.addr.addr6,
+ (int)addrlen, AF_INET6, &host);
}
- else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED)
+ end_aquery(aquery, status, host);
+ } else if (status == ARES_EDESTRUCTION || status == ARES_ECANCELLED) {
end_aquery(aquery, status, NULL);
- else
+ } else {
next_lookup(aquery);
+ }
}
-static void end_aquery(struct addr_query *aquery, int status,
+static void end_aquery(struct addr_query *aquery, ares_status_t status,
struct hostent *host)
{
- aquery->callback(aquery->arg, status, aquery->timeouts, host);
- if (host)
+ aquery->callback(aquery->arg, (int)status, (int)aquery->timeouts, host);
+ if (host) {
ares_free_hostent(host);
+ }
+ ares_free(aquery->lookups);
ares_free(aquery);
}
-static int file_lookup(struct ares_addr *addr, struct hostent **host)
+static ares_status_t file_lookup(ares_channel_t *channel,
+ const 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);
- }
+ char ipaddr[INET6_ADDRSTRLEN];
+ const void *ptr = NULL;
+ const ares_hosts_entry_t *entry;
+ ares_status_t status;
+
+ if (addr->family == AF_INET) {
+ ptr = &addr->addr.addr4;
+ } else if (addr->family == AF_INET6) {
+ ptr = &addr->addr.addr6;
}
- else if (platform == WIN_9X)
- GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH);
- else
- return ARES_ENOTFOUND;
- strcat(PATH_HOSTS, WIN_PATH_HOSTS);
-
-#elif defined(WATT32)
- const char *PATH_HOSTS = _w32_GetHostsFile();
+ if (ptr == NULL) {
+ return ARES_ENOTFOUND;
+ }
- if (!PATH_HOSTS)
+ if (!ares_inet_ntop(addr->family, ptr, ipaddr, sizeof(ipaddr))) {
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;
-}
+ status = ares__hosts_search_ipaddr(channel, ARES_FALSE, ipaddr, &entry);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
-static void ptr_rr_name(char *name, int name_size, 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;
- snprintf(name, name_size, "%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 */
- snprintf(name, name_size,
- "%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);
- snprintf(name+strlen(name), name_size-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);
- }
+ status = ares__hosts_entry_to_hostent(entry, addr->family, host);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ return ARES_SUCCESS;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_gethostbyname.c b/contrib/libs/c-ares/src/lib/ares_gethostbyname.c
index 343bd7b733..299c35b416 100644
--- a/contrib/libs/c-ares/src/lib/ares_gethostbyname.c
+++ b/contrib/libs/c-ares/src/lib/ares_gethostbyname.c
@@ -40,60 +40,57 @@
#include "ares_nameser.h"
#ifdef HAVE_STRINGS_H
-#include <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"
-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);
+static void sort_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort);
+static void sort6_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort);
+static size_t get_address_index(const struct in_addr *addr,
+ const struct apattern *sortlist, size_t nsort);
+static size_t get6_address_index(const struct ares_in6_addr *addr,
+ const struct apattern *sortlist, size_t nsort);
struct host_query {
ares_host_callback callback;
- void *arg;
- ares_channel channel;
+ void *arg;
+ ares_channel_t *channel;
};
static void ares_gethostbyname_callback(void *arg, int status, int timeouts,
struct ares_addrinfo *result)
{
- struct hostent *hostent = NULL;
+ struct hostent *hostent = NULL;
struct host_query *ghbn_arg = arg;
- if (status == ARES_SUCCESS)
- {
- status = ares__addrinfo2hostent(result, AF_UNSPEC, &hostent);
- }
+ if (status == ARES_SUCCESS) {
+ status = (int)ares__addrinfo2hostent(result, AF_UNSPEC, &hostent);
+ }
/* addrinfo2hostent will only return ENODATA if there are no addresses _and_
* no cname/aliases. However, gethostbyname will return ENODATA even if there
* is cname/alias data */
if (status == ARES_SUCCESS && hostent &&
- (!hostent->h_addr_list || !hostent->h_addr_list[0]))
- {
- status = ARES_ENODATA;
- }
+ (!hostent->h_addr_list || !hostent->h_addr_list[0])) {
+ status = ARES_ENODATA;
+ }
- if (status == ARES_SUCCESS && ghbn_arg->channel->nsort && hostent)
- {
- if (hostent->h_addrtype == AF_INET6)
- sort6_addresses(hostent, ghbn_arg->channel->sortlist,
- ghbn_arg->channel->nsort);
- if (hostent->h_addrtype == AF_INET)
- sort_addresses(hostent, ghbn_arg->channel->sortlist,
- ghbn_arg->channel->nsort);
+ if (status == ARES_SUCCESS && ghbn_arg->channel->nsort && hostent) {
+ if (hostent->h_addrtype == AF_INET6) {
+ sort6_addresses(hostent, ghbn_arg->channel->sortlist,
+ ghbn_arg->channel->nsort);
+ }
+ if (hostent->h_addrtype == AF_INET) {
+ sort_addresses(hostent, ghbn_arg->channel->sortlist,
+ ghbn_arg->channel->nsort);
}
+ }
ghbn_arg->callback(ghbn_arg->arg, status, timeouts, hostent);
@@ -102,249 +99,232 @@ static void ares_gethostbyname_callback(void *arg, int status, int timeouts,
ares_free_hostent(hostent);
}
-void ares_gethostbyname(ares_channel channel, const char *name, int family,
+void ares_gethostbyname(ares_channel_t *channel, const char *name, int family,
ares_host_callback callback, void *arg)
{
const struct ares_addrinfo_hints hints = { ARES_AI_CANONNAME, family, 0, 0 };
- struct host_query *ghbn_arg;
+ struct host_query *ghbn_arg;
- if (!callback)
+ if (!callback) {
return;
+ }
ghbn_arg = ares_malloc(sizeof(*ghbn_arg));
- if (!ghbn_arg)
- {
- callback(arg, ARES_ENOMEM, 0, NULL);
- return;
- }
+ if (!ghbn_arg) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return;
+ }
- ghbn_arg->callback=callback;
- ghbn_arg->arg=arg;
- ghbn_arg->channel=channel;
+ ghbn_arg->callback = callback;
+ ghbn_arg->arg = arg;
+ ghbn_arg->channel = channel;
+ /* NOTE: ares_getaddrinfo() locks the channel, we don't use the channel
+ * outside so no need to lock */
ares_getaddrinfo(channel, name, NULL, &hints, ares_gethostbyname_callback,
ghbn_arg);
}
-
-static void sort_addresses(struct hostent *host,
- const struct apattern *sortlist, int nsort)
+static void sort_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort)
{
- struct in_addr a1, a2;
- int i1, i2, ind1, ind2;
+ struct in_addr a1;
+ struct in_addr a2;
+ int i1;
+ int i2;
+ size_t ind1;
+ size_t ind2;
/* This is a simple insertion sort, not optimized at all. i1 walks
* through the address list, with the loop invariant that everything
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
* back through the list (via i2) until it is in sorted order.
*/
- for (i1 = 0; host->h_addr_list[i1]; i1++)
- {
- memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
- ind1 = get_address_index(&a1, sortlist, nsort);
- for (i2 = i1 - 1; i2 >= 0; i2--)
- {
- memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
- ind2 = get_address_index(&a2, sortlist, nsort);
- if (ind2 <= ind1)
- break;
- memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
- }
- memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
+ 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)
+static size_t get_address_index(const struct in_addr *addr,
+ const struct apattern *sortlist, size_t 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;
- }
+ size_t i;
+ struct ares_addr aaddr;
+
+ memset(&aaddr, 0, sizeof(aaddr));
+ aaddr.family = AF_INET;
+ memcpy(&aaddr.addr.addr4, addr, 4);
+
+ for (i = 0; i < nsort; i++) {
+ if (sortlist[i].addr.family != AF_INET) {
+ continue;
+ }
+
+ if (ares__subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) {
+ break;
}
+ }
+
return i;
}
-static void sort6_addresses(struct hostent *host,
- const struct apattern *sortlist, int nsort)
+static void sort6_addresses(const struct hostent *host,
+ const struct apattern *sortlist, size_t nsort)
{
- struct ares_in6_addr a1, a2;
- int i1, i2, ind1, ind2;
+ struct ares_in6_addr a1;
+ struct ares_in6_addr a2;
+ int i1;
+ int i2;
+ size_t ind1;
+ size_t ind2;
/* This is a simple insertion sort, not optimized at all. i1 walks
* through the address list, with the loop invariant that everything
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
* back through the list (via i2) until it is in sorted order.
*/
- for (i1 = 0; host->h_addr_list[i1]; i1++)
- {
- memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr));
- ind1 = get6_address_index(&a1, sortlist, nsort);
- for (i2 = i1 - 1; i2 >= 0; i2--)
- {
- memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr));
- ind2 = get6_address_index(&a2, sortlist, nsort);
- if (ind2 <= ind1)
- break;
- memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr));
- }
- memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr));
+ 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)
+static size_t get6_address_index(const struct ares_in6_addr *addr,
+ const struct apattern *sortlist, size_t nsort)
{
- int i;
+ size_t i;
+ struct ares_addr aaddr;
- 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;
+ memset(&aaddr, 0, sizeof(aaddr));
+ aaddr.family = AF_INET6;
+ memcpy(&aaddr.addr.addr6, addr, 16);
+
+ for (i = 0; i < nsort; i++) {
+ if (sortlist[i].addr.family != AF_INET6) {
+ continue;
+ }
+
+ if (ares__subnet_match(&aaddr, &sortlist[i].addr, sortlist[i].mask)) {
+ break;
}
+ }
return i;
}
+static ares_status_t ares__hostent_localhost(const char *name, int family,
+ struct hostent **host_out)
+{
+ ares_status_t status;
+ struct ares_addrinfo *ai = NULL;
+ struct ares_addrinfo_hints hints;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = family;
+
+ ai = ares_malloc_zero(sizeof(*ai));
+ if (ai == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ status = ares__addrinfo_localhost(name, 0, &hints, ai);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
-static int file_lookup(const char *name, int family, struct hostent **host);
+ status = ares__addrinfo2hostent(ai, family, host_out);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares_freeaddrinfo(ai);
+ return status;
+}
/* I really have no idea why this is exposed as a public function, but since
* it is, we can't kill this legacy function. */
-int ares_gethostbyname_file(ares_channel channel, const char *name,
- int family, struct hostent **host)
+static ares_status_t ares_gethostbyname_file_int(ares_channel_t *channel,
+ const char *name, int family,
+ struct hostent **host)
{
- int result;
+ const ares_hosts_entry_t *entry;
+ ares_status_t status;
/* We only take the channel to ensure that ares_init() been called. */
- if(channel == NULL)
- {
- /* Anything will do, really. This seems fine, and is consistent with
- other error cases. */
+ if (channel == NULL || name == NULL || host == NULL) {
+ /* Anything will do, really. This seems fine, and is consistent with
+ other error cases. */
+ if (host != NULL) {
*host = NULL;
- return ARES_ENOTFOUND;
}
+ 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;
-}
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(name)) {
+ return ARES_ENOTFOUND;
+ }
-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);
- }
+ status = ares__hosts_search_host(channel, ARES_FALSE, name, &entry);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- else if (platform == WIN_9X)
- GetWindowsDirectoryA(PATH_HOSTS, MAX_PATH);
- else
- return ARES_ENOTFOUND;
- strcat(PATH_HOSTS, WIN_PATH_HOSTS);
+ status = ares__hosts_entry_to_hostent(entry, family, host);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
-#elif defined(WATT32)
- const char *PATH_HOSTS = _w32_GetHostsFile();
+done:
+ /* RFC6761 section 6.3 #3 states that "Name resolution APIs and libraries
+ * SHOULD recognize localhost names as special and SHOULD always return the
+ * IP loopback address for address queries".
+ * We will also ignore ALL errors when trying to resolve localhost, such
+ * as permissions errors reading /etc/hosts or a malformed /etc/hosts */
+ if (status != ARES_SUCCESS && status != ARES_ENOMEM &&
+ ares__is_localhost(name)) {
+ return ares__hostent_localhost(name, family, host);
+ }
- if (!PATH_HOSTS)
- return ARES_ENOTFOUND;
-#endif
+ return status;
+}
- /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
- if (ares__is_onion_domain(name))
+int ares_gethostbyname_file(ares_channel_t *channel, const char *name,
+ int family, struct hostent **host)
+{
+ ares_status_t status;
+ if (channel == NULL) {
return ARES_ENOTFOUND;
+ }
-
- 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;
+ ares__channel_lock(channel);
+ status = ares_gethostbyname_file_int(channel, name, family, host);
+ ares__channel_unlock(channel);
+ return (int)status;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares_getnameinfo.c b/contrib/libs/c-ares/src/lib/ares_getnameinfo.c
index 0d97a318bf..8889e9eec6 100644
--- a/contrib/libs/c-ares/src/lib/ares_getnameinfo.c
+++ b/contrib/libs/c-ares/src/lib/ares_getnameinfo.c
@@ -26,9 +26,9 @@
#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"
+# if !defined(GETSERVBYPORT_R_ARGS) || (GETSERVBYPORT_R_ARGS < 4) || \
+ (GETSERVBYPORT_R_ARGS > 6)
+# error "you MUST specify a valid number of arguments for getservbyport_r"
# endif
#endif
@@ -45,413 +45,394 @@
#include "ares_nameser.h"
#ifdef HAVE_NET_IF_H
-#include <net/if.h>
+# include <net/if.h>
+#endif
+#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.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;
+ void *arg;
+
union {
- struct sockaddr_in addr4;
+ struct sockaddr_in addr4;
struct sockaddr_in6 addr6;
} addr;
- int family;
- int flags;
- int timeouts;
+
+ int family;
+ unsigned int flags;
+ size_t timeouts;
};
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
-#define IPBUFSIZ \
- (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") + IF_NAMESIZE)
+#ifdef HAVE_STRUCT_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"))
+# 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);
+static void nameinfo_callback(void *arg, int status, int timeouts,
+ struct hostent *host);
+static char *lookup_service(unsigned short port, unsigned int flags, char *buf,
+ size_t buflen);
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+static void append_scopeid(const struct sockaddr_in6 *addr6,
+ unsigned int scopeid, char *buf, size_t buflen);
#endif
-STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2);
+static 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)
+static void ares_getnameinfo_int(ares_channel_t *channel,
+ const struct sockaddr *sa,
+ ares_socklen_t salen, int flags_int,
+ ares_nameinfo_callback callback, void *arg)
{
- struct sockaddr_in *addr = NULL;
- struct sockaddr_in6 *addr6 = NULL;
- struct nameinfo_query *niquery;
- unsigned int port = 0;
+ const struct sockaddr_in *addr = NULL;
+ const struct sockaddr_in6 *addr6 = NULL;
+ struct nameinfo_query *niquery;
+ unsigned short port = 0;
+ unsigned int flags = (unsigned int)flags_int;
/* Validate socket address family and length */
- if ((sa->sa_family == AF_INET) &&
- (salen == sizeof(struct sockaddr_in)))
- {
- addr = CARES_INADDR_CAST(struct sockaddr_in *, sa);
- port = addr->sin_port;
- }
- else if ((sa->sa_family == AF_INET6) &&
- (salen == sizeof(struct sockaddr_in6)))
- {
- addr6 = CARES_INADDR_CAST(struct sockaddr_in6 *, sa);
- port = addr6->sin6_port;
- }
- else
- {
- callback(arg, ARES_ENOTIMP, 0, NULL, NULL);
- return;
- }
+ if ((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))
+ 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;
+ if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST)) {
+ char buf[33];
+ char *service;
- service = lookup_service((unsigned short)(port & 0xffff),
- flags, buf, sizeof(buf));
- callback(arg, ARES_SUCCESS, 0, NULL, service);
- return;
- }
+ 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);
+ 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_STRUCT_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);
- }
+ else {
+ niquery = ares_malloc(sizeof(struct nameinfo_query));
+ if (!niquery) {
+ callback(arg, ARES_ENOMEM, 0, NULL, NULL);
+ return;
+ }
+ niquery->callback = callback;
+ niquery->arg = arg;
+ niquery->flags = flags;
+ niquery->timeouts = 0;
+ if (sa->sa_family == AF_INET) {
+ niquery->family = AF_INET;
+ memcpy(&niquery->addr.addr4, addr, sizeof(niquery->addr.addr4));
+ ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr),
+ AF_INET, nameinfo_callback, niquery);
+ } else {
+ niquery->family = AF_INET6;
+ memcpy(&niquery->addr.addr6, addr6, sizeof(niquery->addr.addr6));
+ ares_gethostbyaddr(channel, &addr6->sin6_addr,
+ sizeof(struct ares_in6_addr), AF_INET6,
+ nameinfo_callback, niquery);
}
}
+ }
+}
+
+void ares_getnameinfo(ares_channel_t *channel, const struct sockaddr *sa,
+ ares_socklen_t salen, int flags_int,
+ ares_nameinfo_callback callback, void *arg)
+{
+ if (channel == NULL) {
+ return;
+ }
+
+ ares__channel_lock(channel);
+ ares_getnameinfo_int(channel, sa, salen, flags_int, callback, arg);
+ ares__channel_unlock(channel);
}
static void nameinfo_callback(void *arg, int status, int timeouts,
struct hostent *host)
{
- struct nameinfo_query *niquery = (struct nameinfo_query *) arg;
- char srvbuf[33];
- char *service = NULL;
-
- niquery->timeouts += 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.
- */
+ struct nameinfo_query *niquery = (struct nameinfo_query *)arg;
+ char srvbuf[33];
+ char *service = NULL;
+
+ niquery->timeouts += (size_t)timeouts;
+ if (status == ARES_SUCCESS) {
+ /* They want a service too */
+ if (niquery->flags & ARES_NI_LOOKUPSERVICE) {
+ if (niquery->family == AF_INET) {
+ service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ } else {
+ service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ }
+ }
+ /* NOFQDN means we have to strip off the domain name portion. We do
+ this by determining our own domain name, then searching the string
+ for this domain name and removing it.
+ */
#ifdef HAVE_GETHOSTNAME
- if (niquery->flags & ARES_NI_NOFQDN)
- {
- char buf[255];
- char *domain;
- gethostname(buf, 255);
- if ((domain = strchr(buf, '.')) != NULL)
- {
- char *end = ares_striendstr(host->h_name, domain);
- if (end)
- *end = 0;
- }
+ if (niquery->flags & ARES_NI_NOFQDN) {
+ char buf[255];
+ const char *domain;
+ gethostname(buf, 255);
+ if ((domain = strchr(buf, '.')) != NULL) {
+ char *end = ares_striendstr(host->h_name, domain);
+ if (end) {
+ *end = 0;
}
-#endif
- niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts,
- (char *)(host->h_name),
- service);
- ares_free(niquery);
- return;
+ }
}
+#endif
+ niquery->callback(niquery->arg, ARES_SUCCESS, (int)niquery->timeouts,
+ host->h_name, service);
+ ares_free(niquery);
+ return;
+ }
/* We couldn't find the host, but it's OK, we can use the IP */
- else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD))
- {
- char ipbuf[IPBUFSIZ];
- if (niquery->family == AF_INET)
- ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf,
- IPBUFSIZ);
- else
- {
- ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf,
- IPBUFSIZ);
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
- append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf,
- sizeof(ipbuf));
+ 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_STRUCT_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);
+ /* They want a service too */
+ if (niquery->flags & ARES_NI_LOOKUPSERVICE) {
+ if (niquery->family == AF_INET) {
+ service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ } else {
+ service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags,
+ srvbuf, sizeof(srvbuf));
+ }
+ }
+ niquery->callback(niquery->arg, ARES_SUCCESS, (int)niquery->timeouts, ipbuf,
+ service);
+ ares_free(niquery);
+ return;
+ }
+ niquery->callback(niquery->arg, status, (int)niquery->timeouts, NULL, NULL);
ares_free(niquery);
}
-static char *lookup_service(unsigned short port, int flags,
- char *buf, size_t buflen)
+static char *lookup_service(unsigned short port, unsigned int flags, char *buf,
+ size_t buflen)
{
- const char *proto;
+ const char *proto;
struct servent *sep;
#ifdef HAVE_GETSERVBYPORT_R
struct servent se;
#endif
- char tmpbuf[4096];
- char *name;
- size_t name_len;
+ char tmpbuf[4096];
+ const char *name;
+ size_t name_len;
- if (port)
- {
- if (flags & ARES_NI_NUMERICSERV)
- sep = NULL;
- else
- {
- if (flags & ARES_NI_UDP)
- proto = "udp";
- else if (flags & ARES_NI_SCTP)
- proto = "sctp";
- else if (flags & ARES_NI_DCCP)
- proto = "dccp";
- else
- proto = "tcp";
+ 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);
+ 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
- sep = getservbyport(port, proto);
-#endif
+ /* Lets just hope the OS uses TLS! */
+# if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
+ sep = getservbyport(port, (char *)proto);
+# else
+ sep = getservbyport(port, proto);
+# endif
#endif
- }
- if (sep && sep->s_name)
- {
- /* get service name */
- name = sep->s_name;
- }
- else
- {
- /* get port as a string */
- snprintf(tmpbuf, sizeof(tmpbuf), "%u", (unsigned int)ntohs(port));
- name = tmpbuf;
- }
- name_len = 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;
}
+ if (sep && sep->s_name) {
+ /* get service name */
+ name = sep->s_name;
+ } else {
+ /* get port as a string */
+ snprintf(tmpbuf, sizeof(tmpbuf), "%u", (unsigned int)ntohs(port));
+ name = tmpbuf;
+ }
+ name_len = ares_strlen(name);
+ if (name_len < buflen) {
+ /* return it if buffer big enough */
+ memcpy(buf, name, name_len + 1);
+ } else {
+ /* avoid reusing previous one */
+ buf[0] = '\0'; /* LCOV_EXCL_LINE: no real service names are too big */
+ }
+ return buf;
+ }
buf[0] = '\0';
return NULL;
}
-#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
-static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+static void append_scopeid(const struct sockaddr_in6 *addr6, unsigned int flags,
char *buf, size_t buflen)
{
-#ifdef HAVE_IF_INDEXTONAME
- int is_ll, is_mcll;
-#endif
- char tmpbuf[IF_NAMESIZE + 2];
+# ifdef HAVE_IF_INDEXTONAME
+ int is_ll;
+ int 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);
+# 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)
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%lu", (unsigned long)addr6->sin6_scope_id);
- }
- else
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%u", (unsigned int)addr6->sin6_scope_id);
- }
- }
- else
- {
- if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL)
- {
- if (is_scope_long)
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%lu", (unsigned long)addr6->sin6_scope_id);
- }
- else
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%u", (unsigned int)addr6->sin6_scope_id);
- }
- }
+ if ((flags & ARES_NI_NUMERICSCOPE) || (!is_ll && !is_mcll)) {
+ snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu",
+ (unsigned long)addr6->sin6_scope_id);
+ } else {
+ if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL) {
+ snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu",
+ (unsigned long)addr6->sin6_scope_id);
}
-#else
- if (is_scope_long)
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%lu", (unsigned long)addr6->sin6_scope_id);
- }
- else
- {
- snprintf(&tmpbuf[1], sizeof(tmpbuf)-1, "%u", (unsigned int)addr6->sin6_scope_id);
- }
- (void) flags;
-#endif
+ }
+# else
+ snprintf(&tmpbuf[1], sizeof(tmpbuf) - 1, "%lu",
+ (unsigned long)addr6->sin6_scope_id);
+ (void)flags;
+# endif
tmpbuf[IF_NAMESIZE + 1] = '\0';
- bufl = strlen(buf);
+ bufl = ares_strlen(buf);
- if(bufl + strlen(tmpbuf) < buflen)
+ if (bufl + ares_strlen(tmpbuf) < buflen) {
/* only append the scopeid string if it fits in the target buffer */
- strcpy(&buf[bufl], tmpbuf);
+ ares_strcpy(&buf[bufl], tmpbuf, buflen - bufl);
+ }
}
#endif
/* Determines if s1 ends with the string in s2 (case-insensitive) */
-STATIC_TESTABLE char *ares_striendstr(const char *s1, const char *s2)
+static 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);
+ const char *c1;
+ const char *c2;
+ const char *c1_begin;
+ int lo1;
+ int lo2;
+ size_t s1_len = ares_strlen(s1);
+ size_t s2_len = ares_strlen(s2);
+
+ if (s1 == NULL || s2 == NULL) {
+ return NULL;
+ }
/* If the substr is longer than the full str, it can't match */
- if (s2_len > s1_len)
+ 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++;
- }
+ c1_begin = s1 + s1_len - s2_len;
+ c1 = c1_begin;
+ c2 = s2;
+ while (c2 < s2 + s2_len) {
+ lo1 = TOLOWER(*c1);
+ lo2 = TOLOWER(*c2);
+ if (lo1 != lo2) {
+ return NULL;
+ } else {
+ c1++;
+ c2++;
}
- return (char *)c1_begin;
+ }
+ /* Cast off const */
+ return (char *)((size_t)c1_begin);
}
-int ares__is_onion_domain(const char *name)
+ares_bool_t ares__is_onion_domain(const char *name)
{
- if (ares_striendstr(name, ".onion"))
- return 1;
+ if (ares_striendstr(name, ".onion")) {
+ return ARES_TRUE;
+ }
- if (ares_striendstr(name, ".onion."))
- return 1;
+ if (ares_striendstr(name, ".onion.")) {
+ return ARES_TRUE;
+ }
- return 0;
+ return ARES_FALSE;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_getsock.c b/contrib/libs/c-ares/src/lib/ares_getsock.c
index 48c9076a66..0353bad639 100644
--- a/contrib/libs/c-ares/src/lib/ares_getsock.c
+++ b/contrib/libs/c-ares/src/lib/ares_getsock.c
@@ -29,37 +29,44 @@
#include "ares.h"
#include "ares_private.h"
-int ares_getsock(ares_channel channel,
- ares_socket_t *socks,
+int ares_getsock(ares_channel_t *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;
+ ares__slist_node_t *snode;
+ size_t sockindex = 0;
+ unsigned int bitmap = 0;
+ unsigned int setbits = 0xffffffff;
/* Are there any active queries? */
- size_t active_queries = ares__llist_len(channel->all_queries);
+ size_t active_queries;
- for (i = 0; i < channel->nservers; i++) {
- ares__llist_node_t *node;
- server = &channel->servers[i];
+ if (channel == NULL || numsocks <= 0) {
+ return 0;
+ }
- for (node = ares__llist_node_first(server->connections);
- node != NULL;
- node = ares__llist_node_next(node)) {
+ ares__channel_lock(channel);
+
+ active_queries = ares__llist_len(channel->all_queries);
+
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ struct server_state *server = ares__slist_node_val(snode);
+ ares__llist_node_t *node;
- struct server_connection *conn = ares__llist_node_val(node);
+ for (node = ares__llist_node_first(server->connections); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const struct server_connection *conn = ares__llist_node_val(node);
- if (sockindex >= numsocks || sockindex >= ARES_GETSOCK_MAXNUM)
+ if (sockindex >= (size_t)numsocks || sockindex >= ARES_GETSOCK_MAXNUM) {
break;
+ }
/* We only need to register interest in UDP sockets if we have
* outstanding queries.
*/
- if (!active_queries && !conn->is_tcp)
+ if (!active_queries && !conn->is_tcp) {
continue;
+ }
socks[sockindex] = conn->fd;
@@ -75,5 +82,7 @@ int ares_getsock(ares_channel channel,
sockindex++;
}
}
- return bitmap;
+
+ ares__channel_unlock(channel);
+ return (int)bitmap;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h b/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h
index 179d36d972..0a52855bd8 100644
--- a/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h
+++ b/contrib/libs/c-ares/src/lib/ares_inet_net_pton.h
@@ -27,7 +27,7 @@
#define HEADER_CARES_INET_NET_PTON_H
#ifdef HAVE_INET_NET_PTON
-#define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z)
+# 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
diff --git a/contrib/libs/c-ares/src/lib/ares_init.c b/contrib/libs/c-ares/src/lib/ares_init.c
index 25f1d8dfc0..27147fa64d 100644
--- a/contrib/libs/c-ares/src/lib/ares_init.c
+++ b/contrib/libs/c-ares/src/lib/ares_init.c
@@ -28,87 +28,50 @@
#include "ares_setup.h"
#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
+# include <sys/param.h>
#endif
#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
+# include <netinet/in.h>
#endif
#ifdef HAVE_NETDB_H
-#include <netdb.h>
+# include <netdb.h>
#endif
#ifdef HAVE_ARPA_INET_H
-#include <arpa/inet.h>
+# include <arpa/inet.h>
#endif
#include "ares_nameser.h"
#if defined(ANDROID) || defined(__ANDROID__)
-#include <sys/system_properties.h>
-#include "ares_android.h"
+# 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
+# define DNS_PROP_NAME_PREFIX "net.dns"
+# define MAX_DNS_PROPERTIES 8
#endif
#if defined(CARES_USE_LIBRESOLV)
-#include <resolv.h>
+# include <resolv.h>
#endif
-#if defined(USE_WINSOCK)
+#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H)
# include <iphlpapi.h>
#endif
#include "ares.h"
#include "ares_inet_net_pton.h"
-#include "ares_nowarn.h"
#include "ares_platform.h"
#include "ares_private.h"
#ifdef WATT32
-#undef WIN32 /* Redefined in MingW/MSVC headers */
-#endif
-
-
-static int init_by_options(ares_channel channel,
- const struct ares_options *options,
- int optmask);
-static int init_by_environment(ares_channel channel);
-static int init_by_resolv_conf(ares_channel channel);
-static int init_by_defaults(ares_channel channel);
-
-#ifndef WATT32
-static int config_nameserver(struct server_state **servers, int *nservers,
- const char *str);
-#endif
-static int set_search(ares_channel channel, const char *str);
-static int set_options(ares_channel channel, const char *str);
-static const char *try_option(const char *p, const char *q, const char *opt);
-
-static int config_sortlist(struct apattern **sortlist, int *nsort,
- const char *str);
-static int sortlist_alloc(struct apattern **sortlist, int *nsort,
- struct apattern *pat);
-static int ip_addr(const char *s, ares_ssize_t len, struct in_addr *addr);
-static void natural_mask(struct apattern *pat);
-#if !defined(WIN32) && !defined(WATT32) && \
- !defined(ANDROID) && !defined(__ANDROID__) && !defined(CARES_USE_LIBRESOLV)
-static int config_domain(ares_channel channel, char *str);
-static int config_lookup(ares_channel channel, const char *str,
- const char *bindch, const char *altbindch,
- const char *filech);
-static char *try_config(char *s, const char *opt, char scc);
+# undef WIN32 /* Redefined in MingW/MSVC headers */
#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)
+int ares_init(ares_channel_t **channelptr)
{
return ares_init_options(channelptr, NULL, 0);
}
@@ -118,1556 +81,112 @@ static int ares_query_timeout_cmp_cb(const void *arg1, const void *arg2)
const struct query *q1 = arg1;
const struct query *q2 = arg2;
- if (q1->timeout.tv_sec > q2->timeout.tv_sec)
+ if (q1->timeout.tv_sec > q2->timeout.tv_sec) {
return 1;
- if (q1->timeout.tv_sec < q2->timeout.tv_sec)
- return -1;
-
- if (q1->timeout.tv_usec > q2->timeout.tv_usec)
- return 1;
- if (q1->timeout.tv_usec < q2->timeout.tv_usec)
- return -1;
-
- return 0;
-}
-
-int ares_init_options(ares_channel *channelptr, struct ares_options *options,
- int optmask)
-{
- ares_channel channel;
- int status = ARES_SUCCESS;
-
- if (ares_library_initialized() != ARES_SUCCESS)
- return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
-
- channel = ares_malloc(sizeof(*channel));
- if (!channel) {
- *channelptr = NULL;
- return ARES_ENOMEM;
- }
-
- memset(channel, 0, sizeof(*channel));
-
- /* 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;
-
- /* Generate random key */
-
- channel->rand_state = ares__init_rand_state();
- if (channel->rand_state == NULL) {
- status = ARES_ENOMEM;
- DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n",
- ares_strerror(status)));
- goto done;
- }
-
- /* Initialize our lists of queries */
- channel->all_queries = ares__llist_create(NULL);
- if (channel->all_queries == NULL) {
- status = ARES_ENOMEM;
- goto done;
}
-
- channel->queries_by_qid = ares__htable_stvp_create(NULL);
- if (channel->queries_by_qid == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- channel->queries_by_timeout = ares__slist_create(channel->rand_state,
- ares_query_timeout_cmp_cb,
- NULL);
- if (channel->queries_by_timeout == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- channel->connnode_by_socket = ares__htable_asvp_create(NULL);
- if (channel->connnode_by_socket == NULL) {
- status = ARES_ENOMEM;
- goto done;
- }
-
- /* Initialize configuration by each of the four sources, from highest
- * precedence to lowest.
- */
-
- status = 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)));
-
- /* Trim to one server if ARES_FLAG_PRIMARY is set. */
- if ((channel->flags & ARES_FLAG_PRIMARY) && channel->nservers > 1)
- channel->nservers = 1;
-
- status = ares__init_servers_state(channel);
- if (status != ARES_SUCCESS) {
- goto done;
- }
-
-done:
- if (status != ARES_SUCCESS)
- {
- /* Something failed; clean up memory we may have allocated. */
- if (channel->servers) {
- ares_free(channel->servers);
- }
- if (channel->ndomains != -1)
- ares__strsplit_free(channel->domains, channel->ndomains);
- if (channel->sortlist)
- ares_free(channel->sortlist);
- if(channel->lookups)
- ares_free(channel->lookups);
- if(channel->resolvconf_path)
- ares_free(channel->resolvconf_path);
- if(channel->hosts_path)
- ares_free(channel->hosts_path);
- if (channel->rand_state)
- ares__destroy_rand_state(channel->rand_state);
-
- ares__htable_stvp_destroy(channel->queries_by_qid);
- ares__llist_destroy(channel->all_queries);
- ares__slist_destroy(channel->queries_by_timeout);
- ares__htable_asvp_destroy(channel->connnode_by_socket);
- ares_free(channel);
- return status;
- }
-
- *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;
-
- if (channel->hosts_path)
- (*optmask) |= ARES_OPT_HOSTS_FILE;
-
- /* Copy easy stuff */
- options->flags = channel->flags;
-
- /* We return full millisecond resolution but that's only because we don't
- set the ARES_OPT_TIMEOUT anymore, only the new ARES_OPT_TIMEOUTMS */
- options->timeout = channel->timeout;
- options->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;
- }
-
- /* copy path for hosts file */
- if (channel->hosts_path) {
- options->hosts_path = ares_strdup(channel->hosts_path);
- if (!options->hosts_path)
- return ARES_ENOMEM;
- }
-
- if (channel->udp_max_queries > 0) {
- (*optmask) |= ARES_OPT_UDP_MAX_QUERIES;
- options->udp_max_queries = channel->udp_max_queries;
+ if (q1->timeout.tv_sec < q2->timeout.tv_sec) {
+ return -1;
}
- 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(*channel->servers));
- if (!channel->servers)
- return ARES_ENOMEM;
- memset(channel->servers, 0, options->nservers * sizeof(*channel->servers));
- 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;
+ if (q1->timeout.tv_usec > q2->timeout.tv_usec) {
+ return 1;
}
-
- /* Set path for resolv.conf file, if given. */
- if ((optmask & ARES_OPT_RESOLVCONF) && !channel->resolvconf_path)
- {
- channel->resolvconf_path = ares_strdup(options->resolvconf_path);
- if (!channel->resolvconf_path && options->resolvconf_path)
- return ARES_ENOMEM;
- }
-
- /* Set path for hosts file, if given. */
- if ((optmask & ARES_OPT_HOSTS_FILE) && !channel->hosts_path)
- {
- channel->hosts_path = ares_strdup(options->hosts_path);
- if (!channel->hosts_path && options->hosts_path)
- return ARES_ENOMEM;
- }
-
- if (optmask & ARES_OPT_UDP_MAX_QUERIES)
- channel->udp_max_queries = options->udp_max_queries;
-
- 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;
+ if (q1->timeout.tv_usec < q2->timeout.tv_usec) {
+ return -1;
}
- /* Null terminate buffer allways */
- *(*outptr + size) = '\0';
-
- return 1;
-}
-
-static void commanjoin(char** dst, const char* const src, const size_t len)
-{
- char *newbuf;
- size_t newsize;
-
- /* 1 for terminating 0 and 2 for , and terminating 0 */
- newsize = len + (*dst ? (strlen(*dst) + 2) : 1);
- newbuf = ares_realloc(*dst, newsize);
- if (!newbuf)
- return;
- if (*dst == NULL)
- *newbuf = '\0';
- *dst = newbuf;
- if (strlen(*dst) != 0)
- strcat(*dst, ",");
- strncat(*dst, src, len);
-}
-
-/*
- * commajoin()
- *
- * RTF code.
- */
-static void commajoin(char **dst, const char *src)
-{
- commanjoin(dst, src, strlen(src));
-}
-
-
-/* A structure to hold the string form of IPv4 and IPv6 addresses so we can
- * sort them by a metric.
- */
-typedef struct
-{
- /* The metric we sort them by. */
- ULONG metric;
-
- /* Original index of the item, used as a secondary sort parameter to make
- * qsort() stable if the metrics are equal */
- size_t orig_idx;
-
- /* Room enough for the string form of any IPv4 or IPv6 address that
- * ares_inet_ntop() will create. Based on the existing c-ares practice.
- */
- char text[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */
-} Address;
-
-/* Sort Address values \a left and \a right by metric, returning the usual
- * indicators for qsort().
- */
-static int compareAddresses(const void *arg1,
- const void *arg2)
-{
- const Address * const left = arg1;
- const Address * const right = arg2;
- /* Lower metric the more preferred */
- if(left->metric < right->metric) return -1;
- if(left->metric > right->metric) return 1;
- /* If metrics are equal, lower original index more preferred */
- if(left->orig_idx < right->orig_idx) return -1;
- if(left->orig_idx > right->orig_idx) return 1;
return 0;
}
-/* There can be multiple routes to "the Internet". And there can be different
- * DNS servers associated with each of the interfaces that offer those routes.
- * We have to assume that any DNS server can serve any request. But, some DNS
- * servers may only respond if requested over their associated interface. But
- * we also want to use "the preferred route to the Internet" whenever possible
- * (and not use DNS servers on a non-preferred route even by forcing request
- * to go out on the associated non-preferred interface). i.e. We want to use
- * the DNS servers associated with the same interface that we would use to
- * make a general request to anything else.
- *
- * But, Windows won't sort the DNS servers by the metrics associated with the
- * routes and interfaces _even_ though it obviously sends IP packets based on
- * those same routes and metrics. So, we must do it ourselves.
- *
- * So, we sort the DNS servers by the same metric values used to determine how
- * an outgoing IP packet will go, thus effectively using the DNS servers
- * associated with the interface that the DNS requests themselves will
- * travel. This gives us optimal routing and avoids issues where DNS servers
- * won't respond to requests that don't arrive via some specific subnetwork
- * (and thus some specific interface).
- *
- * This function computes the metric we use to sort. On the interface
- * identified by \a luid, it determines the best route to \a dest and combines
- * that route's metric with \a interfaceMetric to compute a metric for the
- * destination address on that interface. This metric can be used as a weight
- * to sort the DNS server addresses associated with each interface (lower is
- * better).
- *
- * Note that by restricting the route search to the specific interface with
- * which the DNS servers are associated, this function asks the question "What
- * is the metric for sending IP packets to this DNS server?" which allows us
- * to sort the DNS servers correctly.
- */
-static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */
- const SOCKADDR_INET * const dest,
- const ULONG interfaceMetric)
+static int server_sort_cb(const void *data1, const void *data2)
{
- /* On this interface, get the best route to that destination. */
-#if defined(__WATCOMC__)
- /* OpenWatcom's builtin Windows SDK does not have a definition for
- * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET
- * as a variable. Let's work around this by returning the worst possible
- * metric, but only when using the OpenWatcom compiler.
- * It may be worth investigating using a different version of the Windows
- * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom
- * 2.0.
- */
- return (ULONG)-1;
-#else
- MIB_IPFORWARD_ROW2 row;
- SOCKADDR_INET ignored;
- if(GetBestRoute2(/* The interface to use. The index is ignored since we are
- * passing a LUID.
- */
- luid, 0,
- /* No specific source address. */
- NULL,
- /* Our destination address. */
- dest,
- /* No options. */
- 0,
- /* The route row. */
- &row,
- /* The best source address, which we don't need. */
- &ignored) != NO_ERROR
- /* If the metric is "unused" (-1) or too large for us to add the two
- * metrics, use the worst possible, thus sorting this last.
- */
- || row.Metric == (ULONG)-1
- || row.Metric > ((ULONG)-1) - interfaceMetric) {
- /* Return the worst possible metric. */
- return (ULONG)-1;
- }
+ const struct server_state *s1 = data1;
+ const struct server_state *s2 = data2;
- /* Return the metric value from that row, plus the interface metric.
- *
- * See
- * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx
- * which describes the combination as a "sum".
- */
- return row.Metric + interfaceMetric;
-#endif /* __WATCOMC__ */
-}
-
-/*
- * get_DNS_Windows()
- *
- * Locates DNS info using GetAdaptersAddresses() function from the Internet
- * Protocol Helper (IP Helper) API. When located, this returns a pointer
- * in *outptr to a newly allocated memory area holding a null-terminated
- * string with a space or comma seperated list of DNS IP addresses.
- *
- * Returns 0 and nullifies *outptr upon inability to return DNSes string.
- *
- * Returns 1 and sets *outptr when returning a dynamically allocated string.
- *
- * Implementation supports Windows XP and newer.
- */
-#define IPAA_INITIAL_BUF_SZ 15 * 1024
-#define IPAA_MAX_TRIES 3
-static int get_DNS_Windows(char **outptr)
-{
- IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr;
- IP_ADAPTER_ADDRESSES *ipaa, *newipaa, *ipaaEntry;
- ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ;
- ULONG Bufsz = IPAA_INITIAL_BUF_SZ;
- ULONG AddrFlags = 0;
- int trying = IPAA_MAX_TRIES;
- int res;
-
- /* The capacity of addresses, in elements. */
- size_t addressesSize;
- /* The number of elements in addresses. */
- size_t addressesIndex = 0;
- /* The addresses we will sort. */
- Address *addresses;
-
- union {
- struct sockaddr *sa;
- struct sockaddr_in *sa4;
- struct sockaddr_in6 *sa6;
- } namesrvr;
-
- *outptr = NULL;
-
- ipaa = ares_malloc(Bufsz);
- if (!ipaa)
- return 0;
-
- /* Start with enough room for a few DNS server addresses and we'll grow it
- * as we encounter more.
- */
- addressesSize = 4;
- addresses = (Address*)ares_malloc(sizeof(Address) * addressesSize);
- if(addresses == NULL) {
- /* We need room for at least some addresses to function. */
- ares_free(ipaa);
- return 0;
- }
-
- /* Usually this call suceeds with initial buffer size */
- res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
- if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
- goto done;
-
- while ((res == ERROR_BUFFER_OVERFLOW) && (--trying))
- {
- if (Bufsz < ReqBufsz)
- {
- newipaa = ares_realloc(ipaa, ReqBufsz);
- if (!newipaa)
- goto done;
- Bufsz = ReqBufsz;
- ipaa = newipaa;
- }
- res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
- if (res == ERROR_SUCCESS)
- break;
+ if (s1->consec_failures < s2->consec_failures) {
+ return -1;
}
- if (res != ERROR_SUCCESS)
- goto done;
-
- for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next)
- {
- if(ipaaEntry->OperStatus != IfOperStatusUp)
- continue;
-
- /* For each interface, find any associated DNS servers as IPv4 or IPv6
- * addresses. For each found address, find the best route to that DNS
- * server address _on_ _that_ _interface_ (at this moment in time) and
- * compute the resulting total metric, just as Windows routing will do.
- * Then, sort all the addresses found by the metric.
- */
- for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress;
- ipaDNSAddr;
- ipaDNSAddr = ipaDNSAddr->Next)
- {
- char ipaddr[INET6_ADDRSTRLEN] = "";
- namesrvr.sa = ipaDNSAddr->Address.lpSockaddr;
-
- if (namesrvr.sa->sa_family == AF_INET)
- {
- if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) ||
- (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE))
- continue;
-
- /* Allocate room for another address, if necessary, else skip. */
- if(addressesIndex == addressesSize) {
- const size_t newSize = addressesSize + 4;
- Address * const newMem =
- (Address*)ares_realloc(addresses, sizeof(Address) * newSize);
- if(newMem == NULL) {
- continue;
- }
- addresses = newMem;
- addressesSize = newSize;
- }
-
- addresses[addressesIndex].metric =
- getBestRouteMetric(&ipaaEntry->Luid,
- (SOCKADDR_INET*)(namesrvr.sa),
- ipaaEntry->Ipv4Metric);
-
- /* Record insertion index to make qsort stable */
- addresses[addressesIndex].orig_idx = addressesIndex;
-
- if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr,
- ipaddr, sizeof(ipaddr))) {
- continue;
- }
- snprintf(addresses[addressesIndex].text,
- sizeof(addresses[addressesIndex].text),
- "[%s]:%u",
- ipaddr,
- ntohs(namesrvr.sa4->sin_port));
- ++addressesIndex;
- }
- else if (namesrvr.sa->sa_family == AF_INET6)
- {
- if (memcmp(&namesrvr.sa6->sin6_addr, &ares_in6addr_any,
- sizeof(namesrvr.sa6->sin6_addr)) == 0)
- continue;
-
- /* Allocate room for another address, if necessary, else skip. */
- if(addressesIndex == addressesSize) {
- const size_t newSize = addressesSize + 4;
- Address * const newMem =
- (Address*)ares_realloc(addresses, sizeof(Address) * newSize);
- if(newMem == NULL) {
- continue;
- }
- addresses = newMem;
- addressesSize = newSize;
- }
-
- addresses[addressesIndex].metric =
- getBestRouteMetric(&ipaaEntry->Luid,
- (SOCKADDR_INET*)(namesrvr.sa),
- ipaaEntry->Ipv6Metric);
-
- /* Record insertion index to make qsort stable */
- addresses[addressesIndex].orig_idx = addressesIndex;
-
- if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr,
- ipaddr, sizeof(ipaddr))) {
- continue;
- }
- snprintf(addresses[addressesIndex].text,
- sizeof(addresses[addressesIndex].text),
- "[%s]:%u",
- ipaddr,
- ntohs(namesrvr.sa6->sin6_port));
- ++addressesIndex;
- }
- else {
- /* Skip non-IPv4/IPv6 addresses completely. */
- continue;
- }
- }
+ if (s1->consec_failures > s2->consec_failures) {
+ return 1;
}
-
- /* 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);
- }
- }
+ if (s1->idx < s2->idx) {
+ return -1;
}
-
-done:
- ares_free(addresses);
-
- if (ipaa)
- ares_free(ipaa);
-
- if (!*outptr) {
- return 0;
+ if (s1->idx > s2->idx) {
+ return 1;
}
-
- return 1;
+ return 0;
}
-/*
- * 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)
+static void server_destroy_cb(void *data)
{
- 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);
+ if (data == NULL) {
+ return;
}
-
- return *outptr != NULL;
+ ares__destroy_server(data);
}
-#endif
-
-static int init_by_resolv_conf(ares_channel channel)
+static ares_status_t init_by_defaults(ares_channel_t *channel)
{
-#if !defined(ANDROID) && !defined(__ANDROID__) && !defined(WATT32) && \
- !defined(CARES_USE_LIBRESOLV)
- char *line = NULL;
+ char *hostname = NULL;
+ ares_status_t rc = ARES_SUCCESS;
+#ifdef HAVE_GETHOSTNAME
+ const char *dot;
#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);
- }
+ struct ares_addr addr;
+ ares__llist_t *sconfig = NULL;
- if (status == ARES_SUCCESS)
- status = ARES_EOF;
- else
- /* Catch the case when all the above checks fail (which happens when there
- is no network card or the cable is unplugged) */
- status = ARES_EFILE;
-#elif defined(__MVS__)
-
- struct __res_state *res = 0;
- int count4, count6;
- __STATEEXTIPV6 *v6;
- struct server_state *pserver;
- if (0 == res) {
- int rc = res_init();
- while (rc == -1 && h_errno == TRY_AGAIN) {
- rc = res_init();
- }
- if (rc == -1) {
- return ARES_ENOMEM;
- }
- res = __res();
- }
-
- v6 = res->__res_extIPv6;
- count4 = res->nscount;
- if (v6) {
- count6 = v6->__stat_nscount;
- } else {
- count6 = 0;
- }
-
- nservers = count4 + count6;
- servers = ares_malloc(nservers * sizeof(*servers));
- if (!servers)
- return ARES_ENOMEM;
-
- memset(servers, 0, nservers * sizeof(*servers));
-
- pserver = servers;
- for (int i = 0; i < count4; ++i, ++pserver) {
- struct sockaddr_in *addr_in = &(res->nsaddr_list[i]);
- pserver->addr.addrV4.s_addr = addr_in->sin_addr.s_addr;
- pserver->addr.family = AF_INET;
- pserver->addr.udp_port = addr_in->sin_port;
- pserver->addr.tcp_port = addr_in->sin_port;
- }
-
- for (int j = 0; j < count6; ++j, ++pserver) {
- struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[j]);
- memcpy(&(pserver->addr.addr.addr6), &(addr_in->sin6_addr),
- sizeof(addr_in->sin6_addr));
- pserver->addr.family = AF_INET6;
- pserver->addr.udp_port = addr_in->sin6_port;
- pserver->addr.tcp_port = addr_in->sin6_port;
+ /* Enable EDNS by default */
+ if (!(channel->optmask & ARES_OPT_FLAGS)) {
+ channel->flags = ARES_FLAG_EDNS;
}
-
- status = ARES_EOF;
-
-#elif defined(__riscos__)
-
- /* Under RISC OS, name servers are listed in the
- system variable Inet$Resolvers, space separated. */
-
- line = getenv("Inet$Resolvers");
- status = ARES_EOF;
- if (line) {
- char *resolvers = ares_strdup(line), *pos, *space;
-
- if (!resolvers)
- return ARES_ENOMEM;
-
- pos = resolvers;
- do {
- space = strchr(pos, ' ');
- if (space)
- *space = '\0';
- status = config_nameserver(&servers, &nservers, pos);
- if (status != ARES_SUCCESS)
- break;
- pos = space + 1;
- } while (space);
-
- if (status == ARES_SUCCESS)
- status = ARES_EOF;
-
- ares_free(resolvers);
- }
-
-#elif defined(WATT32)
- int i;
-
- sock_init();
- for (i = 0; def_nameservers[i]; i++)
- ;
- if (i == 0)
- return ARES_SUCCESS; /* use localhost DNS server */
-
- nservers = i;
- servers = ares_malloc(sizeof(*servers));
- if (!servers)
- return ARES_ENOMEM;
- memset(servers, 0, sizeof(*servers));
-
- 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;
- }
+ if (channel->ednspsz == 0) {
+ channel->ednspsz = EDNSPACKETSZ;
}
-# endif /* HAVE___SYSTEM_PROPERTY_GET */
-#elif defined(CARES_USE_LIBRESOLV)
- struct __res_state res;
- int result;
- memset(&res, 0, sizeof(res));
- result = res_ninit(&res);
- if (result == 0 && (res.options & RES_INIT)) {
- status = ARES_EOF;
-
- if (channel->nservers == -1) {
- union res_sockaddr_union addr[MAXNS];
- int nscount = res_getservers(&res, addr, MAXNS);
- int i;
- for (i = 0; i < nscount; ++i) {
- char ipaddr[INET6_ADDRSTRLEN] = "";
- char ipaddr_port[INET6_ADDRSTRLEN + 8]; /* [%s]:NNNNN */
- unsigned short port = 0;
- 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, ipaddr, sizeof(ipaddr));
- port = ntohs(addr[i].sin.sin_port);
- } else if (family == AF_INET6) {
- ares_inet_ntop(family, &addr[i].sin6.sin6_addr, ipaddr, sizeof(ipaddr));
- port = ntohs(addr[i].sin6.sin6_port);
- } else {
- continue;
- }
-
- if (port) {
- snprintf(ipaddr_port, sizeof(ipaddr_port), "[%s]:%u", ipaddr, port);
- } else {
- snprintf(ipaddr_port, sizeof(ipaddr_port), "%s", ipaddr);
- }
-
- config_status = config_nameserver(&servers, &nservers, ipaddr_port);
- if (config_status != ARES_SUCCESS) {
- status = config_status;
- break;
- }
- }
- }
- if (channel->ndomains == -1) {
- int entries = 0;
- while ((entries < MAXDNSRCH) && res.dnsrch[entries])
- entries++;
- if(entries) {
- channel->domains = ares_malloc(entries * sizeof(char *));
- if (!channel->domains) {
- status = ARES_ENOMEM;
- } else {
- int i;
- channel->ndomains = entries;
- for (i = 0; i < channel->ndomains; ++i) {
- channel->domains[i] = ares_strdup(res.dnsrch[i]);
- if (!channel->domains[i])
- status = ARES_ENOMEM;
- }
- }
- }
- }
- if (channel->ndots == -1)
- channel->ndots = res.ndots;
- if (channel->tries == -1)
- channel->tries = res.retry;
- if (channel->rotate == -1)
- channel->rotate = res.options & RES_ROTATE;
- if (channel->timeout == -1) {
- channel->timeout = res.retrans * 1000;
-#ifdef __APPLE__
- channel->timeout /= (res.retry + 1) * (res.nscount > 0 ? res.nscount : 1);
-#endif
- }
- res_ndestroy(&res);
+ if (channel->timeout == 0) {
+ channel->timeout = DEFAULT_TIMEOUT;
}
-#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);
+ if (channel->tries == 0) {
+ channel->tries = DEFAULT_TRIES;
}
-#endif
-
- /* Handle errors. */
- if (status != ARES_EOF)
- {
- if (servers != NULL)
- ares_free(servers);
- if (sortlist != NULL)
- ares_free(sortlist);
- return status;
+ if (ares__slist_len(channel->servers) == 0) {
+ /* Add a default local named server to the channel unless configured not
+ * to (in which case return an error).
+ */
+ if (channel->flags & ARES_FLAG_NO_DFLT_SVR) {
+ rc = ARES_ENOSERVER;
+ goto error;
}
- /* If we got any name server entries, fill them in. */
- if (servers)
- {
- channel->servers = servers;
- channel->nservers = nservers;
- }
+ addr.family = AF_INET;
+ addr.addr.addr4.s_addr = htonl(INADDR_LOOPBACK);
- /* If we got any sortlist entries, fill them in. */
- if (sortlist)
- {
- channel->sortlist = sortlist;
- channel->nsort = nsort;
+ rc = ares__sconfig_append(&sconfig, &addr, 0, 0, NULL);
+ if (rc != ARES_SUCCESS) {
+ goto error;
}
- 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;
+ rc = ares__servers_update(channel, sconfig, ARES_FALSE);
+ ares__llist_destroy(sconfig);
- if (channel->nservers == -1) {
- /* If nobody specified servers, try a local named. */
- channel->servers = ares_malloc(sizeof(*channel->servers));
- if (!channel->servers) {
- rc = ARES_ENOMEM;
+ if (rc != ARES_SUCCESS) {
goto error;
}
- memset(channel->servers, 0, sizeof(*channel->servers));
- 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)
+# define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT)
#elif defined(ENAMETOOLONG)
-#define toolong(x) (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || \
- (SOCKERRNO == EINVAL))
+# define toolong(x) \
+ (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || (SOCKERRNO == EINVAL))
#else
-#define toolong(x) (x == -1) && (SOCKERRNO == EINVAL)
+# define toolong(x) (x == -1) && (SOCKERRNO == EINVAL)
#endif
- if (channel->ndomains == -1) {
+ if (channel->ndomains == 0) {
/* Derive a default domain search list from the kernel hostname,
* or set it to empty if the hostname isn't helpful.
*/
@@ -1675,12 +194,12 @@ static int init_by_defaults(ares_channel channel)
channel->ndomains = 0; /* default to none */
#else
GETHOSTNAME_TYPE_ARG2 lenv = 64;
- size_t len = 64;
- int res;
+ size_t len = 64;
+ int res;
channel->ndomains = 0; /* default to none */
hostname = ares_malloc(len);
- if(!hostname) {
+ if (!hostname) {
rc = ARES_ENOMEM;
goto error;
}
@@ -1688,19 +207,18 @@ static int init_by_defaults(ares_channel channel)
do {
res = gethostname(hostname, lenv);
- if(toolong(res)) {
+ if (toolong(res)) {
char *p;
- len *= 2;
+ len *= 2;
lenv *= 2;
- p = ares_realloc(hostname, len);
- if(!p) {
+ p = ares_realloc(hostname, len);
+ if (!p) {
rc = ARES_ENOMEM;
goto error;
}
hostname = p;
continue;
- }
- else if(res) {
+ } else if (res) {
/* Lets not treat a gethostname failure as critical, since we
* are ok if gethostname doesn't even exist */
*hostname = '\0';
@@ -1727,728 +245,321 @@ static int init_by_defaults(ares_channel channel)
#endif
}
- if (channel->nsort == -1) {
+ if (channel->nsort == 0) {
channel->sortlist = NULL;
- channel->nsort = 0;
}
if (!channel->lookups) {
channel->lookups = ares_strdup("fb");
- if (!channel->lookups)
+ if (!channel->lookups) {
rc = ARES_ENOMEM;
- }
-
- error:
- if(rc) {
- if(channel->servers) {
- ares_free(channel->servers);
- channel->servers = NULL;
- }
- channel->nservers = 0;
-
- if(channel->domains && channel->domains[0])
- ares_free(channel->domains[0]);
- if(channel->domains) {
- ares_free(channel->domains);
- channel->domains = NULL;
- }
-
- if(channel->lookups) {
- ares_free(channel->lookups);
- channel->lookups = NULL;
- }
-
- if(channel->resolvconf_path) {
- ares_free(channel->resolvconf_path);
- channel->resolvconf_path = NULL;
}
+ }
- if(channel->hosts_path) {
- ares_free(channel->hosts_path);
- channel->hosts_path = NULL;
- }
+ /* Set default fields for server failover behavior */
+ if (!(channel->optmask & ARES_OPT_SERVER_FAILOVER)) {
+ channel->server_retry_chance = DEFAULT_SERVER_RETRY_CHANCE;
+ channel->server_retry_delay = DEFAULT_SERVER_RETRY_DELAY;
}
- if(hostname)
+error:
+ 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)
+int ares_init_options(ares_channel_t **channelptr,
+ const struct ares_options *options, int optmask)
{
- char lookups[3], *l;
- const char *vqualifier p;
- int found;
+ ares_channel_t *channel;
+ ares_status_t status = ARES_SUCCESS;
- 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 */
+ if (ares_library_initialized() != ARES_SUCCESS) {
+ return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
+ }
-#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;
+ channel = ares_malloc_zero(sizeof(*channel));
+ if (!channel) {
+ *channelptr = NULL;
+ return ARES_ENOMEM;
+ }
- /* Misuse */
- if (netmask > 128)
- return 0;
+ /* One option where zero is valid, so set default value here */
+ channel->ndots = 1;
- /* Quickly set whole bytes */
- memset(mask, 0xFF, netmask / 8);
+ status = ares__channel_threading_init(channel);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* Set remaining bits */
- if(netmask % 8) {
- mask[netmask / 8] = (unsigned char)(0xff << (8 - (netmask % 8)));
+ /* Generate random key */
+ channel->rand_state = ares__init_rand_state();
+ if (channel->rand_state == NULL) {
+ status = ARES_ENOMEM;
+ DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n",
+ ares_strerror(status)));
+ goto done;
}
- for (i=0; i<16; i++) {
- if ((netbase[i] & mask[i]) != (ipaddr[i] & mask[i]))
- return 0;
+ /* Initialize Server List */
+ channel->servers =
+ ares__slist_create(channel->rand_state, server_sort_cb, server_destroy_cb);
+ if (channel->servers == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- return 1;
-}
+ /* Initialize our lists of queries */
+ channel->all_queries = ares__llist_create(NULL);
+ if (channel->all_queries == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
-/* 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;
+ channel->queries_by_qid = ares__htable_szvp_create(NULL);
+ if (channel->queries_by_qid == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- return 0;
-}
-/* Parse address and port in these formats, either ipv4 or ipv6 addresses
- * are allowed:
- * ipaddr
- * [ipaddr]
- * [ipaddr]:port
- *
- * If a port is not specified, will set port to 0.
- *
- * Will fail if an IPv6 nameserver as detected by
- * ares_ipv6_server_blacklisted()
- *
- * Returns an error code on failure, else ARES_SUCCESS
- */
-static int parse_dnsaddrport(const char *str, size_t len,
- struct ares_addr *host, unsigned short *port)
-{
- char ipaddr[INET6_ADDRSTRLEN] = "";
- char ipport[6] = "";
- size_t mylen;
- const char *addr_start = NULL;
- const char *addr_end = NULL;
- const char *port_start = NULL;
- const char *port_end = NULL;
-
- /* Must start with [, hex digit or : */
- if (len == 0 || (*str != '[' && !isxdigit(*str) && *str != ':')) {
- return ARES_EBADSTR;
+ channel->queries_by_timeout =
+ ares__slist_create(channel->rand_state, ares_query_timeout_cmp_cb, NULL);
+ if (channel->queries_by_timeout == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- /* If it starts with a bracket, must end with a bracket */
- if (*str == '[') {
- const char *ptr;
- addr_start = str+1;
- ptr = memchr(addr_start, ']', len-1);
- if (ptr == NULL) {
- return ARES_EBADSTR;
- }
- addr_end = ptr-1;
+ channel->connnode_by_socket = ares__htable_asvp_create(NULL);
+ if (channel->connnode_by_socket == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* Try to pull off port */
- if ((size_t)(ptr - str) < len) {
- ptr++;
- if (*ptr != ':') {
- return ARES_EBADSTR;
- }
+ /* Initialize configuration by each of the four sources, from highest
+ * precedence to lowest.
+ */
- /* Missing port number */
- if ((size_t)(ptr - str) == len) {
- return ARES_EBADSTR;
- }
+ status = ares__init_by_options(channel, options, optmask);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n",
+ ares_strerror(status)));
+ /* If we fail to apply user-specified options, fail the whole init process
+ */
+ goto done;
+ }
- port_start = ptr+1;
- port_end = str+(len-1);
+ if (channel->qcache_max_ttl > 0) {
+ status = ares__qcache_create(channel->rand_state, channel->qcache_max_ttl,
+ &channel->qcache);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- } else {
- addr_start = str;
- addr_end = str+(len-1);
}
- mylen = (addr_end-addr_start)+1;
- /* Larger than buffer with null term */
- if (mylen+1 > sizeof(ipaddr)) {
- return ARES_EBADSTR;
+ if (status == ARES_SUCCESS) {
+ status = ares__init_by_sysconfig(channel);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n",
+ ares_strerror(status)));
+ }
}
- memset(ipaddr, 0, sizeof(ipaddr));
- memcpy(ipaddr, addr_start, mylen);
+ /*
+ * 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)));
+ goto done;
+ }
- if (port_start) {
- mylen = (port_end-port_start)+1;
- /* Larger than buffer with null term */
- if (mylen+1 > sizeof(ipport)) {
- return ARES_EBADSTR;
+ /* Initialize the event thread */
+ if (channel->optmask & ARES_OPT_EVENT_THREAD) {
+ status = ares_event_thread_init(channel);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- memset(ipport, 0, sizeof(ipport));
- memcpy(ipport, port_start, mylen);
- } else {
- snprintf(ipport, sizeof(ipport), "0");
}
- /* Convert textual address to binary format. */
- if (ares_inet_pton(AF_INET, ipaddr, &host->addrV4) == 1) {
- host->family = AF_INET;
- } else if (ares_inet_pton(AF_INET6, ipaddr, &host->addrV6) == 1
- /* Silently skip blacklisted IPv6 servers. */
- && !ares_ipv6_server_blacklisted(
- (const unsigned char *)&host->addrV6)) {
- host->family = AF_INET6;
- } else {
- return ARES_EBADSTR;
+done:
+ if (status != ARES_SUCCESS) {
+ ares_destroy(channel);
+ return (int)status;
}
- *port = (unsigned short)atoi(ipport);
+ *channelptr = channel;
return ARES_SUCCESS;
}
-/* Add the IPv4 or IPv6 nameservers in str (separated by commas or spaces) to
- * the servers list, updating servers and nservers as required.
- *
- * If a nameserver is encapsulated in [ ] it may optionally include a port
- * suffix, e.g.:
- * [127.0.0.1]:59591
- *
- * The extended format is required to support OpenBSD's resolv.conf format:
- * https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5
- * As well as MacOS libresolv that may include a non-default port number.
- *
- * This will silently ignore blacklisted IPv6 nameservers as detected by
- * ares_ipv6_server_blacklisted().
- *
- * Returns an error code on failure, else ARES_SUCCESS.
- */
-static int config_nameserver(struct server_state **servers, int *nservers,
- const char *str)
+ares_status_t ares_reinit(ares_channel_t *channel)
{
- struct ares_addr host;
- struct server_state *newserv;
- const 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;)
- {
- unsigned short port;
-
- /* Skip whitespace and commas. */
- while (*p && (ISSPACE(*p) || (*p == ',')))
- p++;
- if (!*p)
- /* No more input, done. */
- break;
+ ares_status_t status;
- /* Pointer to start of IPv4 or IPv6 address part. */
- txtaddr = p;
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
- /* Advance past this address. */
- while (*p && !ISSPACE(*p) && (*p != ','))
- p++;
+ ares__channel_lock(channel);
- if (parse_dnsaddrport(txtaddr, p-txtaddr, &host, &port) !=
- ARES_SUCCESS) {
- continue;
- }
-
- /* Resize servers state array. */
- newserv = ares_realloc(*servers, (*nservers + 1) *
- sizeof(*newserv));
- if (!newserv)
- return ARES_ENOMEM;
-
- memset(((unsigned char *)newserv) + ((*nservers) * sizeof(*newserv)), 0, sizeof(*newserv));
-
- /* Store address data. */
- newserv[*nservers].addr.family = host.family;
- newserv[*nservers].addr.udp_port = htons(port);
- newserv[*nservers].addr.tcp_port = htons(port);
- 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;
- }
+ status = ares__init_by_sysconfig(channel);
+ if (status != ARES_SUCCESS) {
+ DEBUGF(fprintf(stderr, "Error: init_by_sysconfig failed: %s\n",
+ ares_strerror(status)));
+ }
- return ARES_SUCCESS;
-}
-#endif /* !WATT32 */
+ /* Flush cached queries on reinit */
+ if (channel->qcache) {
+ ares__qcache_flush(channel->qcache);
+ }
-static int config_sortlist(struct apattern **sortlist, int *nsort,
- const char *str)
-{
- struct apattern pat;
- const char *q;
-
- /* Add sortlist entries. */
- while (*str && *str != ';')
- {
- int bits;
- char ipbuf[16], ipbufpfx[32];
- /* Find just the IP */
- q = str;
- while (*q && *q != '/' && *q != ';' && !ISSPACE(*q))
- q++;
- if (q-str >= 16)
- return ARES_EBADSTR;
- memcpy(ipbuf, str, q-str);
- ipbuf[q-str] = '\0';
- /* Find the prefix */
- if (*q == '/')
- {
- const char *str2 = q+1;
- while (*q && *q != ';' && !ISSPACE(*q))
- q++;
- if (q-str >= 32)
- return ARES_EBADSTR;
- memcpy(ipbufpfx, str, q-str);
- ipbufpfx[q-str] = '\0';
- str = str2;
- }
- else
- ipbufpfx[0] = '\0';
- /* Lets see if it is CIDR */
- /* First we'll try IPv6 */
- if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf,
- &pat.addrV6,
- sizeof(pat.addrV6))) > 0)
- {
- pat.type = PATTERN_CIDR;
- pat.mask.bits = (unsigned short)bits;
- pat.family = AF_INET6;
- if (!sortlist_alloc(sortlist, nsort, &pat)) {
- ares_free(*sortlist);
- *sortlist = NULL;
- return ARES_ENOMEM;
- }
- }
- else if (ipbufpfx[0] &&
- (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4,
- sizeof(pat.addrV4))) > 0)
- {
- pat.type = PATTERN_CIDR;
- pat.mask.bits = (unsigned short)bits;
- pat.family = AF_INET;
- if (!sortlist_alloc(sortlist, nsort, &pat)) {
- ares_free(*sortlist);
- *sortlist = NULL;
- return ARES_ENOMEM;
- }
- }
- /* See if it is just a regular IP */
- else if (ip_addr(ipbuf, q-str, &pat.addrV4) == 0)
- {
- if (ipbufpfx[0])
- {
- memcpy(ipbuf, str, q-str);
- ipbuf[q-str] = '\0';
- if (ip_addr(ipbuf, q-str, &pat.mask.addr4) != 0)
- natural_mask(&pat);
- }
- else
- natural_mask(&pat);
- pat.family = AF_INET;
- pat.type = PATTERN_MASK;
- if (!sortlist_alloc(sortlist, nsort, &pat)) {
- ares_free(*sortlist);
- *sortlist = NULL;
- return ARES_ENOMEM;
- }
- }
- else
- {
- while (*q && *q != ';' && !ISSPACE(*q))
- q++;
- }
- str = q;
- while (ISSPACE(*str))
- str++;
- }
+ ares__channel_unlock(channel);
- return ARES_SUCCESS;
+ return status;
}
-static int set_search(ares_channel channel, const char *str)
+/* ares_dup() duplicates a channel handle with all its options and returns a
+ new channel handle */
+int ares_dup(ares_channel_t **dest, ares_channel_t *src)
{
- size_t cnt;
-
- if(channel->ndomains != -1) {
- /* LCOV_EXCL_START: all callers check ndomains == -1 */
- /* if we already have some domains present, free them first */
- ares__strsplit_free(channel->domains, channel->ndomains);
- channel->domains = NULL;
- channel->ndomains = -1;
- } /* LCOV_EXCL_STOP */
-
- channel->domains = ares__strsplit(str, ", ", &cnt);
- channel->ndomains = (int)cnt;
- if (channel->domains == NULL || channel->ndomains == 0) {
- channel->domains = NULL;
- channel->ndomains = -1;
- }
-
- return ARES_SUCCESS;
-}
+ struct ares_options opts;
+ ares_status_t rc;
+ int optmask;
-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++;
- }
+ if (dest == NULL || src == NULL) {
+ return ARES_EFORMERR;
+ }
- return ARES_SUCCESS;
-}
+ *dest = NULL; /* in case of failure return NULL explicitly */
-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;
-}
+ ares__channel_lock(src);
+ /* First get the options supported by the old ares_save_options() function,
+ which is most of them */
+ rc = (ares_status_t)ares_save_options(src, &opts, &optmask);
+ if (rc != ARES_SUCCESS) {
+ ares_destroy_options(&opts);
+ goto done;
+ }
-#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__ */
+ /* Then create the new channel with those options */
+ rc = (ares_status_t)ares_init_options(dest, &opts, optmask);
-static int ip_addr(const char *ipbuf, ares_ssize_t len, struct in_addr *addr)
-{
+ /* destroy the options copy to not leak any memory */
+ ares_destroy_options(&opts);
- /* Four octets and three periods yields at most 15 characters. */
- if (len > 15)
- return -1;
+ if (rc != ARES_SUCCESS) {
+ goto done;
+ }
- if (ares_inet_pton(AF_INET, ipbuf, addr) < 1)
- return -1;
+ /* Now clone the options that ares_save_options() doesn't support, but are
+ * user-provided */
+ (*dest)->sock_create_cb = src->sock_create_cb;
+ (*dest)->sock_create_cb_data = src->sock_create_cb_data;
+ (*dest)->sock_config_cb = src->sock_config_cb;
+ (*dest)->sock_config_cb_data = src->sock_config_cb_data;
+ (*dest)->sock_funcs = src->sock_funcs;
+ (*dest)->sock_func_cb_data = src->sock_func_cb_data;
- return 0;
-}
+ ares_strcpy((*dest)->local_dev_name, src->local_dev_name,
+ sizeof((*dest)->local_dev_name));
+ (*dest)->local_ip4 = src->local_ip4;
+ memcpy((*dest)->local_ip6, src->local_ip6, sizeof(src->local_ip6));
-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.
+ /* Servers are a bit unique as ares_init_options() only allows ipv4 servers
+ * and not a port per server, but there are other user specified ways, that
+ * too will toggle the optmask ARES_OPT_SERVERS to let us know. If that's
+ * the case, pull them in.
+ *
+ * We don't want to clone system-configuration servers though.
+ *
+ * We must use the "csv" format to get things like link-local address support
*/
- 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);
-}
+ if (optmask & ARES_OPT_SERVERS) {
+ char *csv = ares_get_servers_csv(src);
+ if (csv == NULL) {
+ ares_destroy(*dest);
+ *dest = NULL;
+ rc = ARES_ENOMEM;
+ goto done;
+ }
-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;
-}
+ rc = (ares_status_t)ares_set_servers_ports_csv(*dest, csv);
+ ares_free_string(csv);
+ if (rc != ARES_SUCCESS) {
+ ares_destroy(*dest);
+ *dest = NULL;
+ goto done;
+ }
+ }
+ rc = ARES_SUCCESS;
+done:
+ ares__channel_unlock(src);
+ return (int)rc; /* everything went fine */
+}
-void ares_set_local_ip4(ares_channel channel, unsigned int local_ip)
+void ares_set_local_ip4(ares_channel_t *channel, unsigned int local_ip)
{
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
channel->local_ip4 = local_ip;
+ ares__channel_unlock(channel);
}
/* local_ip6 should be 16 bytes in length */
-void ares_set_local_ip6(ares_channel channel,
- const unsigned char* local_ip6)
+void ares_set_local_ip6(ares_channel_t *channel, const unsigned char *local_ip6)
{
+ if (channel == NULL) {
+ return;
+ }
+ ares__channel_lock(channel);
memcpy(&channel->local_ip6, local_ip6, sizeof(channel->local_ip6));
+ ares__channel_unlock(channel);
}
/* local_dev_name should be null terminated. */
-void ares_set_local_dev(ares_channel 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)
+void ares_set_local_dev(ares_channel_t *channel, const char *local_dev_name)
{
- channel->sock_config_cb = cb;
- channel->sock_config_cb_data = data;
-}
+ if (channel == NULL) {
+ return;
+ }
-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;
+ ares__channel_lock(channel);
+ ares_strcpy(channel->local_dev_name, local_dev_name,
+ sizeof(channel->local_dev_name));
+ channel->local_dev_name[sizeof(channel->local_dev_name) - 1] = 0;
+ ares__channel_unlock(channel);
}
-int ares_set_sortlist(ares_channel channel, const char *sortstr)
+int ares_set_sortlist(ares_channel_t *channel, const char *sortstr)
{
- int nsort = 0;
+ size_t nsort = 0;
struct apattern *sortlist = NULL;
- int status;
+ ares_status_t status;
- if (!channel)
+ if (!channel) {
return ARES_ENODATA;
+ }
+ ares__channel_lock(channel);
- status = config_sortlist(&sortlist, &nsort, sortstr);
+ status = ares__parse_sortlist(&sortlist, &nsort, sortstr);
if (status == ARES_SUCCESS && sortlist) {
- if (channel->sortlist)
+ if (channel->sortlist) {
ares_free(channel->sortlist);
- channel->sortlist = sortlist;
- channel->nsort = nsort;
- }
- return status;
-}
-
-int ares__init_servers_state(ares_channel channel)
-{
- struct server_state *server;
- int i;
-
- for (i = 0; i < channel->nservers; i++) {
- server = &channel->servers[i];
-
- /* NOTE: Can't use memset() here because the server addresses have been
- * filled in already */
- server->tcp_parser = ares__buf_create();
- if (server->tcp_parser == NULL)
- return ARES_ENOMEM;
-
- server->tcp_send = ares__buf_create();
- if (server->tcp_send == NULL) {
- ares__buf_destroy(server->tcp_parser);
- return ARES_ENOMEM;
- }
-
- server->idx = i;
- server->connections = ares__llist_create(NULL);
- if (server->connections == NULL) {
- ares__buf_destroy(server->tcp_parser);
- ares__buf_destroy(server->tcp_send);
- return ARES_ENOMEM;
}
+ channel->sortlist = sortlist;
+ channel->nsort = nsort;
- server->tcp_connection_generation = ++channel->tcp_connection_generation;
- server->channel = channel;
+ /* Save sortlist as if it was passed in as an option */
+ channel->optmask |= ARES_OPT_SORTLIST;
}
- return ARES_SUCCESS;
+ ares__channel_unlock(channel);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_ipv6.h b/contrib/libs/c-ares/src/lib/ares_ipv6.h
index edb305324b..28d7851ff3 100644
--- a/contrib/libs/c-ares/src/lib/ares_ipv6.h
+++ b/contrib/libs/c-ares/src/lib/ares_ipv6.h
@@ -27,13 +27,16 @@
#ifndef ARES_IPV6_H
#define ARES_IPV6_H
+#ifdef HAVE_NETINET6_IN6_H
+# include <netinet6/in6.h>
+#endif
+
#ifndef HAVE_PF_INET6
-#define PF_INET6 AF_INET6
+# define PF_INET6 AF_INET6
#endif
#ifndef HAVE_STRUCT_SOCKADDR_IN6
-struct sockaddr_in6
-{
+struct sockaddr_in6 {
unsigned short sin6_family;
unsigned short sin6_port;
unsigned long sin6_flowinfo;
@@ -42,21 +45,19 @@ struct sockaddr_in6
};
#endif
-typedef union
-{
+typedef union {
struct sockaddr sa;
struct sockaddr_in sa4;
struct sockaddr_in6 sa6;
} ares_sockaddr;
#ifndef HAVE_STRUCT_ADDRINFO
-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 */
+ ares_socklen_t ai_addrlen; /* Follow rfc3493 struct addrinfo */
char *ai_canonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
@@ -64,28 +65,28 @@ struct addrinfo
#endif
#ifndef NS_IN6ADDRSZ
-#ifndef HAVE_STRUCT_IN6_ADDR
+# 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
+# define NS_IN6ADDRSZ 16
+# else
+# define NS_IN6ADDRSZ sizeof(struct in6_addr)
+# endif
#endif
#ifndef NS_INADDRSZ
-#define NS_INADDRSZ sizeof(struct in_addr)
+# define NS_INADDRSZ sizeof(struct in_addr)
#endif
#ifndef NS_INT16SZ
-#define NS_INT16SZ 2
+# define NS_INT16SZ 2
#endif
#ifndef IF_NAMESIZE
-#ifdef IFNAMSIZ
-#define IF_NAMESIZE IFNAMSIZ
-#else
-#define IF_NAMESIZE 256
-#endif
+# ifdef IFNAMSIZ
+# define IF_NAMESIZE IFNAMSIZ
+# else
+# define IF_NAMESIZE 256
+# endif
#endif
/* Defined in inet_net_pton.c for no particular reason. */
diff --git a/contrib/libs/c-ares/src/lib/ares_library_init.c b/contrib/libs/c-ares/src/lib/ares_library_init.c
index 79f73b22d4..5d8abf10a0 100644
--- a/contrib/libs/c-ares/src/lib/ares_library_init.c
+++ b/contrib/libs/c-ares/src/lib/ares_library_init.c
@@ -30,47 +30,80 @@
#include "ares.h"
#include "ares_private.h"
-#include "atomic.h"
-
/* library-private global and unique instance vars */
#if defined(ANDROID) || defined(__ANDROID__)
-#include "ares_android.h"
+# 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 */
-/* Some systems may return either NULL or a valid pointer on malloc(0). c-ares should
- * never call malloc(0) so lets return NULL so we're more likely to find an issue if it
- * were to occur. */
+/* Some systems may return either NULL or a valid pointer on malloc(0). c-ares
+ * should never call malloc(0) so lets return NULL so we're more likely to find
+ * an issue if it were to occur. */
-static void *default_malloc(size_t size) { if (size == 0) { return NULL; } return malloc(size); }
+static void *default_malloc(size_t size)
+{
+ if (size == 0) {
+ return NULL;
+ }
+ return malloc(size);
+}
#if defined(WIN32)
/* We need indirections to handle Windows DLL rules. */
-static void *default_realloc(void *p, size_t size) { return realloc(p, size); }
-static void default_free(void *p) { free(p); }
+static void *default_realloc(void *p, size_t size)
+{
+ return realloc(p, size);
+}
+
+static void default_free(void *p)
+{
+ free(p);
+}
#else
-# define default_realloc realloc
-# define default_free free
+# define default_realloc realloc
+# define default_free free
#endif
-void *(*ares_malloc)(size_t size) = default_malloc;
+void *(*ares_malloc)(size_t size) = default_malloc;
void *(*ares_realloc)(void *ptr, size_t size) = default_realloc;
-void (*ares_free)(void *ptr) = default_free;
+void (*ares_free)(void *ptr) = default_free;
+
+void *ares_malloc_zero(size_t size)
+{
+ void *ptr = ares_malloc(size);
+ if (ptr != NULL) {
+ memset(ptr, 0, size);
+ }
+
+ return ptr;
+}
+
+void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size)
+{
+ void *p = ares_realloc(ptr, new_size);
+ if (p == NULL) {
+ return NULL;
+ }
+
+ if (new_size > orig_size) {
+ memset((unsigned char *)p + orig_size, 0, new_size - orig_size);
+ }
+
+ return p;
+}
int ares_library_init_unsafe(int flags)
{
- if (ares_initialized)
- {
- ares_initialized++;
- return ARES_SUCCESS;
- }
+ if (ares_initialized) {
+ ares_initialized++;
+ return ARES_SUCCESS;
+ }
ares_initialized++;
/* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
@@ -80,36 +113,31 @@ int ares_library_init_unsafe(int flags)
return ARES_SUCCESS;
}
-int ares_library_init(int flags)
-{
- acquire_lock(&ares_init_lock);
- int res = ares_library_init_unsafe(flags);
- release_lock(&ares_init_lock);
- return res;
-}
-
-int ares_library_init_mem(int flags,
- void *(*amalloc)(size_t size),
+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)
+ if (amalloc) {
ares_malloc = amalloc;
- if (arealloc)
+ }
+ if (arealloc) {
ares_realloc = arealloc;
- if (afree)
+ }
+ if (afree) {
ares_free = afree;
+ }
return ares_library_init(flags);
}
-
void ares_library_cleanup_unsafe(void)
{
- if (!ares_initialized)
+ if (!ares_initialized) {
return;
+ }
ares_initialized--;
- if (ares_initialized)
+ if (ares_initialized) {
return;
+ }
/* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
@@ -118,27 +146,37 @@ void ares_library_cleanup_unsafe(void)
#endif
ares_init_flags = ARES_LIB_INIT_NONE;
- ares_malloc = malloc;
- ares_realloc = realloc;
- ares_free = free;
+ ares_malloc = malloc;
+ ares_realloc = realloc;
+ ares_free = free;
}
-void ares_library_cleanup(void)
-{
- acquire_lock(&ares_init_lock);
- ares_library_cleanup_unsafe();
- release_lock(&ares_init_lock);
-}
-
-
int ares_library_initialized_unsafe(void)
{
#ifdef USE_WINSOCK
- if (!ares_initialized)
+ if (!ares_initialized) {
return ARES_ENOTINITIALIZED;
+ }
#endif
return ARES_SUCCESS;
}
+#include "atomic.h"
+static atomic_t ares_init_lock;
+int ares_library_init(int flags)
+{
+ acquire_lock(&ares_init_lock);
+ int res = ares_library_init_unsafe(flags);
+ release_lock(&ares_init_lock);
+ return res;
+}
+
+void ares_library_cleanup(void)
+{
+ acquire_lock(&ares_init_lock);
+ ares_library_cleanup_unsafe();
+ release_lock(&ares_init_lock);
+}
+
int ares_library_initialized(void)
{
diff --git a/contrib/libs/c-ares/src/lib/ares_math.c b/contrib/libs/c-ares/src/lib/ares_math.c
new file mode 100644
index 0000000000..eaefd6c5de
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_math.c
@@ -0,0 +1,145 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+/* Uses public domain code snippets from
+ * http://graphics.stanford.edu/~seander/bithacks.html */
+
+static unsigned int ares__round_up_pow2_u32(unsigned int n)
+{
+ /* NOTE: if already a power of 2, will return itself, not the next */
+ n--;
+ n |= n >> 1;
+ n |= n >> 2;
+ n |= n >> 4;
+ n |= n >> 8;
+ n |= n >> 16;
+ n++;
+ return n;
+}
+
+static ares_int64_t ares__round_up_pow2_u64(ares_int64_t n)
+{
+ /* NOTE: if already a power of 2, will return itself, not the next */
+ n--;
+ n |= n >> 1;
+ n |= n >> 2;
+ n |= n >> 4;
+ n |= n >> 8;
+ n |= n >> 16;
+ n |= n >> 32;
+ n++;
+ return n;
+}
+
+size_t ares__round_up_pow2(size_t n)
+{
+ if (sizeof(size_t) > 4) {
+ return (size_t)ares__round_up_pow2_u64((ares_int64_t)n);
+ }
+
+ return (size_t)ares__round_up_pow2_u32((unsigned int)n);
+}
+
+size_t ares__log2(size_t n)
+{
+ static const unsigned char tab32[32] = { 0, 1, 28, 2, 29, 14, 24, 3,
+ 30, 22, 20, 15, 25, 17, 4, 8,
+ 31, 27, 13, 23, 21, 19, 16, 7,
+ 26, 12, 18, 6, 11, 5, 10, 9 };
+ static const unsigned char tab64[64] = {
+ 63, 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3,
+ 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4,
+ 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21,
+ 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5
+ };
+
+ if (sizeof(size_t) == 4) {
+ return tab32[(n * 0x077CB531) >> 27];
+ }
+
+ return tab64[(n * 0x07EDD5E59A4E28C2) >> 58];
+}
+
+/* x^y */
+size_t ares__pow(size_t x, size_t y)
+{
+ size_t res = 1;
+
+ while (y > 0) {
+ /* If y is odd, multiply x with result */
+ if (y & 1) {
+ res = res * x;
+ }
+
+ /* y must be even now */
+ y = y >> 1; /* y /= 2; */
+ x = x * x; /* x^2 */
+ }
+
+ return res;
+}
+
+size_t ares__count_digits(size_t n)
+{
+ size_t digits;
+
+ for (digits = 0; n > 0; digits++) {
+ n /= 10;
+ }
+ if (digits == 0) {
+ digits = 1;
+ }
+
+ return digits;
+}
+
+size_t ares__count_hexdigits(size_t n)
+{
+ size_t digits;
+
+ for (digits = 0; n > 0; digits++) {
+ n /= 16;
+ }
+ if (digits == 0) {
+ digits = 1;
+ }
+
+ return digits;
+}
+
+unsigned char ares__count_bits_u8(unsigned char x)
+{
+ /* Implementation obtained from:
+ * http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable */
+#define B2(n) n, n + 1, n + 1, n + 2
+#define B4(n) B2(n), B2(n + 1), B2(n + 1), B2(n + 2)
+#define B6(n) B4(n), B4(n + 1), B4(n + 1), B4(n + 2)
+ static const unsigned char lookup[256] = { B6(0), B6(1), B6(1), B6(2) };
+ return lookup[x];
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_mkquery.c b/contrib/libs/c-ares/src/lib/ares_mkquery.c
deleted file mode 100644
index da1898e74c..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_mkquery.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-#include "ares.h"
-
-int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
- int rd, unsigned char **buf, int *buflen)
-{
- return ares_create_query(name, dnsclass, type, id, rd, buf, buflen, 0);
-}
diff --git a/contrib/libs/c-ares/src/lib/ares_nowarn.c b/contrib/libs/c-ares/src/lib/ares_nowarn.c
deleted file mode 100644
index 65cabb37b2..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_nowarn.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2010 Daniel Stenberg
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#include "ares_setup.h"
-
-#ifdef HAVE_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/src/lib/ares_nowarn.h b/contrib/libs/c-ares/src/lib/ares_nowarn.h
deleted file mode 100644
index 3f5612dbb9..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_nowarn.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2010 Daniel Stenberg
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-#ifndef HEADER_CARES_NOWARN_H
-#define HEADER_CARES_NOWARN_H
-
-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/src/lib/ares_options.c b/contrib/libs/c-ares/src/lib/ares_options.c
index 78e16bb5d2..4306242cb2 100644
--- a/contrib/libs/c-ares/src/lib/ares_options.c
+++ b/contrib/libs/c-ares/src/lib/ares_options.c
@@ -36,382 +36,461 @@
#include "ares_inet_net_pton.h"
#include "ares_private.h"
-
-int ares_get_servers(ares_channel channel,
- struct ares_addr_node **servers)
+void ares_destroy_options(struct ares_options *options)
{
- 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;
- }
- }
+ ares_free(options->servers);
- *servers = srvr_head;
+ for (i = 0; options->domains && i < options->ndomains; i++) {
+ ares_free(options->domains[i]);
+ }
- return status;
+ ares_free(options->domains);
+ ares_free(options->sortlist);
+ ares_free(options->lookups);
+ ares_free(options->resolvconf_path);
+ ares_free(options->hosts_path);
}
-int ares_get_servers_ports(ares_channel channel,
- struct ares_addr_port_node **servers)
+static struct in_addr *ares_save_opt_servers(ares_channel_t *channel,
+ int *nservers)
{
- 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;
+ ares__slist_node_t *snode;
+ struct in_addr *out =
+ ares_malloc_zero(ares__slist_len(channel->servers) * sizeof(*out));
- if (!channel)
- return ARES_ENODATA;
+ *nservers = 0;
- 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 (out == NULL) {
+ return NULL;
+ }
- if (status != ARES_SUCCESS)
- {
- if (srvr_head)
- {
- ares_free_data(srvr_head);
- srvr_head = NULL;
- }
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ const struct server_state *server = ares__slist_node_val(snode);
+
+ if (server->addr.family != AF_INET) {
+ continue;
}
- *servers = srvr_head;
+ memcpy(&out[*nservers], &server->addr.addr.addr4, sizeof(*out));
+ (*nservers)++;
+ }
- return status;
+ return out;
}
-int ares_set_servers(ares_channel channel,
- struct ares_addr_node *servers)
+/* Save options from initialized channel */
+int ares_save_options(ares_channel_t *channel, struct ares_options *options,
+ int *optmask)
{
- 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 */
+ size_t i;
- if (!channel)
+ /* NOTE: We can't zero the whole thing out, this is because the size of the
+ * struct ares_options changes over time, so if someone compiled
+ * with an older version, their struct size might be smaller and
+ * we might overwrite their memory! So using the optmask is critical
+ * here, as they could have only set options they knew about.
+ *
+ * Unfortunately ares_destroy_options() doesn't take an optmask, so
+ * there are a few pointers we *must* zero out otherwise we won't
+ * know if they were allocated or not
+ */
+ options->servers = NULL;
+ options->domains = NULL;
+ options->sortlist = NULL;
+ options->lookups = NULL;
+ options->resolvconf_path = NULL;
+ options->hosts_path = NULL;
+
+ if (!ARES_CONFIG_CHECK(channel)) {
return ARES_ENODATA;
+ }
- if (ares__llist_len(channel->all_queries) != 0)
- return ARES_ENOTIMP;
+ if (channel->optmask & ARES_OPT_FLAGS) {
+ options->flags = (int)channel->flags;
+ }
+
+ /* We convert ARES_OPT_TIMEOUT to ARES_OPT_TIMEOUTMS in
+ * ares__init_by_options() */
+ if (channel->optmask & ARES_OPT_TIMEOUTMS) {
+ options->timeout = (int)channel->timeout;
+ }
+
+ if (channel->optmask & ARES_OPT_TRIES) {
+ options->tries = (int)channel->tries;
+ }
+
+ if (channel->optmask & ARES_OPT_NDOTS) {
+ options->ndots = (int)channel->ndots;
+ }
+
+ if (channel->optmask & ARES_OPT_MAXTIMEOUTMS) {
+ options->maxtimeout = (int)channel->maxtimeout;
+ }
+
+ if (channel->optmask & ARES_OPT_UDP_PORT) {
+ options->udp_port = channel->udp_port;
+ }
+ if (channel->optmask & ARES_OPT_TCP_PORT) {
+ options->tcp_port = channel->tcp_port;
+ }
- ares__destroy_servers_state(channel);
+ if (channel->optmask & ARES_OPT_SOCK_STATE_CB) {
+ options->sock_state_cb = channel->sock_state_cb;
+ options->sock_state_cb_data = channel->sock_state_cb_data;
+ }
- for (srvr = servers; srvr; srvr = srvr->next)
- {
- num_srvrs++;
+ if (channel->optmask & ARES_OPT_SERVERS) {
+ options->servers = ares_save_opt_servers(channel, &options->nservers);
+ if (options->servers == NULL) {
+ return ARES_ENOMEM;
}
+ }
- if (num_srvrs > 0)
- {
- /* Allocate storage for servers state */
- channel->servers = ares_malloc(num_srvrs * sizeof(*channel->servers));
- if (!channel->servers)
- {
+ if (channel->optmask & ARES_OPT_DOMAINS) {
+ options->domains = NULL;
+ if (channel->ndomains) {
+ options->domains = ares_malloc(channel->ndomains * sizeof(char *));
+ if (!options->domains) {
+ return ARES_ENOMEM;
+ }
+
+ for (i = 0; i < channel->ndomains; i++) {
+ options->domains[i] = ares_strdup(channel->domains[i]);
+ if (!options->domains[i]) {
+ options->ndomains = (int)i;
return ARES_ENOMEM;
}
- memset(channel->servers, 0, num_srvrs * sizeof(*channel->servers));
- 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);
+ }
+ }
+ options->ndomains = (int)channel->ndomains;
+ }
+
+ if (channel->optmask & ARES_OPT_LOOKUPS) {
+ options->lookups = ares_strdup(channel->lookups);
+ if (!options->lookups && channel->lookups) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (channel->optmask & ARES_OPT_SORTLIST) {
+ options->sortlist = NULL;
+ if (channel->nsort) {
+ options->sortlist = ares_malloc(channel->nsort * sizeof(struct apattern));
+ if (!options->sortlist) {
+ return ARES_ENOMEM;
+ }
+ for (i = 0; i < channel->nsort; i++) {
+ options->sortlist[i] = channel->sortlist[i];
+ }
+ }
+ options->nsort = (int)channel->nsort;
+ }
+
+ if (channel->optmask & ARES_OPT_RESOLVCONF) {
+ options->resolvconf_path = ares_strdup(channel->resolvconf_path);
+ if (!options->resolvconf_path) {
+ return ARES_ENOMEM;
}
+ }
+
+ if (channel->optmask & ARES_OPT_HOSTS_FILE) {
+ options->hosts_path = ares_strdup(channel->hosts_path);
+ if (!options->hosts_path) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ if (channel->optmask & ARES_OPT_SOCK_SNDBUF &&
+ channel->socket_send_buffer_size > 0) {
+ options->socket_send_buffer_size = channel->socket_send_buffer_size;
+ }
+
+ if (channel->optmask & ARES_OPT_SOCK_RCVBUF &&
+ channel->socket_receive_buffer_size > 0) {
+ options->socket_receive_buffer_size = channel->socket_receive_buffer_size;
+ }
+
+ if (channel->optmask & ARES_OPT_EDNSPSZ) {
+ options->ednspsz = (int)channel->ednspsz;
+ }
+
+ if (channel->optmask & ARES_OPT_UDP_MAX_QUERIES) {
+ options->udp_max_queries = (int)channel->udp_max_queries;
+ }
+
+ if (channel->optmask & ARES_OPT_QUERY_CACHE) {
+ options->qcache_max_ttl = channel->qcache_max_ttl;
+ }
+
+ if (channel->optmask & ARES_OPT_EVENT_THREAD) {
+ options->evsys = channel->evsys;
+ }
+
+ /* Set options for server failover behavior */
+ if (channel->optmask & ARES_OPT_SERVER_FAILOVER) {
+ options->server_failover_opts.retry_chance =
+ channel->server_retry_chance;
+ options->server_failover_opts.retry_delay =
+ channel->server_retry_delay;
+ }
+
+ *optmask = (int)channel->optmask;
return ARES_SUCCESS;
}
-int ares_set_servers_ports(ares_channel channel,
- struct ares_addr_port_node *servers)
+static ares_status_t ares__init_options_servers(ares_channel_t *channel,
+ const struct in_addr *servers,
+ size_t nservers)
{
- struct ares_addr_port_node *srvr;
- int num_srvrs = 0;
- int i;
+ ares__llist_t *slist = NULL;
+ ares_status_t status;
+
+ status = ares_in_addr_to_server_config_llist(servers, nservers, &slist);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
- if (ares_library_initialized() != ARES_SUCCESS)
- return ARES_ENOTINITIALIZED; /* LCOV_EXCL_LINE: n/a on non-WinSock */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
- if (!channel)
+ ares__llist_destroy(slist);
+
+ return status;
+}
+
+ares_status_t ares__init_by_options(ares_channel_t *channel,
+ const struct ares_options *options,
+ int optmask)
+{
+ size_t i;
+
+ if (channel == NULL) {
return ARES_ENODATA;
+ }
- if (ares__llist_len(channel->all_queries) != 0)
- return ARES_ENOTIMP;
+ if (options == NULL) {
+ if (optmask != 0) {
+ return ARES_ENODATA;
+ }
+ return ARES_SUCCESS;
+ }
- ares__destroy_servers_state(channel);
+ /* Easy stuff. */
- for (srvr = servers; srvr; srvr = srvr->next)
- {
- num_srvrs++;
+ /* Event Thread requires threading support and is incompatible with socket
+ * state callbacks */
+ if (optmask & ARES_OPT_EVENT_THREAD) {
+ if (!ares_threadsafety()) {
+ return ARES_ENOTIMP;
}
+ if (optmask & ARES_OPT_SOCK_STATE_CB) {
+ return ARES_EFORMERR;
+ }
+ channel->evsys = options->evsys;
+ }
- if (num_srvrs > 0)
- {
- /* Allocate storage for servers state */
- channel->servers = ares_malloc(num_srvrs * sizeof(*channel->servers));
- if (!channel->servers)
- {
- return ARES_ENOMEM;
- }
- memset(channel->servers, 0, num_srvrs * sizeof(*channel->servers));
- 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);
+ if (optmask & ARES_OPT_FLAGS) {
+ channel->flags = (unsigned int)options->flags;
+ }
+
+ if (optmask & ARES_OPT_TIMEOUTMS) {
+ /* Apparently some integrations were passing -1 to tell c-ares to use
+ * the default instead of just omitting the optmask */
+ if (options->timeout <= 0) {
+ optmask &= ~(ARES_OPT_TIMEOUTMS);
+ } else {
+ channel->timeout = (unsigned int)options->timeout;
+ }
+ } else if (optmask & ARES_OPT_TIMEOUT) {
+ optmask &= ~(ARES_OPT_TIMEOUT);
+ /* Apparently some integrations were passing -1 to tell c-ares to use
+ * the default instead of just omitting the optmask */
+ if (options->timeout > 0) {
+ /* Convert to milliseconds */
+ optmask |= ARES_OPT_TIMEOUTMS;
+ channel->timeout = (unsigned int)options->timeout * 1000;
}
+ }
- return ARES_SUCCESS;
-}
+ if (optmask & ARES_OPT_TRIES) {
+ if (options->tries <= 0) {
+ optmask &= ~(ARES_OPT_TRIES);
+ } else {
+ channel->tries = (size_t)options->tries;
+ }
+ }
-/* 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;
+ if (optmask & ARES_OPT_NDOTS) {
+ if (options->ndots < 0) {
+ optmask &= ~(ARES_OPT_NDOTS);
+ } else {
+ channel->ndots = (size_t)options->ndots;
+ }
+ }
+
+ if (optmask & ARES_OPT_MAXTIMEOUTMS) {
+ if (options->maxtimeout <= 0) {
+ optmask &= ~(ARES_OPT_MAXTIMEOUTMS);
+ } else {
+ channel->maxtimeout = (size_t)options->maxtimeout;
+ }
+ }
+
+ if (optmask & ARES_OPT_ROTATE) {
+ channel->rotate = ARES_TRUE;
+ }
+
+ if (optmask & ARES_OPT_NOROTATE) {
+ channel->rotate = ARES_FALSE;
+ }
+
+ if (optmask & ARES_OPT_UDP_PORT) {
+ channel->udp_port = options->udp_port;
+ }
+
+ if (optmask & ARES_OPT_TCP_PORT) {
+ channel->tcp_port = options->tcp_port;
+ }
- i = strlen(_csv);
- if (i == 0)
- return ARES_SUCCESS; /* blank all servers */
+ if (optmask & ARES_OPT_SOCK_STATE_CB) {
+ channel->sock_state_cb = options->sock_state_cb;
+ channel->sock_state_cb_data = options->sock_state_cb_data;
+ }
- csv = ares_malloc(i + 2);
- if (!csv)
- return ARES_ENOMEM;
+ if (optmask & ARES_OPT_SOCK_SNDBUF) {
+ if (options->socket_send_buffer_size <= 0) {
+ optmask &= ~(ARES_OPT_SOCK_SNDBUF);
+ } else {
+ channel->socket_send_buffer_size = options->socket_send_buffer_size;
+ }
+ }
- strcpy(csv, _csv);
- if (csv[i-1] != ',') { /* make parsing easier by ensuring ending ',' */
- csv[i] = ',';
- csv[i+1] = 0;
+ if (optmask & ARES_OPT_SOCK_RCVBUF) {
+ if (options->socket_receive_buffer_size <= 0) {
+ optmask &= ~(ARES_OPT_SOCK_RCVBUF);
+ } else {
+ channel->socket_receive_buffer_size = options->socket_receive_buffer_size;
+ }
}
- 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++;
+ if (optmask & ARES_OPT_EDNSPSZ) {
+ if (options->ednspsz <= 0) {
+ optmask &= ~(ARES_OPT_EDNSPSZ);
+ } else {
+ channel->ednspsz = (size_t)options->ednspsz;
}
- else if (*ptr == '[') {
- /* move start_host if an open square bracket is found wrapping an IPv6
- address */
- start_host = ptr + 1;
+ }
+
+ /* Copy the domains, if given. Keep channel->ndomains consistent so
+ * we can clean up in case of error.
+ */
+ if (optmask & ARES_OPT_DOMAINS && options->ndomains > 0) {
+ channel->domains =
+ ares_malloc_zero((size_t)options->ndomains * sizeof(char *));
+ if (!channel->domains) {
+ return ARES_ENOMEM;
}
- 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 */
- }
+ channel->ndomains = (size_t)options->ndomains;
+ for (i = 0; i < (size_t)options->ndomains; i++) {
+ channel->domains[i] = ares_strdup(options->domains[i]);
+ if (!channel->domains[i]) {
+ return ARES_ENOMEM;
}
- /* 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));
+ }
+ }
+
+ /* Set lookups, if given. */
+ if (optmask & ARES_OPT_LOOKUPS) {
+ if (options->lookups == NULL) {
+ optmask &= ~(ARES_OPT_LOOKUPS);
+ } else {
+ channel->lookups = ares_strdup(options->lookups);
+ if (!channel->lookups) {
+ return ARES_ENOMEM;
}
- 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));
+ }
+ }
+
+ /* copy sortlist */
+ if (optmask & ARES_OPT_SORTLIST && options->nsort > 0) {
+ channel->nsort = (size_t)options->nsort;
+ channel->sortlist =
+ ares_malloc((size_t)options->nsort * sizeof(struct apattern));
+ if (!channel->sortlist) {
+ return ARES_ENOMEM;
+ }
+ for (i = 0; i < (size_t)options->nsort; i++) {
+ channel->sortlist[i] = options->sortlist[i];
+ }
+ }
+
+ /* Set path for resolv.conf file, if given. */
+ if (optmask & ARES_OPT_RESOLVCONF) {
+ if (options->resolvconf_path == NULL) {
+ optmask &= ~(ARES_OPT_RESOLVCONF);
+ } else {
+ channel->resolvconf_path = ares_strdup(options->resolvconf_path);
+ if (channel->resolvconf_path == NULL) {
+ return ARES_ENOMEM;
}
- 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 path for hosts file, if given. */
+ if (optmask & ARES_OPT_HOSTS_FILE) {
+ if (options->hosts_path == NULL) {
+ optmask &= ~(ARES_OPT_HOSTS_FILE);
+ } else {
+ channel->hosts_path = ares_strdup(options->hosts_path);
+ if (channel->hosts_path == NULL) {
+ return ARES_ENOMEM;
}
+ }
+ }
- /* Set up for next one */
- start_host = ptr + 1;
- cc = 0;
+ if (optmask & ARES_OPT_UDP_MAX_QUERIES) {
+ if (options->udp_max_queries <= 0) {
+ optmask &= ~(ARES_OPT_UDP_MAX_QUERIES);
+ } else {
+ channel->udp_max_queries = (size_t)options->udp_max_queries;
}
}
- rv = ares_set_servers_ports(channel, servers);
+ if (optmask & ARES_OPT_QUERY_CACHE) {
+ /* qcache_max_ttl is unsigned unlike the others */
+ if (options->qcache_max_ttl == 0) {
+ optmask &= ~(ARES_OPT_QUERY_CACHE);
+ } else {
+ channel->qcache_max_ttl = options->qcache_max_ttl;
+ }
+ }
- out:
- if (csv)
- ares_free(csv);
- while (servers) {
- struct ares_addr_port_node *s = servers;
- servers = servers->next;
- ares_free(s);
+ /* Initialize the ipv4 servers if provided */
+ if (optmask & ARES_OPT_SERVERS) {
+ if (options->nservers <= 0) {
+ optmask &= ~(ARES_OPT_SERVERS);
+ } else {
+ ares_status_t status;
+ status = ares__init_options_servers(channel, options->servers,
+ (size_t)options->nservers);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
}
- return rv;
-}
+ /* Set fields for server failover behavior */
+ if (optmask & ARES_OPT_SERVER_FAILOVER) {
+ channel->server_retry_chance =
+ options->server_failover_opts.retry_chance;
+ channel->server_retry_delay =
+ options->server_failover_opts.retry_delay;
+ }
-int ares_set_servers_csv(ares_channel channel,
- const char* _csv)
-{
- return set_servers_csv(channel, _csv, FALSE);
-}
+ channel->optmask = (unsigned int)optmask;
-int ares_set_servers_ports_csv(ares_channel channel,
- const char* _csv)
-{
- return set_servers_csv(channel, _csv, TRUE);
+ return ARES_SUCCESS;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c
index b50dea3884..da841f0da9 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_a_reply.c
@@ -56,38 +56,45 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
int *naddrttls)
{
struct ares_addrinfo ai;
- char *question_hostname = NULL;
- int status;
- int req_naddrttls = 0;
-
- if (naddrttls)
- {
- req_naddrttls = *naddrttls;
- *naddrttls = 0;
- }
+ char *question_hostname = NULL;
+ ares_status_t status;
+ size_t req_naddrttls = 0;
+ ares_dns_record_t *dnsrec = NULL;
+
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+
+ if (naddrttls) {
+ req_naddrttls = (size_t)*naddrttls;
+ *naddrttls = 0;
+ }
memset(&ai, 0, sizeof(ai));
- status = ares__parse_into_addrinfo(abuf, alen, 0, 0, &ai);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
+ }
- if (host != NULL)
- {
- status = ares__addrinfo2hostent(&ai, AF_INET, host);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ if (host != NULL) {
+ status = ares__addrinfo2hostent(&ai, AF_INET, host);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
}
+ }
- if (addrttls != NULL && req_naddrttls)
- {
- ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls,
- NULL, naddrttls);
- }
+ if (addrttls != NULL && req_naddrttls) {
+ size_t temp_naddrttls = 0;
+ ares__addrinfo2addrttl(&ai, AF_INET, req_naddrttls, addrttls, NULL,
+ &temp_naddrttls);
+ *naddrttls = (int)temp_naddrttls;
+ }
fail:
@@ -95,6 +102,11 @@ fail:
ares__freeaddrinfo_nodes(ai.nodes);
ares_free(ai.name);
ares_free(question_hostname);
+ ares_dns_record_destroy(dnsrec);
+
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
- return status;
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c
index 7a839829eb..b3eba166be 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_aaaa_reply.c
@@ -58,45 +58,56 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
int *naddrttls)
{
struct ares_addrinfo ai;
- char *question_hostname = NULL;
- int status;
- int req_naddrttls = 0;
-
- if (naddrttls)
- {
- req_naddrttls = *naddrttls;
- *naddrttls = 0;
- }
+ char *question_hostname = NULL;
+ ares_status_t status;
+ size_t req_naddrttls = 0;
+ ares_dns_record_t *dnsrec = NULL;
+
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+
+ if (naddrttls) {
+ req_naddrttls = (size_t)*naddrttls;
+ *naddrttls = 0;
+ }
memset(&ai, 0, sizeof(ai));
- status = ares__parse_into_addrinfo(abuf, alen, 0, 0, &ai);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ status = ares_dns_parse(abuf, (size_t)alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
- if (host != NULL)
- {
- status = ares__addrinfo2hostent(&ai, AF_INET6, host);
- if (status != ARES_SUCCESS && status != ARES_ENODATA)
- {
- goto fail;
- }
+ status = ares__parse_into_addrinfo(dnsrec, 0, 0, &ai);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
+ }
+
+ if (host != NULL) {
+ status = ares__addrinfo2hostent(&ai, AF_INET6, host);
+ if (status != ARES_SUCCESS && status != ARES_ENODATA) {
+ goto fail;
}
+ }
- if (addrttls != NULL && req_naddrttls)
- {
- ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL,
- addrttls, naddrttls);
- }
+ if (addrttls != NULL && req_naddrttls) {
+ size_t temp_naddrttls = 0;
+ ares__addrinfo2addrttl(&ai, AF_INET6, req_naddrttls, NULL, addrttls,
+ &temp_naddrttls);
+ *naddrttls = (int)temp_naddrttls;
+ }
fail:
ares__freeaddrinfo_cnames(ai.cnames);
ares__freeaddrinfo_nodes(ai.nodes);
ares_free(question_hostname);
ares_free(ai.name);
+ ares_dns_record_destroy(dnsrec);
- return status;
-}
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ return (int)status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c
index f4581c124a..6c30305ee1 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_caa_reply.c
@@ -1,6 +1,6 @@
/* MIT License
*
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,210 +24,116 @@
* SPDX-License-Identifier: MIT
*/
-/* =============================================================================
- * NOTE: The below copyright is preserved from the original author. In
- * October 2023, there were attempts made to contact the author in order
- * gain approval for relicensing to the modern MIT license from the
- * below 1989 variant, but all contact information for the author is
- * no longer valid.
- *
- * Copyright (c) 2020 <danny.sonnenschein@platynum.ch>
- *
- * 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_nameser.h"
-
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_caa_reply (const unsigned char *abuf, int alen,
- struct ares_caa_reply **caa_out)
+int ares_parse_caa_reply(const unsigned char *abuf, int alen_int,
+ struct ares_caa_reply **caa_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr;
- const unsigned char *strptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_caa_reply *caa_head = NULL;
struct ares_caa_reply *caa_last = NULL;
struct ares_caa_reply *caa_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *caa_out to NULL for all failure cases. */
*caa_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
+
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const unsigned char *ptr;
+ size_t ptr_len;
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* 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;
+ /* XXX: Why do we allow Chaos class? */
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN &&
+ ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) {
+ continue;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a CAA record */
- if ((rr_class == C_IN || rr_class == C_CHAOS) && rr_type == T_CAA)
- {
- strptr = aptr;
-
- /* Allocate storage for this CAA answer appending it to the list */
- caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY);
- if (!caa_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (caa_last)
- {
- caa_last->next = caa_curr;
- }
- else
- {
- caa_head = caa_curr;
- }
- caa_last = caa_curr;
- if (rr_len < 2)
- {
- status = ARES_EBADRESP;
- break;
- }
- caa_curr->critical = (int)*strptr++;
- caa_curr->plength = (int)*strptr++;
- if (caa_curr->plength <= 0 || (int)caa_curr->plength >= rr_len - 2)
- {
- status = ARES_EBADRESP;
- break;
- }
- caa_curr->property = ares_malloc (caa_curr->plength + 1/* Including null byte */);
- if (caa_curr->property == NULL)
- {
- status = ARES_ENOMEM;
- break;
- }
- memcpy ((char *) caa_curr->property, strptr, caa_curr->plength);
- /* Make sure we NULL-terminate */
- caa_curr->property[caa_curr->plength] = 0;
- strptr += caa_curr->plength;
-
- caa_curr->length = rr_len - caa_curr->plength - 2;
- if (caa_curr->length <= 0)
- {
- status = ARES_EBADRESP;
- break;
- }
- caa_curr->value = ares_malloc (caa_curr->length + 1/* Including null byte */);
- if (caa_curr->value == NULL)
- {
- status = ARES_ENOMEM;
- break;
- }
- memcpy ((char *) caa_curr->value, strptr, caa_curr->length);
- /* Make sure we NULL-terminate */
- caa_curr->value[caa_curr->length] = 0;
- }
-
- /* Propagate any failures */
- if (status != ARES_SUCCESS)
- {
- break;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ /* Only looking for CAA records */
+ if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_CAA) {
+ continue;
}
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
+ /* Allocate storage for this CAA answer appending it to the list */
+ caa_curr = ares_malloc_data(ARES_DATATYPE_CAA_REPLY);
+ if (caa_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (caa_head)
- ares_free_data (caa_head);
- return status;
+ /* Link in the record */
+ if (caa_last) {
+ caa_last->next = caa_curr;
+ } else {
+ caa_head = caa_curr;
+ }
+ caa_last = caa_curr;
+
+ caa_curr->critical = ares_dns_rr_get_u8(rr, ARES_RR_CAA_CRITICAL);
+ caa_curr->property =
+ (unsigned char *)ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_CAA_TAG));
+ if (caa_curr->property == NULL) {
+ status = ARES_ENOMEM;
+ break;
+ }
+ /* RFC6844 says this can only be ascii, so not sure why we're recording a
+ * length */
+ caa_curr->plength = ares_strlen((const char *)caa_curr->property);
+
+ ptr = ares_dns_rr_get_bin(rr, ARES_RR_CAA_VALUE, &ptr_len);
+ if (ptr == NULL) {
+ status = ARES_EBADRESP;
+ goto done;
}
- /* everything looks fine, return the data */
- *caa_out = caa_head;
+ /* Wants NULL termination for some reason */
+ caa_curr->value = ares_malloc(ptr_len + 1);
+ if (caa_curr->value == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memcpy(caa_curr->value, ptr, ptr_len);
+ caa_curr->value[ptr_len] = 0;
+ caa_curr->length = ptr_len;
+ }
- return ARES_SUCCESS;
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (caa_head) {
+ ares_free_data(caa_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *caa_out = caa_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c
index 36dfe3d933..db7155d2e8 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_mx_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2010 Jeremy Lal
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,149 +25,88 @@
*/
#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_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_mx_reply (const unsigned char *abuf, int alen,
- struct ares_mx_reply **mx_out)
+int ares_parse_mx_reply(const unsigned char *abuf, int alen_int,
+ struct ares_mx_reply **mx_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_mx_reply *mx_head = NULL;
struct ares_mx_reply *mx_last = NULL;
struct ares_mx_reply *mx_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* 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)
+ if (alen_int < 0) {
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;
+ alen = (size_t)alen_int;
- /* 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;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
- }
- aptr += len + QFIXEDSZ;
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
- /* 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;
- }
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* 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;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_MX) {
+ continue;
+ }
- vptr = aptr;
- mx_curr->priority = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
+ /* Allocate storage for this MX answer appending it to the list */
+ mx_curr = ares_malloc_data(ARES_DATATYPE_MX_REPLY);
+ if (mx_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- status = ares_expand_name (vptr, abuf, alen, &mx_curr->host, &len);
- if (status != ARES_SUCCESS)
- break;
- }
+ /* Link in the record */
+ if (mx_last) {
+ mx_last->next = mx_curr;
+ } else {
+ mx_head = mx_curr;
+ }
+ mx_last = mx_curr;
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
+ mx_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_MX_PREFERENCE);
+ mx_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_MX_EXCHANGE));
- /* Move on to the next record */
- aptr += rr_len;
+ if (mx_curr->host == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ }
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
-
+done:
/* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (mx_head)
- ares_free_data (mx_head);
- return status;
+ if (status != ARES_SUCCESS) {
+ if (mx_head) {
+ ares_free_data(mx_head);
}
-
- /* everything looks fine, return the data */
- *mx_out = mx_head;
-
- return ARES_SUCCESS;
+ } else {
+ /* everything looks fine, return the data */
+ *mx_out = mx_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c
index 81dfb02a2a..1a304ccdd3 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_naptr_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -25,168 +24,111 @@
* SPDX-License-Identifier: MIT
*/
#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_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_naptr_reply (const unsigned char *abuf, int alen,
- struct ares_naptr_reply **naptr_out)
+int ares_parse_naptr_reply(const unsigned char *abuf, int alen_int,
+ struct ares_naptr_reply **naptr_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_naptr_reply *naptr_head = NULL;
struct ares_naptr_reply *naptr_last = NULL;
struct ares_naptr_reply *naptr_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* 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)
+ if (alen_int < 0) {
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;
+ alen = (size_t)alen_int;
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (hostname);
- return ARES_EBADRESP;
- }
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a NAPTR record */
- if (rr_class == C_IN && rr_type == T_NAPTR)
- {
- /* parse the NAPTR record itself */
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* RR must contain at least 7 bytes = 2 x int16 + 3 x name */
- if (rr_len < 7)
- {
- status = ARES_EBADRESP;
- break;
- }
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
- /* 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;
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
- 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;
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- status = ares_expand_string(vptr, abuf, alen, &naptr_curr->service, &len);
- if (status != ARES_SUCCESS)
- break;
- vptr += len;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_NAPTR) {
+ continue;
+ }
- status = ares_expand_string(vptr, abuf, alen, &naptr_curr->regexp, &len);
- if (status != ARES_SUCCESS)
- break;
- vptr += len;
+ /* Allocate storage for this NAPTR answer appending it to the list */
+ naptr_curr = ares_malloc_data(ARES_DATATYPE_NAPTR_REPLY);
+ if (naptr_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- status = ares_expand_name(vptr, abuf, alen, &naptr_curr->replacement, &len);
- if (status != ARES_SUCCESS)
- break;
- }
+ /* Link in the record */
+ if (naptr_last) {
+ naptr_last->next = naptr_curr;
+ } else {
+ naptr_head = naptr_curr;
+ }
+ naptr_last = naptr_curr;
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
+ naptr_curr->order = ares_dns_rr_get_u16(rr, ARES_RR_NAPTR_ORDER);
+ naptr_curr->preference = ares_dns_rr_get_u16(rr, ARES_RR_NAPTR_PREFERENCE);
- /* Move on to the next record */
- aptr += rr_len;
+ /* XXX: Why is this unsigned char * ? */
+ naptr_curr->flags = (unsigned char *)ares_strdup(
+ ares_dns_rr_get_str(rr, ARES_RR_NAPTR_FLAGS));
+ if (naptr_curr->flags == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ /* XXX: Why is this unsigned char * ? */
+ naptr_curr->service = (unsigned char *)ares_strdup(
+ ares_dns_rr_get_str(rr, ARES_RR_NAPTR_SERVICES));
+ if (naptr_curr->service == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ /* XXX: Why is this unsigned char * ? */
+ naptr_curr->regexp = (unsigned char *)ares_strdup(
+ ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REGEXP));
+ if (naptr_curr->regexp == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ naptr_curr->replacement =
+ ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_NAPTR_REPLACEMENT));
+ if (naptr_curr->replacement == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
-
+done:
/* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (naptr_head)
- ares_free_data (naptr_head);
- return status;
+ if (status != ARES_SUCCESS) {
+ if (naptr_head) {
+ ares_free_data(naptr_head);
}
-
- /* everything looks fine, return the data */
- *naptr_out = naptr_head;
-
- return ARES_SUCCESS;
+ } else {
+ /* everything looks fine, return the data */
+ *naptr_out = naptr_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c
index 28083d44c1..18fda82f41 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_ns_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -25,11 +24,6 @@
* SPDX-License-Identifier: MIT
*/
-/*
- * 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
@@ -42,148 +36,122 @@
# include <arpa/inet.h>
#endif
-#include "ares_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_private.h"
-int ares_parse_ns_reply( const unsigned char* abuf, int alen,
- struct hostent** host )
+int ares_parse_ns_reply(const unsigned char *abuf, int alen_int,
+ 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. */
+ ares_status_t status;
+ size_t alen;
+ size_t nscount = 0;
+ struct hostent *hostent = NULL;
+ const char *hostname = NULL;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
+ size_t ancount;
+
*host = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if ( alen < HFIXEDSZ )
+ if (alen_int < 0) {
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;
+ alen = (size_t)alen_int;
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares__expand_name_for_response( aptr, abuf, alen, &hostname, &len, 0);
- if ( status != ARES_SUCCESS )
- return status;
- if ( aptr + len + QFIXEDSZ > abuf + alen )
- {
- ares_free( hostname );
- return ARES_EBADRESP;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ if (ancount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ /* Response structure */
+ hostent = ares_malloc(sizeof(*hostent));
+ if (hostent == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ memset(hostent, 0, sizeof(*hostent));
+
+ hostent->h_addr_list = ares_malloc(sizeof(*hostent->h_addr_list));
+ if (hostent->h_addr_list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ hostent->h_addr_list[0] = NULL;
+ hostent->h_addrtype = AF_INET;
+ hostent->h_length = sizeof(struct in_addr);
+
+ /* Fill in hostname */
+ status = ares_dns_record_query_get(dnsrec, 0, &hostname, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ hostent->h_name = ares_strdup(hostname);
+ if (hostent->h_name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- 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;
+
+ /* Preallocate the maximum number + 1 */
+ hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases));
+ if (hostent->h_aliases == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- nameservers_num = 0;
-
- /* Examine each answer resource record (RR) in turn. */
- for ( i = 0; i < ( int ) ancount; i++ )
- {
- /* Decode the RR up to the data field. */
- status = ares__expand_name_for_response( aptr, abuf, alen, &rr_name, &len, 0);
- if ( status != ARES_SUCCESS )
- break;
- aptr += len;
- if ( aptr + RRFIXEDSZ > abuf + alen )
- {
+ memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases));
+
+ for (i = 0; i < ancount; i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
status = ARES_EBADRESP;
- ares_free(rr_name);
- break;
- }
- rr_type = DNS_RR_TYPE( aptr );
- rr_class = DNS_RR_CLASS( aptr );
- rr_len = DNS_RR_LEN( aptr );
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- break;
- }
-
- if ( rr_class == C_IN && rr_type == T_NS )
- {
- /* Decode the RR data and add it to the nameservers list */
- status = ares__expand_name_for_response( aptr, abuf, alen, &rr_data,
- &len, 1);
- if ( status != ARES_SUCCESS )
- {
- ares_free(rr_name);
- break;
- }
-
- nameservers[nameservers_num] = ares_malloc(strlen(rr_data)+1);
-
- if (nameservers[nameservers_num]==NULL)
- {
- ares_free(rr_name);
- ares_free(rr_data);
- status=ARES_ENOMEM;
- break;
- }
- strcpy(nameservers[nameservers_num],rr_data);
- ares_free(rr_data);
-
- nameservers_num++;
+ goto done;
}
- ares_free( rr_name );
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_NS) {
+ continue;
+ }
- aptr += rr_len;
- if ( aptr > abuf + alen )
- { /* LCOV_EXCL_START: already checked above */
+ hostname = ares_dns_rr_get_str(rr, ARES_RR_NS_NSDNAME);
+ if (hostname == NULL) {
status = ARES_EBADRESP;
- break;
- } /* LCOV_EXCL_STOP */
+ goto done;
+ }
+
+ hostent->h_aliases[nscount] = ares_strdup(hostname);
+ if (hostent->h_aliases[nscount] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ nscount++;
}
- if ( status == ARES_SUCCESS && nameservers_num == 0 )
- {
+ if (nscount == 0) {
status = ARES_ENODATA;
+ } else {
+ status = ARES_SUCCESS;
}
- 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 );
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_free_hostent(hostent);
+ /* Compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
}
- status = ARES_ENOMEM;
+ } else {
+ *host = hostent;
}
- for ( i = 0; i < nameservers_num; i++ )
- ares_free( nameservers[i] );
- ares_free( nameservers );
- ares_free( hostname );
- return status;
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c
index 0606d35f1e..6ee20f722e 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_ptr_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -34,206 +33,183 @@
# include <netdb.h>
#endif
-#include "ares_nameser.h"
-
-#ifdef HAVE_STRINGS_H
-# include <strings.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)
+ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec,
+ const void *addr, int addrlen,
+ int family, struct hostent **host)
{
- unsigned int qdcount, ancount;
- int status, i, rr_type, rr_class, rr_len;
- long len;
- const unsigned char *aptr;
- char *ptrname, *hostname, *rr_name, *rr_data;
- struct hostent *hostent = NULL;
- int aliascnt = 0;
- int alias_alloc = 8;
- char ** aliases;
- size_t rr_data_len;
-
- /* Set *host to NULL for all failure cases. */
+ ares_status_t status;
+ size_t ptrcount = 0;
+ struct hostent *hostent = NULL;
+ const char *hostname = NULL;
+ const char *ptrname = NULL;
+ size_t i;
+ size_t ancount;
+
*host = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
+ /* Fetch name from query as we will use it to compare later on. Old code
+ * did this check, so we'll retain it. */
+ status = ares_dns_record_query_get(dnsrec, 0, &ptrname, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* 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;
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ if (ancount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ /* Response structure */
+ hostent = ares_malloc(sizeof(*hostent));
+ if (hostent == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ memset(hostent, 0, sizeof(*hostent));
+
+ hostent->h_addr_list = ares_malloc(2 * sizeof(*hostent->h_addr_list));
+ if (hostent->h_addr_list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memset(hostent->h_addr_list, 0, 2 * sizeof(*hostent->h_addr_list));
+ if (addr != NULL && addrlen > 0) {
+ hostent->h_addr_list[0] = ares_malloc((size_t)addrlen);
+ if (hostent->h_addr_list[0] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memcpy(hostent->h_addr_list[0], addr, (size_t)addrlen);
+ }
+ hostent->h_addrtype = (HOSTENT_ADDRTYPE_TYPE)family;
+ hostent->h_length = (HOSTENT_LENGTH_TYPE)addrlen;
+
+ /* Preallocate the maximum number + 1 */
+ hostent->h_aliases = ares_malloc((ancount + 1) * sizeof(*hostent->h_aliases));
+ if (hostent->h_aliases == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memset(hostent->h_aliases, 0, (ancount + 1) * sizeof(*hostent->h_aliases));
+
+
+ /* Cycle through answers */
+ for (i = 0; i < ancount; i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get_const(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares__expand_name_for_response(aptr, abuf, alen, &ptrname, &len, 0);
- if (status != ARES_SUCCESS)
- return status;
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free(ptrname);
- return ARES_EBADRESP;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN) {
+ continue;
}
- 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;
+
+ /* Any time we see a CNAME, replace our ptrname with its value */
+ if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_CNAME) {
+ ptrname = ares_dns_rr_get_str(rr, ARES_RR_CNAME_CNAME);
+ if (ptrname == NULL) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
}
- for (i = 0; i < (int)ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len, 0);
- if (status != ARES_SUCCESS)
- break;
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE(aptr);
- rr_class = DNS_RR_CLASS(aptr);
- rr_len = DNS_RR_LEN(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- break;
- }
-
- if (rr_class == C_IN && rr_type == T_PTR
- && strcasecmp(rr_name, ptrname) == 0)
- {
- /* Decode the RR data and set hostname to it. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
- &len, 1);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- break;
- }
- if (hostname)
- ares_free(hostname);
- hostname = rr_data;
- rr_data_len = strlen(rr_data)+1;
- aliases[aliascnt] = ares_malloc(rr_data_len * sizeof(char));
- if (!aliases[aliascnt])
- {
- ares_free(rr_name);
- status = ARES_ENOMEM;
- break;
- }
- strncpy(aliases[aliascnt], rr_data, rr_data_len);
- aliascnt++;
- if (aliascnt >= alias_alloc) {
- char **ptr;
- alias_alloc *= 2;
- ptr = ares_realloc(aliases, alias_alloc * sizeof(char *));
- if(!ptr) {
- ares_free(rr_name);
- status = ARES_ENOMEM;
- break;
- }
- aliases = ptr;
- }
- }
-
- if (rr_class == C_IN && rr_type == T_CNAME)
- {
- /* Decode the RR data and replace ptrname with it. */
- status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
- &len, 1);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- break;
- }
- ares_free(ptrname);
- ptrname = rr_data;
- }
-
- ares_free(rr_name);
- aptr += rr_len;
- if (aptr > abuf + alen)
- { /* LCOV_EXCL_START: already checked above */
- status = ARES_EBADRESP;
- break;
- } /* LCOV_EXCL_STOP */
+
+ /* Handling for PTR records below this, otherwise skip */
+ if (ares_dns_rr_get_type(rr) != ARES_REC_TYPE_PTR) {
+ continue;
}
- if (status == ARES_SUCCESS && !hostname)
- status = ARES_ENODATA;
- if (status == ARES_SUCCESS)
- {
- /* If we don't reach the end, we must have failed due to out of memory */
- status = ARES_ENOMEM;
+ /* Issue #683
+ * Old code compared the name in the rr to the ptrname, but I think this
+ * is wrong since it was proven wrong for A & AAAA records. Leaving
+ * this code commented out for future reference
+ *
+ * rname = ares_dns_rr_get_name(rr);
+ * if (rname == NULL) {
+ * status = ARES_EBADRESP;
+ * goto done;
+ * }
+ * if (strcasecmp(ptrname, rname) != 0) {
+ * continue;
+ * }
+ */
+
+ /* Save most recent PTR record as the hostname */
+ hostname = ares_dns_rr_get_str(rr, ARES_RR_PTR_DNAME);
+ if (hostname == NULL) {
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* We got our answer. Allocate memory to build the host entry. */
- hostent = ares_malloc(sizeof(*hostent));
- if (!hostent)
- goto fail;
+ /* Append as an alias */
+ hostent->h_aliases[ptrcount] = ares_strdup(hostname);
+ if (hostent->h_aliases[ptrcount] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ ptrcount++;
+ }
- /* If we don't memset here, cleanups may fail */
- memset(hostent, 0, sizeof(*hostent));
+ if (ptrcount == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ } else {
+ status = ARES_SUCCESS;
+ }
+
+ /* Fill in hostname */
+ hostent->h_name = ares_strdup(hostname);
+ if (hostent->h_name == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares_free_hostent(hostent);
+ /* Compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ } else {
+ *host = hostent;
+ }
+ return status;
+}
- hostent->h_addr_list = ares_malloc(2 * sizeof(char *));
- if (!hostent->h_addr_list)
- goto fail;
+int ares_parse_ptr_reply(const unsigned char *abuf, int alen_int,
+ const void *addr, int addrlen, int family,
+ struct hostent **host)
+{
+ size_t alen;
+ ares_dns_record_t *dnsrec = NULL;
+ ares_status_t status;
+ if (alen_int < 0) {
+ return ARES_EBADRESP;
+ }
- if (addr && addrlen) {
- hostent->h_addr_list[0] = ares_malloc(addrlen);
- if (!hostent->h_addr_list[0])
- goto fail;
- } else {
- hostent->h_addr_list[0] = NULL;
- }
+ alen = (size_t)alen_int;
- hostent->h_aliases = ares_malloc((aliascnt+1) * sizeof (char *));
- if (!hostent->h_aliases)
- goto fail;
-
- /* Fill in the hostent and return successfully. */
- hostent->h_name = hostname;
- for (i=0 ; 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);
- if (addr && addrlen)
- memcpy(hostent->h_addr_list[0], addr, addrlen);
- hostent->h_addr_list[1] = NULL;
- *host = hostent;
- ares_free(aliases);
- ares_free(ptrname);
-
- return ARES_SUCCESS;
- }
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
-fail:
- ares_free_hostent(hostent);
+ status = ares_parse_ptr_reply_dnsrec(dnsrec, addr, addrlen, family, host);
- 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;
+done:
+ ares_dns_record_destroy(dnsrec);
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c
index f37ba19173..2777dbcb0b 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_soa_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2012 Marko Kreen
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,164 +25,93 @@
*/
#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_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_soa_reply(const unsigned char *abuf, int alen,
- struct ares_soa_reply **soa_out)
+int ares_parse_soa_reply(const unsigned char *abuf, int alen_int,
+ 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;
+ ares_status_t status;
+ size_t alen;
+ struct ares_soa_reply *soa = NULL;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- if (alen < HFIXEDSZ)
- return ARES_EBADRESP;
-
- /* parse message header */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
+ *soa_out = NULL;
- if (qdcount != 1)
- return ARES_EBADRESP;
- if (ancount == 0)
+ if (alen_int < 0) {
return ARES_EBADRESP;
+ }
- aptr = abuf + HFIXEDSZ;
-
- /* query name */
- status = ares__expand_name_for_response(aptr, abuf, alen, &qname, &len, 0);
- if (status != ARES_SUCCESS)
- goto failed_stat;
-
- if (alen <= len + HFIXEDSZ + 1)
- goto failed;
- aptr += len;
-
- qclass = DNS_QUESTION_TYPE(aptr);
+ alen = (size_t)alen_int;
- /* skip qtype & qclass */
- if (aptr + QFIXEDSZ > abuf + alen)
- goto failed;
- aptr += QFIXEDSZ;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
- /* qclass of SOA with multiple answers */
- if (qclass == T_SOA && ancount > 1)
- goto failed;
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_EBADRESP; /* ENODATA might make more sense */
+ goto done;
+ }
- /* examine all the records, break and return if found soa */
- for (i = 0; i < ancount; i++)
- {
- rr_name = NULL;
- status = ares__expand_name_for_response (aptr, abuf, alen, &rr_name, &len, 0);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- goto failed_stat;
- }
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
- aptr += len;
- if ( aptr + RRFIXEDSZ > abuf + alen )
- {
- ares_free(rr_name);
+ if (rr == NULL) {
+ /* Shouldn't be possible */
status = ARES_EBADRESP;
- goto failed_stat;
+ goto done;
}
- rr_type = DNS_RR_TYPE( aptr );
- rr_class = DNS_RR_CLASS( aptr );
- rr_len = DNS_RR_LEN( aptr );
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- ares_free(rr_name);
- status = ARES_EBADRESP;
- goto failed_stat;
- }
- if ( rr_class == C_IN && rr_type == T_SOA )
- {
- /* allocate result struct */
- soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY);
- if (!soa)
- {
- ares_free(rr_name);
- status = ARES_ENOMEM;
- goto failed_stat;
- }
- /* nsname */
- status = ares__expand_name_for_response(aptr, abuf, alen, &soa->nsname,
- &len, 0);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- goto failed_stat;
- }
- aptr += len;
-
- /* hostmaster */
- status = ares__expand_name_for_response(aptr, abuf, alen,
- &soa->hostmaster, &len, 0);
- if (status != ARES_SUCCESS)
- {
- ares_free(rr_name);
- goto failed_stat;
- }
- aptr += len;
-
- /* integer fields */
- if (aptr + 5 * 4 > abuf + alen)
- {
- ares_free(rr_name);
- goto failed;
- }
- soa->serial = DNS__32BIT(aptr + 0 * 4);
- soa->refresh = DNS__32BIT(aptr + 1 * 4);
- soa->retry = DNS__32BIT(aptr + 2 * 4);
- soa->expire = DNS__32BIT(aptr + 3 * 4);
- soa->minttl = DNS__32BIT(aptr + 4 * 4);
-
- ares_free(qname);
- ares_free(rr_name);
-
- *soa_out = soa;
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_SOA) {
+ continue;
+ }
- return ARES_SUCCESS;
+ /* allocate result struct */
+ soa = ares_malloc_data(ARES_DATATYPE_SOA_REPLY);
+ if (soa == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- aptr += rr_len;
- ares_free(rr_name);
+ soa->serial = ares_dns_rr_get_u32(rr, ARES_RR_SOA_SERIAL);
+ soa->refresh = ares_dns_rr_get_u32(rr, ARES_RR_SOA_REFRESH);
+ soa->retry = ares_dns_rr_get_u32(rr, ARES_RR_SOA_RETRY);
+ soa->expire = ares_dns_rr_get_u32(rr, ARES_RR_SOA_EXPIRE);
+ soa->minttl = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM);
+ soa->nsname = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_MNAME));
+ if (soa->nsname == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ soa->hostmaster = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SOA_RNAME));
+ if (soa->hostmaster == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ break;
+ }
- if (aptr > abuf + alen)
- goto failed_stat;
+ if (soa == NULL) {
+ status = ARES_EBADRESP;
}
- /* no SOA record found */
- status = ARES_EBADRESP;
- goto failed_stat;
-failed:
- status = ARES_EBADRESP;
-failed_stat:
- if (soa)
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
ares_free_data(soa);
- if (qname)
- ares_free(qname);
- return status;
+ /* Compatibility */
+ if (status == ARES_EBADNAME) {
+ status = ARES_EBADRESP;
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *soa_out = soa;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c
index 0125092c02..f27bcce733 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_srv_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,153 +25,92 @@
*/
#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_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-int
-ares_parse_srv_reply (const unsigned char *abuf, int alen,
- struct ares_srv_reply **srv_out)
+int ares_parse_srv_reply(const unsigned char *abuf, int alen_int,
+ struct ares_srv_reply **srv_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_srv_reply *srv_head = NULL;
struct ares_srv_reply *srv_last = NULL;
struct ares_srv_reply *srv_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* 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)
+ if (alen_int < 0) {
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;
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a SRV record */
- if (rr_class == C_IN && rr_type == T_SRV)
- {
- /* parse the SRV record itself */
- if (rr_len < 6)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Allocate storage for this SRV answer appending it to the list */
- srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY);
- if (!srv_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (srv_last)
- {
- srv_last->next = srv_curr;
- }
- else
- {
- srv_head = srv_curr;
- }
- srv_last = srv_curr;
-
- vptr = aptr;
- srv_curr->priority = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- srv_curr->weight = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- srv_curr->port = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
-
- status = ares_expand_name (vptr, abuf, alen, &srv_curr->host, &len);
- if (status != ARES_SUCCESS)
- break;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ if (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_SRV) {
+ continue;
}
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
+ /* Allocate storage for this SRV answer appending it to the list */
+ srv_curr = ares_malloc_data(ARES_DATATYPE_SRV_REPLY);
+ if (srv_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (srv_head)
- ares_free_data (srv_head);
- return status;
+ /* Link in the record */
+ if (srv_last) {
+ srv_last->next = srv_curr;
+ } else {
+ srv_head = srv_curr;
}
+ srv_last = srv_curr;
+
+
+ srv_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_SRV_PRIORITY);
+ srv_curr->weight = ares_dns_rr_get_u16(rr, ARES_RR_SRV_WEIGHT);
+ srv_curr->port = ares_dns_rr_get_u16(rr, ARES_RR_SRV_PORT);
- /* everything looks fine, return the data */
- *srv_out = srv_head;
+ srv_curr->host = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_SRV_TARGET));
- return ARES_SUCCESS;
+ if (srv_curr->host == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (srv_head) {
+ ares_free_data(srv_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *srv_out = srv_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c
index 083cbf4dff..85c3644b8c 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_txt_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,199 +25,113 @@
*/
#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_nameser.h"
-
-#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)
+static int ares__parse_txt_reply(const unsigned char *abuf, size_t alen,
+ ares_bool_t ex, void **txt_out)
{
- size_t substr_len;
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr;
- const unsigned char *strptr;
- int status, rr_type, rr_class, rr_len;
- long len;
- char *hostname = NULL, *rr_name = NULL;
+ ares_status_t status;
struct ares_txt_ext *txt_head = NULL;
struct ares_txt_ext *txt_last = NULL;
struct ares_txt_ext *txt_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* 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;
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
+ }
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+ const unsigned char *ptr;
+ size_t ptr_len;
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
+ }
- /* 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;
+ /* XXX: Why Chaos? */
+ if ((ares_dns_rr_get_class(rr) != ARES_CLASS_IN &&
+ ares_dns_rr_get_class(rr) != ARES_CLASS_CHAOS) ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_TXT) {
+ continue;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a TXT record */
- if ((rr_class == C_IN || rr_class == C_CHAOS) && rr_type == T_TXT)
- {
- /*
- * There may be multiple substrings in a single TXT record. Each
- * substring may be up to 255 characters in length, with a
- * "length byte" indicating the size of the substring payload.
- * RDATA contains both the length-bytes and payloads of all
- * substrings contained therein.
- */
-
- strptr = aptr;
- while (strptr < (aptr + rr_len))
- {
- substr_len = (unsigned char)*strptr;
- if (strptr + substr_len + 1 > aptr + rr_len)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Allocate storage for this TXT answer appending it to the list */
- txt_curr = ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT :
- ARES_DATATYPE_TXT_REPLY);
- if (!txt_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (txt_last)
- {
- txt_last->next = txt_curr;
- }
- else
- {
- txt_head = txt_curr;
- }
- txt_last = txt_curr;
-
- if (ex)
- txt_curr->record_start = (strptr == aptr);
- txt_curr->length = substr_len;
- txt_curr->txt = ares_malloc (substr_len + 1/* Including null byte */);
- if (txt_curr->txt == NULL)
- {
- status = ARES_ENOMEM;
- break;
- }
-
- ++strptr;
- memcpy ((char *) txt_curr->txt, strptr, substr_len);
-
- /* Make sure we NULL-terminate */
- txt_curr->txt[substr_len] = 0;
-
- strptr += substr_len;
- }
- }
-
- /* Propagate any failures */
- if (status != ARES_SUCCESS)
- {
- break;
- }
-
- /* Don't lose memory in the next iteration */
- ares_free (rr_name);
- rr_name = NULL;
-
- /* Move on to the next record */
- aptr += rr_len;
+
+ /* Allocate storage for this TXT answer appending it to the list */
+ txt_curr =
+ ares_malloc_data(ex ? ARES_DATATYPE_TXT_EXT : ARES_DATATYPE_TXT_REPLY);
+ if (txt_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- if (hostname)
- ares_free (hostname);
- if (rr_name)
- ares_free (rr_name);
+ /* Link in the record */
+ if (txt_last) {
+ txt_last->next = txt_curr;
+ } else {
+ txt_head = txt_curr;
+ }
+ txt_last = txt_curr;
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (txt_head)
- ares_free_data (txt_head);
- return status;
+ /* These days, records are joined, always tag as start */
+ if (ex) {
+ txt_curr->record_start = 1;
}
- /* everything looks fine, return the data */
- *txt_out = txt_head;
+ ptr = ares_dns_rr_get_bin(rr, ARES_RR_TXT_DATA, &ptr_len);
+
+ txt_curr->txt = ares_malloc(ptr_len + 1);
+ if (txt_curr->txt == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ memcpy(txt_curr->txt, ptr, ptr_len);
+ txt_curr->txt[ptr_len] = 0;
+ txt_curr->length = ptr_len;
+ }
- return ARES_SUCCESS;
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (txt_head) {
+ ares_free_data(txt_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *txt_out = txt_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
-int
-ares_parse_txt_reply (const unsigned char *abuf, int alen,
- struct ares_txt_reply **txt_out)
+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);
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+ return ares__parse_txt_reply(abuf, (size_t)alen, ARES_FALSE,
+ (void **)txt_out);
}
-
-int
-ares_parse_txt_reply_ext (const unsigned char *abuf, int alen,
- struct ares_txt_ext **txt_out)
+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);
+ if (alen < 0) {
+ return ARES_EBADRESP;
+ }
+ return ares__parse_txt_reply(abuf, (size_t)alen, ARES_TRUE, (void **)txt_out);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c b/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c
index d5bb7ee45d..bff7023f78 100644
--- a/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c
+++ b/contrib/libs/c-ares/src/lib/ares_parse_uri_reply.c
@@ -1,7 +1,6 @@
/* MIT License
*
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) 2009 Jakub Hrozek
+ * Copyright (c) 2023 Brad House
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -26,166 +25,91 @@
*/
#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_nameser.h"
-
#include "ares.h"
-#include "ares_dns.h"
#include "ares_data.h"
#include "ares_private.h"
-/* AIX portability check */
-#ifndef T_URI
-# define T_URI 256 /* uri selection */
-#endif
-
-int
-ares_parse_uri_reply (const unsigned char *abuf, int alen,
- struct ares_uri_reply **uri_out)
+int ares_parse_uri_reply(const unsigned char *abuf, int alen_int,
+ struct ares_uri_reply **uri_out)
{
- unsigned int qdcount, ancount, i;
- const unsigned char *aptr, *vptr;
- int status, rr_type, rr_class, rr_len, rr_ttl;
- long len;
- char *uri_str = NULL, *rr_name = NULL;
+ ares_status_t status;
+ size_t alen;
struct ares_uri_reply *uri_head = NULL;
struct ares_uri_reply *uri_last = NULL;
struct ares_uri_reply *uri_curr;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t i;
- /* Set *uri_out to NULL for all failure cases. */
*uri_out = NULL;
- /* Give up if abuf doesn't have room for a header. */
- if (alen < HFIXEDSZ){
- return ARES_EBADRESP;
+ if (alen_int < 0) {
+ 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;
+ alen = (size_t)alen_int;
+
+ status = ares_dns_parse(abuf, alen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- /* Expand the name from the question, and skip past the question. */
- aptr = abuf + HFIXEDSZ;
- status = ares_expand_name (aptr, abuf, alen, &uri_str, &len);
- if (status != ARES_SUCCESS){
- return status;
+ if (ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER) == 0) {
+ status = ARES_ENODATA;
+ goto done;
}
- if (aptr + len + QFIXEDSZ > abuf + alen)
- {
- ares_free (uri_str);
- return ARES_EBADRESP;
+
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_ANSWER, i);
+
+ if (rr == NULL) {
+ /* Shouldn't be possible */
+ status = ARES_EBADRESP;
+ goto done;
}
- aptr += len + QFIXEDSZ;
-
- /* Examine each answer resource record (RR) in turn. */
- for (i = 0; i < ancount; i++)
- {
- /* Decode the RR up to the data field. */
- status = ares_expand_name (aptr, abuf, alen, &rr_name, &len);
- if (status != ARES_SUCCESS)
- {
- break;
- }
- aptr += len;
- if (aptr + RRFIXEDSZ > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- rr_type = DNS_RR_TYPE (aptr);
- rr_class = DNS_RR_CLASS (aptr);
- rr_ttl = DNS_RR_TTL(aptr);
- rr_len = DNS_RR_LEN (aptr);
- aptr += RRFIXEDSZ;
-
- if (aptr + rr_len > abuf + alen)
- {
- status = ARES_EBADRESP;
- break;
- }
-
- /* Check if we are really looking at a URI record */
- if (rr_class == C_IN && rr_type == T_URI)
- {
- /* parse the URI record itself */
- if (rr_len < 5)
- {
- status = ARES_EBADRESP;
- break;
- }
- /* Allocate storage for this URI answer appending it to the list */
- uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY);
- if (!uri_curr)
- {
- status = ARES_ENOMEM;
- break;
- }
- if (uri_last)
- {
- uri_last->next = uri_curr;
- }
- else
- {
- uri_head = uri_curr;
- }
- uri_last = uri_curr;
-
- vptr = aptr;
- uri_curr->priority = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- uri_curr->weight = DNS__16BIT(vptr);
- vptr += sizeof(unsigned short);
- uri_curr->uri = (char *)ares_malloc(rr_len-3);
- if (!uri_curr->uri)
- {
- status = ARES_ENOMEM;
- break;
- }
- uri_curr->uri = strncpy(uri_curr->uri, (const char *)vptr, rr_len-4);
- uri_curr->uri[rr_len-4]='\0';
- uri_curr->ttl = rr_ttl;
- }
-
- /* 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 (ares_dns_rr_get_class(rr) != ARES_CLASS_IN ||
+ ares_dns_rr_get_type(rr) != ARES_REC_TYPE_URI) {
+ continue;
}
- if (uri_str)
- ares_free (uri_str);
- if (rr_name)
- ares_free (rr_name);
+ /* Allocate storage for this URI answer appending it to the list */
+ uri_curr = ares_malloc_data(ARES_DATATYPE_URI_REPLY);
+ if (uri_curr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
- /* clean up on error */
- if (status != ARES_SUCCESS)
- {
- if (uri_head)
- ares_free_data (uri_head);
- return status;
+ /* Link in the record */
+ if (uri_last) {
+ uri_last->next = uri_curr;
+ } else {
+ uri_head = uri_curr;
}
+ uri_last = uri_curr;
+
- /* everything looks fine, return the data */
- *uri_out = uri_head;
+ uri_curr->priority = ares_dns_rr_get_u16(rr, ARES_RR_URI_PRIORITY);
+ uri_curr->weight = ares_dns_rr_get_u16(rr, ARES_RR_URI_WEIGHT);
+ uri_curr->uri = ares_strdup(ares_dns_rr_get_str(rr, ARES_RR_URI_TARGET));
+ uri_curr->ttl = (int)ares_dns_rr_get_ttl(rr);
- return ARES_SUCCESS;
+ if (uri_curr->uri == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+
+done:
+ /* clean up on error */
+ if (status != ARES_SUCCESS) {
+ if (uri_head) {
+ ares_free_data(uri_head);
+ }
+ } else {
+ /* everything looks fine, return the data */
+ *uri_out = uri_head;
+ }
+ ares_dns_record_destroy(dnsrec);
+ return (int)status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_platform.c b/contrib/libs/c-ares/src/lib/ares_platform.c
index 6fcbd49bb8..0727ae001c 100644
--- a/contrib/libs/c-ares/src/lib/ares_platform.c
+++ b/contrib/libs/c-ares/src/lib/ares_platform.c
@@ -29,15 +29,14 @@
#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
+# 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)
{
@@ -45,38 +44,38 @@ win_platform ares__getplatform(void)
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(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
+ }
+# ifdef _MSC_VER
+# pragma warning(pop)
+# endif
- switch(OsvEx.dwPlatformId)
- {
- case V_PLATFORM_WIN32s:
- return WIN_3X;
+ switch (OsvEx.dwPlatformId) {
+ case V_PLATFORM_WIN32s:
+ return WIN_3X;
- case V_PLATFORM_WIN32_WINDOWS:
- return WIN_9X;
+ case V_PLATFORM_WIN32_WINDOWS:
+ return WIN_9X;
- case V_PLATFORM_WIN32_NT:
- return WIN_NT;
+ case V_PLATFORM_WIN32_NT:
+ return WIN_NT;
- case V_PLATFORM_WIN32_CE:
- return WIN_CE;
+ case V_PLATFORM_WIN32_CE:
+ return WIN_CE;
- default:
- return WIN_UNKNOWN;
- }
+ default:
+ return WIN_UNKNOWN;
+ }
}
#endif /* WIN32 && ! MSDOS */
@@ -84,16 +83,16 @@ win_platform ares__getplatform(void)
#if defined(_WIN32_WCE)
/* IANA Well Known Ports are in range 0-1023 */
-#define USE_IANA_WELL_KNOWN_PORTS 1
+# define USE_IANA_WELL_KNOWN_PORTS 1
/* IANA Registered Ports are in range 1024-49151 */
-#define USE_IANA_REGISTERED_PORTS 1
+# define USE_IANA_REGISTERED_PORTS 1
struct pvt_servent {
- char *s_name;
- char **s_aliases;
- unsigned short s_port;
- char *s_proto;
+ char *s_name;
+ char **s_aliases;
+ unsigned short s_port;
+ char *s_proto;
};
/*
@@ -101,10948 +100,10948 @@ struct pvt_servent {
*/
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 }
+# 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;
+ const char *protocol = NULL;
+ int error = 0;
+ size_t i;
u_port = ntohs((unsigned short)port);
- if (proto)
- {
- switch (strlen(proto)) {
+ if (proto) {
+ switch (ares_strlen(proto)) {
case 3:
- if (!strncasecmp(proto, "tcp", 3))
+ if (!strncasecmp(proto, "tcp", 3)) {
protocol = "tcp";
- else if (!strncasecmp(proto, "udp", 3))
+ } else if (!strncasecmp(proto, "udp", 3)) {
protocol = "udp";
- else
+ } else {
error = WSAEFAULT;
+ }
break;
case 4:
- if (!strncasecmp(proto, "sctp", 4))
+ if (!strncasecmp(proto, "sctp", 4)) {
protocol = "sctp";
- else if (!strncasecmp(proto, "dccp", 4))
+ } else if (!strncasecmp(proto, "dccp", 4)) {
protocol = "dccp";
- else
+ } 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];
- }
+ 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;
+ }
}
+ error = WSANO_DATA;
+ }
SET_SOCKERRNO(error);
return NULL;
diff --git a/contrib/libs/c-ares/src/lib/ares_private.h b/contrib/libs/c-ares/src/lib/ares_private.h
index 2c30959e89..8d6e8ba77b 100644
--- a/contrib/libs/c-ares/src/lib/ares_private.h
+++ b/contrib/libs/c-ares/src/lib/ares_private.h
@@ -32,79 +32,75 @@
*/
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-#define WIN32
+# define WIN32
#endif
#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
+# include <netinet/in.h>
#endif
#ifdef WATT32
-#include <tcp.h>
-#include <sys/ioctl.h>
+# include <tcp.h>
+# include <sys/ioctl.h>
#endif
-#define DEFAULT_TIMEOUT 2000 /* milliseconds */
-#define DEFAULT_TRIES 3
+#define DEFAULT_TIMEOUT 2000 /* milliseconds */
+#define DEFAULT_TRIES 3
#ifndef INADDR_NONE
-#define INADDR_NONE 0xffffffff
-#endif
-
-#ifdef CARES_EXPOSE_STATICS
-/* Make some internal functions visible for testing */
-#define STATIC_TESTABLE
-#else
-#define STATIC_TESTABLE static
+# 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]
+ * warning: cast from 'const struct sockaddr *' to 'const struct sockaddr_in6 *'
+ * increases required alignment from 1 to 4 [-Wcast-align]
*/
#define CARES_INADDR_CAST(type, var) ((type)((void *)var))
#if defined(WIN32) && !defined(WATT32)
-#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
-#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
-#define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient"
-#define WIN_NT_DNSCLIENT "Software\\Policies\\Microsoft\\Windows NT\\DNSClient"
-#define NAMESERVER "NameServer"
-#define DHCPNAMESERVER "DhcpNameServer"
-#define DATABASEPATH "DatabasePath"
-#define WIN_PATH_HOSTS "\\hosts"
-#define SEARCHLIST_KEY "SearchList"
-#define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix"
-#define INTERFACES_KEY "Interfaces"
-#define DOMAIN_KEY "Domain"
-#define DHCPDOMAIN_KEY "DhcpDomain"
-
+# define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
+# define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
+# define WIN_DNSCLIENT "Software\\Policies\\Microsoft\\System\\DNSClient"
+# define WIN_NT_DNSCLIENT \
+ "Software\\Policies\\Microsoft\\Windows NT\\DNSClient"
+# define NAMESERVER "NameServer"
+# define DHCPNAMESERVER "DhcpNameServer"
+# define DATABASEPATH "DatabasePath"
+# define WIN_PATH_HOSTS "\\hosts"
+# define SEARCHLIST_KEY "SearchList"
+# define PRIMARYDNSSUFFIX_KEY "PrimaryDNSSuffix"
+# define INTERFACES_KEY "Interfaces"
+# define DOMAIN_KEY "Domain"
+# define DHCPDOMAIN_KEY "DhcpDomain"
+# define PATH_RESOLV_CONF ""
#elif defined(WATT32)
-#define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf"
-W32_FUNC const char *_w32_GetHostsFile (void);
+# define PATH_RESOLV_CONF "/dev/ENV/etc/resolv.conf"
+W32_FUNC const char *_w32_GetHostsFile(void);
#elif defined(NETWARE)
-#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
-#define PATH_HOSTS "sys:/etc/hosts"
+# define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
+# define PATH_HOSTS "sys:/etc/hosts"
#elif defined(__riscos__)
-#define PATH_HOSTS "InetDBase:Hosts"
+# define PATH_RESOLV_CONF ""
+# define PATH_HOSTS "InetDBase:Hosts"
#elif defined(__HAIKU__)
-#define PATH_RESOLV_CONF "/system/settings/network/resolv.conf"
-#define PATH_HOSTS "/system/settings/network/hosts"
+# define PATH_RESOLV_CONF "/system/settings/network/resolv.conf"
+# define PATH_HOSTS "/system/settings/network/hosts"
#else
-#define PATH_RESOLV_CONF "/etc/resolv.conf"
-#ifdef ETC_INET
-#define PATH_HOSTS "/etc/inet/hosts"
-#else
-#define PATH_HOSTS "/etc/hosts"
-#endif
+# define PATH_RESOLV_CONF "/etc/resolv.conf"
+# ifdef ETC_INET
+# define PATH_HOSTS "/etc/inet/hosts"
+# else
+# define PATH_HOSTS "/etc/hosts"
+# endif
#endif
@@ -115,46 +111,46 @@ typedef struct ares_rand_state ares_rand_state;
#include "ares__llist.h"
#include "ares__slist.h"
-#include "ares__htable_stvp.h"
+#include "ares__htable_strvp.h"
+#include "ares__htable_szvp.h"
#include "ares__htable_asvp.h"
#include "ares__buf.h"
+#include "ares_dns_private.h"
+#include "ares__iface_ips.h"
+#include "ares__threads.h"
#ifndef HAVE_GETENV
# include "ares_getenv.h"
# define getenv(ptr) ares_getenv(ptr)
#endif
-#include "ares_strdup.h"
+#include "ares_str.h"
#include "ares_strsplit.h"
#ifndef HAVE_STRCASECMP
# include "ares_strcasecmp.h"
-# define strcasecmp(p1,p2) ares_strcasecmp(p1,p2)
+# 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)
+# define strncasecmp(p1, p2, n) ares_strncasecmp(p1, p2, n)
#endif
/********* EDNS defines section ******/
-#define EDNSPACKETSZ 1280 /* Reasonable UDP payload size, as suggested
- in RFC2671 */
-#define MAXENDSSZ 4096 /* Maximum (local) limit for edns packet size */
-#define EDNSFIXEDSZ 11 /* Size of EDNS header */
+#define EDNSPACKETSZ \
+ 1232 /* Reasonable UDP payload size, as agreed by operators \
+ https://www.dnsflagday.net/2020/#faq */
+#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
+/* Default values for server failover behavior. We retry failed servers with
+ * a 10% probability and a minimum delay of 5 seconds between retries.
+ */
+#define DEFAULT_SERVER_RETRY_CHANCE 10
+#define DEFAULT_SERVER_RETRY_DELAY 5000
struct query;
@@ -163,7 +159,7 @@ struct server_state;
struct server_connection {
struct server_state *server;
ares_socket_t fd;
- int is_tcp;
+ ares_bool_t is_tcp;
/* total number of queries run on this connection since it was established */
size_t total_queries;
/* list of outstanding queries to this connection */
@@ -171,12 +167,23 @@ struct server_connection {
};
struct server_state {
- size_t idx; /* index for server in ares_channel */
- struct ares_addr addr;
-
+ /* Configuration */
+ size_t idx; /* index for server in system configuration */
+ struct ares_addr addr;
+ unsigned short udp_port; /* host byte order */
+ unsigned short tcp_port; /* host byte order */
+ char ll_iface[64]; /* IPv6 Link Local Interface */
+ unsigned int ll_scope; /* IPv6 Link Local Scope */
+
+ size_t consec_failures; /* Consecutive query failure count
+ * can be hard errors or timeouts
+ */
ares__llist_t *connections;
struct server_connection *tcp_conn;
+ /* The next time when we will retry this server if it has hit failures */
+ struct timeval next_retry_time;
+
/* TCP buffer since multiple responses can come back in one read, or partial
* in a read */
ares__buf_t *tcp_parser;
@@ -184,266 +191,468 @@ struct server_state {
/* TCP output queue */
ares__buf_t *tcp_send;
- /* 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;
-
/* Link back to owning channel */
- ares_channel channel;
+ ares_channel_t *channel;
};
/* State to represent a DNS query */
struct query {
/* Query ID from qbuf, for faster lookup, and current timeout */
- unsigned short qid; /* host byte order */
- struct timeval timeout;
- ares_channel channel;
+ unsigned short qid; /* host byte order */
+ struct timeval timeout;
+ ares_channel_t *channel;
/*
* Node object for each list entry the query belongs to in order to
* make removal operations O(1).
*/
- ares__slist_node_t *node_queries_by_timeout;
- ares__llist_node_t *node_queries_to_conn;
- ares__llist_node_t *node_all_queries;
+ ares__slist_node_t *node_queries_by_timeout;
+ ares__llist_node_t *node_queries_to_conn;
+ ares__llist_node_t *node_all_queries;
- /* connection handle for validation purposes */
- const struct server_connection *conn;
+ /* connection handle query is associated with */
+ struct server_connection *conn;
- /* Query buf with length at beginning, for TCP transmission */
- unsigned char *tcpbuf;
- int tcplen;
+ /* Arguments passed to ares_send() */
+ unsigned char *qbuf;
+ size_t qlen;
- /* Arguments passed to ares_send() (qbuf points into tcpbuf) */
- const unsigned char *qbuf;
- int qlen;
- ares_callback callback;
- void *arg;
+ ares_callback_dnsrec 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 */
- int no_retries; /* do not perform any additional retries, this is set when
- * a query is to be canceled */
+ size_t try_count; /* Number of times we tried this query already. */
+ ares_bool_t using_tcp;
+ ares_status_t error_status;
+ size_t timeouts; /* number of timeouts we saw for this request */
+ ares_bool_t no_retries; /* do not perform any additional retries, this is set
+ * when a query is to be canceled */
};
-/* 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? */
+struct apattern {
+ struct ares_addr addr;
+ unsigned char mask;
};
-/* An IP address pattern; matches an IP address X if X & mask == addr */
-#define PATTERN_MASK 0x1
-#define PATTERN_CIDR 0x2
+struct ares__qcache;
+typedef struct ares__qcache ares__qcache_t;
-struct apattern {
- union
- {
- struct in_addr addr4;
- struct ares_in6_addr addr6;
- } addr;
- union
- {
- struct in_addr addr4;
- struct ares_in6_addr addr6;
- unsigned short bits;
- } mask;
- int family;
- unsigned short type;
-};
+struct ares_hosts_file;
+typedef struct ares_hosts_file ares_hosts_file_t;
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;
+ unsigned int flags;
+ size_t timeout; /* in milliseconds */
+ size_t tries;
+ size_t ndots;
+ size_t maxtimeout; /* in milliseconds */
+ ares_bool_t rotate;
+ unsigned short udp_port; /* stored in network order */
+ unsigned short tcp_port; /* stored in network order */
+ int socket_send_buffer_size; /* setsockopt takes int */
+ int socket_receive_buffer_size; /* setsockopt takes int */
+ char **domains;
+ size_t ndomains;
+ struct apattern *sortlist;
+ size_t nsort;
+ char *lookups;
+ size_t ednspsz;
+ unsigned int qcache_max_ttl;
+ ares_evsys_t evsys;
+ unsigned int optmask;
/* For binding to local devices and/or IP addresses. Leave
* them null/zero for no binding.
*/
- char local_dev_name[32];
- unsigned int local_ip4;
- unsigned char local_ip6[16];
+ char local_dev_name[32];
+ unsigned int local_ip4;
+ unsigned char local_ip6[16];
- int optmask; /* the option bitfield passed in at init time */
+ /* Thread safety lock */
+ ares__thread_mutex_t *lock;
- /* Server addresses and communications state */
- struct server_state *servers;
- int nservers;
+ /* Conditional to wake waiters when queue is empty */
+ ares__thread_cond_t *cond_empty;
- /* random state to use when generating new ids */
- ares_rand_state *rand_state;
+ /* Server addresses and communications state. Sorted by least consecutive
+ * failures, followed by the configuration order if failures are equal. */
+ ares__slist_t *servers;
- /* Generation number to use for the next TCP socket open/close */
- int tcp_connection_generation;
-
- /* Last server we sent a query to. */
- int last_server;
+ /* random state to use when generating new ids and generating retry penalties
+ */
+ ares_rand_state *rand_state;
/* All active queries in a single list */
- ares__llist_t *all_queries;
+ ares__llist_t *all_queries;
/* Queries bucketed by qid, for quickly dispatching DNS responses: */
- ares__htable_stvp_t *queries_by_qid;
+ ares__htable_szvp_t *queries_by_qid;
/* Queries bucketed by timeout, for quickly handling timeouts: */
- ares__slist_t *queries_by_timeout;
+ ares__slist_t *queries_by_timeout;
/* Map linked list node member for connection to file descriptor. We use
* the node instead of the connection object itself so we can quickly look
* up a connection and remove it if necessary (as otherwise we'd have to
* scan all connections) */
- ares__htable_asvp_t *connnode_by_socket;
+ ares__htable_asvp_t *connnode_by_socket;
- ares_sock_state_cb sock_state_cb;
- void *sock_state_cb_data;
+ 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_create_callback sock_create_cb;
+ void *sock_create_cb_data;
- ares_sock_config_callback sock_config_cb;
- void *sock_config_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;
+ const struct ares_socket_functions *sock_funcs;
+ void *sock_func_cb_data;
/* Path for resolv.conf file, configurable via ares_options */
- char *resolvconf_path;
+ char *resolvconf_path;
/* Path for hosts file, configurable via ares_options */
- char *hosts_path;
+ char *hosts_path;
/* Maximum UDP queries per connection allowed */
- int udp_max_queries;
+ size_t udp_max_queries;
+
+ /* Cache of local hosts file */
+ ares_hosts_file_t *hf;
+
+ /* Query Cache */
+ ares__qcache_t *qcache;
+
+ /* Fields controlling server failover behavior.
+ * The retry chance is the probability (1/N) by which we will retry a failed
+ * server instead of the best server when selecting a server to send queries
+ * to.
+ * The retry delay is the minimum time in milliseconds to wait between doing
+ * such retries (applied per-server).
+ */
+ unsigned short server_retry_chance;
+ size_t server_retry_delay;
};
/* Does the domain end in ".onion" or ".onion."? Case-insensitive. */
-int ares__is_onion_domain(const char *name);
+ares_bool_t ares__is_onion_domain(const char *name);
/* Memory management functions */
extern void *(*ares_malloc)(size_t size);
extern void *(*ares_realloc)(void *ptr, size_t size);
extern void (*ares_free)(void *ptr);
+void *ares_malloc_zero(size_t size);
+void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size);
/* return true if now is exactly check time or later */
-int ares__timedout(struct timeval *now,
- struct timeval *check);
+ares_bool_t ares__timedout(const struct timeval *now,
+ const struct timeval *check);
/* Returns one of the normal ares status codes like ARES_SUCCESS */
-int ares__send_query(ares_channel channel, struct query *query,
- struct timeval *now);
-
-/* Identical to ares_query, but returns a normal ares return code like
- * ARES_SUCCESS, and can be passed the qid by reference which will be
- * filled in on ARES_SUCCESS */
-int ares_query_qid(ares_channel channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg, unsigned short *qid);
-/* Identical to ares_send() except returns normal ares return codes like
- * ARES_SUCCESS */
-int ares_send_ex(ares_channel channel, const unsigned char *qbuf, int qlen,
- ares_callback callback, void *arg);
+ares_status_t ares__send_query(struct query *query, struct timeval *now);
+ares_status_t ares__requeue_query(struct query *query, struct timeval *now);
+
+/*! Retrieve a list of names to use for searching. The first successful
+ * query in the list wins. This function also uses the HOSTSALIASES file
+ * as well as uses channel configuration to determine the search order.
+ *
+ * \param[in] channel initialized ares channel
+ * \param[in] name initial name being searched
+ * \param[out] names array of names to attempt, use ares__strsplit_free()
+ * when no longer needed.
+ * \param[out] names_len number of names in array
+ * \return ARES_SUCCESS on success, otherwise one of the other error codes.
+ */
+ares_status_t ares__search_name_list(const ares_channel_t *channel,
+ const char *name, char ***names,
+ size_t *names_len);
+
+/*! Function to create callback arg for converting from ares_callback_dnsrec
+ * to ares_calback */
+void *ares__dnsrec_convert_arg(ares_callback callback, void *arg);
+
+/*! Callback function used to convert from the ares_callback_dnsrec prototype to
+ * the ares_callback prototype, by writing the result and passing that to
+ * the inner callback.
+ */
+void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
void ares__close_connection(struct server_connection *conn);
void ares__close_sockets(struct server_state *server);
-void ares__check_cleanup_conn(ares_channel channel, ares_socket_t fd);
-int ares__get_hostent(FILE *fp, int family, struct hostent **host);
-int ares__read_line(FILE *fp, char **buf, size_t *bufsize);
+void ares__check_cleanup_conn(const ares_channel_t *channel,
+ struct server_connection *conn);
void ares__free_query(struct query *query);
ares_rand_state *ares__init_rand_state(void);
-void ares__destroy_rand_state(ares_rand_state *state);
+void ares__destroy_rand_state(ares_rand_state *state);
void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len);
unsigned short ares__generate_new_id(ares_rand_state *state);
struct timeval ares__tvnow(void);
-int ares__expand_name_validated(const unsigned char *encoded,
- const unsigned char *abuf,
- int alen, char **s, long *enclen,
- int is_hostname);
-int ares__expand_name_for_response(const unsigned char *encoded,
- const unsigned char *abuf, int alen,
- char **s, long *enclen, int is_hostname);
-int 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);
-
-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__timeval_remaining(struct timeval *remaining,
+ const struct timeval *now,
+ const struct timeval *tout);
+ares_status_t ares__expand_name_validated(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s, size_t *enclen,
+ ares_bool_t is_hostname);
+ares_status_t ares__expand_name_for_response(const unsigned char *encoded,
+ const unsigned char *abuf,
+ size_t alen, char **s,
+ size_t *enclen,
+ ares_bool_t is_hostname);
+ares_status_t ares_expand_string_ex(const unsigned char *encoded,
+ const unsigned char *abuf, size_t alen,
+ unsigned char **s, size_t *enclen);
+ares_status_t ares__init_servers_state(ares_channel_t *channel);
+ares_status_t ares__init_by_options(ares_channel_t *channel,
+ const struct ares_options *options,
+ int optmask);
+ares_status_t ares__init_by_sysconfig(ares_channel_t *channel);
+
+typedef struct {
+ ares__llist_t *sconfig;
+ struct apattern *sortlist;
+ size_t nsortlist;
+ char **domains;
+ size_t ndomains;
+ char *lookups;
+ size_t ndots;
+ size_t tries;
+ ares_bool_t rotate;
+ size_t timeout_ms;
+ ares_bool_t usevc;
+} ares_sysconfig_t;
+
+ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig);
+
+ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel,
+ ares_sysconfig_t *sysconfig);
+ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
+ const char *str);
+
+void ares__destroy_servers_state(ares_channel_t *channel);
+
+/* Returns ARES_SUCCESS if alias found, alias is set. Returns ARES_ENOTFOUND
+ * if not alias found. Returns other errors on critical failure like
+ * ARES_ENOMEM */
+ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel,
+ const char *name, char **alias);
+
+ares_status_t ares__cat_domain(const char *name, const char *domain, char **s);
+ares_status_t ares__sortaddrinfo(ares_channel_t *channel,
+ struct ares_addrinfo_node *ai_node);
+
+void ares__freeaddrinfo_nodes(struct ares_addrinfo_node *ai_node);
+ares_bool_t ares__is_localhost(const char *name);
+
+struct ares_addrinfo_node *
+ ares__append_addrinfo_node(struct ares_addrinfo_node **ai_node);
void ares__addrinfo_cat_nodes(struct ares_addrinfo_node **head,
- struct ares_addrinfo_node *tail);
+ struct ares_addrinfo_node *tail);
void ares__freeaddrinfo_cnames(struct ares_addrinfo_cname *ai_cname);
-struct ares_addrinfo_cname *ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname);
-
-int ares_append_ai_node(int aftype, unsigned short port, int ttl,
- const void *adata,
- struct ares_addrinfo_node **nodes);
-
-void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head,
- struct ares_addrinfo_cname *tail);
-
-int ares__parse_into_addrinfo(const unsigned char *abuf,
- int alen, int cname_only_is_enodata,
- unsigned short port,
- struct ares_addrinfo *ai);
+struct ares_addrinfo_cname *
+ ares__append_addrinfo_cname(struct ares_addrinfo_cname **ai_cname);
+
+ares_status_t ares_append_ai_node(int aftype, unsigned short port,
+ unsigned int ttl, const void *adata,
+ struct ares_addrinfo_node **nodes);
+
+void ares__addrinfo_cat_cnames(struct ares_addrinfo_cname **head,
+ struct ares_addrinfo_cname *tail);
+
+ares_status_t ares__parse_into_addrinfo(const ares_dns_record_t *dnsrec,
+ ares_bool_t cname_only_is_enodata,
+ unsigned short port,
+ struct ares_addrinfo *ai);
+ares_status_t ares_parse_ptr_reply_dnsrec(const ares_dns_record_t *dnsrec,
+ const void *addr, int addrlen,
+ int family, struct hostent **host);
+
+ares_status_t ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
+ struct hostent **host);
+ares_status_t ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
+ size_t req_naddrttls,
+ struct ares_addrttl *addrttls,
+ struct ares_addr6ttl *addr6ttls,
+ size_t *naddrttls);
+ares_status_t ares__addrinfo_localhost(const char *name, unsigned short port,
+ const struct ares_addrinfo_hints *hints,
+ struct ares_addrinfo *ai);
+ares_status_t ares__open_connection(ares_channel_t *channel,
+ struct server_state *server,
+ ares_bool_t is_tcp);
+ares_socket_t ares__open_socket(ares_channel_t *channel, int af, int type,
+ int protocol);
+ares_ssize_t ares__socket_write(ares_channel_t *channel, ares_socket_t s,
+ const void *data, size_t len);
+ares_ssize_t ares__socket_recvfrom(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len, int flags,
+ struct sockaddr *from,
+ ares_socklen_t *from_len);
+ares_ssize_t ares__socket_recv(ares_channel_t *channel, ares_socket_t s,
+ void *data, size_t data_len);
+void ares__close_socket(ares_channel, ares_socket_t);
+int ares__connect_socket(ares_channel_t *channel, ares_socket_t sockfd,
+ const struct sockaddr *addr, ares_socklen_t addrlen);
+void ares__destroy_server(struct server_state *server);
+
+ares_status_t ares__servers_update(ares_channel_t *channel,
+ ares__llist_t *server_list,
+ ares_bool_t user_specified);
+ares_status_t ares__sconfig_append(ares__llist_t **sconfig,
+ const struct ares_addr *addr,
+ unsigned short udp_port,
+ unsigned short tcp_port,
+ const char *ll_iface);
+ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig,
+ const char *str,
+ ares_bool_t ignore_invalid);
+ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers,
+ size_t nservers,
+ ares__llist_t **llist);
+
+struct ares_hosts_entry;
+typedef struct ares_hosts_entry ares_hosts_entry_t;
+
+void ares__hosts_file_destroy(ares_hosts_file_t *hf);
+ares_status_t ares__hosts_search_ipaddr(ares_channel_t *channel,
+ ares_bool_t use_env, const char *ipaddr,
+ const ares_hosts_entry_t **entry);
+ares_status_t ares__hosts_search_host(ares_channel_t *channel,
+ ares_bool_t use_env, const char *host,
+ const ares_hosts_entry_t **entry);
+ares_status_t ares__hosts_entry_to_hostent(const ares_hosts_entry_t *entry,
+ int family,
+ struct hostent **hostent);
+ares_status_t ares__hosts_entry_to_addrinfo(const ares_hosts_entry_t *entry,
+ const char *name, int family,
+ unsigned short port,
+ ares_bool_t want_cnames,
+ struct ares_addrinfo *ai);
+
+
+/*! Parse a compressed DNS name as defined in RFC1035 starting at the current
+ * offset within the buffer.
+ *
+ * It is assumed that either a const buffer is being used, or before
+ * the message processing was started that ares__buf_reclaim() was called.
+ *
+ * \param[in] buf Initialized buffer object
+ * \param[out] name Pointer passed by reference to be filled in with
+ * allocated string of the parsed name that must be
+ * ares_free()'d by the caller.
+ * \param[in] is_hostname if ARES_TRUE, will validate the character set for
+ * a valid hostname or will return error.
+ * \return ARES_SUCCESS on success
+ */
+ares_status_t ares__dns_name_parse(ares__buf_t *buf, char **name,
+ ares_bool_t is_hostname);
-int ares__addrinfo2hostent(const struct ares_addrinfo *ai, int family,
- struct hostent **host);
-int ares__addrinfo2addrttl(const struct ares_addrinfo *ai, int family,
- int req_naddrttls, struct ares_addrttl *addrttls,
- struct ares_addr6ttl *addr6ttls, int *naddrttls);
-int ares__addrinfo_localhost(const char *name, unsigned short port,
- const struct ares_addrinfo_hints *hints,
- struct ares_addrinfo *ai);
+/*! Write the DNS name to the buffer in the DNS domain-name syntax as a
+ * series of labels. The maximum domain name length is 255 characters with
+ * each label being a maximum of 63 characters. If the validate_hostname
+ * flag is set, it will strictly validate the character set.
+ *
+ * \param[in,out] buf Initialized buffer object to write name to
+ * \param[in,out] list Pointer passed by reference to maintain a list of
+ * domain name to indexes used for name compression.
+ * Pass NULL (not by reference) if name compression isn't
+ * desired. Otherwise the list will be automatically
+ * created upon first entry.
+ * \param[in] validate_hostname Validate the hostname character set.
+ * \param[in] name Name to write out, it may have escape
+ * sequences.
+ * \return ARES_SUCCESS on success, most likely ARES_EBADNAME if the name is
+ * bad.
+ */
+ares_status_t ares__dns_name_write(ares__buf_t *buf, ares__llist_t **list,
+ ares_bool_t validate_hostname,
+ const char *name);
-#if 0 /* Not used */
-long ares__tvdiff(struct timeval t1, struct timeval t2);
+/*! Check if the queue is empty, if so, wake any waiters. This is only
+ * effective if built with threading support.
+ *
+ * Must be holding a channel lock when calling this function.
+ *
+ * \param[in] channel Initialized ares channel object
+ */
+void ares_queue_notify_empty(ares_channel_t *channel);
+
+
+#define ARES_SWAP_BYTE(a, b) \
+ do { \
+ unsigned char swapByte = *(a); \
+ *(a) = *(b); \
+ *(b) = swapByte; \
+ } while (0)
+
+#define SOCK_STATE_CALLBACK(c, s, r, w) \
+ do { \
+ if ((c)->sock_state_cb) { \
+ (c)->sock_state_cb((c)->sock_state_cb_data, (s), (r), (w)); \
+ } \
+ } while (0)
+
+#define ARES_CONFIG_CHECK(x) \
+ (x && x->lookups && ares__slist_len(x->servers) > 0 && \
+ x->timeout > 0 && x->tries > 0)
+
+ares_bool_t ares__subnet_match(const struct ares_addr *addr,
+ const struct ares_addr *subnet,
+ unsigned char netmask);
+ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr);
+
+size_t ares__round_up_pow2(size_t n);
+size_t ares__log2(size_t n);
+size_t ares__pow(size_t x, size_t y);
+size_t ares__count_digits(size_t n);
+size_t ares__count_hexdigits(size_t n);
+unsigned char ares__count_bits_u8(unsigned char x);
+void ares__qcache_destroy(ares__qcache_t *cache);
+ares_status_t ares__qcache_create(ares_rand_state *rand_state,
+ unsigned int max_ttl,
+ ares__qcache_t **cache_out);
+void ares__qcache_flush(ares__qcache_t *cache);
+ares_status_t ares_qcache_insert(ares_channel_t *channel,
+ const struct timeval *now,
+ const struct query *query,
+ ares_dns_record_t *dnsrec);
+ares_status_t ares_qcache_fetch(ares_channel_t *channel,
+ const struct timeval *now,
+ const ares_dns_record_t *dnsrec,
+ const ares_dns_record_t **dnsrec_resp);
+
+ares_status_t ares__channel_threading_init(ares_channel_t *channel);
+void ares__channel_threading_destroy(ares_channel_t *channel);
+void ares__channel_lock(ares_channel_t *channel);
+void ares__channel_unlock(ares_channel_t *channel);
+
+struct ares_event_thread;
+typedef struct ares_event_thread ares_event_thread_t;
+
+void ares_event_thread_destroy(ares_channel_t *channel);
+ares_status_t ares_event_thread_init(ares_channel_t *channel);
+
+
+#ifdef _MSC_VER
+typedef __int64 ares_int64_t;
+typedef unsigned __int64 ares_uint64_t;
+#else
+typedef long long ares_int64_t;
+typedef unsigned long long ares_uint64_t;
#endif
-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 _WIN32
+# define HOSTENT_ADDRTYPE_TYPE short
+# define HOSTENT_LENGTH_TYPE short
+#else
+# define HOSTENT_ADDRTYPE_TYPE int
+# define HOSTENT_LENGTH_TYPE int
+#endif
#endif /* __ARES_PRIVATE_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_process.c b/contrib/libs/c-ares/src/lib/ares_process.c
index a876f2a573..23fb6786c2 100644
--- a/contrib/libs/c-ares/src/lib/ares_process.c
+++ b/contrib/libs/c-ares/src/lib/ares_process.c
@@ -27,23 +27,6 @@
#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
-
-#include "ares_nameser.h"
#ifdef HAVE_STRINGS_H
# include <strings.h>
@@ -54,64 +37,104 @@
#ifdef NETWARE
# include <sys/filio.h>
#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.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"
+#include "ares_nameser.h"
+#include "ares_dns.h"
+static void timeadd(struct timeval *now, size_t millisecs);
+static ares_bool_t try_again(int errnum);
+static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds,
+ ares_socket_t write_fd);
+static void read_packets(ares_channel_t *channel, fd_set *read_fds,
+ ares_socket_t read_fd, struct timeval *now);
+static void process_timeouts(ares_channel_t *channel, struct timeval *now);
+static ares_status_t process_answer(ares_channel_t *channel,
+ const unsigned char *abuf, size_t alen,
+ struct server_connection *conn,
+ ares_bool_t tcp, struct timeval *now);
+static void handle_conn_error(struct server_connection *conn,
+ ares_bool_t critical_failure);
+
+static ares_bool_t same_questions(const ares_dns_record_t *qrec,
+ const ares_dns_record_t *arec);
+static ares_bool_t same_address(const struct sockaddr *sa,
+ const struct ares_addr *aa);
+static void end_query(ares_channel_t *channel, struct query *query,
+ ares_status_t status, const ares_dns_record_t *dnsrec);
+
+static void server_increment_failures(struct server_state *server)
+{
+ ares__slist_node_t *node;
+ const ares_channel_t *channel = server->channel;
+ struct timeval next_retry_time;
-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_packets(ares_channel channel, fd_set *read_fds,
- ares_socket_t read_fd, struct timeval *now);
-static void process_timeouts(ares_channel channel, struct timeval *now);
-static void process_answer(ares_channel channel, const unsigned char *abuf,
- int alen, struct server_connection *conn, int tcp,
- struct timeval *now);
-static void handle_error(struct server_connection *conn, struct timeval *now);
-static void skip_server(ares_channel channel, struct query *query,
- struct server_state *server);
-static int next_server(ares_channel channel, struct query *query,
- struct timeval *now);
-static int open_socket(ares_channel channel, struct server_state *server,
- int is_tcp);
-static int same_questions(const unsigned char *qbuf, int qlen,
- const unsigned char *abuf, int alen);
-static int same_address(struct sockaddr *sa, struct ares_addr *aa);
-static int has_opt_rr(const unsigned char *abuf, int alen);
-static void end_query(ares_channel channel, struct query *query, int status,
- const unsigned char *abuf, int alen);
-static ares_ssize_t ares__socket_write(ares_channel channel, ares_socket_t s,
- const void * data, size_t len);
+ node = ares__slist_node_find(channel->servers, server);
+ if (node == NULL) {
+ return;
+ }
+
+ server->consec_failures++;
+ ares__slist_node_reinsert(node);
+
+ next_retry_time = ares__tvnow();
+ timeadd(&next_retry_time, channel->server_retry_delay);
+ server->next_retry_time = next_retry_time;
+}
+
+static void server_set_good(struct server_state *server)
+{
+ ares__slist_node_t *node;
+ const ares_channel_t *channel = server->channel;
+
+ node = ares__slist_node_find(channel->servers, server);
+ if (node == NULL) {
+ return;
+ }
+
+ if (server->consec_failures > 0) {
+ server->consec_failures = 0;
+ ares__slist_node_reinsert(node);
+ }
+
+ server->next_retry_time.tv_sec = 0;
+ server->next_retry_time.tv_usec = 0;
+}
/* return true if now is exactly check time or later */
-int ares__timedout(struct timeval *now,
- struct timeval *check)
+ares_bool_t ares__timedout(const struct timeval *now,
+ const struct timeval *check)
{
- long secs = (now->tv_sec - check->tv_sec);
+ ares_int64_t secs = ((ares_int64_t)now->tv_sec - (ares_int64_t)check->tv_sec);
- if(secs > 0)
- return 1; /* yes, timed out */
- if(secs < 0)
- return 0; /* nope, not timed out */
+ if (secs > 0) {
+ return ARES_TRUE; /* yes, timed out */
+ }
+ if (secs < 0) {
+ return ARES_FALSE; /* nope, not timed out */
+ }
/* if the full seconds were identical, check the sub second parts */
- return (now->tv_usec - check->tv_usec >= 0);
+ return ((ares_int64_t)now->tv_usec - (ares_int64_t)check->tv_usec) >= 0
+ ? ARES_TRUE
+ : ARES_FALSE;
}
/* add the specific number of milliseconds to the time in the first argument */
-static void timeadd(struct timeval *now, int millisecs)
+static void timeadd(struct timeval *now, size_t millisecs)
{
- now->tv_sec += millisecs/1000;
- now->tv_usec += (millisecs%1000)*1000;
+ now->tv_sec += (time_t)millisecs / 1000;
+ now->tv_usec += (time_t)((millisecs % 1000) * 1000);
- if(now->tv_usec >= 1000000) {
+ if (now->tv_usec >= 1000000) {
++(now->tv_sec);
now->tv_usec -= 1000000;
}
@@ -120,21 +143,31 @@ static void timeadd(struct timeval *now, int millisecs)
/*
* 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)
+static void processfds(ares_channel_t *channel, fd_set *read_fds,
+ ares_socket_t read_fd, fd_set *write_fds,
+ ares_socket_t write_fd)
{
- struct timeval now = ares__tvnow();
+ struct timeval now;
+
+ if (channel == NULL) {
+ return;
+ }
+
+ ares__channel_lock(channel);
- write_tcp_data(channel, write_fds, write_fd, &now);
+ now = ares__tvnow();
read_packets(channel, read_fds, read_fd, &now);
process_timeouts(channel, &now);
+ /* Write last as the other 2 operations might have triggered writes */
+ write_tcp_data(channel, write_fds, write_fd);
+
+ ares__channel_unlock(channel);
}
/* Something interesting happened on the wire, or there was a timeout.
* See what's up and respond accordingly.
*/
-void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
+void ares_process(ares_channel_t *channel, fd_set *read_fds, fd_set *write_fds)
{
processfds(channel, read_fds, ARES_SOCKET_BAD, write_fds, ARES_SOCKET_BAD);
}
@@ -142,15 +175,14 @@ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
/* 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)
+void ares_process_fd(ares_channel_t *channel,
+ ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid
+ file descriptors */
+ ares_socket_t write_fd)
{
processfds(channel, NULL, read_fd, NULL, write_fd);
}
-
/* Return 1 if the specified error number describes a readiness error, or 0
* otherwise. This is mostly for HP-UX, which could return EAGAIN or
* EWOULDBLOCK. See this man page
@@ -158,58 +190,61 @@ void ares_process_fd(ares_channel channel,
* http://devrsrc1.external.hp.com/STKS/cgi-bin/man2html?
* manpage=/usr/share/man/man2.Z/send.2
*/
-static int try_again(int errnum)
+static ares_bool_t try_again(int errnum)
{
#if !defined EWOULDBLOCK && !defined EAGAIN
-#error "Neither EWOULDBLOCK nor EAGAIN defined"
+# error "Neither EWOULDBLOCK nor EAGAIN defined"
#endif
- switch (errnum)
- {
+
#ifdef EWOULDBLOCK
- case EWOULDBLOCK:
- return 1;
+ if (errnum == EWOULDBLOCK) {
+ return ARES_TRUE;
+ }
#endif
+
#if defined EAGAIN && EAGAIN != EWOULDBLOCK
- case EAGAIN:
- return 1;
+ if (errnum == EAGAIN) {
+ return ARES_TRUE;
+ }
#endif
- }
- return 0;
-}
+ return ARES_FALSE;
+}
/* If any TCP sockets select true for writing, write out queued data
* we have for them.
*/
-static void write_tcp_data(ares_channel channel,
- fd_set *write_fds,
- ares_socket_t write_fd,
- struct timeval *now)
+static void write_tcp_data(ares_channel_t *channel, fd_set *write_fds,
+ ares_socket_t write_fd)
{
- struct server_state *server;
- int i;
+ ares__slist_node_t *node;
- if(!write_fds && (write_fd == ARES_SOCKET_BAD))
+ if (!write_fds && (write_fd == ARES_SOCKET_BAD)) {
/* no possible action */
return;
+ }
- for (i = 0; i < channel->nservers; i++) {
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ struct server_state *server = ares__slist_node_val(node);
const unsigned char *data;
size_t data_len;
ares_ssize_t count;
/* Make sure server has data to send and is selected in write_fds or
write_fd. */
- server = &channel->servers[i];
- if (ares__buf_len(server->tcp_send) == 0 || server->tcp_conn == NULL)
+ if (ares__buf_len(server->tcp_send) == 0 || server->tcp_conn == NULL) {
continue;
+ }
if (write_fds) {
- if (!FD_ISSET(server->tcp_conn->fd, write_fds))
+ if (!FD_ISSET(server->tcp_conn->fd, write_fds)) {
continue;
+ }
} else {
- if (server->tcp_conn->fd != write_fd)
+ if (server->tcp_conn->fd != write_fd) {
continue;
+ }
}
if (write_fds) {
@@ -225,13 +260,13 @@ static void write_tcp_data(ares_channel channel,
count = ares__socket_write(channel, server->tcp_conn->fd, data, data_len);
if (count <= 0) {
if (!try_again(SOCKERRNO)) {
- handle_error(server->tcp_conn, now);
+ handle_conn_error(server->tcp_conn, ARES_TRUE);
}
continue;
}
/* Strip data written from the buffer */
- ares__buf_consume(server->tcp_send, count);
+ ares__buf_consume(server->tcp_send, (size_t)count);
/* Notify state callback all data is written */
if (ares__buf_len(server->tcp_send) == 0) {
@@ -240,78 +275,47 @@ static void write_tcp_data(ares_channel channel,
}
}
-
-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 && channel->sock_funcs->arecvfrom)
- return channel->sock_funcs->arecvfrom(s, data, data_len,
- flags, from, from_len,
- channel->sock_func_cb_data);
-
-#ifdef HAVE_RECVFROM
- return recvfrom(s, data, data_len, flags, from, from_len);
-#else
- return sread(s, data, data_len);
-#endif
-}
-
-static ares_ssize_t socket_recv(ares_channel channel,
- ares_socket_t s,
- void * data,
- size_t data_len)
-{
- if (channel->sock_funcs && channel->sock_funcs->arecvfrom)
- return channel->sock_funcs->arecvfrom(s, data, data_len, 0, 0, 0,
- channel->sock_func_cb_data);
-
- return sread(s, data, data_len);
-}
-
-
/* 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, struct server_connection *conn,
- struct timeval *now)
+static void read_tcp_data(ares_channel_t *channel,
+ struct server_connection *conn, struct timeval *now)
{
ares_ssize_t count;
- struct server_state *server = conn->server;
+ struct server_state *server = conn->server;
/* Fetch buffer to store data we are reading */
- size_t ptr_len = 512;
- unsigned char *ptr = ares__buf_append_start(server->tcp_parser,
- &ptr_len);
+ size_t ptr_len = 65535;
+ unsigned char *ptr;
+
+ ptr = ares__buf_append_start(server->tcp_parser, &ptr_len);
if (ptr == NULL) {
- handle_error(conn, now);
+ handle_conn_error(conn, ARES_FALSE /* not critical to connection */);
return; /* bail out on malloc failure. TODO: make this
function return error codes */
}
/* Read from socket */
- count = socket_recv(channel, conn->fd, ptr, ptr_len);
+ count = ares__socket_recv(channel, conn->fd, ptr, ptr_len);
if (count <= 0) {
ares__buf_append_finish(server->tcp_parser, 0);
- if (!(count == -1 && try_again(SOCKERRNO)))
- handle_error(conn, now);
+ if (!(count == -1 && try_again(SOCKERRNO))) {
+ handle_conn_error(conn, ARES_TRUE);
+ }
return;
}
/* Record amount of data read */
- ares__buf_append_finish(server->tcp_parser, count);
+ ares__buf_append_finish(server->tcp_parser, (size_t)count);
/* Process all queued answers */
while (1) {
- unsigned short dns_len = 0;
- const unsigned char *data = NULL;
- size_t data_len = 0;
+ unsigned short dns_len = 0;
+ const unsigned char *data = NULL;
+ size_t data_len = 0;
+ ares_status_t status;
/* Tag so we can roll back */
ares__buf_tag(server->tcp_parser);
@@ -319,20 +323,20 @@ static void read_tcp_data(ares_channel channel, struct server_connection *conn,
/* Read length indicator */
if (ares__buf_fetch_be16(server->tcp_parser, &dns_len) != ARES_SUCCESS) {
ares__buf_tag_rollback(server->tcp_parser);
- return;
+ break;
}
/* Not enough data for a full response yet */
if (ares__buf_consume(server->tcp_parser, dns_len) != ARES_SUCCESS) {
ares__buf_tag_rollback(server->tcp_parser);
- return;
+ break;
}
/* Can't fail except for misuse */
data = ares__buf_tag_fetch(server->tcp_parser, &data_len);
if (data == NULL) {
ares__buf_tag_clear(server->tcp_parser);
- return;
+ break;
}
/* Strip off 2 bytes length */
@@ -340,13 +344,18 @@ static void read_tcp_data(ares_channel channel, struct server_connection *conn,
data_len -= 2;
/* We finished reading this answer; process it */
- process_answer(channel, data, (int)data_len, conn, 1, now);
+ status = process_answer(channel, data, data_len, conn, ARES_TRUE, now);
+ if (status != ARES_SUCCESS) {
+ handle_conn_error(conn, ARES_TRUE);
+ return;
+ }
/* Since we processed the answer, clear the tag so space can be reclaimed */
ares__buf_tag_clear(server->tcp_parser);
}
-}
+ ares__check_cleanup_conn(channel, conn);
+}
static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd,
size_t *alloc_cnt, size_t *num)
@@ -354,10 +363,11 @@ static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd,
if (*num >= *alloc_cnt) {
/* Grow by powers of 2 */
size_t new_alloc = (*alloc_cnt) << 1;
- ares_socket_t *new_list = ares_realloc(socketlist,
- new_alloc * sizeof(*new_list));
- if (new_list == NULL)
+ ares_socket_t *new_list =
+ ares_realloc(socketlist, new_alloc * sizeof(*new_list));
+ if (new_list == NULL) {
return 0;
+ }
*alloc_cnt = new_alloc;
*socketlist = new_list;
}
@@ -366,30 +376,35 @@ static int socket_list_append(ares_socket_t **socketlist, ares_socket_t fd,
return 1;
}
-
-static ares_socket_t *channel_socket_list(ares_channel channel, size_t *num)
+static ares_socket_t *channel_socket_list(const ares_channel_t *channel,
+ size_t *num)
{
- size_t alloc_cnt = 1 << 4;
- int i;
- ares_socket_t *out = ares_malloc(alloc_cnt * sizeof(*out));
+ size_t alloc_cnt = 1 << 4;
+ ares_socket_t *out = ares_malloc(alloc_cnt * sizeof(*out));
+ ares__slist_node_t *snode;
*num = 0;
- if (out == NULL)
+ if (out == NULL) {
return NULL;
+ }
+
+ for (snode = ares__slist_node_first(channel->servers); snode != NULL;
+ snode = ares__slist_node_next(snode)) {
+ struct server_state *server = ares__slist_node_val(snode);
+ ares__llist_node_t *node;
- for (i=0; i<channel->nservers; i++) {
- ares__llist_node_t *node;
- for (node = ares__llist_node_first(channel->servers[i].connections);
- node != NULL;
+ for (node = ares__llist_node_first(server->connections); node != NULL;
node = ares__llist_node_next(node)) {
- struct server_connection *conn = ares__llist_node_val(node);
+ const struct server_connection *conn = ares__llist_node_val(node);
- if (conn->fd == ARES_SOCKET_BAD)
+ if (conn->fd == ARES_SOCKET_BAD) {
continue;
+ }
- if (!socket_list_append(&out, conn->fd, &alloc_cnt, num))
+ if (!socket_list_append(&out, conn->fd, &alloc_cnt, num)) {
goto fail;
+ }
}
}
@@ -402,21 +417,23 @@ fail:
}
/* If any UDP sockets select true for reading, process them. */
-static void read_udp_packets_fd(ares_channel channel,
+static void read_udp_packets_fd(ares_channel_t *channel,
struct server_connection *conn,
- struct timeval *now)
+ struct timeval *now)
{
- ares_ssize_t read_len;
+ ares_ssize_t read_len;
unsigned char buf[MAXENDSSZ + 1];
- ares_socket_t fd = conn->fd; /* Cache for validation */
#ifdef HAVE_RECVFROM
ares_socklen_t fromlen;
+
union {
struct sockaddr sa;
struct sockaddr_in sa4;
struct sockaddr_in6 sa6;
} from;
+
+ memset(&from, 0, sizeof(from));
#endif
/* To reduce event loop overhead, read and process as many
@@ -430,8 +447,8 @@ static void read_udp_packets_fd(ares_channel channel,
} else {
fromlen = sizeof(from.sa6);
}
- read_len = socket_recvfrom(channel, conn->fd, (void *)buf,
- sizeof(buf), 0, &from.sa, &fromlen);
+ read_len = ares__socket_recvfrom(channel, conn->fd, (void *)buf,
+ sizeof(buf), 0, &from.sa, &fromlen);
}
if (read_len == 0) {
@@ -440,10 +457,11 @@ static void read_udp_packets_fd(ares_channel channel,
* tcp */
continue;
} else if (read_len < 0) {
- if (try_again(SOCKERRNO))
- continue;
+ if (try_again(SOCKERRNO)) {
+ break;
+ }
- handle_error(conn, now);
+ handle_conn_error(conn, ARES_TRUE);
return;
#ifdef HAVE_RECVFROM
} else if (!same_address(&from.sa, &conn->server->addr)) {
@@ -454,18 +472,18 @@ static void read_udp_packets_fd(ares_channel channel,
#endif
} else {
- process_answer(channel, buf, (int)read_len, conn, 0, now);
+ process_answer(channel, buf, (size_t)read_len, conn, ARES_FALSE, now);
}
- /* process_answer may invalidate "conn" and close the file descriptor, so
- * check to see if file descriptor is still valid before looping! */
- } while (read_len >= 0 &&
- ares__htable_asvp_get_direct(channel->connnode_by_socket, fd) != NULL);
-}
+ /* Try to read again only if *we* set up the socket, otherwise it may be
+ * a blocking socket and would cause recvfrom to hang. */
+ } while (read_len >= 0 && channel->sock_funcs == NULL);
+ ares__check_cleanup_conn(channel, conn);
+}
-static void read_packets(ares_channel channel, fd_set *read_fds,
- ares_socket_t read_fd, struct timeval *now)
+static void read_packets(ares_channel_t *channel, fd_set *read_fds,
+ ares_socket_t read_fd, struct timeval *now)
{
size_t i;
ares_socket_t *socketlist = NULL;
@@ -473,15 +491,17 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
struct server_connection *conn = NULL;
ares__llist_node_t *node = NULL;
- if (!read_fds && (read_fd == ARES_SOCKET_BAD))
+ if (!read_fds && (read_fd == ARES_SOCKET_BAD)) {
/* no possible action */
return;
+ }
/* Single socket specified */
if (!read_fds) {
node = ares__htable_asvp_get_direct(channel->connnode_by_socket, read_fd);
- if (node == NULL)
+ if (node == NULL) {
return;
+ }
conn = ares__llist_node_val(node);
@@ -494,13 +514,15 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
return;
}
- /* There is no good way to iterate across an fd_set, instead we must pull a list
- * of all known fds, and iterate across that checking against the fd_set. */
+ /* There is no good way to iterate across an fd_set, instead we must pull a
+ * list of all known fds, and iterate across that checking against the fd_set.
+ */
socketlist = channel_socket_list(channel, &num_sockets);
- for (i=0; i<num_sockets; i++) {
- if (!FD_ISSET(socketlist[i], read_fds))
+ for (i = 0; i < num_sockets; i++) {
+ if (!FD_ISSET(socketlist[i], read_fds)) {
continue;
+ }
/* If there's an error and we close this socket, then open
* another with the same fd to talk to another server, then we
@@ -509,10 +531,11 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
* extra system calls and confusion. */
FD_CLR(socketlist[i], read_fds);
- node = ares__htable_asvp_get_direct(channel->connnode_by_socket,
- socketlist[i]);
- if (node == NULL)
+ node =
+ ares__htable_asvp_get_direct(channel->connnode_by_socket, socketlist[i]);
+ if (node == NULL) {
return;
+ }
conn = ares__llist_node_val(node);
@@ -526,18 +549,18 @@ static void read_packets(ares_channel channel, fd_set *read_fds,
ares_free(socketlist);
}
-
/* If any queries have timed out, note the timeout and move them on. */
-static void process_timeouts(ares_channel channel, struct timeval *now)
+static void process_timeouts(ares_channel_t *channel, struct timeval *now)
{
- ares__slist_node_t *node = ares__slist_node_first(channel->queries_by_timeout);
+ ares__slist_node_t *node =
+ ares__slist_node_first(channel->queries_by_timeout);
while (node != NULL) {
- struct query *query = ares__slist_node_val(node);
+ struct query *query = ares__slist_node_val(node);
/* Node might be removed, cache next */
- ares__slist_node_t *next = ares__slist_node_next(node);
- ares_socket_t fd;
-
- /* Since this is sorted, as soon as we hit a query that isn't timed out, break */
+ ares__slist_node_t *next = ares__slist_node_next(node);
+ struct server_connection *conn;
+ /* Since this is sorted, as soon as we hit a query that isn't timed out,
+ * break */
if (!ares__timedout(now, &query->timeout)) {
break;
}
@@ -545,54 +568,104 @@ static void process_timeouts(ares_channel channel, struct timeval *now)
query->error_status = ARES_ETIMEOUT;
query->timeouts++;
-
- fd = query->conn->fd;
- next_server(channel, query, now);
- /* A timeout is a special case where we need to possibly cleanup a
- * a connection */
- ares__check_cleanup_conn(channel, fd);
+ conn = query->conn;
+ server_increment_failures(conn->server);
+ ares__requeue_query(query, now);
+ ares__check_cleanup_conn(channel, conn);
node = next;
}
}
+static ares_status_t rewrite_without_edns(ares_dns_record_t *qdnsrec,
+ struct query *query)
+{
+ ares_status_t status;
+ size_t i;
+ ares_bool_t found_opt_rr = ARES_FALSE;
+ unsigned char *msg = NULL;
+ size_t msglen = 0;
+
+ /* Find and remove the OPT RR record */
+ for (i = 0; i < ares_dns_record_rr_cnt(qdnsrec, ARES_SECTION_ADDITIONAL);
+ i++) {
+ const ares_dns_rr_t *rr;
+ rr = ares_dns_record_rr_get(qdnsrec, ARES_SECTION_ADDITIONAL, i);
+ if (ares_dns_rr_get_type(rr) == ARES_REC_TYPE_OPT) {
+ ares_dns_record_rr_del(qdnsrec, ARES_SECTION_ADDITIONAL, i);
+ found_opt_rr = ARES_TRUE;
+ break;
+ }
+ }
+
+ if (!found_opt_rr) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
-/* Handle an answer from a server. */
-static void process_answer(ares_channel channel, const unsigned char *abuf,
- int alen, struct server_connection *conn, int tcp,
- struct timeval *now)
+ /* Rewrite the DNS message */
+ status = ares_dns_write(qdnsrec, &msg, &msglen);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ ares_free(query->qbuf);
+ query->qbuf = msg;
+ query->qlen = msglen;
+
+done:
+ return status;
+}
+
+/* Handle an answer from a server. This must NEVER cleanup the
+ * server connection! Return something other than ARES_SUCCESS to cause
+ * the connection to be terminated after this call. */
+static ares_status_t process_answer(ares_channel_t *channel,
+ const unsigned char *abuf, size_t alen,
+ struct server_connection *conn,
+ ares_bool_t tcp, struct timeval *now)
{
- int tc, rcode, packetsz;
- unsigned short id;
- struct query *query;
+ struct query *query;
/* Cache these as once ares__send_query() gets called, it may end up
* invalidating the connection all-together */
- struct server_state *server = conn->server;
- ares_socket_t fd = conn->fd;
-
- /* If there's no room in the answer for a header, we can't do much
- * with it. */
- if (alen < HFIXEDSZ) {
- return;
+ struct server_state *server = conn->server;
+ ares_dns_record_t *rdnsrec = NULL;
+ ares_dns_record_t *qdnsrec = NULL;
+ ares_status_t status;
+ ares_bool_t is_cached = ARES_FALSE;
+
+ /* Parse the response */
+ status = ares_dns_parse(abuf, alen, 0, &rdnsrec);
+ if (status != ARES_SUCCESS) {
+ /* Malformations are never accepted */
+ status = ARES_EBADRESP;
+ goto cleanup;
}
- /* Grab the query ID, truncate bit, and response code from the packet. */
- id = DNS_HEADER_QID(abuf); /* Converts to host byte order */
- 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.
+ * hashed/bucketed by query id, so this lookup should be quick.
*/
- query = ares__htable_stvp_get_direct(channel->queries_by_qid, id);
+ query = ares__htable_szvp_get_direct(channel->queries_by_qid,
+ ares_dns_record_get_id(rdnsrec));
if (!query) {
- return;
+ /* We may have stopped listening for this query, that's ok */
+ status = ARES_SUCCESS;
+ goto cleanup;
+ }
+
+ /* Parse the question we sent as we use it to compare */
+ status = ares_dns_parse(query->qbuf, query->qlen, 0, &qdnsrec);
+ if (status != ARES_SUCCESS) {
+ end_query(channel, query, status, NULL);
+ goto cleanup;
}
/* Both the query id and the questions must be the same. We will drop any
* replies that aren't for the same query as this is considered invalid. */
- if (!same_questions(query->qbuf, query->qlen, abuf, alen)) {
- return;
+ if (!same_questions(qdnsrec, rdnsrec)) {
+ /* Possible qid conflict due to delayed response, that's ok */
+ status = ARES_SUCCESS;
+ goto cleanup;
}
/* At this point we know we've received an answer for this query, so we should
@@ -602,189 +675,310 @@ static void process_answer(ares_channel channel, const unsigned char *abuf,
ares__llist_node_destroy(query->node_queries_to_conn);
query->node_queries_to_conn = NULL;
- packetsz = PACKETSZ;
- /* If we use EDNS and server answers with FORMERR without an OPT RR, the protocol
- * extension is not understood by the responder. We must retry the query
- * without EDNS enabled. */
- if (channel->flags & ARES_FLAG_EDNS)
- {
- packetsz = channel->ednspsz;
- if (rcode == FORMERR && has_opt_rr(abuf, alen) != 1)
- {
- int qlen = (query->tcplen - 2) - EDNSFIXEDSZ;
- channel->flags ^= ARES_FLAG_EDNS;
- query->tcplen -= EDNSFIXEDSZ;
- query->qlen -= EDNSFIXEDSZ;
- query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
- query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
- DNS_HEADER_SET_ARCOUNT(query->tcpbuf + 2, 0);
- query->tcpbuf = ares_realloc(query->tcpbuf, query->tcplen);
- query->qbuf = query->tcpbuf + 2;
- ares__send_query(channel, query, now);
- ares__check_cleanup_conn(channel, fd);
- return;
- }
+ /* If we use EDNS and server answers with FORMERR without an OPT RR, the
+ * protocol extension is not understood by the responder. We must retry the
+ * query without EDNS enabled. */
+ if (ares_dns_record_get_rcode(rdnsrec) == ARES_RCODE_FORMERR &&
+ ares_dns_has_opt_rr(qdnsrec) && !ares_dns_has_opt_rr(rdnsrec)) {
+ status = rewrite_without_edns(qdnsrec, query);
+ if (status != ARES_SUCCESS) {
+ end_query(channel, query, status, NULL);
+ goto cleanup;
+ }
+
+ ares__send_query(query, now);
+ status = ARES_SUCCESS;
+ goto cleanup;
}
/* If we got a truncated UDP packet and are not ignoring truncation,
* don't accept the packet, and switch the query to TCP if we hadn't
* done so already.
*/
- if ((tc || alen > packetsz) && !tcp && !(channel->flags & ARES_FLAG_IGNTC))
- {
- if (!query->using_tcp)
- {
- query->using_tcp = 1;
- ares__send_query(channel, query, now);
- }
- ares__check_cleanup_conn(channel, fd);
- 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 (ares_dns_record_get_flags(rdnsrec) & ARES_FLAG_TC && !tcp &&
+ !(channel->flags & ARES_FLAG_IGNTC)) {
+ query->using_tcp = ARES_TRUE;
+ ares__send_query(query, now);
+ status = ARES_SUCCESS; /* Switched to TCP is ok */
+ goto cleanup;
+ }
/* If we aren't passing through all error packets, discard packets
* with SERVFAIL, NOTIMP, or REFUSED response codes.
*/
- if (!(channel->flags & ARES_FLAG_NOCHECKRESP))
- {
- if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED)
- {
- switch (rcode) {
- case SERVFAIL:
- query->error_status = ARES_ESERVFAIL;
- break;
- case NOTIMP:
- query->error_status = ARES_ENOTIMP;
- break;
- case REFUSED:
- query->error_status = ARES_EREFUSED;
- break;
- }
- skip_server(channel, query, server);
- if (query->server == (int)server->idx) /* Is this ever not true? */
- next_server(channel, query, now);
- ares__check_cleanup_conn(channel, fd);
- return;
- }
+ if (!(channel->flags & ARES_FLAG_NOCHECKRESP)) {
+ ares_dns_rcode_t rcode = ares_dns_record_get_rcode(rdnsrec);
+ if (rcode == ARES_RCODE_SERVFAIL || rcode == ARES_RCODE_NOTIMP ||
+ rcode == ARES_RCODE_REFUSED) {
+ switch (rcode) {
+ case ARES_RCODE_SERVFAIL:
+ query->error_status = ARES_ESERVFAIL;
+ break;
+ case ARES_RCODE_NOTIMP:
+ query->error_status = ARES_ENOTIMP;
+ break;
+ case ARES_RCODE_REFUSED:
+ query->error_status = ARES_EREFUSED;
+ break;
+ default:
+ break;
+ }
+
+ server_increment_failures(server);
+ ares__requeue_query(query, now);
+
+ /* Should any of these cause a connection termination?
+ * Maybe SERVER_FAILURE? */
+ status = ARES_SUCCESS;
+ goto cleanup;
}
+ }
- end_query(channel, query, ARES_SUCCESS, abuf, alen);
+ /* If cache insertion was successful, it took ownership. We ignore
+ * other cache insertion failures. */
+ if (ares_qcache_insert(channel, now, query, rdnsrec) == ARES_SUCCESS) {
+ is_cached = ARES_TRUE;
+ }
- ares__check_cleanup_conn(channel, fd);
-}
+ server_set_good(server);
+ end_query(channel, query, ARES_SUCCESS, rdnsrec);
+
+ status = ARES_SUCCESS;
+cleanup:
+ /* Don't cleanup the cached pointer to the dns response */
+ if (!is_cached) {
+ ares_dns_record_destroy(rdnsrec);
+ }
-static void handle_error(struct server_connection *conn,
- struct timeval *now)
+ ares_dns_record_destroy(qdnsrec);
+ return status;
+}
+
+static void handle_conn_error(struct server_connection *conn,
+ ares_bool_t critical_failure)
{
- ares_channel channel = conn->server->channel;
struct server_state *server = conn->server;
- ares__llist_t *list_copy;
- ares__llist_node_t *node;
-
- /* We steal the list from the connection then close the connection, then
- * iterate across the list to requeue any inflight queries with the broken
- * connection. Destroying the connection prior to requeuing ensures requests
- * won't go back to the broken connection */
- list_copy = conn->queries_to_conn;
- conn->queries_to_conn = NULL;
+
+ /* Increment failures first before requeue so it is unlikely to requeue
+ * to the same server */
+ if (critical_failure) {
+ server_increment_failures(server);
+ }
+
+ /* This will requeue any connections automatically */
ares__close_connection(conn);
+}
- while ((node = ares__llist_node_first(list_copy)) != NULL) {
- struct query *query = ares__llist_node_val(node);
+ares_status_t ares__requeue_query(struct query *query, struct timeval *now)
+{
+ ares_channel_t *channel = query->channel;
+ size_t max_tries = ares__slist_len(channel->servers) * channel->tries;
+
+ query->try_count++;
+
+ if (query->try_count < max_tries && !query->no_retries) {
+ return ares__send_query(query, now);
+ }
- assert(query->server == (int)server->idx);
- skip_server(channel, query, server);
- /* next_server will remove the current node from the list */
- next_server(channel, query, now);
+ /* If we are here, all attempts to perform query failed. */
+ if (query->error_status == ARES_SUCCESS) {
+ query->error_status = ARES_ETIMEOUT;
}
- ares__llist_destroy(list_copy);
+ end_query(channel, query, query->error_status, NULL);
+ return ARES_ETIMEOUT;
}
+/* Pick a random server from the list, we first get a random number in the
+ * range of the number of servers, then scan until we find that server in
+ * the list */
+static struct server_state *ares__random_server(ares_channel_t *channel)
+{
+ unsigned char c;
+ size_t cnt;
+ size_t idx;
+ ares__slist_node_t *node;
+ size_t num_servers = ares__slist_len(channel->servers);
+
+ /* Silence coverity, not possible */
+ if (num_servers == 0) {
+ return NULL;
+ }
+
+ ares__rand_bytes(channel->rand_state, &c, 1);
+
+ cnt = c;
+ idx = cnt % num_servers;
-static void skip_server(ares_channel channel, struct query *query,
- struct server_state *server)
+ cnt = 0;
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ if (cnt == idx) {
+ return ares__slist_node_val(node);
+ }
+
+ cnt++;
+ }
+
+ return NULL;
+}
+
+/* Pick a server from the list with failover behavior.
+ *
+ * We default to using the first server in the sorted list of servers. That is
+ * the server with the lowest number of consecutive failures and then the
+ * highest priority server (by idx) if there is a draw.
+ *
+ * However, if a server temporarily goes down and hits some failures, then that
+ * server will never be retried until all other servers hit the same number of
+ * failures. This may prevent the server from being retried for a long time.
+ *
+ * To resolve this, with some probability we select a failed server to retry
+ * instead.
+ */
+static struct server_state *ares__failover_server(ares_channel_t *channel)
{
- /* 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).
+ struct server_state *first_server = ares__slist_first_val(channel->servers);
+ struct server_state *last_server = ares__slist_last_val(channel->servers);
+ unsigned short r;
+
+ /* Defensive code against no servers being available on the channel. */
+ if (first_server == NULL) {
+ return NULL;
+ }
+
+ /* If no servers have failures, then prefer the first server in the list. */
+ if (last_server != NULL && last_server->consec_failures == 0) {
+ return first_server;
+ }
+
+ /* If we are not configured with a server retry chance then return the first
+ * server.
*/
- if (channel->nservers > 1)
- {
- query->server_info[server->idx].skip_server = 1;
+ if (channel->server_retry_chance == 0) {
+ return first_server;
+ }
+
+ /* Generate a random value to decide whether to retry a failed server. The
+ * probability to use is 1/channel->server_retry_chance, rounded up to a
+ * precision of 1/2^B where B is the number of bits in the random value.
+ * We use an unsigned short for the random value for increased precision.
+ */
+ ares__rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r));
+ if (r % channel->server_retry_chance == 0) {
+ /* Select a suitable failed server to retry. */
+ struct timeval now = ares__tvnow();
+ ares__slist_node_t *node;
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ struct server_state *node_val = ares__slist_node_val(node);
+ if (node_val != NULL && node_val->consec_failures > 0 &&
+ ares__timedout(&now, &node_val->next_retry_time)) {
+ return node_val;
+ }
}
+ }
+
+ /* If we have not returned yet, then return the first server. */
+ return first_server;
}
-static int next_server(ares_channel channel, struct query *query,
- struct timeval *now)
+static ares_status_t ares__append_tcpbuf(struct server_state *server,
+ const struct query *query)
{
- int status;
- /* 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.
- * A query can be requested be terminated at the next interval by setting
- * query->no_retries */
- while (++(query->try_count) < (channel->nservers * channel->tries) &&
- !query->no_retries) {
- 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've decided to skip this
- * server because of earlier errors we encountered, or (2) we already
- * sent this query over this exact connection.
- */
- if (!query->server_info[query->server].skip_server &&
- !(query->using_tcp &&
- (query->server_info[query->server].tcp_connection_generation ==
- server->tcp_connection_generation))) {
- return ares__send_query(channel, query, now);
- }
+ ares_status_t status;
- /* 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.
- */
+ status = ares__buf_append_be16(server->tcp_send, (unsigned short)query->qlen);
+ if (status != ARES_SUCCESS) {
+ return status;
}
+ return ares__buf_append(server->tcp_send, query->qbuf, query->qlen);
+}
- /* If we are here, all attempts to perform query failed. */
- status = query->error_status;
- end_query(channel, query, query->error_status, NULL, 0);
- return status;
+static size_t ares__calc_query_timeout(const struct query *query)
+{
+ const ares_channel_t *channel = query->channel;
+ size_t timeplus = channel->timeout;
+ size_t rounds;
+ size_t num_servers = ares__slist_len(channel->servers);
+
+ if (num_servers == 0) {
+ return 0;
+ }
+
+ /* For each trip through the entire server list, we want to double the
+ * retry from the last retry */
+ rounds = (query->try_count / num_servers);
+ if (rounds > 0) {
+ timeplus <<= rounds;
+ }
+
+ if (channel->maxtimeout && timeplus > channel->maxtimeout) {
+ timeplus = channel->maxtimeout;
+ }
+
+ /* Add some jitter to the retry timeout.
+ *
+ * Jitter is needed in situation when resolve requests are performed
+ * simultaneously from multiple hosts and DNS server throttle these requests.
+ * Adding randomness allows to avoid synchronisation of retries.
+ *
+ * Value of timeplus adjusted randomly to the range [0.5 * timeplus,
+ * timeplus].
+ */
+ if (rounds > 0) {
+ unsigned short r;
+ float delta_multiplier;
+
+ ares__rand_bytes(channel->rand_state, (unsigned char *)&r, sizeof(r));
+ delta_multiplier = ((float)r / USHRT_MAX) * 0.5f;
+ timeplus -= (size_t)((float)timeplus * delta_multiplier);
+ }
+
+ /* We want explicitly guarantee that timeplus is greater or equal to timeout
+ * specified in channel options. */
+ if (timeplus < channel->timeout) {
+ timeplus = channel->timeout;
+ }
+
+ return timeplus;
}
-int ares__send_query(ares_channel channel, struct query *query,
- struct timeval *now)
+ares_status_t ares__send_query(struct query *query, struct timeval *now)
{
- struct server_state *server;
+ ares_channel_t *channel = query->channel;
+ struct server_state *server;
struct server_connection *conn;
- int timeplus;
- int status;
+ size_t timeplus;
+ ares_status_t status;
+ ares_bool_t new_connection = ARES_FALSE;
+
+ query->conn = NULL;
+
+ /* Choose the server to send the query to */
+ if (channel->rotate) {
+ /* Pull random server */
+ server = ares__random_server(channel);
+ } else {
+ /* Pull server with failover behavior */
+ server = ares__failover_server(channel);
+ }
+
+ if (server == NULL) {
+ end_query(channel, query, ARES_ENOSERVER /* ? */, NULL);
+ return ARES_ENOSERVER;
+ }
- server = &channel->servers[query->server];
if (query->using_tcp) {
size_t prior_len = 0;
/* Make sure the TCP socket for this server is set up and queue
* a send request.
*/
if (server->tcp_conn == NULL) {
- int err = open_socket(channel, server, 1);
- switch (err) {
+ new_connection = ARES_TRUE;
+ status = ares__open_connection(channel, server, ARES_TRUE);
+ switch (status) {
/* Good result, continue on */
case ARES_SUCCESS:
break;
@@ -793,13 +987,14 @@ int ares__send_query(ares_channel channel, struct query *query,
* error codes */
case ARES_ECONNREFUSED:
case ARES_EBADFAMILY:
- skip_server(channel, query, server);
- return next_server(channel, query, now);
+ server_increment_failures(server);
+ query->error_status = status;
+ return ares__requeue_query(query, now);
/* Anything else is not retryable, likely ENOMEM */
default:
- end_query(channel, query, err, NULL, 0);
- return err;
+ end_query(channel, query, status, NULL);
+ return status;
}
}
@@ -807,18 +1002,22 @@ int ares__send_query(ares_channel channel, struct query *query,
prior_len = ares__buf_len(server->tcp_send);
- status = ares__buf_append(server->tcp_send, query->tcpbuf, query->tcplen);
+ status = ares__append_tcpbuf(server, query);
if (status != ARES_SUCCESS) {
- end_query(channel, query, status, NULL, 0);
- return ARES_ENOMEM;
+ end_query(channel, query, status, NULL);
+
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
+ }
+ return status;
}
if (prior_len == 0) {
SOCK_STATE_CALLBACK(channel, conn->fd, 1, 1);
}
- query->server_info[query->server].tcp_connection_generation =
- server->tcp_connection_generation;
} else {
ares__llist_node_t *node = ares__llist_node_first(server->connections);
@@ -830,14 +1029,15 @@ int ares__send_query(ares_channel channel, struct query *query,
if (conn->is_tcp) {
node = NULL;
} else if (channel->udp_max_queries > 0 &&
- conn->total_queries >= (size_t)channel->udp_max_queries) {
+ conn->total_queries >= channel->udp_max_queries) {
node = NULL;
}
}
if (node == NULL) {
- int err = open_socket(channel, server, 0);
- switch (err) {
+ new_connection = ARES_TRUE;
+ status = ares__open_connection(channel, server, ARES_FALSE);
+ switch (status) {
/* Good result, continue on */
case ARES_SUCCESS:
break;
@@ -846,13 +1046,14 @@ int ares__send_query(ares_channel channel, struct query *query,
* error codes */
case ARES_ECONNREFUSED:
case ARES_EBADFAMILY:
- skip_server(channel, query, server);
- return next_server(channel, query, now);
+ server_increment_failures(server);
+ query->error_status = status;
+ return ares__requeue_query(query, now);
/* Anything else is not retryable, likely ENOMEM */
default:
- end_query(channel, query, err, NULL, 0);
- return err;
+ end_query(channel, query, status, NULL);
+ return status;
}
node = ares__llist_node_first(server->connections);
}
@@ -860,65 +1061,35 @@ int ares__send_query(ares_channel channel, struct query *query,
conn = ares__llist_node_val(node);
if (ares__socket_write(channel, conn->fd, query->qbuf, query->qlen) == -1) {
/* FIXME: Handle EAGAIN here since it likely can happen. */
- skip_server(channel, query, server);
- return next_server(channel, query, now);
- }
- }
-
- /* 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;
- }
- }
+ server_increment_failures(server);
+ status = ares__requeue_query(query, now);
- if (channel->maxtimeout != -1 && timeplus > channel->maxtimeout)
- timeplus = channel->maxtimeout;
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
+ }
- 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;
+ return status;
+ }
}
+ timeplus = ares__calc_query_timeout(query);
/* Keep track of queries bucketed by timeout, so we can process
* timeout events quickly.
*/
ares__slist_node_destroy(query->node_queries_by_timeout);
query->timeout = *now;
timeadd(&query->timeout, timeplus);
- query->node_queries_by_timeout = ares__slist_insert(channel->queries_by_timeout, query);
+ query->node_queries_by_timeout =
+ ares__slist_insert(channel->queries_by_timeout, query);
if (!query->node_queries_by_timeout) {
- end_query(channel, query, ARES_ENOMEM, NULL, 0);
+ end_query(channel, query, ARES_ENOMEM, NULL);
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
+ }
return ARES_ENOMEM;
}
@@ -927,497 +1098,96 @@ int ares__send_query(ares_channel channel, struct query *query,
ares__llist_node_destroy(query->node_queries_to_conn);
query->node_queries_to_conn =
ares__llist_insert_last(conn->queries_to_conn, query);
- query->conn = conn;
- conn->total_queries++;
- return ARES_SUCCESS;
-}
-
-/*
- * setsocknonblock sets the given socket to either blocking or non-blocking
- * mode based on the 'nonblock' boolean argument. This function is highly
- * portable.
- */
-static int setsocknonblock(ares_socket_t sockfd, /* operate on this */
- int nonblock /* TRUE or FALSE */)
-{
-#if defined(USE_BLOCKING_SOCKETS)
-
- return 0; /* returns success */
-#elif defined(HAVE_FCNTL_O_NONBLOCK)
-
- /* most recent unix versions */
- int flags;
- flags = fcntl(sockfd, F_GETFL, 0);
- if (FALSE != nonblock)
- return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
- else
- return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK)); /* LCOV_EXCL_LINE */
-
-#elif defined(HAVE_IOCTL_FIONBIO)
-
- /* older unix versions */
- int flags = nonblock ? 1 : 0;
- return ioctl(sockfd, FIONBIO, &flags);
-
-#elif defined(HAVE_IOCTLSOCKET_FIONBIO)
-
-#ifdef WATT32
- char flags = nonblock ? 1 : 0;
-#else
- /* Windows */
- unsigned long flags = nonblock ? 1UL : 0UL;
-#endif
- return ioctlsocket(sockfd, FIONBIO, &flags);
-
-#elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
-
- /* Amiga */
- long flags = nonblock ? 1L : 0L;
- return IoctlSocket(sockfd, FIONBIO, flags);
-
-#elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
-
- /* BeOS */
- long b = nonblock ? 1L : 0L;
- return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
-
-#else
-# error "no non-blocking method was found/used/set"
-#endif
-}
-
-#if defined(IPV6_V6ONLY) && defined(WIN32)
-/* It makes support for IPv4-mapped IPv6 addresses.
- * Linux kernel, NetBSD, FreeBSD and Darwin: default is off;
- * Windows Vista and later: default is on;
- * DragonFly BSD: acts like off, and dummy setting;
- * OpenBSD and earlier Windows: unsupported.
- * Linux: controlled by /proc/sys/net/ipv6/bindv6only.
- */
-static void set_ipv6_v6only(ares_socket_t sockfd, int on)
-{
- (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&on, sizeof(on));
-}
-#else
-#define set_ipv6_v6only(s,v)
-#endif
-
-static int configure_socket(ares_socket_t s, int family, ares_channel channel)
-{
- union {
- struct sockaddr sa;
- struct sockaddr_in sa4;
- struct sockaddr_in6 sa6;
- } local;
-
- /* do not set options for user-managed sockets */
- if (channel->sock_funcs && channel->sock_funcs->asocket)
- return 0;
-
- (void)setsocknonblock(s, TRUE);
-
-#if defined(FD_CLOEXEC) && !defined(MSDOS)
- /* Configure the socket fd as close-on-exec. */
- if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1)
- return -1; /* LCOV_EXCL_LINE */
-#endif
-
- /* Set the socket's send and receive buffer sizes. */
- if ((channel->socket_send_buffer_size > 0) &&
- setsockopt(s, SOL_SOCKET, SO_SNDBUF,
- (void *)&channel->socket_send_buffer_size,
- sizeof(channel->socket_send_buffer_size)) == -1)
- return -1;
-
- if ((channel->socket_receive_buffer_size > 0) &&
- setsockopt(s, SOL_SOCKET, SO_RCVBUF,
- (void *)&channel->socket_receive_buffer_size,
- sizeof(channel->socket_receive_buffer_size)) == -1)
- return -1;
-
-#ifdef SO_BINDTODEVICE
- if (channel->local_dev_name[0]) {
- 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;
+ if (query->node_queries_to_conn == NULL) {
+ end_query(channel, query, ARES_ENOMEM, NULL);
+ /* Only safe to kill connection if it was new, otherwise it should be
+ * cleaned up by another process later */
+ if (new_connection) {
+ ares__close_connection(conn);
}
- }
- else if (family == AF_INET6) {
- if (memcmp(channel->local_ip6, &ares_in6addr_any,
- sizeof(channel->local_ip6)) != 0) {
- memset(&local.sa6, 0, sizeof(local.sa6));
- local.sa6.sin6_family = AF_INET6;
- memcpy(&local.sa6.sin6_addr, channel->local_ip6,
- sizeof(channel->local_ip6));
- if (bind(s, &local.sa, sizeof(local.sa6)) < 0)
- return -1;
- }
- set_ipv6_v6only(s, 0);
+ return ARES_ENOMEM;
}
- return 0;
+ query->conn = conn;
+ conn->total_queries++;
+ return ARES_SUCCESS;
}
-static int open_socket(ares_channel channel, struct server_state *server,
- int is_tcp)
+static ares_bool_t same_questions(const ares_dns_record_t *qrec,
+ const ares_dns_record_t *arec)
{
- ares_socket_t s;
- int opt;
- ares_socklen_t salen;
- union {
- struct sockaddr_in sa4;
- struct sockaddr_in6 sa6;
- } saddr;
- struct sockaddr *sa;
- unsigned short port;
- struct server_connection *conn;
- ares__llist_node_t *node;
-
- if (is_tcp) {
- port = aresx_sitous(server->addr.tcp_port?
- server->addr.tcp_port:channel->tcp_port);
- } else {
- port = aresx_sitous(server->addr.udp_port?
- server->addr.udp_port:channel->udp_port);
- }
-
- 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;
- saddr.sa4.sin_port = 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;
- saddr.sa6.sin6_port = port;
- memcpy(&saddr.sa6.sin6_addr, &server->addr.addrV6,
- sizeof(server->addr.addrV6));
- break;
- default:
- return ARES_EBADFAMILY; /* LCOV_EXCL_LINE */
- }
+ size_t i;
+ ares_bool_t rv = ARES_FALSE;
- /* Acquire a socket. */
- s = ares__open_socket(channel, server->addr.family,
- is_tcp?SOCK_STREAM:SOCK_DGRAM, 0);
- if (s == ARES_SOCKET_BAD)
- return ARES_ECONNREFUSED;
- /* Configure it. */
- if (configure_socket(s, server->addr.family, channel) < 0) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
+ if (ares_dns_record_query_cnt(qrec) != ares_dns_record_query_cnt(arec)) {
+ goto done;
}
-#ifdef TCP_NODELAY
- if (is_tcp) {
- /*
- * Disable the Nagle algorithm (only relevant for TCP sockets, and thus not
- * in configure_socket). In general, in DNS lookups we're pretty much
- * interested in firing off a single request and then waiting for a reply,
- * so batching isn't very interesting.
- */
- opt = 1;
- if (!channel->sock_funcs || !channel->sock_funcs->asocket) {
- if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&opt, sizeof(opt))
- == -1) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
- }
+ for (i = 0; i < ares_dns_record_query_cnt(qrec); i++) {
+ const char *qname = NULL;
+ const char *aname = NULL;
+ ares_dns_rec_type_t qtype;
+ ares_dns_rec_type_t atype;
+ ares_dns_class_t qclass;
+ ares_dns_class_t aclass;
+
+ if (ares_dns_record_query_get(qrec, i, &qname, &qtype, &qclass) !=
+ ARES_SUCCESS ||
+ qname == NULL) {
+ goto done;
}
- }
-#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 ARES_ECONNREFUSED;
+ if (ares_dns_record_query_get(arec, i, &aname, &atype, &aclass) !=
+ ARES_SUCCESS ||
+ aname == NULL) {
+ goto done;
}
- }
-
- /* Connect to the server. */
- if (ares__connect_socket(channel, s, sa, salen) == -1) {
- int err = SOCKERRNO;
-
- if (err != EINPROGRESS && err != EWOULDBLOCK) {
- ares__close_socket(channel, s);
- return ARES_ECONNREFUSED;
+ if (strcasecmp(qname, aname) != 0 || qtype != atype || qclass != aclass) {
+ goto done;
}
}
- 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 ARES_ECONNREFUSED;
- }
- }
+ rv = ARES_TRUE;
- conn = ares_malloc(sizeof(*conn));
- if (conn == NULL) {
- ares__close_socket(channel, s);
- return ARES_ENOMEM;
- }
- memset(conn, 0, sizeof(*conn));
- conn->fd = s;
- conn->server = server;
- conn->queries_to_conn = ares__llist_create(NULL);
- conn->is_tcp = is_tcp;
- if (conn->queries_to_conn == NULL) {
- ares__close_socket(channel, s);
- ares_free(conn);
- return ARES_ENOMEM;
- }
-
- /* TCP connections are thrown to the end as we don't spawn multiple TCP
- * connections. UDP connections are put on front where the newest connection
- * can be quickly pulled */
- if (is_tcp) {
- node = ares__llist_insert_last(server->connections, conn);
- } else {
- node = ares__llist_insert_first(server->connections, conn);
- }
- if (node == NULL) {
- ares__close_socket(channel, s);
- ares__llist_destroy(conn->queries_to_conn);
- ares_free(conn);
- return ARES_ENOMEM;
- }
-
- /* Register globally to quickly map event on file descriptor to connection
- * node object */
- if (!ares__htable_asvp_insert(channel->connnode_by_socket, s, node)) {
- ares__close_socket(channel, s);
- ares__llist_destroy(conn->queries_to_conn);
- ares__llist_node_claim(node);
- ares_free(conn);
- return ARES_ENOMEM;
- }
-
- SOCK_STATE_CALLBACK(channel, s, 1, 0);
-
- if (is_tcp) {
- server->tcp_connection_generation = ++channel->tcp_connection_generation;
- server->tcp_conn = conn;
- }
-
- return ARES_SUCCESS;
+done:
+ return rv;
}
-
-static int same_questions(const unsigned char *qbuf, int qlen,
- const unsigned char *abuf, int alen)
+static ares_bool_t same_address(const struct sockaddr *sa,
+ const struct ares_addr *aa)
{
- 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;
+ const void *addr1;
+ const void *addr2;
+
+ if (sa->sa_family == aa->family) {
+ switch (aa->family) {
+ case AF_INET:
+ addr1 = &aa->addr.addr4;
+ addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr;
+ if (memcmp(addr1, addr2, sizeof(aa->addr.addr4)) == 0) {
+ return ARES_TRUE; /* match */
}
- 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);
+ break;
+ case AF_INET6:
+ addr1 = &aa->addr.addr6;
+ addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr;
+ if (memcmp(addr1, addr2, sizeof(aa->addr.addr6)) == 0) {
+ return ARES_TRUE; /* match */
}
-
- ares_free(q.name);
- if (j == a.qdcount)
- return 0;
+ break;
+ default:
+ break; /* LCOV_EXCL_LINE */
}
- return 1;
-}
-
-static int same_address(struct sockaddr *sa, struct ares_addr *aa)
-{
- void *addr1;
- void *addr2;
-
- if (sa->sa_family == aa->family)
- {
- switch (aa->family)
- {
- case AF_INET:
- addr1 = &aa->addrV4;
- addr2 = &(CARES_INADDR_CAST(struct sockaddr_in *, sa))->sin_addr;
- if (memcmp(addr1, addr2, sizeof(aa->addrV4)) == 0)
- return 1; /* match */
- break;
- case AF_INET6:
- addr1 = &aa->addrV6;
- addr2 = &(CARES_INADDR_CAST(struct sockaddr_in6 *, sa))->sin6_addr;
- if (memcmp(addr1, addr2, sizeof(aa->addrV6)) == 0)
- return 1; /* match */
- break;
- default:
- break; /* LCOV_EXCL_LINE */
- }
- }
- return 0; /* different */
-}
-
-/* search for an OPT RR in the response */
-static int has_opt_rr(const unsigned char *abuf, int alen)
-{
- unsigned int qdcount, ancount, nscount, arcount, i;
- const unsigned char *aptr;
- int status;
-
- if (alen < HFIXEDSZ)
- return -1;
-
- /* Parse the answer header. */
- qdcount = DNS_HEADER_QDCOUNT(abuf);
- ancount = DNS_HEADER_ANCOUNT(abuf);
- nscount = DNS_HEADER_NSCOUNT(abuf);
- arcount = DNS_HEADER_ARCOUNT(abuf);
-
- aptr = abuf + HFIXEDSZ;
-
- /* skip the questions */
- for (i = 0; i < qdcount; i++)
- {
- char* name;
- long len;
- status = ares_expand_name(aptr, abuf, alen, &name, &len);
- if (status != ARES_SUCCESS)
- return -1;
- ares_free_string(name);
- if (aptr + len + QFIXEDSZ > abuf + alen)
- return -1;
- aptr += len + QFIXEDSZ;
- }
-
- /* skip the ancount and nscount */
- for (i = 0; i < ancount + nscount; i++)
- {
- char* name;
- long len;
- int dlen;
- status = ares_expand_name(aptr, abuf, alen, &name, &len);
- if (status != ARES_SUCCESS)
- return -1;
- ares_free_string(name);
- if (aptr + len + RRFIXEDSZ > abuf + alen)
- return -1;
- aptr += len;
- dlen = DNS_RR_LEN(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + dlen > abuf + alen)
- return -1;
- aptr += dlen;
- }
-
- /* search for rr type (41) - opt */
- for (i = 0; i < arcount; i++)
- {
- char* name;
- long len;
- int dlen;
- status = ares_expand_name(aptr, abuf, alen, &name, &len);
- if (status != ARES_SUCCESS)
- return -1;
- ares_free_string(name);
- if (aptr + len + RRFIXEDSZ > abuf + alen)
- return -1;
- aptr += len;
-
- if (DNS_RR_TYPE(aptr) == T_OPT)
- return 1;
-
- dlen = DNS_RR_LEN(aptr);
- aptr += RRFIXEDSZ;
- if (aptr + dlen > abuf + alen)
- return -1;
- aptr += dlen;
- }
-
- return 0;
+ }
+ return ARES_FALSE; /* different */
}
static void ares_detach_query(struct query *query)
{
/* Remove the query from all the lists in which it is linked */
- ares__htable_stvp_remove(query->channel->queries_by_qid, query->qid);
+ ares__htable_szvp_remove(query->channel->queries_by_qid, query->qid);
ares__slist_node_destroy(query->node_queries_by_timeout);
ares__llist_node_destroy(query->node_queries_to_conn);
ares__llist_node_destroy(query->node_all_queries);
@@ -1426,20 +1196,19 @@ static void ares_detach_query(struct query *query)
query->node_all_queries = NULL;
}
-static void end_query(ares_channel channel, struct query *query, int status,
- const unsigned char *abuf, int alen)
+static void end_query(ares_channel_t *channel, struct query *query,
+ ares_status_t status, const ares_dns_record_t *dnsrec)
{
- (void)channel;
-
- ares_detach_query(query);
-
/* Invoke the callback. */
- query->callback(query->arg, status, query->timeouts,
- /* due to prior design flaws, abuf isn't meant to be modified,
- * but bad prototypes, ugh. Lets cast off constfor compat. */
- (unsigned char *)((void *)((size_t)abuf)),
- alen);
+ query->callback(query->arg, status, query->timeouts, dnsrec);
ares__free_query(query);
+
+ /* Check and notify if no other queries are enqueued on the channel. This
+ * must come after the callback and freeing the query for 2 reasons.
+ * 1) The callback itself may enqueue a new query
+ * 2) Technically the current query isn't detached until it is free()'d.
+ */
+ ares_queue_notify_empty(channel);
}
void ares__free_query(struct query *query)
@@ -1447,66 +1216,9 @@ void ares__free_query(struct query *query)
ares_detach_query(query);
/* Zero out some important stuff, to help catch bugs */
query->callback = NULL;
- query->arg = NULL;
+ 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 && channel->sock_funcs->asocket) {
- return channel->sock_funcs->asocket(af,
- type,
- protocol,
- channel->sock_func_cb_data);
- }
-
- return socket(af, type, protocol);
-}
-
-int ares__connect_socket(ares_channel channel,
- ares_socket_t sockfd,
- const struct sockaddr *addr,
- ares_socklen_t addrlen)
-{
- if (channel->sock_funcs && channel->sock_funcs->aconnect) {
- return channel->sock_funcs->aconnect(sockfd,
- addr,
- addrlen,
- channel->sock_func_cb_data);
- }
-
- return connect(sockfd, addr, addrlen);
-}
+ ares_free(query->qbuf);
-void ares__close_socket(ares_channel channel, ares_socket_t s)
-{
- if (channel->sock_funcs && channel->sock_funcs->aclose) {
- channel->sock_funcs->aclose(s, channel->sock_func_cb_data);
- } else {
- sclose(s);
- }
-}
-
-#ifndef HAVE_WRITEV
-/* Structure for scatter/gather I/O. */
-struct iovec
-{
- void *iov_base; /* Pointer to data. */
- size_t iov_len; /* Length of data. */
-};
-#endif
-
-static ares_ssize_t ares__socket_write(ares_channel channel, ares_socket_t s, const void * data, size_t len)
-{
- if (channel->sock_funcs && channel->sock_funcs->asendv) {
- struct iovec vec;
- vec.iov_base = (void*)data;
- vec.iov_len = len;
- return channel->sock_funcs->asendv(s, &vec, 1, channel->sock_func_cb_data);
- }
- return swrite(s, data, len);
+ ares_free(query);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_qcache.c b/contrib/libs/c-ares/src/lib/ares_qcache.c
new file mode 100644
index 0000000000..2af1125a0d
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_qcache.c
@@ -0,0 +1,444 @@
+/* MIT License
+ *
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+#include "ares.h"
+#include "ares_private.h"
+
+struct ares__qcache {
+ ares__htable_strvp_t *cache;
+ ares__slist_t *expire;
+ unsigned int max_ttl;
+};
+
+typedef struct {
+ char *key;
+ ares_dns_record_t *dnsrec;
+ time_t expire_ts;
+ time_t insert_ts;
+} ares__qcache_entry_t;
+
+static char *ares__qcache_calc_key(const ares_dns_record_t *dnsrec)
+{
+ ares__buf_t *buf = ares__buf_create();
+ size_t i;
+ ares_status_t status;
+ ares_dns_flags_t flags;
+
+ if (dnsrec == NULL || buf == NULL) {
+ return NULL;
+ }
+
+ /* Format is OPCODE|FLAGS[|QTYPE1|QCLASS1|QNAME1]... */
+
+ status = ares__buf_append_str(
+ buf, ares_dns_opcode_tostr(ares_dns_record_get_opcode(dnsrec)));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ flags = ares_dns_record_get_flags(dnsrec);
+ /* Only care about RD and CD */
+ if (flags & ARES_FLAG_RD) {
+ status = ares__buf_append_str(buf, "rd");
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+ if (flags & ARES_FLAG_CD) {
+ status = ares__buf_append_str(buf, "cd");
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ for (i = 0; i < ares_dns_record_query_cnt(dnsrec); i++) {
+ const char *name;
+ size_t name_len;
+ ares_dns_rec_type_t qtype;
+ ares_dns_class_t qclass;
+
+ status = ares_dns_record_query_get(dnsrec, i, &name, &qtype, &qclass);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_str(buf, ares_dns_rec_type_tostr(qtype));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_str(buf, ares_dns_class_tostr(qclass));
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares__buf_append_byte(buf, '|');
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* On queries, a '.' may be appended to the name to indicate an explicit
+ * name lookup without performing a search. Strip this since its not part
+ * of a cached response. */
+ name_len = ares_strlen(name);
+ if (name_len && name[name_len - 1] == '.') {
+ name_len--;
+ }
+
+ status = ares__buf_append(buf, (const unsigned char *)name, name_len);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+ }
+
+ return ares__buf_finish_str(buf, NULL);
+
+fail:
+ ares__buf_destroy(buf);
+ return NULL;
+}
+
+static void ares__qcache_expire(ares__qcache_t *cache,
+ const struct timeval *now)
+{
+ ares__slist_node_t *node;
+
+ if (cache == NULL) {
+ return;
+ }
+
+ while ((node = ares__slist_node_first(cache->expire)) != NULL) {
+ const ares__qcache_entry_t *entry = ares__slist_node_val(node);
+ if (entry->expire_ts > now->tv_sec) {
+ break;
+ }
+
+ ares__htable_strvp_remove(cache->cache, entry->key);
+ ares__slist_node_destroy(node);
+ }
+}
+
+void ares__qcache_flush(ares__qcache_t *cache)
+{
+ struct timeval now;
+ memset(&now, 0, sizeof(now));
+ ares__qcache_expire(cache, &now);
+}
+
+void ares__qcache_destroy(ares__qcache_t *cache)
+{
+ if (cache == NULL) {
+ return;
+ }
+
+ ares__htable_strvp_destroy(cache->cache);
+ ares__slist_destroy(cache->expire);
+ ares_free(cache);
+}
+
+static int ares__qcache_entry_sort_cb(const void *arg1, const void *arg2)
+{
+ const ares__qcache_entry_t *entry1 = arg1;
+ const ares__qcache_entry_t *entry2 = arg2;
+
+ if (entry1->expire_ts > entry2->expire_ts) {
+ return 1;
+ }
+
+ if (entry1->expire_ts < entry2->expire_ts) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static void ares__qcache_entry_destroy_cb(void *arg)
+{
+ ares__qcache_entry_t *entry = arg;
+ if (entry == NULL) {
+ return;
+ }
+
+ ares_free(entry->key);
+ ares_dns_record_destroy(entry->dnsrec);
+ ares_free(entry);
+}
+
+ares_status_t ares__qcache_create(ares_rand_state *rand_state,
+ unsigned int max_ttl,
+ ares__qcache_t **cache_out)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares__qcache_t *cache;
+
+ cache = ares_malloc_zero(sizeof(*cache));
+ if (cache == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cache->cache = ares__htable_strvp_create(NULL);
+ if (cache->cache == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cache->expire = ares__slist_create(rand_state, ares__qcache_entry_sort_cb,
+ ares__qcache_entry_destroy_cb);
+ if (cache->expire == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ cache->max_ttl = max_ttl;
+
+done:
+ if (status != ARES_SUCCESS) {
+ *cache_out = NULL;
+ ares__qcache_destroy(cache);
+ return status;
+ }
+
+ *cache_out = cache;
+ return status;
+}
+
+static unsigned int ares__qcache_calc_minttl(ares_dns_record_t *dnsrec)
+{
+ unsigned int minttl = 0xFFFFFFFF;
+ size_t sect;
+
+ for (sect = ARES_SECTION_ANSWER; sect <= ARES_SECTION_ADDITIONAL; sect++) {
+ size_t i;
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, (ares_dns_section_t)sect);
+ i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, (ares_dns_section_t)sect, i);
+ ares_dns_rec_type_t type = ares_dns_rr_get_type(rr);
+ unsigned int ttl = ares_dns_rr_get_ttl(rr);
+ if (type == ARES_REC_TYPE_OPT || type == ARES_REC_TYPE_SOA) {
+ continue;
+ }
+
+ if (ttl < minttl) {
+ minttl = ttl;
+ }
+ }
+ }
+
+ return minttl;
+}
+
+static unsigned int ares__qcache_soa_minimum(ares_dns_record_t *dnsrec)
+{
+ size_t i;
+
+ /* RFC 2308 Section 5 says its the minimum of MINIMUM and the TTL of the
+ * record. */
+ for (i = 0; i < ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_AUTHORITY); i++) {
+ const ares_dns_rr_t *rr =
+ ares_dns_record_rr_get(dnsrec, ARES_SECTION_AUTHORITY, i);
+ ares_dns_rec_type_t type = ares_dns_rr_get_type(rr);
+ unsigned int ttl;
+ unsigned int minimum;
+
+ if (type != ARES_REC_TYPE_SOA) {
+ continue;
+ }
+
+ minimum = ares_dns_rr_get_u32(rr, ARES_RR_SOA_MINIMUM);
+ ttl = ares_dns_rr_get_ttl(rr);
+
+ if (ttl > minimum) {
+ return minimum;
+ }
+ return ttl;
+ }
+
+ return 0;
+}
+
+static char *ares__qcache_calc_key_frombuf(const unsigned char *qbuf,
+ size_t qlen)
+{
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ char *key = NULL;
+
+ status = ares_dns_parse(qbuf, qlen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ key = ares__qcache_calc_key(dnsrec);
+
+done:
+ ares_dns_record_destroy(dnsrec);
+ return key;
+}
+
+/* On success, takes ownership of dnsrec */
+static ares_status_t ares__qcache_insert(ares__qcache_t *qcache,
+ ares_dns_record_t *dnsrec,
+ const unsigned char *qbuf, size_t qlen,
+ const struct timeval *now)
+{
+ ares__qcache_entry_t *entry;
+ unsigned int ttl;
+ ares_dns_rcode_t rcode = ares_dns_record_get_rcode(dnsrec);
+ ares_dns_flags_t flags = ares_dns_record_get_flags(dnsrec);
+
+ if (qcache == NULL || dnsrec == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Only save NOERROR or NXDOMAIN */
+ if (rcode != ARES_RCODE_NOERROR && rcode != ARES_RCODE_NXDOMAIN) {
+ return ARES_ENOTIMP;
+ }
+
+ /* Don't save truncated queries */
+ if (flags & ARES_FLAG_TC) {
+ return ARES_ENOTIMP;
+ }
+
+ /* Look at SOA for NXDOMAIN for minimum */
+ if (rcode == ARES_RCODE_NXDOMAIN) {
+ ttl = ares__qcache_soa_minimum(dnsrec);
+ } else {
+ ttl = ares__qcache_calc_minttl(dnsrec);
+ }
+
+ /* Don't cache something that is already expired */
+ if (ttl == 0) {
+ return ARES_EREFUSED;
+ }
+
+ if (ttl > qcache->max_ttl) {
+ ttl = qcache->max_ttl;
+ }
+
+ entry = ares_malloc_zero(sizeof(*entry));
+ if (entry == NULL) {
+ goto fail;
+ }
+
+ entry->dnsrec = dnsrec;
+ entry->expire_ts = now->tv_sec + (time_t)ttl;
+ entry->insert_ts = now->tv_sec;
+
+ /* We can't guarantee the server responded with the same flags as the
+ * request had, so we have to re-parse the request in order to generate the
+ * key for caching, but we'll only do this once we know for sure we really
+ * want to cache it */
+ entry->key = ares__qcache_calc_key_frombuf(qbuf, qlen);
+ if (entry->key == NULL) {
+ goto fail;
+ }
+
+ if (!ares__htable_strvp_insert(qcache->cache, entry->key, entry)) {
+ goto fail;
+ }
+
+ if (ares__slist_insert(qcache->expire, entry) == NULL) {
+ goto fail;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ if (entry != NULL && entry->key != NULL) {
+ ares__htable_strvp_remove(qcache->cache, entry->key);
+ ares_free(entry->key);
+ ares_free(entry);
+ }
+ return ARES_ENOMEM;
+}
+
+ares_status_t ares_qcache_fetch(ares_channel_t *channel,
+ const struct timeval *now,
+ const ares_dns_record_t *dnsrec,
+ const ares_dns_record_t **dnsrec_resp)
+{
+ char *key = NULL;
+ ares__qcache_entry_t *entry;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (channel == NULL || dnsrec == NULL || dnsrec_resp == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (channel->qcache == NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ ares__qcache_expire(channel->qcache, now);
+
+ key = ares__qcache_calc_key(dnsrec);
+ if (key == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ entry = ares__htable_strvp_get_direct(channel->qcache->cache, key);
+ if (entry == NULL) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ ares_dns_record_write_ttl_decrement(
+ entry->dnsrec, (unsigned int)(now->tv_sec - entry->insert_ts));
+
+ *dnsrec_resp = entry->dnsrec;
+
+done:
+ ares_free(key);
+ return status;
+}
+
+ares_status_t ares_qcache_insert(ares_channel_t *channel,
+ const struct timeval *now,
+ const struct query *query,
+ ares_dns_record_t *dnsrec)
+{
+ return ares__qcache_insert(channel->qcache, dnsrec, query->qbuf, query->qlen,
+ now);
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_query.c b/contrib/libs/c-ares/src/lib/ares_query.c
index 04521d1c85..0eea80e7fc 100644
--- a/contrib/libs/c-ares/src/lib/ares_query.c
+++ b/contrib/libs/c-ares/src/lib/ares_query.c
@@ -37,115 +37,116 @@
#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);
-
-
-/* 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)
+typedef struct {
+ ares_callback_dnsrec callback;
+ void *arg;
+} ares_query_dnsrec_arg_t;
+
+static void ares_query_dnsrec_cb(void *arg, ares_status_t status,
+ size_t timeouts,
+ const ares_dns_record_t *dnsrec)
{
- unsigned short id;
-
- do {
- id = ares__generate_new_id(channel->rand_state);
- } while (ares__htable_stvp_get(channel->queries_by_qid, id, NULL));
-
- return (unsigned short)id;
+ ares_query_dnsrec_arg_t *qquery = arg;
+
+ if (status != ARES_SUCCESS) {
+ qquery->callback(qquery->arg, status, timeouts, dnsrec);
+ } else {
+ size_t ancount;
+ ares_dns_rcode_t rcode;
+ /* Pull the response code and answer count from the packet and convert any
+ * errors.
+ */
+ rcode = ares_dns_record_get_rcode(dnsrec);
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ status = ares_dns_query_reply_tostatus(rcode, ancount);
+ qquery->callback(qquery->arg, status, timeouts, dnsrec);
+ }
+ ares_free(qquery);
}
-int ares_query_qid(ares_channel channel, const char *name,
- int dnsclass, int type, ares_callback callback,
- void *arg, unsigned short *qid)
+static ares_status_t ares_query_int(ares_channel_t *channel, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
{
- struct qquery *qquery;
- unsigned char *qbuf;
- int qlen, rd, status;
- unsigned short id = generate_unique_id(channel);
-
- /* Compose the query. */
- rd = !(channel->flags & ARES_FLAG_NORECURSE);
- status = ares_create_query(name, dnsclass, type, 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 status;
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ ares_dns_flags_t flags = 0;
+ ares_query_dnsrec_arg_t *qquery = NULL;
+
+ if (channel == NULL || name == NULL || callback == NULL) {
+ status = ARES_EFORMERR;
+ if (callback != NULL) {
+ callback(arg, status, 0, NULL);
}
+ return status;
+ }
+
+ if (!(channel->flags & ARES_FLAG_NORECURSE)) {
+ flags |= ARES_FLAG_RD;
+ }
+
+ status = ares_dns_record_create_query(
+ &dnsrec, name, dnsclass, type, 0, flags,
+ (size_t)(channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0);
+ if (status != ARES_SUCCESS) {
+ callback(arg, status, 0, NULL);
+ return status;
+ }
+
+ qquery = ares_malloc(sizeof(*qquery));
+ if (qquery == NULL) {
+ status = ARES_ENOMEM;
+ callback(arg, status, 0, NULL);
+ ares_dns_record_destroy(dnsrec);
+ return status;
+ }
- /* Allocate and fill in the query structure. */
- qquery = ares_malloc(sizeof(struct qquery));
- if (!qquery)
- {
- ares_free_string(qbuf);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
qquery->callback = callback;
- qquery->arg = arg;
+ qquery->arg = arg;
/* Send it off. qcallback will be called when we get an answer. */
- status = ares_send_ex(channel, qbuf, qlen, qcallback, qquery);
- ares_free_string(qbuf);
+ status = ares_send_dnsrec(channel, dnsrec, ares_query_dnsrec_cb, qquery, qid);
- if (status == ARES_SUCCESS && qid)
- *qid = id;
+ ares_dns_record_destroy(dnsrec);
+ return status;
+}
+ares_status_t ares_query_dnsrec(ares_channel_t *channel, const char *name,
+ ares_dns_class_t dnsclass,
+ ares_dns_rec_type_t type,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
+{
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+ status = ares_query_int(channel, name, dnsclass, type, callback, arg, qid);
+ ares__channel_unlock(channel);
return status;
}
-void ares_query(ares_channel channel, const char *name, int dnsclass,
+void ares_query(ares_channel_t *channel, const char *name, int dnsclass,
int type, ares_callback callback, void *arg)
{
- ares_query_qid(channel, name, dnsclass, type, callback, arg, NULL);
-}
+ void *carg = NULL;
+ if (channel == NULL) {
+ return;
+ }
-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);
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ return;
+ }
+
+ ares_query_dnsrec(channel, name, (ares_dns_class_t)dnsclass,
+ (ares_dns_rec_type_t)type, ares__dnsrec_convert_cb, carg,
+ NULL);
}
diff --git a/contrib/libs/c-ares/src/lib/ares_rand.c b/contrib/libs/c-ares/src/lib/ares_rand.c
index 99a5a04cff..a7a74c9a8d 100644
--- a/contrib/libs/c-ares/src/lib/ares_rand.c
+++ b/contrib/libs/c-ares/src/lib/ares_rand.c
@@ -27,65 +27,58 @@
#include "ares_setup.h"
#include "ares.h"
#include "ares_private.h"
-#include "ares_nowarn.h"
#include <stdlib.h>
-#if !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_GETRANDOM) && !defined(_WIN32)
-# define ARES_NEEDS_RC4 1
+/* Older MacOS versions require including AvailabilityMacros.h before
+ * sys/random.h */
+#ifdef HAVE_AVAILABILITYMACROS_H
+# include <AvailabilityMacros.h>
#endif
-typedef enum {
- ARES_RAND_OS = 1, /* OS-provided such as RtlGenRandom or arc4random */
- ARES_RAND_FILE = 2, /* OS file-backed random number generator */
-#ifdef ARES_NEEDS_RC4
- ARES_RAND_RC4 = 3 /* Internal RC4 based PRNG */
+#ifdef HAVE_SYS_RANDOM_H
+# include <sys/random.h>
#endif
-} ares_rand_backend;
-/* Don't build RC4 code if it goes unused as it will generate dead code
- * warnings */
-#ifdef ARES_NEEDS_RC4
-# define ARES_RC4_KEY_LEN 32 /* 256 bits */
+typedef enum {
+ ARES_RAND_OS = 1 << 0, /* OS-provided such as RtlGenRandom or arc4random */
+ ARES_RAND_FILE = 1 << 1, /* OS file-backed random number generator */
+ ARES_RAND_RC4 = 1 << 2, /* Internal RC4 based PRNG */
+} ares_rand_backend;
-typedef struct ares_rand_rc4
-{
+#define ARES_RC4_KEY_LEN 32 /* 256 bits */
+
+typedef struct ares_rand_rc4 {
unsigned char S[256];
size_t i;
size_t j;
} ares_rand_rc4;
-
-#ifdef _MSC_VER
-typedef unsigned __int64 cares_u64;
-#else
-typedef unsigned long long cares_u64;
-#endif
-
-
static unsigned int ares_u32_from_ptr(void *addr)
{
- if (sizeof(void *) == 8) {
- return (unsigned int)((((cares_u64)addr >> 32) & 0xFFFFFFFF) | ((cares_u64)addr & 0xFFFFFFFF));
- }
- return (unsigned int)((size_t)addr & 0xFFFFFFFF);
+ if (sizeof(void *) == 8) {
+ return (unsigned int)((((ares_uint64_t)addr >> 32) & 0xFFFFFFFF) |
+ ((ares_uint64_t)addr & 0xFFFFFFFF));
+ }
+ return (unsigned int)((size_t)addr & 0xFFFFFFFF);
}
-
/* initialize an rc4 key as the last possible fallback. */
-static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key, size_t key_len)
+static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key,
+ size_t key_len)
{
size_t i;
size_t len = 0;
unsigned int data;
struct timeval tv;
- if (key_len != ARES_RC4_KEY_LEN)
+ if (key_len != ARES_RC4_KEY_LEN) {
return;
+ }
- /* Randomness is hard to come by. Maybe the system randomizes heap and stack addresses.
- * Maybe the current timestamp give us some randomness.
- * Use rc4_state (heap), &i (stack), and ares__tvnow()
+ /* Randomness is hard to come by. Maybe the system randomizes heap and stack
+ * addresses. Maybe the current timestamp give us some randomness. Use
+ * rc4_state (heap), &i (stack), and ares__tvnow()
*/
data = ares_u32_from_ptr(rc4_state);
memcpy(key + len, &data, sizeof(data));
@@ -95,19 +88,19 @@ static void ares_rc4_generate_key(ares_rand_rc4 *rc4_state, unsigned char *key,
memcpy(key + len, &data, sizeof(data));
len += sizeof(data);
- tv = ares__tvnow();
+ tv = ares__tvnow();
data = (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF);
memcpy(key + len, &data, sizeof(data));
len += sizeof(data);
- srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) | (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF));
+ srand(ares_u32_from_ptr(rc4_state) | ares_u32_from_ptr(&i) |
+ (unsigned int)((tv.tv_sec | tv.tv_usec) & 0xFFFFFFFF));
- for (i=len; i<key_len; i++) {
- key[i]=(unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */
+ for (i = len; i < key_len; i++) {
+ key[i] = (unsigned char)(rand() % 256); /* LCOV_EXCL_LINE */
}
}
-
static void ares_rc4_init(ares_rand_rc4 *rc4_state)
{
unsigned char key[ARES_RC4_KEY_LEN];
@@ -120,7 +113,7 @@ static void ares_rc4_init(ares_rand_rc4 *rc4_state)
rc4_state->S[i] = i & 0xFF;
}
- for(i = 0, j = 0; i < 256; i++) {
+ for (i = 0, j = 0; i < 256; i++) {
j = (j + rc4_state->S[i] + key[i % sizeof(key)]) % 256;
ARES_SWAP_BYTE(&rc4_state->S[i], &rc4_state->S[j]);
}
@@ -129,16 +122,17 @@ static void ares_rc4_init(ares_rand_rc4 *rc4_state)
rc4_state->j = 0;
}
-
-/* Just outputs the key schedule, no need to XOR with any data since we have none */
-static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, size_t len)
+/* Just outputs the key schedule, no need to XOR with any data since we have
+ * none */
+static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf,
+ size_t len)
{
unsigned char *S = rc4_state->S;
size_t i = rc4_state->i;
size_t j = rc4_state->j;
size_t cnt;
- for (cnt=0; cnt<len; cnt++) {
+ for (cnt = 0; cnt < len; cnt++) {
i = (i + 1) % 256;
j = (j + S[i]) % 256;
@@ -150,17 +144,13 @@ static void ares_rc4_prng(ares_rand_rc4 *rc4_state, unsigned char *buf, size_t l
rc4_state->j = j;
}
-#endif /* ARES_NEEDS_RC4 */
-
-
-struct ares_rand_state
-{
+struct ares_rand_state {
ares_rand_backend type;
+ ares_rand_backend bad_backends;
+
union {
- FILE *rand_file;
-#ifdef ARES_NEEDS_RC4
+ FILE *rand_file;
ares_rand_rc4 rc4;
-#endif
} state;
/* Since except for RC4, random data will likely result in a syscall, lets
@@ -168,11 +158,10 @@ struct ares_rand_state
* that means we should only need a syscall every 128 queries. 256bytes
* appears to be a sweet spot that may be able to be served without
* interruption */
- unsigned char cache[256];
- size_t cache_remaining;
+ unsigned char cache[256];
+ size_t cache_remaining;
};
-
/* Define RtlGenRandom = SystemFunction036. This is in advapi32.dll. There is
* no need to dynamically load this, other software used widely does not.
* http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx
@@ -181,45 +170,49 @@ struct ares_rand_state
#ifdef _WIN32
BOOLEAN WINAPI SystemFunction036(PVOID RandomBuffer, ULONG RandomBufferLength);
# ifndef RtlGenRandom
-# define RtlGenRandom(a,b) SystemFunction036(a,b)
+# define RtlGenRandom(a, b) SystemFunction036(a, b)
# endif
#endif
-static int ares__init_rand_engine(ares_rand_state *state)
+static ares_bool_t ares__init_rand_engine(ares_rand_state *state)
{
- memset(state, 0, sizeof(*state));
+ state->cache_remaining = 0;
#if defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_GETRANDOM) || defined(_WIN32)
- state->type = ARES_RAND_OS;
- return 1;
-#elif defined(CARES_RANDOM_FILE)
- state->type = ARES_RAND_FILE;
- state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb");
- if (state->state.rand_file) {
- setvbuf(state->state.rand_file, NULL, _IONBF, 0);
- return 1;
+ if (!(state->bad_backends & ARES_RAND_OS)) {
+ state->type = ARES_RAND_OS;
+ return ARES_TRUE;
+ }
+#endif
+
+#if defined(CARES_RANDOM_FILE)
+ if (!(state->bad_backends & ARES_RAND_FILE)) {
+ state->type = ARES_RAND_FILE;
+ state->state.rand_file = fopen(CARES_RANDOM_FILE, "rb");
+ if (state->state.rand_file) {
+ setvbuf(state->state.rand_file, NULL, _IONBF, 0);
+ return ARES_TRUE;
+ }
}
/* Fall-Thru on failure to RC4 */
#endif
-#ifdef ARES_NEEDS_RC4
state->type = ARES_RAND_RC4;
ares_rc4_init(&state->state.rc4);
/* Currently cannot fail */
- return 1;
-#endif
+ return ARES_TRUE;
}
-
ares_rand_state *ares__init_rand_state(void)
{
ares_rand_state *state = NULL;
- state = ares_malloc(sizeof(*state));
- if (!state)
+ state = ares_malloc_zero(sizeof(*state));
+ if (!state) {
return NULL;
+ }
if (!ares__init_rand_engine(state)) {
ares_free(state);
@@ -229,11 +222,11 @@ ares_rand_state *ares__init_rand_state(void)
return state;
}
-
static void ares__clear_rand_state(ares_rand_state *state)
{
- if (!state)
+ if (!state) {
return;
+ }
switch (state->type) {
case ARES_RAND_OS:
@@ -241,59 +234,61 @@ static void ares__clear_rand_state(ares_rand_state *state)
case ARES_RAND_FILE:
fclose(state->state.rand_file);
break;
-#ifdef ARES_NEEDS_RC4
case ARES_RAND_RC4:
break;
-#endif
}
}
-
static void ares__reinit_rand(ares_rand_state *state)
{
ares__clear_rand_state(state);
ares__init_rand_engine(state);
}
-
void ares__destroy_rand_state(ares_rand_state *state)
{
- if (!state)
+ if (!state) {
return;
+ }
ares__clear_rand_state(state);
ares_free(state);
}
-
static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf,
size_t len)
{
-
while (1) {
size_t bytes_read = 0;
switch (state->type) {
case ARES_RAND_OS:
#ifdef _WIN32
- RtlGenRandom(buf, len);
+ RtlGenRandom(buf, (ULONG)len);
return;
#elif defined(HAVE_ARC4RANDOM_BUF)
arc4random_buf(buf, len);
return;
#elif defined(HAVE_GETRANDOM)
while (1) {
- size_t n = len - bytes_read;
+ size_t n = len - bytes_read;
/* getrandom() on Linux always succeeds and is never
* interrupted by a signal when requesting <= 256 bytes.
*/
ssize_t rv = getrandom(buf + bytes_read, n > 256 ? 256 : n, 0);
- if (rv <= 0)
+ if (rv <= 0) {
+ /* We need to fall back to another backend */
+ if (errno == ENOSYS) {
+ state->bad_backends |= ARES_RAND_OS;
+ break;
+ }
continue; /* Just retry. */
+ }
- bytes_read += rv;
- if (bytes_read == len)
+ bytes_read += (size_t)rv;
+ if (bytes_read == len) {
return;
+ }
}
break;
#else
@@ -303,21 +298,22 @@ static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf,
case ARES_RAND_FILE:
while (1) {
- size_t rv = fread(buf + bytes_read, 1, len - bytes_read, state->state.rand_file);
- if (rv == 0)
+ size_t rv = fread(buf + bytes_read, 1, len - bytes_read,
+ state->state.rand_file);
+ if (rv == 0) {
break; /* critical error, will reinit rand state */
+ }
bytes_read += rv;
- if (bytes_read == len)
+ if (bytes_read == len) {
return;
+ }
}
break;
-#ifdef ARES_NEEDS_RC4
case ARES_RAND_RC4:
ares_rc4_prng(&state->state.rc4, buf, len);
return;
-#endif
}
/* If we didn't return before we got here, that means we had a critical rand
@@ -326,7 +322,6 @@ static void ares__rand_bytes_fetch(ares_rand_state *state, unsigned char *buf,
}
}
-
void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len)
{
/* See if we need to refill the cache to serve the request, but if len is
@@ -349,12 +344,10 @@ void ares__rand_bytes(ares_rand_state *state, unsigned char *buf, size_t len)
ares__rand_bytes_fetch(state, buf, len);
}
-
unsigned short ares__generate_new_id(ares_rand_state *state)
{
- unsigned short r=0;
+ unsigned short r = 0;
ares__rand_bytes(state, (unsigned char *)&r, sizeof(r));
return r;
}
-
diff --git a/contrib/libs/c-ares/src/lib/ares_search.c b/contrib/libs/c-ares/src/lib/ares_search.c
index d72b4c444e..4fd909cd4f 100644
--- a/contrib/libs/c-ares/src/lib/ares_search.c
+++ b/contrib/libs/c-ares/src/lib/ares_search.c
@@ -33,208 +33,454 @@
#include "ares.h"
#include "ares_private.h"
+#include "ares_dns.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;
+ /* Arguments passed to ares_search_dnsrec() */
+ ares_channel_t *channel;
+ ares_callback_dnsrec callback;
+ void *arg;
+
+ /* Duplicate of DNS record passed to ares_search_dnsrec() */
+ ares_dns_record_t *dnsrec;
+
+ /* Search order for names */
+ char **names;
+ size_t names_cnt;
- 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? */
+ /* State tracking progress through the search query */
+ size_t next_name_idx; /* next name index being attempted */
+ size_t timeouts; /* number of timeouts we saw for this request */
+ ares_bool_t ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */
};
-static void search_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen);
-static void end_squery(struct search_query *squery, int status,
- unsigned char *abuf, int alen);
+static void squery_free(struct search_query *squery)
+{
+ if (squery == NULL) {
+ return;
+ }
+ ares__strsplit_free(squery->names, squery->names_cnt);
+ ares_dns_record_destroy(squery->dnsrec);
+ ares_free(squery);
+}
-void ares_search(ares_channel channel, const char *name, int dnsclass,
- int type, ares_callback callback, void *arg)
+/* End a search query by invoking the user callback and freeing the
+ * search_query structure.
+ */
+static void end_squery(struct search_query *squery, ares_status_t status,
+ const ares_dns_record_t *dnsrec)
+{
+ squery->callback(squery->arg, status, squery->timeouts, dnsrec);
+ squery_free(squery);
+}
+
+static void search_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec);
+
+static ares_status_t ares_search_next(ares_channel_t *channel,
+ struct search_query *squery,
+ ares_bool_t *skip_cleanup)
{
- struct search_query *squery;
- char *s;
- const char *p;
- int status, ndots;
+ ares_status_t status;
- /* 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;
- }
+ *skip_cleanup = ARES_FALSE;
+
+ /* Misuse check */
+ if (squery->next_name_idx >= squery->names_cnt) {
+ return ARES_EFORMERR;
+ }
+
+ status = ares_dns_record_query_set_name(
+ squery->dnsrec, 0, squery->names[squery->next_name_idx++]);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ status =
+ ares_send_dnsrec(channel, squery->dnsrec, search_callback, squery, NULL);
- /* If name only yields one domain to search, then we don't have
- * to keep extra state, so just do an ares_query().
+ if (status != ARES_EFORMERR) {
+ *skip_cleanup = ARES_TRUE;
+ }
+
+ return status;
+}
+
+static void search_callback(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
+{
+ struct search_query *squery = (struct search_query *)arg;
+ ares_channel_t *channel = squery->channel;
+ ares_dns_rcode_t rcode;
+ size_t ancount;
+ ares_status_t mystatus;
+ ares_bool_t skip_cleanup = ARES_FALSE;
+
+ squery->timeouts += timeouts;
+
+ if (status != ARES_SUCCESS) {
+ end_squery(squery, status, dnsrec);
+ return;
+ }
+
+ rcode = ares_dns_record_get_rcode(dnsrec);
+ ancount = ares_dns_record_rr_cnt(dnsrec, ARES_SECTION_ANSWER);
+ mystatus = ares_dns_query_reply_tostatus(rcode, ancount);
+
+ if (mystatus != ARES_ENODATA && mystatus != ARES_ESERVFAIL &&
+ mystatus != ARES_ENOTFOUND) {
+ end_squery(squery, mystatus, dnsrec);
+ return;
+ }
+
+ /* 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.
*/
- status = ares__single_domain(channel, name, &s);
- if (status != ARES_SUCCESS)
- {
- callback(arg, status, 0, NULL, 0);
- return;
+ if (mystatus == ARES_ENODATA) {
+ squery->ever_got_nodata = ARES_TRUE;
+ }
+
+ if (squery->next_name_idx < squery->names_cnt) {
+ mystatus = ares_search_next(channel, squery, &skip_cleanup);
+ if (mystatus != ARES_SUCCESS && !skip_cleanup) {
+ end_squery(squery, mystatus, NULL);
}
- if (s)
- {
- ares_query(channel, s, dnsclass, type, callback, arg);
- ares_free(s);
- return;
+ return;
+ }
+
+
+ /* We have no more domains to search, return an appropriate response. */
+ if (mystatus == ARES_ENOTFOUND && squery->ever_got_nodata) {
+ end_squery(squery, ARES_ENODATA, NULL);
+ return;
+ }
+
+ end_squery(squery, mystatus, NULL);
+}
+
+/* Determine if the domain should be looked up as-is, or if it is eligible
+ * for search by appending domains */
+static ares_bool_t ares__search_eligible(const ares_channel_t *channel,
+ const char *name)
+{
+ size_t len = ares_strlen(name);
+
+ /* Name ends in '.', cannot search */
+ if (len && name[len - 1] == '.') {
+ return ARES_FALSE;
+ }
+
+ if (channel->flags & ARES_FLAG_NOSEARCH) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+ares_status_t ares__search_name_list(const ares_channel_t *channel,
+ const char *name, char ***names,
+ size_t *names_len)
+{
+ ares_status_t status;
+ char **list = NULL;
+ size_t list_len = 0;
+ char *alias = NULL;
+ size_t ndots = 0;
+ size_t idx = 0;
+ const char *p;
+ size_t i;
+
+ /* Perform HOSTALIASES resolution */
+ status = ares__lookup_hostaliases(channel, name, &alias);
+ if (status == ARES_SUCCESS) {
+ /* If hostalias succeeds, there is no searching, it is used as-is */
+ list_len = 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ list[0] = alias;
+ alias = NULL;
+ goto done;
+ } else if (status != ARES_ENOTFOUND) {
+ goto done;
+ }
- /* 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;
+ /* See if searching is eligible at all, if not, look up as-is only */
+ if (!ares__search_eligible(channel, name)) {
+ list_len = 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
- squery->channel = channel;
- squery->name = ares_strdup(name);
- if (!squery->name)
- {
- ares_free(squery);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return;
+ list[0] = ares_strdup(name);
+ if (list[0] == NULL) {
+ status = ARES_ENOMEM;
+ } else {
+ status = ARES_SUCCESS;
}
- 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. */
+ goto done;
+ }
+
+ /* Count the number of dots in name */
ndots = 0;
- for (p = name; *p; p++)
- {
- if (*p == '.')
- ndots++;
+ for (p = name; *p != 0; p++) {
+ if (*p == '.') {
+ ndots++;
+ }
+ }
+
+ /* Allocate an entry for each search domain, plus one for as-is */
+ list_len = channel->ndomains + 1;
+ list = ares_malloc_zero(sizeof(*list) * list_len);
+ if (list == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Set status here, its possible there are no search domains at all, so
+ * status may be ARES_ENOTFOUND from ares__lookup_hostaliases(). */
+ status = ARES_SUCCESS;
+
+ /* Try as-is first */
+ if (ndots >= channel->ndots) {
+ list[idx] = ares_strdup(name);
+ if (list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ idx++;
+ }
- /* 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);
+ /* Append each search suffix to the name */
+ for (i = 0; i < channel->ndomains; i++) {
+ status = ares__cat_domain(name, channel->domains[i], &list[idx]);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
- 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);
- }
+ idx++;
+ }
+
+ /* Try as-is last */
+ if (ndots < channel->ndots) {
+ list[idx] = ares_strdup(name);
+ if (list[idx] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
}
+ idx++;
+ }
+
+
+done:
+ if (status == ARES_SUCCESS) {
+ *names = list;
+ *names_len = list_len;
+ } else {
+ ares__strsplit_free(list, list_len);
+ }
+
+ ares_free(alias);
+ return status;
}
-static void search_callback(void *arg, int status, int timeouts,
- unsigned char *abuf, int alen)
+static ares_status_t ares_search_int(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg)
{
- struct search_query *squery = (struct search_query *) arg;
- ares_channel channel = squery->channel;
- char *s;
+ struct search_query *squery = NULL;
+ const char *name;
+ ares_status_t status = ARES_SUCCESS;
+ ares_bool_t skip_cleanup = ARES_FALSE;
- squery->timeouts += timeouts;
+ /* Extract the name for the search. Note that searches are only supported for
+ * DNS records containing a single query.
+ */
+ if (ares_dns_record_query_cnt(dnsrec) != 1) {
+ status = ARES_EBADQUERY;
+ goto fail;
+ }
+
+ status = ares_dns_record_query_get(dnsrec, 0, &name, NULL, NULL);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ /* Per RFC 7686, reject queries for ".onion" domain names with NXDOMAIN. */
+ if (ares__is_onion_domain(name)) {
+ status = ARES_ENOTFOUND;
+ goto fail;
+ }
+
+ /* Allocate a search_query structure to hold the state necessary for
+ * doing multiple lookups.
+ */
+ squery = ares_malloc_zero(sizeof(*squery));
+ if (squery == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ squery->channel = channel;
+
+ /* Duplicate DNS record since, name will need to be rewritten */
+ squery->dnsrec = ares_dns_record_duplicate(dnsrec);
+ if (squery->dnsrec == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ squery->callback = callback;
+ squery->arg = arg;
+ squery->timeouts = 0;
+ squery->ever_got_nodata = ARES_FALSE;
+
+ status =
+ ares__search_name_list(channel, name, &squery->names, &squery->names_cnt);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ status = ares_search_next(channel, squery, &skip_cleanup);
+ if (status != ARES_SUCCESS) {
+ goto fail;
+ }
+
+ return status;
+
+fail:
+ if (!skip_cleanup) {
+ squery_free(squery);
+ callback(arg, status, 0, NULL);
+ }
+ return status;
+}
- /* 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);
- }
+/* Callback argument structure passed to ares__dnsrec_convert_cb(). */
+typedef struct {
+ ares_callback callback;
+ void *arg;
+} dnsrec_convert_arg_t;
+
+/*! Function to create callback arg for converting from ares_callback_dnsrec
+ * to ares_calback */
+void *ares__dnsrec_convert_arg(ares_callback callback, void *arg)
+{
+ dnsrec_convert_arg_t *carg = ares_malloc_zero(sizeof(*carg));
+ if (carg == NULL) {
+ return NULL;
+ }
+ carg->callback = callback;
+ carg->arg = arg;
+ return carg;
+}
+
+/*! Callback function used to convert from the ares_callback_dnsrec prototype to
+ * the ares_callback prototype, by writing the result and passing that to
+ * the inner callback.
+ */
+void ares__dnsrec_convert_cb(void *arg, ares_status_t status, size_t timeouts,
+ const ares_dns_record_t *dnsrec)
+{
+ dnsrec_convert_arg_t *carg = arg;
+ unsigned char *abuf = NULL;
+ size_t alen = 0;
+
+ if (dnsrec != NULL) {
+ ares_status_t mystatus = ares_dns_write(dnsrec, &abuf, &alen);
+ if (mystatus != ARES_SUCCESS) {
+ status = mystatus;
}
+ }
+
+ carg->callback(carg->arg, (int)status, (int)timeouts, abuf, (int)alen);
+
+ ares_free(abuf);
+ ares_free(carg);
}
-static void end_squery(struct search_query *squery, int status,
- unsigned char *abuf, int alen)
+/* Search for a DNS name with given class and type. Wrapper around
+ * ares_search_int() where the DNS record to search is first constructed.
+ */
+void ares_search(ares_channel_t *channel, const char *name, int dnsclass,
+ int type, ares_callback callback, void *arg)
{
- squery->callback(squery->arg, status, squery->timeouts, abuf, alen);
- ares_free(squery->name);
- ares_free(squery);
+ ares_status_t status;
+ ares_dns_record_t *dnsrec = NULL;
+ size_t max_udp_size;
+ ares_dns_flags_t rd_flag;
+ void *carg = NULL;
+ if (channel == NULL || name == NULL) {
+ return;
+ }
+
+ /* For now, ares_search_int() uses the ares_callback prototype. We need to
+ * wrap the callback passed to this function in ares__dnsrec_convert_cb, to
+ * convert from ares_callback_dnsrec to ares_callback. Allocate the convert
+ * arg structure here.
+ */
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ return;
+ }
+
+ rd_flag = !(channel->flags & ARES_FLAG_NORECURSE) ? ARES_FLAG_RD : 0;
+ max_udp_size = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : 0;
+ status = ares_dns_record_create_query(
+ &dnsrec, name, (ares_dns_class_t)dnsclass, (ares_dns_rec_type_t)type, 0,
+ rd_flag, max_udp_size);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL, 0);
+ ares_free(carg);
+ return;
+ }
+
+ ares__channel_lock(channel);
+ ares_search_int(channel, dnsrec, ares__dnsrec_convert_cb, carg);
+ ares__channel_unlock(channel);
+
+ ares_dns_record_destroy(dnsrec);
+}
+
+/* Search for a DNS record. Wrapper around ares_search_int(). */
+ares_status_t ares_search_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg)
+{
+ ares_status_t status;
+
+ if (channel == NULL || dnsrec == NULL || callback == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+ status = ares_search_int(channel, dnsrec, callback, arg);
+ ares__channel_unlock(channel);
+
+ return status;
}
/* Concatenate two domains. */
-int ares__cat_domain(const char *name, const char *domain, char **s)
+ares_status_t ares__cat_domain(const char *name, const char *domain, char **s)
{
- size_t nlen = strlen(name);
- size_t dlen = strlen(domain);
+ size_t nlen = ares_strlen(name);
+ size_t dlen = ares_strlen(domain);
*s = ares_malloc(nlen + 1 + dlen + 1);
- if (!*s)
+ if (!*s) {
return ARES_ENOMEM;
+ }
memcpy(*s, name, nlen);
(*s)[nlen] = '.';
if (strcmp(domain, ".") == 0) {
/* Avoid appending the root domain to the separator, which would set *s to
- an ill-formed value (ending in two consequtive dots). */
+ an ill-formed value (ending in two consecutive dots). */
dlen = 0;
}
memcpy(*s + nlen + 1, domain, dlen);
@@ -242,96 +488,113 @@ int ares__cat_domain(const char *name, const char *domain, char **s)
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)
+ares_status_t ares__lookup_hostaliases(const ares_channel_t *channel,
+ const char *name, char **alias)
{
- 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.
+ ares_status_t status = ARES_SUCCESS;
+ const char *hostaliases = NULL;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *lines = NULL;
+ ares__llist_node_t *node;
+
+ if (channel == NULL || name == NULL || alias == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ *alias = NULL;
+
+ /* Configuration says to not perform alias lookup */
+ if (channel->flags & ARES_FLAG_NOALIASES) {
+ return ARES_ENOTFOUND;
+ }
+
+ /* If a domain has a '.', its not allowed to perform an alias lookup */
+ if (strchr(name, '.') != NULL) {
+ return ARES_ENOTFOUND;
+ }
+
+ hostaliases = getenv("HOSTALIASES");
+ if (hostaliases == NULL) {
+ status = ARES_ENOTFOUND;
+ goto done;
+ }
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(hostaliases, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* The HOSTALIASES file is structured as one alias per line. The first
+ * field in the line is the simple hostname with no periods, followed by
+ * whitespace, then the full domain name, e.g.:
+ *
+ * c-ares www.c-ares.org
+ * curl www.curl.se
*/
- if ((len > 0) && (name[len - 1] == '.'))
- {
- *s = ares_strdup(name);
- return (*s) ? ARES_SUCCESS : ARES_ENOMEM;
+
+ status = ares__buf_split(buf, (const unsigned char *)"\n", 1,
+ ARES_BUF_SPLIT_TRIM, 0, &lines);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(lines); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *line = ares__llist_node_val(node);
+ char hostname[64] = "";
+ char fqdn[256] = "";
+
+ /* Pull off hostname */
+ ares__buf_tag(line);
+ ares__buf_consume_nonwhitespace(line);
+ if (ares__buf_tag_fetch_string(line, hostname, sizeof(hostname)) !=
+ ARES_SUCCESS) {
+ continue;
}
- 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;
- }
- }
- }
+ /* Match hostname */
+ if (strcasecmp(hostname, name) != 0) {
+ continue;
}
- 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;
+ /* consume whitespace */
+ ares__buf_consume_whitespace(line, ARES_TRUE);
+
+ /* pull off fqdn */
+ ares__buf_tag(line);
+ ares__buf_consume_nonwhitespace(line);
+ if (ares__buf_tag_fetch_string(line, fqdn, sizeof(fqdn)) != ARES_SUCCESS ||
+ ares_strlen(fqdn) == 0) {
+ continue;
}
- *s = NULL;
- return ARES_SUCCESS;
+ /* Validate characterset */
+ if (!ares__is_hostname(fqdn)) {
+ continue;
+ }
+
+ *alias = ares_strdup(fqdn);
+ if (*alias == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Good! */
+ status = ARES_SUCCESS;
+ goto done;
+ }
+
+ status = ARES_ENOTFOUND;
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(lines);
+
+ return status;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_send.c b/contrib/libs/c-ares/src/lib/ares_send.c
index 9507796720..54f2b504d5 100644
--- a/contrib/libs/c-ares/src/lib/ares_send.c
+++ b/contrib/libs/c-ares/src/lib/ares_send.c
@@ -37,98 +37,91 @@
#include "ares_dns.h"
#include "ares_private.h"
-int ares_send_ex(ares_channel channel, const unsigned char *qbuf, int qlen,
- ares_callback callback, void *arg)
+static unsigned short generate_unique_qid(ares_channel_t *channel)
{
- struct query *query;
- int i, packetsz;
- struct timeval now;
+ unsigned short id;
+
+ do {
+ id = ares__generate_new_id(channel->rand_state);
+ } while (ares__htable_szvp_get(channel->queries_by_qid, id, NULL));
+
+ return id;
+}
+
+static ares_status_t ares_send_dnsrec_int(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback,
+ void *arg, unsigned short *qid)
+{
+ struct query *query;
+ size_t packetsz;
+ struct timeval now = ares__tvnow();
+ ares_status_t status;
+ unsigned short id = generate_unique_qid(channel);
+ const ares_dns_record_t *dnsrec_resp = NULL;
+
+ if (ares__slist_len(channel->servers) == 0) {
+ callback(arg, ARES_ENOSERVER, 0, NULL);
+ return ARES_ENOSERVER;
+ }
+
+ /* Check query cache */
+ status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp);
+ if (status != ARES_ENOTFOUND) {
+ /* ARES_SUCCESS means we retrieved the cache, anything else is a critical
+ * failure, all result in termination */
+ callback(arg, status, 0, dnsrec_resp);
+ return status;
+ }
- /* Verify that the query is at least long enough to hold the header. */
- if (qlen < HFIXEDSZ || qlen >= (1 << 16))
- {
- callback(arg, ARES_EBADQUERY, 0, NULL, 0);
- return ARES_EBADQUERY;
- }
- if (channel->nservers < 1)
- {
- callback(arg, ARES_ESERVFAIL, 0, NULL, 0);
- return ARES_ESERVFAIL;
- }
/* Allocate space for query and allocated fields. */
query = ares_malloc(sizeof(struct query));
- if (!query)
- {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
+ if (!query) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
+ return ARES_ENOMEM;
+ }
memset(query, 0, sizeof(*query));
+
query->channel = channel;
- query->tcpbuf = ares_malloc(qlen + 2);
- if (!query->tcpbuf)
- {
- ares_free(query);
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
- return ARES_ENOMEM;
- }
- 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 ARES_ENOMEM;
- }
-
- /* Compute the query ID. Start with no timeout. */
- query->qid = DNS_HEADER_QID(qbuf);
- query->timeout.tv_sec = 0;
+
+ status = ares_dns_write(dnsrec, &query->qbuf, &query->qlen);
+ if (status != ARES_SUCCESS) {
+ ares_free(query);
+ callback(arg, status, 0, NULL);
+ return status;
+ }
+
+ query->qid = id;
+ 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;
+ /* Ignore first 2 bytes, assign our own query id */
+ query->qbuf[0] = (unsigned char)((id >> 8) & 0xFF);
+ query->qbuf[1] = (unsigned char)(id & 0xFF);
/* Fill in query arguments. */
- query->qbuf = query->tcpbuf + 2;
- query->qlen = qlen;
query->callback = callback;
- query->arg = arg;
+ 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->using_tcp =
+ (channel->flags & ARES_FLAG_USEVC) || query->qlen > packetsz;
- query->error_status = ARES_ECONNREFUSED;
- query->timeouts = 0;
+ query->error_status = ARES_SUCCESS;
+ query->timeouts = 0;
/* Initialize our list nodes. */
query->node_queries_by_timeout = NULL;
query->node_queries_to_conn = NULL;
/* Chain the query into the list of all queries. */
- query->node_all_queries = ares__llist_insert_last(channel->all_queries, query);
+ query->node_all_queries =
+ ares__llist_insert_last(channel->all_queries, query);
if (query->node_all_queries == NULL) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ callback(arg, ARES_ENOMEM, 0, NULL);
ares__free_query(query);
return ARES_ENOMEM;
}
@@ -136,19 +129,90 @@ int ares_send_ex(ares_channel channel, const unsigned char *qbuf, int qlen,
/* Keep track of queries bucketed by qid, so we can process DNS
* responses quickly.
*/
- if (!ares__htable_stvp_insert(channel->queries_by_qid, query->qid, query)) {
- callback(arg, ARES_ENOMEM, 0, NULL, 0);
+ if (!ares__htable_szvp_insert(channel->queries_by_qid, query->qid, query)) {
+ callback(arg, ARES_ENOMEM, 0, NULL);
ares__free_query(query);
return ARES_ENOMEM;
}
/* Perform the first query action. */
- now = ares__tvnow();
- return ares__send_query(channel, query, &now);
+
+ status = ares__send_query(query, &now);
+ if (status == ARES_SUCCESS && qid) {
+ *qid = id;
+ }
+ return status;
}
-void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
+ares_status_t ares_send_dnsrec(ares_channel_t *channel,
+ const ares_dns_record_t *dnsrec,
+ ares_callback_dnsrec callback, void *arg,
+ unsigned short *qid)
+{
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+
+ status = ares_send_dnsrec_int(channel, dnsrec, callback, arg, qid);
+
+ ares__channel_unlock(channel);
+
+ return status;
+}
+
+void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen,
ares_callback callback, void *arg)
{
- ares_send_ex(channel, qbuf, qlen, callback, arg);
+ ares_dns_record_t *dnsrec = NULL;
+ ares_status_t status;
+ void *carg = NULL;
+
+ if (channel == NULL) {
+ return;
+ }
+
+ /* 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;
+ }
+
+ status = ares_dns_parse(qbuf, (size_t)qlen, 0, &dnsrec);
+ if (status != ARES_SUCCESS) {
+ callback(arg, (int)status, 0, NULL, 0);
+ return;
+ }
+
+ carg = ares__dnsrec_convert_arg(callback, arg);
+ if (carg == NULL) {
+ status = ARES_ENOMEM;
+ ares_dns_record_destroy(dnsrec);
+ callback(arg, (int)status, 0, NULL, 0);
+ return;
+ }
+
+ ares_send_dnsrec(channel, dnsrec, ares__dnsrec_convert_cb, carg, NULL);
+
+ ares_dns_record_destroy(dnsrec);
+}
+
+size_t ares_queue_active_queries(ares_channel_t *channel)
+{
+ size_t len;
+
+ if (channel == NULL) {
+ return 0;
+ }
+
+ ares__channel_lock(channel);
+
+ len = ares__llist_len(channel->all_queries);
+
+ ares__channel_unlock(channel);
+
+ return len;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_setup.h b/contrib/libs/c-ares/src/lib/ares_setup.h
index f1cd5c0cea..c506449dbd 100644
--- a/contrib/libs/c-ares/src/lib/ares_setup.h
+++ b/contrib/libs/c-ares/src/lib/ares_setup.h
@@ -31,7 +31,7 @@
*/
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-#define WIN32
+# define WIN32
#endif
/*
@@ -40,12 +40,12 @@
*/
#if defined(HAVE_CONFIG_H) && !defined(_MSC_VER)
-#include "ares_config.h"
+# include "ares_config.h"
#else
-#ifdef WIN32
-#include "config-win32.h"
-#endif
+# ifdef WIN32
+# include "config-win32.h"
+# endif
#endif /* HAVE_CONFIG_H */
@@ -123,7 +123,7 @@
# ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
# ifdef HAVE_WS2TCPIP_H
-# include <ws2tcpip.h>
+# include <ws2tcpip.h>
# endif
# else
# ifdef HAVE_WINSOCK_H
@@ -138,8 +138,9 @@
* undefine USE_WINSOCK.
*/
-#undef USE_WINSOCK
-
+#ifdef USE_WINSOCK
+# undef USE_WINSOCK
+#endif
#ifdef HAVE_WINSOCK2_H
# define USE_WINSOCK 2
#else
@@ -154,17 +155,17 @@
#ifndef HAVE_CONFIG_H
-#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__)
-#define HAVE_SYS_TIME_H
-#endif
+# if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__)
+# define HAVE_SYS_TIME_H
+# endif
-#if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
-#define HAVE_UNISTD_H 1
-#endif
+# if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER)
+# define HAVE_UNISTD_H 1
+# endif
-#if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
-#define HAVE_SYS_UIO_H
-#endif
+# if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS)
+# define HAVE_SYS_UIO_H
+# endif
#endif /* HAVE_CONFIG_H */
@@ -193,7 +194,7 @@
* but it is not fully implemented and missing identifiers, so udefine here.
*/
#if (defined(ANDROID) || defined(__ANDROID__) || defined(__MVS__)) && \
- defined(HAVE_ARPA_NAMESER_H)
+ defined(HAVE_ARPA_NAMESER_H)
# undef HAVE_ARPA_NAMESER_H
#endif
@@ -203,21 +204,35 @@
* --enable-debug) so we undef them again here.
*/
-#undef PACKAGE_STRING
-#undef PACKAGE_TARNAME
-#undef PACKAGE_VERSION
-#undef PACKAGE_BUGREPORT
-#undef PACKAGE_NAME
-#undef VERSION
-#undef PACKAGE
+#ifdef PACKAGE_STRING
+# undef PACKAGE_STRING
+#endif
+#ifdef PACKAGE_TARNAME
+# undef PACKAGE_TARNAME
+#endif
+#ifdef PACKAGE_VERSION
+# undef PACKAGE_VERSION
+#endif
+#ifdef PACKAGE_BUGREPORT
+# undef PACKAGE_BUGREPORT
+#endif
+#ifdef PACKAGE_NAME
+# undef PACKAGE_NAME
+#endif
+#ifdef VERSION
+# undef VERSION
+#endif
+#ifdef PACKAGE
+# undef PACKAGE
+#endif
/* IPv6 compatibility */
#if !defined(HAVE_AF_INET6)
-#if defined(HAVE_PF_INET6)
-#define AF_INET6 PF_INET6
-#else
-#define AF_INET6 AF_MAX+1
-#endif
+# if defined(HAVE_PF_INET6)
+# define AF_INET6 PF_INET6
+# else
+# define AF_INET6 AF_MAX + 1
+# endif
#endif
/*
@@ -225,7 +240,7 @@
*/
#ifndef __SETUP_ONCE_H
-#include "setup_once.h"
+# include "setup_once.h"
#endif
#endif /* HEADER_CARES_SETUP_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_str.c b/contrib/libs/c-ares/src/lib/ares_str.c
new file mode 100644
index 0000000000..5f25cfeaff
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_str.c
@@ -0,0 +1,269 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) The c-ares project and its contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+#include "ares_str.h"
+#include "ares.h"
+#include "ares_private.h"
+
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+size_t ares_strlen(const char *str)
+{
+ if (str == NULL) {
+ return 0;
+ }
+
+ return strlen(str);
+}
+
+char *ares_strdup(const char *s1)
+{
+ size_t len;
+ char *out;
+
+ if (s1 == NULL) {
+ return NULL;
+ }
+
+ len = ares_strlen(s1);
+
+ /* Don't see how this is possible */
+ if (len == SIZE_MAX) {
+ return NULL;
+ }
+
+ out = ares_malloc(len + 1);
+ if (out == NULL) {
+ return NULL;
+ }
+
+ if (len) {
+ memcpy(out, s1, len);
+ }
+
+ out[len] = 0;
+ return out;
+}
+
+size_t ares_strcpy(char *dest, const char *src, size_t dest_size)
+{
+ size_t len = 0;
+
+ if (dest == NULL || dest_size == 0) {
+ return 0;
+ }
+
+ len = ares_strlen(src);
+
+ if (len >= dest_size) {
+ len = dest_size - 1;
+ }
+
+ if (len) {
+ memcpy(dest, src, len);
+ }
+
+ dest[len] = 0;
+ return len;
+}
+
+ares_bool_t ares_str_isnum(const char *str)
+{
+ size_t i;
+
+ if (str == NULL || *str == 0) {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; str[i] != 0; i++) {
+ if (str[i] < '0' || str[i] > '9') {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
+
+void ares__str_rtrim(char *str)
+{
+ size_t len;
+ size_t i;
+
+ if (str == NULL) {
+ return;
+ }
+
+ len = ares_strlen(str);
+ for (i = len; i > 0; i--) {
+ if (!ares__isspace(str[i - 1])) {
+ break;
+ }
+ }
+ str[i] = 0;
+}
+
+void ares__str_ltrim(char *str)
+{
+ size_t i;
+ size_t len;
+
+ if (str == NULL) {
+ return;
+ }
+
+ for (i = 0; str[i] != 0 && ares__isspace(str[i]); i++) {
+ /* Do nothing */
+ }
+
+ if (i == 0) {
+ return;
+ }
+
+ len = ares_strlen(str);
+ if (i != len) {
+ memmove(str, str + i, len - i);
+ }
+ str[len - i] = 0;
+}
+
+void ares__str_trim(char *str)
+{
+ ares__str_ltrim(str);
+ ares__str_rtrim(str);
+}
+
+/* tolower() is locale-specific. Use a lookup table fast conversion that only
+ * operates on ASCII */
+static const unsigned char ares__tolower_lookup[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
+ 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
+ 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
+ 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33,
+ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40,
+ 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D,
+ 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
+ 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74,
+ 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81,
+ 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
+ 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B,
+ 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
+ 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5,
+ 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2,
+ 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC,
+ 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
+ 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6,
+ 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
+};
+
+unsigned char ares__tolower(unsigned char c)
+{
+ return ares__tolower_lookup[c];
+}
+
+ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
+ size_t len)
+{
+ size_t i;
+ for (i = 0; i < len; i++) {
+ if (ares__tolower_lookup[ptr[i]] != ares__tolower_lookup[val[i]]) {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
+
+ares_bool_t ares__isspace(int ch)
+{
+ switch (ch) {
+ case '\r':
+ case '\t':
+ case ' ':
+ case '\v':
+ case '\f':
+ case '\n':
+ return ARES_TRUE;
+ default:
+ break;
+ }
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__isprint(int ch)
+{
+ if (ch >= 0x20 && ch <= 0x7E) {
+ return ARES_TRUE;
+ }
+ return ARES_FALSE;
+}
+
+/* Character set allowed by hostnames. This is to include the normal
+ * domain name character set plus:
+ * - underscores which are used in SRV records.
+ * - Forward slashes such as are used for classless in-addr.arpa
+ * delegation (CNAMEs)
+ * - Asterisks may be used for wildcard domains in CNAMEs as seen in the
+ * real world.
+ * While RFC 2181 section 11 does state not to do validation,
+ * that applies to servers, not clients. Vulnerabilities have been
+ * reported when this validation is not performed. Security is more
+ * important than edge-case compatibility (which is probably invalid
+ * anyhow). */
+ares_bool_t ares__is_hostnamech(int ch)
+{
+ /* [A-Za-z0-9-*._/]
+ * Don't use isalnum() as it is locale-specific
+ */
+ if (ch >= 'A' && ch <= 'Z') {
+ return ARES_TRUE;
+ }
+ if (ch >= 'a' && ch <= 'z') {
+ return ARES_TRUE;
+ }
+ if (ch >= '0' && ch <= '9') {
+ return ARES_TRUE;
+ }
+ if (ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '*') {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__is_hostname(const char *str)
+{
+ size_t i;
+ for (i = 0; str[i] != 0; i++) {
+ if (!ares__is_hostnamech(str[i])) {
+ return ARES_FALSE;
+ }
+ }
+ return ARES_TRUE;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_strdup.c b/contrib/libs/c-ares/src/lib/ares_str.h
index db5dd1d84b..8d869073d8 100644
--- a/contrib/libs/c-ares/src/lib/ares_strdup.c
+++ b/contrib/libs/c-ares/src/lib/ares_str.h
@@ -24,29 +24,43 @@
*
* SPDX-License-Identifier: MIT
*/
+#ifndef __ARES_STR_H
+#define __ARES_STR_H
#include "ares_setup.h"
-#include "ares_strdup.h"
#include "ares.h"
-#include "ares_private.h"
-
-char *ares_strdup(const char *s1)
-{
- size_t sz;
- char * s2;
-
- if(s1) {
- sz = strlen(s1);
- if(sz < (size_t)-1) {
- sz++;
- if(sz < ((size_t)-1)) {
- s2 = ares_malloc(sz);
- if(s2) {
- memcpy(s2, s1, sz);
- return s2;
- }
- }
- }
- }
- return (char *)NULL;
-}
+
+char *ares_strdup(const char *s1);
+
+size_t ares_strlen(const char *str);
+
+/*! Copy string from source to destination with destination buffer size
+ * provided. The destination is guaranteed to be null terminated, if the
+ * provided buffer isn't large enough, only those bytes from the source that
+ * will fit will be copied.
+ *
+ * \param[out] dest Destination buffer
+ * \param[in] src Source to copy
+ * \param[in] dest_size Size of destination buffer
+ * \return String length. Will be at most dest_size-1
+ */
+size_t ares_strcpy(char *dest, const char *src, size_t dest_size);
+
+ares_bool_t ares_str_isnum(const char *str);
+
+void ares__str_ltrim(char *str);
+void ares__str_rtrim(char *str);
+void ares__str_trim(char *str);
+
+unsigned char ares__tolower(unsigned char c);
+ares_bool_t ares__memeq_ci(const unsigned char *ptr, const unsigned char *val,
+ size_t len);
+
+ares_bool_t ares__isspace(int ch);
+ares_bool_t ares__isprint(int ch);
+ares_bool_t ares__is_hostnamech(int ch);
+
+ares_bool_t ares__is_hostname(const char *str);
+
+
+#endif /* __ARES_STR_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_strcasecmp.c b/contrib/libs/c-ares/src/lib/ares_strcasecmp.c
index e7fd527404..b91cbbe154 100644
--- a/contrib/libs/c-ares/src/lib/ares_strcasecmp.c
+++ b/contrib/libs/c-ares/src/lib/ares_strcasecmp.c
@@ -31,46 +31,49 @@
#ifndef HAVE_STRCASECMP
int ares_strcasecmp(const char *a, const char *b)
{
-#if defined(HAVE_STRCMPI)
+# if defined(HAVE_STRCMPI)
return strcmpi(a, b);
-#elif defined(HAVE_STRICMP)
+# elif defined(HAVE_STRICMP)
return stricmp(a, b);
-#else
+# 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)
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ if (!c1) {
break;
+ }
}
return 0;
-#endif
+# endif
}
#endif
#ifndef HAVE_STRNCASECMP
int ares_strncasecmp(const char *a, const char *b, size_t n)
{
-#if defined(HAVE_STRNCMPI)
+# if defined(HAVE_STRNCMPI)
return strncmpi(a, b, n);
-#elif defined(HAVE_STRNICMP)
+# elif defined(HAVE_STRNICMP)
return strnicmp(a, b, n);
-#else
+# 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)
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ if (!c1) {
break;
+ }
}
return 0;
-#endif
+# endif
}
#endif
-
diff --git a/contrib/libs/c-ares/src/lib/ares_strdup.h b/contrib/libs/c-ares/src/lib/ares_strdup.h
deleted file mode 100644
index 06e8cdccb5..0000000000
--- a/contrib/libs/c-ares/src/lib/ares_strdup.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 1998 Massachusetts Institute of Technology
- * Copyright (c) The c-ares project and its contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-#ifndef HEADER_CARES_STRDUP_H
-#define HEADER_CARES_STRDUP_H
-
-#include "ares_setup.h"
-
-extern char *ares_strdup(const char *s1);
-
-#endif /* HEADER_CARES_STRDUP_H */
diff --git a/contrib/libs/c-ares/src/lib/ares_strerror.c b/contrib/libs/c-ares/src/lib/ares_strerror.c
index 7e301ff94f..ae94f9619e 100644
--- a/contrib/libs/c-ares/src/lib/ares_strerror.c
+++ b/contrib/libs/c-ares/src/lib/ares_strerror.c
@@ -31,37 +31,63 @@
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"
- };
+ ares_status_t status = (ares_status_t)code;
+ switch (status) {
+ case ARES_SUCCESS:
+ return "Successful completion";
+ case ARES_ENODATA:
+ return "DNS server returned answer with no data";
+ case ARES_EFORMERR:
+ return "DNS server claims query was misformatted";
+ case ARES_ESERVFAIL:
+ return "DNS server returned general failure";
+ case ARES_ENOTFOUND:
+ return "Domain name not found";
+ case ARES_ENOTIMP:
+ return "DNS server does not implement requested operation";
+ case ARES_EREFUSED:
+ return "DNS server refused query";
+ case ARES_EBADQUERY:
+ return "Misformatted DNS query";
+ case ARES_EBADNAME:
+ return "Misformatted domain name";
+ case ARES_EBADFAMILY:
+ return "Unsupported address family";
+ case ARES_EBADRESP:
+ return "Misformatted DNS reply";
+ case ARES_ECONNREFUSED:
+ return "Could not contact DNS servers";
+ case ARES_ETIMEOUT:
+ return "Timeout while contacting DNS servers";
+ case ARES_EOF:
+ return "End of file";
+ case ARES_EFILE:
+ return "Error reading file";
+ case ARES_ENOMEM:
+ return "Out of memory";
+ case ARES_EDESTRUCTION:
+ return "Channel is being destroyed";
+ case ARES_EBADSTR:
+ return "Misformatted string";
+ case ARES_EBADFLAGS:
+ return "Illegal flags specified";
+ case ARES_ENONAME:
+ return "Given hostname is not numeric";
+ case ARES_EBADHINTS:
+ return "Illegal hints flags specified";
+ case ARES_ENOTINITIALIZED:
+ return "c-ares library initialization not yet performed";
+ case ARES_ELOADIPHLPAPI:
+ return "Error loading iphlpapi.dll";
+ case ARES_EADDRGETNETWORKPARAMS:
+ return "Could not find GetNetworkParams function";
+ case ARES_ECANCELLED:
+ return "DNS query cancelled";
+ case ARES_ESERVICE:
+ return "Invalid service name or number";
+ case ARES_ENOSERVER:
+ return "No DNS servers were configured";
+ }
- if(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)))
- return errtext[code];
- else
- return "unknown";
+ return "unknown";
}
diff --git a/contrib/libs/c-ares/src/lib/ares_strsplit.c b/contrib/libs/c-ares/src/lib/ares_strsplit.c
index 985a02dbbf..395bf1ebb9 100644
--- a/contrib/libs/c-ares/src/lib/ares_strsplit.c
+++ b/contrib/libs/c-ares/src/lib/ares_strsplit.c
@@ -25,7 +25,7 @@
*/
#if defined(__MVS__)
-#include <strings.h>
+# include <strings.h>
#endif
#include "ares_setup.h"
@@ -36,70 +36,105 @@ void ares__strsplit_free(char **elms, size_t num_elm)
{
size_t i;
- if (elms == NULL)
+ if (elms == NULL) {
return;
+ }
- for (i=0; i<num_elm; i++)
+ for (i = 0; i < num_elm; i++) {
ares_free(elms[i]);
+ }
ares_free(elms);
}
-char **ares__strsplit(const char *in, const char *delms, size_t *num_elm) {
- const char *p;
- char **table;
- void *tmp;
- size_t i, j, k, count;
+char **ares__strsplit_duplicate(char **elms, size_t num_elm)
+{
+ size_t i;
+ char **out;
- if (in == NULL || delms == NULL || num_elm == NULL)
+ if (elms == NULL || num_elm == 0) {
return NULL;
+ }
- *num_elm = 0;
+ out = ares_malloc_zero(sizeof(*elms) * num_elm);
+ if (out == NULL) {
+ return NULL;
+ }
- /* count non-empty delimited substrings */
- count = 0;
- p = in;
- do {
- i = strcspn(p, delms);
- if (i != 0) {
- /* string is non-empty */
- count++;
- p += i;
+ for (i = 0; i < num_elm; i++) {
+ out[i] = ares_strdup(elms[i]);
+ if (out[i] == NULL) {
+ ares__strsplit_free(out, num_elm);
+ return NULL;
}
- } while (*p++ != 0);
+ }
+
+ return out;
+}
- if (count == 0)
+char **ares__strsplit(const char *in, const char *delms, size_t *num_elm)
+{
+ ares_status_t status;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *llist = NULL;
+ ares__llist_node_t *node;
+ char **out = NULL;
+ size_t cnt = 0;
+ size_t idx = 0;
+
+ if (in == NULL || delms == NULL || num_elm == NULL) {
return NULL;
- table = ares_malloc(count * sizeof(*table));
- if (table == NULL)
+ }
+
+ *num_elm = 0;
+
+ buf = ares__buf_create_const((const unsigned char *)in, ares_strlen(in));
+ if (buf == NULL) {
return NULL;
+ }
+
+ status = ares__buf_split(
+ buf, (const unsigned char *)delms, ares_strlen(delms),
+ ARES_BUF_SPLIT_NO_DUPLICATES | ARES_BUF_SPLIT_CASE_INSENSITIVE, 0, &llist);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ cnt = ares__llist_len(llist);
+ if (cnt == 0) {
+ status = ARES_EFORMERR;
+ goto done;
+ }
- j = 0; /* current table entry */
- /* re-calculate indices and allocate new strings for table */
- for (p = in; j < count; p += i + 1) {
- i = strcspn(p, delms);
- if (i != 0) {
- for (k = 0; k < j; k++) {
- if (strncasecmp(table[k], p, i) == 0 && table[k][i] == 0)
- break;
- }
- if (k == j) {
- /* copy unique strings only */
- table[j] = ares_malloc(i + 1);
- if (table[j] == NULL) {
- ares__strsplit_free(table, j);
- return NULL;
- }
- strncpy(table[j], p, i);
- table[j++][i] = 0;
- } else
- count--;
+
+ out = ares_malloc_zero(cnt * sizeof(*out));
+ if (out == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(llist); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *val = ares__llist_node_val(node);
+ char *temp = NULL;
+
+ status = ares__buf_fetch_str_dup(val, ares__buf_len(val), &temp);
+ if (status != ARES_SUCCESS) {
+ goto done;
}
+
+ out[idx++] = temp;
}
- tmp = ares_realloc(table, count * sizeof (*table));
- if (tmp != NULL)
- table = tmp;
+ *num_elm = cnt;
+ status = ARES_SUCCESS;
+
+done:
+ ares__llist_destroy(llist);
+ ares__buf_destroy(buf);
+ if (status != ARES_SUCCESS) {
+ ares__strsplit_free(out, cnt);
+ out = NULL;
+ }
- *num_elm = count;
- return table;
+ return out;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_strsplit.h b/contrib/libs/c-ares/src/lib/ares_strsplit.h
index d3c258fec0..af650eee53 100644
--- a/contrib/libs/c-ares/src/lib/ares_strsplit.h
+++ b/contrib/libs/c-ares/src/lib/ares_strsplit.h
@@ -31,11 +31,11 @@
/* Split a string on delms skipping empty or duplicate elements.
*
* param in String to split.
- * param delms String of characters to treat as a delimitor.
- * Each character in the string is a delimitor so
- * there can be multiple delimitors to split on.
+ * param delms String of characters to treat as a delimiter.
+ * Each character in the string is a delimiter so
+ * there can be multiple delimiters to split on.
* E.g. ", " will split on all comma's and spaces.
- * Duplicate entries are removed.
+ * Duplicate (case-insensitive) entries are removed.
* param num_elm Return parameter of the number of elements
* in the result array.
*
@@ -45,8 +45,9 @@
char **ares__strsplit(const char *in, const char *delms, size_t *num_elm);
/* Frees the result returned from ares__strsplit(). */
-void ares__strsplit_free(char **elms, size_t num_elm);
+void ares__strsplit_free(char **elms, size_t num_elm);
+/* Duplicate the array */
+char **ares__strsplit_duplicate(char **elms, size_t num_elm);
#endif /* HEADER_CARES_STRSPLIT_H */
-
diff --git a/contrib/libs/c-ares/src/lib/ares_sysconfig.c b/contrib/libs/c-ares/src/lib/ares_sysconfig.c
new file mode 100644
index 0000000000..474534512a
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_sysconfig.c
@@ -0,0 +1,1111 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) 2007 Daniel Stenberg
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_SYS_PARAM_H
+# include <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
+
+#include "ares_nameser.h"
+
+#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
+
+#if defined(USE_WINSOCK)
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
+#endif
+
+#include "ares.h"
+#include "ares_inet_net_pton.h"
+#include "ares_platform.h"
+#include "ares_private.h"
+
+#ifdef WATT32
+# undef WIN32 /* Redefined in MingW/MSVC headers */
+#endif
+
+
+#ifdef WIN32
+/*
+ * get_REG_SZ()
+ *
+ * Given a 'hKey' handle to an open registry key and a 'leafKeyName' pointer
+ * to the name of the registry leaf key to be queried, fetch it's string
+ * value and return a pointer in *outptr to a newly allocated memory area
+ * holding it as a null-terminated string.
+ *
+ * Returns 0 and nullifies *outptr upon inability to return a string value.
+ *
+ * Returns 1 and sets *outptr when returning a dynamically allocated string.
+ *
+ * Supported on Windows NT 3.5 and newer.
+ */
+static ares_bool_t get_REG_SZ(HKEY hKey, const char *leafKeyName, char **outptr)
+{
+ DWORD size = 0;
+ int res;
+
+ *outptr = NULL;
+
+ /* Find out size of string stored in registry */
+ res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, NULL, &size);
+ if ((res != ERROR_SUCCESS && res != ERROR_MORE_DATA) || !size) {
+ return ARES_FALSE;
+ }
+
+ /* Allocate buffer of indicated size plus one given that string
+ might have been stored without null termination */
+ *outptr = ares_malloc(size + 1);
+ if (!*outptr) {
+ return ARES_FALSE;
+ }
+
+ /* Get the value for real */
+ res = RegQueryValueExA(hKey, leafKeyName, 0, NULL, (unsigned char *)*outptr,
+ &size);
+ if ((res != ERROR_SUCCESS) || (size == 1)) {
+ ares_free(*outptr);
+ *outptr = NULL;
+ return ARES_FALSE;
+ }
+
+ /* Null terminate buffer always */
+ *(*outptr + size) = '\0';
+
+ return ARES_TRUE;
+}
+
+static void commanjoin(char **dst, const char * const src, const size_t len)
+{
+ char *newbuf;
+ size_t newsize;
+
+ /* 1 for terminating 0 and 2 for , and terminating 0 */
+ newsize = len + (*dst ? (ares_strlen(*dst) + 2) : 1);
+ newbuf = ares_realloc(*dst, newsize);
+ if (!newbuf) {
+ return;
+ }
+ if (*dst == NULL) {
+ *newbuf = '\0';
+ }
+ *dst = newbuf;
+ if (ares_strlen(*dst) != 0) {
+ strcat(*dst, ",");
+ }
+ strncat(*dst, src, len);
+}
+
+/*
+ * commajoin()
+ *
+ * RTF code.
+ */
+static void commajoin(char **dst, const char *src)
+{
+ commanjoin(dst, src, ares_strlen(src));
+}
+
+/* A structure to hold the string form of IPv4 and IPv6 addresses so we can
+ * sort them by a metric.
+ */
+typedef struct {
+ /* The metric we sort them by. */
+ ULONG metric;
+
+ /* Original index of the item, used as a secondary sort parameter to make
+ * qsort() stable if the metrics are equal */
+ size_t orig_idx;
+
+ /* Room enough for the string form of any IPv4 or IPv6 address that
+ * ares_inet_ntop() will create. Based on the existing c-ares practice.
+ */
+ char text[INET6_ADDRSTRLEN + 8 + 64]; /* [%s]:NNNNN%iface */
+} Address;
+
+/* Sort Address values \a left and \a right by metric, returning the usual
+ * indicators for qsort().
+ */
+static int compareAddresses(const void *arg1, const void *arg2)
+{
+ const Address * const left = arg1;
+ const Address * const right = arg2;
+ /* Lower metric the more preferred */
+ if (left->metric < right->metric) {
+ return -1;
+ }
+ if (left->metric > right->metric) {
+ return 1;
+ }
+ /* If metrics are equal, lower original index more preferred */
+ if (left->orig_idx < right->orig_idx) {
+ return -1;
+ }
+ if (left->orig_idx > right->orig_idx) {
+ return 1;
+ }
+ return 0;
+}
+
+/* There can be multiple routes to "the Internet". And there can be different
+ * DNS servers associated with each of the interfaces that offer those routes.
+ * We have to assume that any DNS server can serve any request. But, some DNS
+ * servers may only respond if requested over their associated interface. But
+ * we also want to use "the preferred route to the Internet" whenever possible
+ * (and not use DNS servers on a non-preferred route even by forcing request
+ * to go out on the associated non-preferred interface). i.e. We want to use
+ * the DNS servers associated with the same interface that we would use to
+ * make a general request to anything else.
+ *
+ * But, Windows won't sort the DNS servers by the metrics associated with the
+ * routes and interfaces _even_ though it obviously sends IP packets based on
+ * those same routes and metrics. So, we must do it ourselves.
+ *
+ * So, we sort the DNS servers by the same metric values used to determine how
+ * an outgoing IP packet will go, thus effectively using the DNS servers
+ * associated with the interface that the DNS requests themselves will
+ * travel. This gives us optimal routing and avoids issues where DNS servers
+ * won't respond to requests that don't arrive via some specific subnetwork
+ * (and thus some specific interface).
+ *
+ * This function computes the metric we use to sort. On the interface
+ * identified by \a luid, it determines the best route to \a dest and combines
+ * that route's metric with \a interfaceMetric to compute a metric for the
+ * destination address on that interface. This metric can be used as a weight
+ * to sort the DNS server addresses associated with each interface (lower is
+ * better).
+ *
+ * Note that by restricting the route search to the specific interface with
+ * which the DNS servers are associated, this function asks the question "What
+ * is the metric for sending IP packets to this DNS server?" which allows us
+ * to sort the DNS servers correctly.
+ */
+static ULONG getBestRouteMetric(IF_LUID * const luid, /* Can't be const :( */
+ const SOCKADDR_INET * const dest,
+ const ULONG interfaceMetric)
+{
+ /* On this interface, get the best route to that destination. */
+# if defined(__WATCOMC__)
+ /* OpenWatcom's builtin Windows SDK does not have a definition for
+ * MIB_IPFORWARD_ROW2, and also does not allow the usage of SOCKADDR_INET
+ * as a variable. Let's work around this by returning the worst possible
+ * metric, but only when using the OpenWatcom compiler.
+ * It may be worth investigating using a different version of the Windows
+ * SDK with OpenWatcom in the future, though this may be fixed in OpenWatcom
+ * 2.0.
+ */
+ return (ULONG)-1;
+# else
+ MIB_IPFORWARD_ROW2 row;
+ SOCKADDR_INET ignored;
+ if (GetBestRoute2(/* The interface to use. The index is ignored since we are
+ * passing a LUID.
+ */
+ luid, 0,
+ /* No specific source address. */
+ NULL,
+ /* Our destination address. */
+ dest,
+ /* No options. */
+ 0,
+ /* The route row. */
+ &row,
+ /* The best source address, which we don't need. */
+ &ignored) != NO_ERROR
+ /* If the metric is "unused" (-1) or too large for us to add the two
+ * metrics, use the worst possible, thus sorting this last.
+ */
+ || row.Metric == (ULONG)-1 ||
+ row.Metric > ((ULONG)-1) - interfaceMetric) {
+ /* Return the worst possible metric. */
+ return (ULONG)-1;
+ }
+
+ /* Return the metric value from that row, plus the interface metric.
+ *
+ * See
+ * http://msdn.microsoft.com/en-us/library/windows/desktop/aa814494(v=vs.85).aspx
+ * which describes the combination as a "sum".
+ */
+ return row.Metric + interfaceMetric;
+# endif /* __WATCOMC__ */
+}
+
+/*
+ * get_DNS_Windows()
+ *
+ * Locates DNS info using GetAdaptersAddresses() function from the Internet
+ * Protocol Helper (IP Helper) API. When located, this returns a pointer
+ * in *outptr to a newly allocated memory area holding a null-terminated
+ * string with a space or comma separated list of DNS IP addresses.
+ *
+ * Returns 0 and nullifies *outptr upon inability to return DNSes string.
+ *
+ * Returns 1 and sets *outptr when returning a dynamically allocated string.
+ *
+ * Implementation supports Windows XP and newer.
+ */
+# define IPAA_INITIAL_BUF_SZ 15 * 1024
+# define IPAA_MAX_TRIES 3
+
+static ares_bool_t get_DNS_Windows(char **outptr)
+{
+ IP_ADAPTER_DNS_SERVER_ADDRESS *ipaDNSAddr;
+ IP_ADAPTER_ADDRESSES *ipaa;
+ IP_ADAPTER_ADDRESSES *newipaa;
+ IP_ADAPTER_ADDRESSES *ipaaEntry;
+ ULONG ReqBufsz = IPAA_INITIAL_BUF_SZ;
+ ULONG Bufsz = IPAA_INITIAL_BUF_SZ;
+ ULONG AddrFlags = 0;
+ int trying = IPAA_MAX_TRIES;
+ ULONG res;
+
+ /* The capacity of addresses, in elements. */
+ size_t addressesSize;
+ /* The number of elements in addresses. */
+ size_t addressesIndex = 0;
+ /* The addresses we will sort. */
+ Address *addresses;
+
+ union {
+ struct sockaddr *sa;
+ struct sockaddr_in *sa4;
+ struct sockaddr_in6 *sa6;
+ } namesrvr;
+
+ *outptr = NULL;
+
+ ipaa = ares_malloc(Bufsz);
+ if (!ipaa) {
+ return ARES_FALSE;
+ }
+
+ /* Start with enough room for a few DNS server addresses and we'll grow it
+ * as we encounter more.
+ */
+ addressesSize = 4;
+ addresses = (Address *)ares_malloc(sizeof(Address) * addressesSize);
+ if (addresses == NULL) {
+ /* We need room for at least some addresses to function. */
+ ares_free(ipaa);
+ return ARES_FALSE;
+ }
+
+ /* Usually this call succeeds with initial buffer size */
+ res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
+ if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) {
+ goto done;
+ }
+
+ while ((res == ERROR_BUFFER_OVERFLOW) && (--trying)) {
+ if (Bufsz < ReqBufsz) {
+ newipaa = ares_realloc(ipaa, ReqBufsz);
+ if (!newipaa) {
+ goto done;
+ }
+ Bufsz = ReqBufsz;
+ ipaa = newipaa;
+ }
+ res = GetAdaptersAddresses(AF_UNSPEC, AddrFlags, NULL, ipaa, &ReqBufsz);
+ if (res == ERROR_SUCCESS) {
+ break;
+ }
+ }
+ if (res != ERROR_SUCCESS) {
+ goto done;
+ }
+
+ for (ipaaEntry = ipaa; ipaaEntry; ipaaEntry = ipaaEntry->Next) {
+ if (ipaaEntry->OperStatus != IfOperStatusUp) {
+ continue;
+ }
+
+ /* For each interface, find any associated DNS servers as IPv4 or IPv6
+ * addresses. For each found address, find the best route to that DNS
+ * server address _on_ _that_ _interface_ (at this moment in time) and
+ * compute the resulting total metric, just as Windows routing will do.
+ * Then, sort all the addresses found by the metric.
+ */
+ for (ipaDNSAddr = ipaaEntry->FirstDnsServerAddress; ipaDNSAddr;
+ ipaDNSAddr = ipaDNSAddr->Next) {
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ namesrvr.sa = ipaDNSAddr->Address.lpSockaddr;
+
+ if (namesrvr.sa->sa_family == AF_INET) {
+ if ((namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_ANY) ||
+ (namesrvr.sa4->sin_addr.S_un.S_addr == INADDR_NONE)) {
+ continue;
+ }
+
+ /* Allocate room for another address, if necessary, else skip. */
+ if (addressesIndex == addressesSize) {
+ const size_t newSize = addressesSize + 4;
+ Address * const newMem =
+ (Address *)ares_realloc(addresses, sizeof(Address) * newSize);
+ if (newMem == NULL) {
+ continue;
+ }
+ addresses = newMem;
+ addressesSize = newSize;
+ }
+
+ addresses[addressesIndex].metric = getBestRouteMetric(
+ &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)),
+ ipaaEntry->Ipv4Metric);
+
+ /* Record insertion index to make qsort stable */
+ addresses[addressesIndex].orig_idx = addressesIndex;
+
+ if (!ares_inet_ntop(AF_INET, &namesrvr.sa4->sin_addr, ipaddr,
+ sizeof(ipaddr))) {
+ continue;
+ }
+ snprintf(addresses[addressesIndex].text,
+ sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr,
+ ntohs(namesrvr.sa4->sin_port));
+ ++addressesIndex;
+ } else if (namesrvr.sa->sa_family == AF_INET6) {
+ unsigned int ll_scope = 0;
+ struct ares_addr addr;
+
+ 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;
+ }
+
+ /* See if its link-local */
+ memset(&addr, 0, sizeof(addr));
+ addr.family = AF_INET6;
+ memcpy(&addr.addr.addr6, &namesrvr.sa6->sin6_addr, 16);
+ if (ares__addr_is_linklocal(&addr)) {
+ ll_scope = ipaaEntry->Ipv6IfIndex;
+ }
+
+ addresses[addressesIndex].metric = getBestRouteMetric(
+ &ipaaEntry->Luid, (SOCKADDR_INET *)((void *)(namesrvr.sa)),
+ ipaaEntry->Ipv6Metric);
+
+ /* Record insertion index to make qsort stable */
+ addresses[addressesIndex].orig_idx = addressesIndex;
+
+ if (!ares_inet_ntop(AF_INET6, &namesrvr.sa6->sin6_addr, ipaddr,
+ sizeof(ipaddr))) {
+ continue;
+ }
+
+ if (ll_scope) {
+ snprintf(addresses[addressesIndex].text,
+ sizeof(addresses[addressesIndex].text), "[%s]:%u%%%u",
+ ipaddr, ntohs(namesrvr.sa6->sin6_port), ll_scope);
+ } else {
+ snprintf(addresses[addressesIndex].text,
+ sizeof(addresses[addressesIndex].text), "[%s]:%u", ipaddr,
+ ntohs(namesrvr.sa6->sin6_port));
+ }
+ ++addressesIndex;
+ } else {
+ /* Skip non-IPv4/IPv6 addresses completely. */
+ continue;
+ }
+ }
+ }
+
+ /* Sort all of the textual addresses by their metric (and original index if
+ * metrics are equal). */
+ qsort(addresses, addressesIndex, sizeof(*addresses), compareAddresses);
+
+ /* Join them all into a single string, removing duplicates. */
+ {
+ size_t i;
+ for (i = 0; i < addressesIndex; ++i) {
+ size_t j;
+ /* Look for this address text appearing previously in the results. */
+ for (j = 0; j < i; ++j) {
+ if (strcmp(addresses[j].text, addresses[i].text) == 0) {
+ break;
+ }
+ }
+ /* Iff we didn't emit this address already, emit it now. */
+ if (j == i) {
+ /* Add that to outptr (if we can). */
+ commajoin(outptr, addresses[i].text);
+ }
+ }
+ }
+
+done:
+ ares_free(addresses);
+
+ if (ipaa) {
+ ares_free(ipaa);
+ }
+
+ if (!*outptr) {
+ return ARES_FALSE;
+ }
+
+ return ARES_TRUE;
+}
+
+/*
+ * get_SuffixList_Windows()
+ *
+ * Reads the "DNS Suffix Search List" from registry and writes the list items
+ * whitespace separated to outptr. If the Search List is empty, the
+ * "Primary Dns Suffix" is written to outptr.
+ *
+ * Returns 0 and nullifies *outptr upon inability to return the suffix list.
+ *
+ * Returns 1 and sets *outptr when returning a dynamically allocated string.
+ *
+ * Implementation supports Windows Server 2003 and newer
+ */
+static ares_bool_t get_SuffixList_Windows(char **outptr)
+{
+ HKEY hKey;
+ HKEY hKeyEnum;
+ char keyName[256];
+ DWORD keyNameBuffSize;
+ DWORD keyIdx = 0;
+ char *p = NULL;
+
+ *outptr = NULL;
+
+ if (ares__getplatform() != WIN_NT) {
+ return ARES_FALSE;
+ }
+
+ /* 1. Global DNS Suffix Search List */
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hKey) ==
+ ERROR_SUCCESS) {
+ get_REG_SZ(hKey, SEARCHLIST_KEY, outptr);
+ if (get_REG_SZ(hKey, DOMAIN_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKey);
+ }
+
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NT_DNSCLIENT, 0, KEY_READ, &hKey) ==
+ ERROR_SUCCESS) {
+ if (get_REG_SZ(hKey, SEARCHLIST_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKey);
+ }
+
+ /* 2. Connection Specific Search List composed of:
+ * a. Primary DNS Suffix */
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_DNSCLIENT, 0, KEY_READ, &hKey) ==
+ ERROR_SUCCESS) {
+ if (get_REG_SZ(hKey, PRIMARYDNSSUFFIX_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKey);
+ }
+
+ /* b. Interface SearchList, Domain, DhcpDomain */
+ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY "\\" INTERFACES_KEY, 0,
+ KEY_READ, &hKey) == ERROR_SUCCESS) {
+ for (;;) {
+ keyNameBuffSize = sizeof(keyName);
+ if (RegEnumKeyExA(hKey, keyIdx++, keyName, &keyNameBuffSize, 0, NULL,
+ NULL, NULL) != ERROR_SUCCESS) {
+ break;
+ }
+ if (RegOpenKeyExA(hKey, keyName, 0, KEY_QUERY_VALUE, &hKeyEnum) !=
+ ERROR_SUCCESS) {
+ continue;
+ }
+ /* p can be comma separated (SearchList) */
+ if (get_REG_SZ(hKeyEnum, SEARCHLIST_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ if (get_REG_SZ(hKeyEnum, DOMAIN_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ if (get_REG_SZ(hKeyEnum, DHCPDOMAIN_KEY, &p)) {
+ commajoin(outptr, p);
+ ares_free(p);
+ p = NULL;
+ }
+ RegCloseKey(hKeyEnum);
+ }
+ RegCloseKey(hKey);
+ }
+
+ return *outptr != NULL ? ARES_TRUE : ARES_FALSE;
+}
+
+static ares_status_t ares__init_sysconfig_windows(ares_sysconfig_t *sysconfig)
+{
+ char *line = NULL;
+ ares_status_t status = ARES_SUCCESS;
+
+ if (get_DNS_Windows(&line)) {
+ status = ares__sconfig_append_fromstr(&sysconfig->sconfig, line, ARES_TRUE);
+ ares_free(line);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ if (get_SuffixList_Windows(&line)) {
+ sysconfig->domains = ares__strsplit(line, ", ", &sysconfig->ndomains);
+ ares_free(line);
+ if (sysconfig->domains == NULL) {
+ status = ARES_EFILE;
+ }
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ return status;
+}
+#endif
+
+#if defined(__MVS__)
+static ares_status_t ares__init_sysconfig_mvs(ares_sysconfig_t *sysconfig)
+{
+ struct __res_state *res = 0;
+ size_t count4;
+ size_t count6;
+ int i;
+ __STATEEXTIPV6 *v6;
+ arse__llist_t *sconfig = NULL;
+ ares_status_t status;
+
+ if (0 == res) {
+ int rc = res_init();
+ while (rc == -1 && h_errno == TRY_AGAIN) {
+ rc = res_init();
+ }
+ if (rc == -1) {
+ return ARES_ENOMEM;
+ }
+ res = __res();
+ }
+
+ v6 = res->__res_extIPv6;
+ if (res->nscount > 0) {
+ count4 = (size_t)res->nscount;
+ }
+
+ if (v6 && v6->__stat_nscount > 0) {
+ count6 = (size_t)v6->__stat_nscount;
+ } else {
+ count6 = 0;
+ }
+
+ for (i = 0; i < count4; i++) {
+ struct sockaddr_in *addr_in = &(res->nsaddr_list[i]);
+ struct ares_addr addr;
+
+ addr.addr.addr4.s_addr = addr_in->sin_addr.s_addr;
+ addr.family = AF_INET;
+
+ status =
+ ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port),
+ htons(addr_in->sin_port), NULL);
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ for (i = 0; i < count6; i++) {
+ struct sockaddr_in6 *addr_in = &(v6->__stat_nsaddr_list[i]);
+ struct ares_addr addr;
+
+ addr.family = AF_INET6;
+ memcpy(&(addr.addr.addr6), &(addr_in->sin6_addr),
+ sizeof(addr_in->sin6_addr));
+
+ status =
+ ares__sconfig_append(&sysconfig->sconfig, &addr, htons(addr_in->sin_port),
+ htons(addr_in->sin_port), NULL);
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+#endif
+
+#if defined(__riscos__)
+static ares_status_t ares__init_sysconfig_riscos(ares_sysconfig_t *sysconfig)
+{
+ char *line;
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Under RISC OS, name servers are listed in the
+ system variable Inet$Resolvers, space separated. */
+ line = getenv("Inet$Resolvers");
+ if (line) {
+ char *resolvers = ares_strdup(line);
+ char *pos;
+ char *space;
+
+ if (!resolvers) {
+ return ARES_ENOMEM;
+ }
+
+ pos = resolvers;
+ do {
+ space = strchr(pos, ' ');
+ if (space) {
+ *space = '\0';
+ }
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, pos, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ break;
+ }
+ pos = space + 1;
+ } while (space);
+
+ ares_free(resolvers);
+ }
+
+ return status;
+}
+#endif
+
+#if defined(WATT32)
+static ares_status_t ares__init_sysconfig_watt32(ares_sysconfig_t *sysconfig)
+{
+ size_t i;
+ ares_status_t status;
+
+ sock_init();
+
+ for (i = 0; def_nameservers[i]; i++) {
+ struct ares_addr addr;
+
+ addr.family = AF_INET;
+ addr.addr.addr4.s_addr = htonl(def_nameservers[i]);
+
+ status = ares__sconfig_append(&sysconfig->sconfig, &addr, 0, 0, NULL);
+
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+#endif
+
+#if defined(ANDROID) || defined(__ANDROID__)
+static ares_status_t ares__init_sysconfig_android(ares_sysconfig_t *sysconfig)
+{
+ size_t i;
+ char **dns_servers;
+ char *domains;
+ size_t num_servers;
+ ares_status_t status = ARES_EFILE;
+
+ /* Use the Android connectivity manager to get a list
+ * of DNS servers. As of Android 8 (Oreo) net.dns#
+ * system properties are no longer available. Google claims this
+ * improves privacy. Apps now need the ACCESS_NETWORK_STATE
+ * permission and must use the ConnectivityManager which
+ * is Java only. */
+ dns_servers = ares_get_android_server_list(MAX_DNS_PROPERTIES, &num_servers);
+ if (dns_servers != NULL) {
+ for (i = 0; i < num_servers; i++) {
+ status = ares__sconfig_append_fromstr(&sysconfig->sconfig, dns_servers[i],
+ ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ for (i = 0; i < num_servers; i++) {
+ ares_free(dns_servers[i]);
+ }
+ ares_free(dns_servers);
+ }
+
+ domains = ares_get_android_search_domains_list();
+ sysconfig->domains = ares__strsplit(domains, ", ", &sysconfig->ndomains);
+ ares_free(domains);
+
+# ifdef HAVE___SYSTEM_PROPERTY_GET
+ /* Old way using the system property still in place as
+ * a fallback. Older android versions can still use this.
+ * it's possible for older apps not not have added the new
+ * permission and we want to try to avoid breaking those.
+ *
+ * We'll only run this if we don't have any dns servers
+ * because this will get the same ones (if it works). */
+ if (sysconfig->sconfig == NULL) {
+ char propname[PROP_NAME_MAX];
+ char propvalue[PROP_VALUE_MAX] = "";
+ for (i = 1; i <= MAX_DNS_PROPERTIES; i++) {
+ snprintf(propname, sizeof(propname), "%s%u", DNS_PROP_NAME_PREFIX, i);
+ if (__system_property_get(propname, propvalue) < 1) {
+ break;
+ }
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, propvalue, ARES_TRUE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+ }
+# endif /* HAVE___SYSTEM_PROPERTY_GET */
+
+ return status;
+}
+#endif
+
+#if defined(CARES_USE_LIBRESOLV)
+static ares_status_t ares__init_sysconfig_libresolv(ares_sysconfig_t *sysconfig)
+{
+ struct __res_state res;
+ ares_status_t status = ARES_SUCCESS;
+ union res_sockaddr_union addr[MAXNS];
+ int nscount;
+ size_t i;
+ size_t entries = 0;
+ ares__buf_t *ipbuf = NULL;
+
+ memset(&res, 0, sizeof(res));
+
+ if (res_ninit(&res) != 0 || !(res.options & RES_INIT)) {
+ return ARES_EFILE;
+ }
+
+ nscount = res_getservers(&res, addr, MAXNS);
+
+ for (i = 0; i < (size_t)nscount; ++i) {
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ char *ipstr = NULL;
+ unsigned short port = 0;
+ unsigned int ll_scope = 0;
+
+ sa_family_t family = addr[i].sin.sin_family;
+ if (family == AF_INET) {
+ ares_inet_ntop(family, &addr[i].sin.sin_addr, ipaddr, sizeof(ipaddr));
+ port = ntohs(addr[i].sin.sin_port);
+ } else if (family == AF_INET6) {
+ ares_inet_ntop(family, &addr[i].sin6.sin6_addr, ipaddr, sizeof(ipaddr));
+ port = ntohs(addr[i].sin6.sin6_port);
+ ll_scope = addr[i].sin6.sin6_scope_id;
+ } else {
+ continue;
+ }
+
+
+ /* [ip]:port%iface */
+ ipbuf = ares__buf_create();
+ if (ipbuf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_append_str(ipbuf, "[");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_str(ipbuf, ipaddr);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_str(ipbuf, "]");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (port) {
+ status = ares__buf_append_str(ipbuf, ":");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ status = ares__buf_append_num_dec(ipbuf, port, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ if (ll_scope) {
+ status = ares__buf_append_str(ipbuf, "%");
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ status = ares__buf_append_num_dec(ipbuf, ll_scope, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ ipstr = ares__buf_finish_str(ipbuf, NULL);
+ ipbuf = NULL;
+ if (ipstr == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, ipstr, ARES_TRUE);
+
+ ares_free(ipstr);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ while ((entries < MAXDNSRCH) && res.dnsrch[entries]) {
+ entries++;
+ }
+
+ if (entries) {
+ sysconfig->domains = ares_malloc_zero(entries * sizeof(char *));
+ if (sysconfig->domains == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ } else {
+ sysconfig->ndomains = entries;
+ for (i = 0; i < sysconfig->ndomains; i++) {
+ sysconfig->domains[i] = ares_strdup(res.dnsrch[i]);
+ if (sysconfig->domains[i] == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+ }
+ }
+
+ if (res.ndots >= 0) {
+ sysconfig->ndots = (size_t)res.ndots;
+ }
+ if (res.retry > 0) {
+ sysconfig->tries = (size_t)res.retry;
+ }
+ if (res.options & RES_ROTATE) {
+ sysconfig->rotate = ARES_TRUE;
+ }
+
+ if (res.retrans > 0) {
+ if (res.retrans > 0) {
+ sysconfig->timeout_ms = (unsigned int)res.retrans * 1000;
+ }
+# ifdef __APPLE__
+ if (res.retry >= 0) {
+ sysconfig->timeout_ms /=
+ ((unsigned int)res.retry + 1) *
+ (unsigned int)(res.nscount > 0 ? res.nscount : 1);
+ }
+# endif
+ }
+
+done:
+ ares__buf_destroy(ipbuf);
+ res_ndestroy(&res);
+ return status;
+}
+#endif
+
+static void ares_sysconfig_free(ares_sysconfig_t *sysconfig)
+{
+ ares__llist_destroy(sysconfig->sconfig);
+ ares__strsplit_free(sysconfig->domains, sysconfig->ndomains);
+ ares_free(sysconfig->sortlist);
+ ares_free(sysconfig->lookups);
+ memset(sysconfig, 0, sizeof(*sysconfig));
+}
+
+static ares_status_t ares_sysconfig_apply(ares_channel_t *channel,
+ const ares_sysconfig_t *sysconfig)
+{
+ ares_status_t status;
+
+ if (sysconfig->sconfig && !(channel->optmask & ARES_OPT_SERVERS)) {
+ status = ares__servers_update(channel, sysconfig->sconfig, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ if (sysconfig->domains && !(channel->optmask & ARES_OPT_DOMAINS)) {
+ /* Make sure we duplicate first then replace so even if there is
+ * ARES_ENOMEM, the channel stays in a good state */
+ char **temp =
+ ares__strsplit_duplicate(sysconfig->domains, sysconfig->ndomains);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ ares__strsplit_free(channel->domains, channel->ndomains);
+ channel->domains = temp;
+ channel->ndomains = sysconfig->ndomains;
+ }
+
+ if (sysconfig->lookups && !(channel->optmask & ARES_OPT_LOOKUPS)) {
+ char *temp = ares_strdup(sysconfig->lookups);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ ares_free(channel->lookups);
+ channel->lookups = temp;
+ }
+
+ if (sysconfig->sortlist && !(channel->optmask & ARES_OPT_SORTLIST)) {
+ struct apattern *temp =
+ ares_malloc(sizeof(*channel->sortlist) * sysconfig->nsortlist);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ memcpy(temp, sysconfig->sortlist,
+ sizeof(*channel->sortlist) * sysconfig->nsortlist);
+
+ ares_free(channel->sortlist);
+ channel->sortlist = temp;
+ channel->nsort = sysconfig->nsortlist;
+ }
+
+ if (sysconfig->ndots && !(channel->optmask & ARES_OPT_NDOTS)) {
+ channel->ndots = sysconfig->ndots;
+ }
+
+ if (sysconfig->tries && !(channel->optmask & ARES_OPT_TRIES)) {
+ channel->tries = sysconfig->tries;
+ }
+
+ if (sysconfig->timeout_ms && !(channel->optmask & ARES_OPT_TIMEOUTMS)) {
+ channel->timeout = sysconfig->timeout_ms;
+ }
+
+ if (!(channel->optmask & (ARES_OPT_ROTATE | ARES_OPT_NOROTATE))) {
+ channel->rotate = sysconfig->rotate;
+ }
+
+ if (sysconfig->usevc) {
+ channel->flags |= ARES_FLAG_USEVC;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__init_by_sysconfig(ares_channel_t *channel)
+{
+ ares_status_t status;
+ ares_sysconfig_t sysconfig;
+
+ memset(&sysconfig, 0, sizeof(sysconfig));
+
+#ifdef _WIN32
+ status = ares__init_sysconfig_windows(&sysconfig);
+#elif defined(__MVS__)
+ status = ares__init_sysconfig_mvs(&sysconfig);
+#elif defined(__riscos__)
+ status = ares__init_sysconfig_riscos(&sysconfig);
+#elif defined(WATT32)
+ status = ares__init_sysconfig_watt32(&sysconfig);
+#elif defined(ANDROID) || defined(__ANDROID__)
+ status = ares__init_sysconfig_android(&sysconfig);
+#elif defined(CARES_USE_LIBRESOLV)
+ status = ares__init_sysconfig_libresolv(&sysconfig);
+#else
+ status = ares__init_sysconfig_files(channel, &sysconfig);
+#endif
+
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Environment is supposed to override sysconfig */
+ status = ares__init_by_environment(&sysconfig);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares_sysconfig_apply(channel, &sysconfig);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+done:
+ ares_sysconfig_free(&sysconfig);
+
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_sysconfig_files.c b/contrib/libs/c-ares/src/lib/ares_sysconfig_files.c
new file mode 100644
index 0000000000..557888bc74
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_sysconfig_files.c
@@ -0,0 +1,811 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) 2007 Daniel Stenberg
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "ares_setup.h"
+
+#ifdef HAVE_SYS_PARAM_H
+# include <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
+
+#include "ares_nameser.h"
+
+#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
+
+#if defined(USE_WINSOCK) && defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+#endif
+
+#include "ares.h"
+#include "ares_inet_net_pton.h"
+#include "ares_platform.h"
+#include "ares_private.h"
+
+static unsigned char ip_natural_mask(const struct ares_addr *addr)
+{
+ const unsigned char *ptr = NULL;
+ /* This is an odd one. If a raw ipv4 address is specified, then we take
+ * what is called a natural mask, which means we look at the first octet
+ * of the ip address and for values 0-127 we assume it is a class A (/8),
+ * for values 128-191 we assume it is a class B (/16), and for 192-223
+ * we assume it is a class C (/24). 223-239 is Class D which and 240-255 is
+ * Class E, however, there is no pre-defined mask for this, so we'll use
+ * /24 as well as that's what the old code did.
+ *
+ * For IPv6, we'll use /64.
+ */
+
+ if (addr->family == AF_INET6) {
+ return 64;
+ }
+
+ ptr = (const unsigned char *)&addr->addr.addr4;
+ if (*ptr < 128) {
+ return 8;
+ }
+
+ if (*ptr < 192) {
+ return 16;
+ }
+
+ return 24;
+}
+
+static ares_bool_t sortlist_append(struct apattern **sortlist, size_t *nsort,
+ const struct apattern *pat)
+{
+ struct apattern *newsort;
+
+ newsort = ares_realloc(*sortlist, (*nsort + 1) * sizeof(*newsort));
+ if (newsort == NULL) {
+ return ARES_FALSE;
+ }
+
+ *sortlist = newsort;
+
+ memcpy(&(*sortlist)[*nsort], pat, sizeof(**sortlist));
+ (*nsort)++;
+
+ return ARES_TRUE;
+}
+
+static ares_status_t parse_sort(ares__buf_t *buf, struct apattern *pat)
+{
+ ares_status_t status;
+ const unsigned char ip_charset[] = "ABCDEFabcdef0123456789.:";
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ size_t addrlen;
+
+ memset(pat, 0, sizeof(*pat));
+
+ /* Consume any leading whitespace */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ /* If no length, just ignore, return ENOTFOUND as an indicator */
+ if (ares__buf_len(buf) == 0) {
+ return ARES_ENOTFOUND;
+ }
+
+ ares__buf_tag(buf);
+
+ /* Consume ip address */
+ if (ares__buf_consume_charset(buf, ip_charset, sizeof(ip_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ /* Fetch ip address */
+ status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Parse it to make sure its valid */
+ pat->addr.family = AF_UNSPEC;
+ if (ares_dns_pton(ipaddr, &pat->addr, &addrlen) == NULL) {
+ return ARES_EBADSTR;
+ }
+
+ /* See if there is a subnet mask */
+ if (ares__buf_begins_with(buf, (const unsigned char *)"/", 1)) {
+ char maskstr[16];
+ const unsigned char ipv4_charset[] = "0123456789.";
+
+
+ /* Consume / */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ /* Consume mask */
+ if (ares__buf_consume_charset(buf, ipv4_charset,
+ sizeof(ipv4_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ /* Fetch mask */
+ status = ares__buf_tag_fetch_string(buf, maskstr, sizeof(maskstr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ if (ares_str_isnum(maskstr)) {
+ /* Numeric mask */
+ int mask = atoi(maskstr);
+ if (mask < 0 || mask > 128) {
+ return ARES_EBADSTR;
+ }
+ if (pat->addr.family == AF_INET && mask > 32) {
+ return ARES_EBADSTR;
+ }
+ pat->mask = (unsigned char)mask;
+ } else {
+ /* Ipv4 subnet style mask */
+ struct ares_addr maskaddr;
+ const unsigned char *ptr;
+
+ memset(&maskaddr, 0, sizeof(maskaddr));
+ maskaddr.family = AF_INET;
+ if (ares_dns_pton(maskstr, &maskaddr, &addrlen) == NULL) {
+ return ARES_EBADSTR;
+ }
+ ptr = (const unsigned char *)&maskaddr.addr.addr4;
+ pat->mask = (unsigned char)(ares__count_bits_u8(ptr[0]) +
+ ares__count_bits_u8(ptr[1]) +
+ ares__count_bits_u8(ptr[2]) +
+ ares__count_bits_u8(ptr[3]));
+ }
+ } else {
+ pat->mask = ip_natural_mask(&pat->addr);
+ }
+
+ /* Consume any trailing whitespace */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ /* If we have any trailing bytes other than whitespace, its a parse failure */
+ if (ares__buf_len(buf) != 0) {
+ return ARES_EBADSTR;
+ }
+
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__parse_sortlist(struct apattern **sortlist, size_t *nsort,
+ const char *str)
+{
+ ares__buf_t *buf = NULL;
+ ares__llist_t *list = NULL;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node = NULL;
+
+ if (sortlist == NULL || nsort == NULL || str == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ if (*sortlist != NULL) {
+ ares_free(*sortlist);
+ }
+
+ *sortlist = NULL;
+ *nsort = 0;
+
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ /* Split on space or semicolon */
+ status = ares__buf_split(buf, (const unsigned char *)" ;", 2,
+ ARES_BUF_SPLIT_NONE, 0, &list);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *entry = ares__llist_node_val(node);
+
+ struct apattern pat;
+
+ status = parse_sort(entry, &pat);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ if (status != ARES_SUCCESS) {
+ continue;
+ }
+
+ if (!sortlist_append(sortlist, nsort, &pat)) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(list);
+
+ if (status != ARES_SUCCESS) {
+ ares_free(*sortlist);
+ *sortlist = NULL;
+ *nsort = 0;
+ }
+
+ return status;
+}
+
+static ares_status_t config_search(ares_sysconfig_t *sysconfig, const char *str,
+ size_t max_domains)
+{
+ if (sysconfig->domains && sysconfig->ndomains > 0) {
+ /* if we already have some domains present, free them first */
+ ares__strsplit_free(sysconfig->domains, sysconfig->ndomains);
+ sysconfig->domains = NULL;
+ sysconfig->ndomains = 0;
+ }
+
+ sysconfig->domains = ares__strsplit(str, ", ", &sysconfig->ndomains);
+ if (sysconfig->domains == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ /* Truncate if necessary */
+ if (max_domains && sysconfig->ndomains > max_domains) {
+ size_t i;
+ for (i = max_domains; i < sysconfig->ndomains; i++) {
+ ares_free(sysconfig->domains[i]);
+ sysconfig->domains[i] = NULL;
+ }
+ sysconfig->ndomains = max_domains;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t buf_fetch_string(ares__buf_t *buf, char *str,
+ size_t str_len)
+{
+ ares_status_t status;
+ ares__buf_tag(buf);
+ ares__buf_consume(buf, ares__buf_len(buf));
+
+ status = ares__buf_tag_fetch_string(buf, str, str_len);
+ return status;
+}
+
+static ares_status_t config_lookup(ares_sysconfig_t *sysconfig,
+ ares__buf_t *buf, const char *separators)
+{
+ ares_status_t status;
+ char lookupstr[32];
+ size_t lookupstr_cnt = 0;
+ ares__llist_t *lookups = NULL;
+ ares__llist_node_t *node;
+ size_t separators_len = ares_strlen(separators);
+
+ status = ares__buf_split(buf, (const unsigned char *)separators,
+ separators_len, ARES_BUF_SPLIT_TRIM, 0, &lookups);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ memset(lookupstr, 0, sizeof(lookupstr));
+
+ for (node = ares__llist_node_first(lookups); node != NULL;
+ node = ares__llist_node_next(node)) {
+ char value[128];
+ char ch;
+ ares__buf_t *valbuf = ares__llist_node_val(node);
+
+ status = buf_fetch_string(valbuf, value, sizeof(value));
+ if (status != ARES_SUCCESS) {
+ continue;
+ }
+
+ if (strcasecmp(value, "dns") == 0 || strcasecmp(value, "bind") == 0 ||
+ strcasecmp(value, "resolv") == 0 || strcasecmp(value, "resolve") == 0) {
+ ch = 'b';
+ } else if (strcasecmp(value, "files") == 0 ||
+ strcasecmp(value, "file") == 0 ||
+ strcasecmp(value, "local") == 0) {
+ ch = 'f';
+ } else {
+ continue;
+ }
+
+ /* Look for a duplicate and ignore */
+ if (memchr(lookupstr, ch, lookupstr_cnt) == NULL) {
+ lookupstr[lookupstr_cnt++] = ch;
+ }
+ }
+
+ if (lookupstr_cnt) {
+ ares_free(sysconfig->lookups);
+ sysconfig->lookups = ares_strdup(lookupstr);
+ if (sysconfig->lookups == NULL) {
+ return ARES_ENOMEM;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ ares__llist_destroy(lookups);
+ return status;
+}
+
+static ares_status_t process_option(ares_sysconfig_t *sysconfig,
+ ares__buf_t *option)
+{
+ ares__llist_t *kv = NULL;
+ char key[32] = "";
+ char val[32] = "";
+ unsigned int valint = 0;
+ ares_status_t status;
+
+ /* Split on : */
+ status = ares__buf_split(option, (const unsigned char *)":", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &kv);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = buf_fetch_string(ares__llist_first_val(kv), key, sizeof(key));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ if (ares__llist_len(kv) == 2) {
+ status = buf_fetch_string(ares__llist_last_val(kv), val, sizeof(val));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ valint = (unsigned int)strtoul(val, NULL, 10);
+ }
+
+ if (strcmp(key, "ndots") == 0) {
+ sysconfig->ndots = valint;
+ } else if (strcmp(key, "retrans") == 0 || strcmp(key, "timeout") == 0) {
+ if (valint == 0) {
+ return ARES_EFORMERR;
+ }
+ sysconfig->timeout_ms = valint * 1000;
+ } else if (strcmp(key, "retry") == 0 || strcmp(key, "attempts") == 0) {
+ if (valint == 0) {
+ return ARES_EFORMERR;
+ }
+ sysconfig->tries = valint;
+ } else if (strcmp(key, "rotate") == 0) {
+ sysconfig->rotate = ARES_TRUE;
+ } else if (strcmp(key, "use-vc") == 0 || strcmp(key, "usevc") == 0) {
+ sysconfig->usevc = ARES_TRUE;
+ }
+
+done:
+ ares__llist_destroy(kv);
+ return status;
+}
+
+static ares_status_t set_options(ares_sysconfig_t *sysconfig, const char *str)
+{
+ ares__buf_t *buf = NULL;
+ ares__llist_t *options = NULL;
+ ares_status_t status;
+ ares__llist_node_t *node;
+
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ status = ares__buf_split(buf, (const unsigned char *)" \t", 2,
+ ARES_BUF_SPLIT_TRIM, 0, &options);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(options); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *valbuf = ares__llist_node_val(node);
+
+ status = process_option(sysconfig, valbuf);
+ /* Out of memory is the only fatal condition */
+ if (status == ARES_ENOMEM) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__llist_destroy(options);
+ ares__buf_destroy(buf);
+ return status;
+}
+
+ares_status_t ares__init_by_environment(ares_sysconfig_t *sysconfig)
+{
+ const char *localdomain;
+ const char *res_options;
+ ares_status_t status;
+
+ localdomain = getenv("LOCALDOMAIN");
+ if (localdomain) {
+ char *temp = ares_strdup(localdomain);
+ if (temp == NULL) {
+ return ARES_ENOMEM;
+ }
+ status = config_search(sysconfig, temp, 1);
+ ares_free(temp);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ res_options = getenv("RES_OPTIONS");
+ if (res_options) {
+ status = set_options(sysconfig, res_options);
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ return ARES_SUCCESS;
+}
+
+/* Configuration Files:
+ * /etc/resolv.conf
+ * - All Unix-like systems
+ * - Comments start with ; or #
+ * - Lines have a keyword followed by a value that is interpreted specific
+ * to the keyword:
+ * - Keywords:
+ * - nameserver - IP address of nameserver with optional port (using a :
+ * prefix). If using an ipv6 address and specifying a port, the ipv6
+ * address must be encapsulated in brackets. For link-local ipv6
+ * addresses, the interface can also be specified with a % prefix. e.g.:
+ * "nameserver [fe80::1]:1234%iface"
+ * This keyword may be specified multiple times.
+ * - search - whitespace separated list of domains
+ * - domain - obsolete, same as search except only a single domain
+ * - lookup / hostresorder - local, bind, file, files
+ * - sortlist - whitespace separated ip-address/netmask pairs
+ * - options - options controlling resolver variables
+ * - ndots:n - set ndots option
+ * - timeout:n (retrans:n) - timeout per query attempt in seconds
+ * - attempts:n (retry:n) - number of times resolver will send query
+ * - rotate - round-robin selection of name servers
+ * - use-vc / usevc - force tcp
+ * /etc/nsswitch.conf
+ * - Modern Linux, FreeBSD, HP-UX, Solaris
+ * - Search order set via:
+ * "hosts: files dns mdns4_minimal mdns4"
+ * - files is /etc/hosts
+ * - dns is dns
+ * - mdns4_minimal does mdns only if ending in .local
+ * - mdns4 does not limit to domains ending in .local
+ * /etc/netsvc.conf
+ * - AIX
+ * - Search order set via:
+ * "hosts = local , bind"
+ * - bind is dns
+ * - local is /etc/hosts
+ * /etc/svc.conf
+ * - Tru64
+ * - Same format as /etc/netsvc.conf
+ * /etc/host.conf
+ * - Early FreeBSD, Early Linux
+ * - Not worth supporting, format varied based on system, FreeBSD used
+ * just a line per search order, Linux used "order " and a comma
+ * delimited list of "bind" and "hosts"
+ */
+
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_resolvconf_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ char value[512];
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1) ||
+ ares__buf_begins_with(line, (const unsigned char *)";", 1)) {
+ return ARES_SUCCESS;
+ }
+
+ ares__buf_tag(line);
+
+ /* Shouldn't be possible, but if it happens, ignore the line. */
+ if (ares__buf_consume_nonwhitespace(line) == 0) {
+ return ARES_SUCCESS;
+ }
+
+ status = ares__buf_tag_fetch_string(line, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ return ARES_SUCCESS;
+ }
+
+ ares__buf_consume_whitespace(line, ARES_TRUE);
+
+ status = buf_fetch_string(line, value, sizeof(value));
+ if (status != ARES_SUCCESS) {
+ return ARES_SUCCESS;
+ }
+
+ ares__str_trim(value);
+ if (*value == 0) {
+ return ARES_SUCCESS;
+ }
+
+ /* At this point we have a string option and a string value, both trimmed
+ * of leading and trailing whitespace. Lets try to evaluate them */
+ if (strcmp(option, "domain") == 0) {
+ /* Domain is legacy, don't overwrite an existing config set by search */
+ if (sysconfig->domains == NULL) {
+ status = config_search(sysconfig, value, 1);
+ }
+ } else if (strcmp(option, "lookup") == 0 ||
+ strcmp(option, "hostresorder") == 0) {
+ ares__buf_tag_rollback(line);
+ status = config_lookup(sysconfig, line, " \t");
+ } else if (strcmp(option, "search") == 0) {
+ status = config_search(sysconfig, value, 0);
+ } else if (strcmp(option, "nameserver") == 0) {
+ status =
+ ares__sconfig_append_fromstr(&sysconfig->sconfig, value, ARES_TRUE);
+ } else if (strcmp(option, "sortlist") == 0) {
+ /* Ignore all failures except ENOMEM. If the sysadmin set a bad
+ * sortlist, just ignore the sortlist, don't cause an inoperable
+ * channel */
+ status =
+ ares__parse_sortlist(&sysconfig->sortlist, &sysconfig->nsortlist, value);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ } else if (strcmp(option, "options") == 0) {
+ status = set_options(sysconfig, value);
+ }
+
+ return status;
+}
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_nsswitch_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ ares__buf_t *buf;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_t *sects = NULL;
+
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) {
+ return ARES_SUCCESS;
+ }
+
+ /* database : values (space delimited) */
+ status = ares__buf_split(line, (const unsigned char *)":", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &sects);
+
+ if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) {
+ goto done;
+ }
+
+ buf = ares__llist_first_val(sects);
+ status = buf_fetch_string(buf, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Only support "hosts:" */
+ if (strcmp(option, "hosts") != 0) {
+ goto done;
+ }
+
+ /* Values are space separated */
+ buf = ares__llist_last_val(sects);
+ status = config_lookup(sysconfig, buf, " \t");
+
+done:
+ ares__llist_destroy(sects);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ return status;
+}
+
+/* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other
+ * conditions are ignored. Users may mess up config files, but we want to
+ * process anything we can. */
+static ares_status_t parse_svcconf_line(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line)
+{
+ char option[32];
+ ares__buf_t *buf;
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_t *sects = NULL;
+
+ /* Ignore lines beginning with a comment */
+ if (ares__buf_begins_with(line, (const unsigned char *)"#", 1)) {
+ return ARES_SUCCESS;
+ }
+
+ /* database = values (comma delimited)*/
+ status = ares__buf_split(line, (const unsigned char *)"=", 1,
+ ARES_BUF_SPLIT_TRIM, 2, &sects);
+
+ if (status != ARES_SUCCESS || ares__llist_len(sects) != 2) {
+ goto done;
+ }
+
+ buf = ares__llist_first_val(sects);
+ status = buf_fetch_string(buf, option, sizeof(option));
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* Only support "hosts=" */
+ if (strcmp(option, "hosts") != 0) {
+ goto done;
+ }
+
+ /* Values are comma separated */
+ buf = ares__llist_last_val(sects);
+ status = config_lookup(sysconfig, buf, ",");
+
+done:
+ ares__llist_destroy(sects);
+ if (status != ARES_ENOMEM) {
+ status = ARES_SUCCESS;
+ }
+ return status;
+}
+
+typedef ares_status_t (*line_callback_t)(ares_sysconfig_t *sysconfig,
+ ares__buf_t *line);
+
+/* Should only return:
+ * ARES_ENOTFOUND - file not found
+ * ARES_EFILE - error reading file (perms)
+ * ARES_ENOMEM - out of memory
+ * ARES_SUCCESS - file processed, doesn't necessarily mean it was a good
+ * file, but we're not erroring out if we can't parse
+ * something (or anything at all) */
+static ares_status_t process_config_lines(const char *filename,
+ ares_sysconfig_t *sysconfig,
+ line_callback_t cb)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares__llist_node_t *node;
+ ares__llist_t *lines = NULL;
+ ares__buf_t *buf = NULL;
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_load_file(filename, buf);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_split(buf, (const unsigned char *)"\n", 1,
+ ARES_BUF_SPLIT_TRIM, 0, &lines);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(lines); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *line = ares__llist_node_val(node);
+
+ status = cb(sysconfig, line);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+done:
+ ares__buf_destroy(buf);
+ ares__llist_destroy(lines);
+
+ return status;
+}
+
+ares_status_t ares__init_sysconfig_files(const ares_channel_t *channel,
+ ares_sysconfig_t *sysconfig)
+{
+ ares_status_t status = ARES_SUCCESS;
+
+ /* Resolv.conf */
+ status = process_config_lines((channel->resolvconf_path != NULL)
+ ? channel->resolvconf_path
+ : PATH_RESOLV_CONF,
+ sysconfig, parse_resolvconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ /* Nsswitch.conf */
+ status =
+ process_config_lines("/etc/nsswitch.conf", sysconfig, parse_nsswitch_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ /* netsvc.conf */
+ status =
+ process_config_lines("/etc/netsvc.conf", sysconfig, parse_svcconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ /* svc.conf */
+ status = process_config_lines("/etc/svc.conf", sysconfig, parse_svcconf_line);
+ if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) {
+ goto done;
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ return status;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_timeout.c b/contrib/libs/c-ares/src/lib/ares_timeout.c
index 7390ef9263..4e80580b5e 100644
--- a/contrib/libs/c-ares/src/lib/ares_timeout.c
+++ b/contrib/libs/c-ares/src/lib/ares_timeout.c
@@ -28,26 +28,39 @@
#include "ares_setup.h"
#ifdef HAVE_LIMITS_H
-#include <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)
+void ares__timeval_remaining(struct timeval *remaining,
+ const struct timeval *now,
+ const struct timeval *tout)
{
- return (check->tv_sec - now->tv_sec)*1000 +
- (check->tv_usec - now->tv_usec)/1000;
+ memset(remaining, 0, sizeof(*remaining));
+
+ /* Expired! */
+ if (tout->tv_sec < now->tv_sec ||
+ (tout->tv_sec == now->tv_sec && tout->tv_usec < now->tv_usec)) {
+ return;
+ }
+
+ remaining->tv_sec = tout->tv_sec - now->tv_sec;
+ if (tout->tv_usec < now->tv_usec) {
+ remaining->tv_sec -= 1;
+ remaining->tv_usec = (tout->tv_usec + 1000000) - now->tv_usec;
+ } else {
+ remaining->tv_usec = tout->tv_usec - now->tv_usec;
+ }
}
-struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
+struct timeval *ares_timeout(ares_channel_t *channel, struct timeval *maxtv,
struct timeval *tvbuf)
{
- struct query *query;
+ const struct query *query;
ares__slist_node_t *node;
struct timeval now;
- long offset;
/* The minimum timeout of all queries is always the first entry in
* channel->queries_by_timeout */
@@ -61,27 +74,24 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
now = ares__tvnow();
- offset = timeoffset(&now, &query->timeout);
- if (offset < 0)
- offset = 0;
- if (offset > (long)INT_MAX)
- offset = INT_MAX;
-
- tvbuf->tv_sec = offset / 1000;
- tvbuf->tv_usec = (offset % 1000) * 1000;
+ ares__timeval_remaining(tvbuf, &now, &query->timeout);
- if (maxtv == NULL)
+ if (maxtv == NULL) {
return tvbuf;
+ }
/* Return the minimum time between maxtv and tvbuf */
- if (tvbuf->tv_sec > maxtv->tv_sec)
+ if (tvbuf->tv_sec > maxtv->tv_sec) {
return maxtv;
- if (tvbuf->tv_sec < maxtv->tv_sec)
+ }
+ if (tvbuf->tv_sec < maxtv->tv_sec) {
return tvbuf;
+ }
- if (tvbuf->tv_usec > maxtv->tv_usec)
+ if (tvbuf->tv_usec > maxtv->tv_usec) {
return maxtv;
+ }
return tvbuf;
}
diff --git a/contrib/libs/c-ares/src/lib/ares_update_servers.c b/contrib/libs/c-ares/src/lib/ares_update_servers.c
new file mode 100644
index 0000000000..b8e26fcbae
--- /dev/null
+++ b/contrib/libs/c-ares/src/lib/ares_update_servers.c
@@ -0,0 +1,1195 @@
+/* MIT License
+ *
+ * Copyright (c) 1998 Massachusetts Institute of Technology
+ * Copyright (c) 2008 Daniel Stenberg
+ * Copyright (c) 2023 Brad House
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * SPDX-License-Identifier: MIT
+ */
+#include "ares_setup.h"
+
+#ifdef HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+
+#if defined(USE_WINSOCK)
+# if defined(HAVE_IPHLPAPI_H)
+# include <iphlpapi.h>
+# endif
+# if defined(HAVE_NETIOAPI_H)
+# include <netioapi.h>
+# endif
+#endif
+
+#include "ares.h"
+#include "ares_data.h"
+#include "ares_inet_net_pton.h"
+#include "ares_private.h"
+
+typedef struct {
+ struct ares_addr addr;
+ unsigned short tcp_port;
+ unsigned short udp_port;
+
+ char ll_iface[IF_NAMESIZE];
+ unsigned int ll_scope;
+} ares_sconfig_t;
+
+static ares_bool_t ares__addr_match(const struct ares_addr *addr1,
+ const struct ares_addr *addr2)
+{
+ if (addr1 == NULL && addr2 == NULL) {
+ return ARES_TRUE;
+ }
+
+ if (addr1 == NULL || addr2 == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (addr1->family != addr2->family) {
+ return ARES_FALSE;
+ }
+
+ if (addr1->family == AF_INET && memcmp(&addr1->addr.addr4, &addr2->addr.addr4,
+ sizeof(addr1->addr.addr4)) == 0) {
+ return ARES_TRUE;
+ }
+
+ if (addr1->family == AF_INET6 &&
+ memcmp(&addr1->addr.addr6._S6_un._S6_u8, &addr2->addr.addr6._S6_un._S6_u8,
+ sizeof(addr1->addr.addr6._S6_un._S6_u8)) == 0) {
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+ares_bool_t ares__subnet_match(const struct ares_addr *addr,
+ const struct ares_addr *subnet,
+ unsigned char netmask)
+{
+ const unsigned char *addr_ptr;
+ const unsigned char *subnet_ptr;
+ size_t len;
+ size_t i;
+
+ if (addr == NULL || subnet == NULL) {
+ return ARES_FALSE;
+ }
+
+ if (addr->family != subnet->family) {
+ return ARES_FALSE;
+ }
+
+ if (addr->family == AF_INET) {
+ addr_ptr = (const unsigned char *)&addr->addr.addr4;
+ subnet_ptr = (const unsigned char *)&subnet->addr.addr4;
+ len = 4;
+
+ if (netmask > 32) {
+ return ARES_FALSE;
+ }
+ } else if (addr->family == AF_INET6) {
+ addr_ptr = (const unsigned char *)&addr->addr.addr6;
+ subnet_ptr = (const unsigned char *)&subnet->addr.addr6;
+ len = 16;
+
+ if (netmask > 128) {
+ return ARES_FALSE;
+ }
+ } else {
+ return ARES_FALSE;
+ }
+
+ for (i = 0; i < len && netmask > 0; i++) {
+ unsigned char mask = 0xff;
+ if (netmask < 8) {
+ mask <<= (8 - netmask);
+ netmask = 0;
+ } else {
+ netmask -= 8;
+ }
+
+ if ((addr_ptr[i] & mask) != (subnet_ptr[i] & mask)) {
+ return ARES_FALSE;
+ }
+ }
+
+ return ARES_TRUE;
+}
+
+ares_bool_t ares__addr_is_linklocal(const struct ares_addr *addr)
+{
+ struct ares_addr subnet;
+ const unsigned char subnetaddr[16] = { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 };
+
+ /* fe80::/10 */
+ subnet.family = AF_INET6;
+ memcpy(&subnet.addr.addr6, subnetaddr, 16);
+
+ return ares__subnet_match(addr, &subnet, 10);
+}
+
+static ares_bool_t ares_server_blacklisted(const struct ares_addr *addr)
+{
+ /* A list of blacklisted IPv6 subnets. */
+ const struct {
+ const unsigned char netbase[16];
+ unsigned char netmask;
+ } blacklist_v6[] = {
+ /* fec0::/10 was deprecated by [RFC3879] in September 2004. Formerly a
+ * Site-Local scoped address prefix. These are never valid DNS servers,
+ * but are known to be returned at least sometimes on Windows and Android.
+ */
+ {{ 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00 },
+ 10}
+ };
+
+ size_t i;
+
+ if (addr->family != AF_INET6) {
+ return ARES_FALSE;
+ }
+
+ /* See if ipaddr matches any of the entries in the blacklist. */
+ for (i = 0; i < sizeof(blacklist_v6) / sizeof(*blacklist_v6); i++) {
+ struct ares_addr subnet;
+ subnet.family = AF_INET6;
+ memcpy(&subnet.addr.addr6, blacklist_v6[i].netbase, 16);
+ if (ares__subnet_match(addr, &subnet, blacklist_v6[i].netmask)) {
+ return ARES_TRUE;
+ }
+ }
+ return ARES_FALSE;
+}
+
+/* Parse address and port in these formats, either ipv4 or ipv6 addresses
+ * are allowed:
+ * ipaddr
+ * ipv4addr:port
+ * [ipaddr]
+ * [ipaddr]:port
+ *
+ * Modifiers: %iface
+ *
+ * TODO: #domain modifier
+ *
+ * If a port is not specified, will set port to 0.
+ *
+ * Will fail if an IPv6 nameserver as detected by
+ * ares_ipv6_server_blacklisted()
+ *
+ * Returns an error code on failure, else ARES_SUCCESS
+ */
+
+static ares_status_t parse_nameserver(ares__buf_t *buf, ares_sconfig_t *sconfig)
+{
+ ares_status_t status;
+ char ipaddr[INET6_ADDRSTRLEN] = "";
+ size_t addrlen;
+
+ memset(sconfig, 0, sizeof(*sconfig));
+
+ /* Consume any leading whitespace */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ /* pop off IP address. If it is in [ ] then it can be ipv4 or ipv6. If
+ * not, ipv4 only */
+ if (ares__buf_begins_with(buf, (const unsigned char *)"[", 1)) {
+ /* Consume [ */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ /* Consume until ] */
+ if (ares__buf_consume_until_charset(buf, (const unsigned char *)"]", 1,
+ ARES_TRUE) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ /* Skip over ] */
+ ares__buf_consume(buf, 1);
+ } else {
+ size_t offset;
+
+ /* Not in [ ], see if '.' is in first 4 characters, if it is, then its ipv4,
+ * otherwise treat as ipv6 */
+ ares__buf_tag(buf);
+
+ offset = ares__buf_consume_until_charset(buf, (const unsigned char *)".", 1,
+ ARES_TRUE);
+ ares__buf_tag_rollback(buf);
+ ares__buf_tag(buf);
+
+ if (offset > 0 && offset < 4) {
+ /* IPv4 */
+ if (ares__buf_consume_charset(buf, (const unsigned char *)"0123456789.",
+ 11) == 0) {
+ return ARES_EBADSTR;
+ }
+ } else {
+ /* IPv6 */
+ const unsigned char ipv6_charset[] = "ABCDEFabcdef0123456789.:";
+ if (ares__buf_consume_charset(buf, ipv6_charset,
+ sizeof(ipv6_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+ }
+
+ status = ares__buf_tag_fetch_string(buf, ipaddr, sizeof(ipaddr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ /* Convert ip address from string to network byte order */
+ sconfig->addr.family = AF_UNSPEC;
+ if (ares_dns_pton(ipaddr, &sconfig->addr, &addrlen) == NULL) {
+ return ARES_EBADSTR;
+ }
+
+ /* Pull off port */
+ if (ares__buf_begins_with(buf, (const unsigned char *)":", 1)) {
+ char portstr[6];
+
+ /* Consume : */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ /* Read numbers */
+ if (ares__buf_consume_charset(buf, (const unsigned char *)"0123456789",
+ 10) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, portstr, sizeof(portstr));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+
+ sconfig->udp_port = (unsigned short)atoi(portstr);
+ sconfig->tcp_port = sconfig->udp_port;
+ }
+
+ /* Pull off interface modifier */
+ if (ares__buf_begins_with(buf, (const unsigned char *)"%", 1)) {
+ const unsigned char iface_charset[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789.-_\\:{}";
+ /* Consume % */
+ ares__buf_consume(buf, 1);
+
+ ares__buf_tag(buf);
+
+ if (ares__buf_consume_charset(buf, iface_charset,
+ sizeof(iface_charset) - 1) == 0) {
+ return ARES_EBADSTR;
+ }
+
+ status = ares__buf_tag_fetch_string(buf, sconfig->ll_iface,
+ sizeof(sconfig->ll_iface));
+ if (status != ARES_SUCCESS) {
+ return status;
+ }
+ }
+
+ /* Consume any trailing whitespace so we can bail out if there is something
+ * after we didn't read */
+ ares__buf_consume_whitespace(buf, ARES_TRUE);
+
+ if (ares__buf_len(buf) != 0) {
+ return ARES_EBADSTR;
+ }
+
+ return ARES_SUCCESS;
+}
+
+static ares_status_t ares__sconfig_linklocal(ares_sconfig_t *s,
+ const char *ll_iface)
+{
+ unsigned int ll_scope = 0;
+
+ if (ares_str_isnum(ll_iface)) {
+ char ifname[IF_NAMESIZE] = "";
+ ll_scope = (unsigned int)atoi(ll_iface);
+ if (ares__if_indextoname(ll_scope, ifname, sizeof(ifname)) == NULL) {
+ DEBUGF(fprintf(stderr, "Interface %s for ipv6 Link Local not found\n",
+ ll_iface));
+ return ARES_ENOTFOUND;
+ }
+ ares_strcpy(s->ll_iface, ifname, sizeof(s->ll_iface));
+ s->ll_scope = ll_scope;
+ return ARES_SUCCESS;
+ }
+
+ ll_scope = ares__if_nametoindex(ll_iface);
+ if (ll_scope == 0) {
+ DEBUGF(fprintf(stderr, "Interface %s for ipv6 Link Local not found\n",
+ ll_iface));
+ return ARES_ENOTFOUND;
+ }
+ ares_strcpy(s->ll_iface, ll_iface, sizeof(s->ll_iface));
+ s->ll_scope = ll_scope;
+ return ARES_SUCCESS;
+}
+
+ares_status_t ares__sconfig_append(ares__llist_t **sconfig,
+ const struct ares_addr *addr,
+ unsigned short udp_port,
+ unsigned short tcp_port,
+ const char *ll_iface)
+{
+ ares_sconfig_t *s;
+ ares_status_t status;
+
+ if (sconfig == NULL || addr == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ /* Silently skip blacklisted IPv6 servers. */
+ if (ares_server_blacklisted(addr)) {
+ return ARES_SUCCESS;
+ }
+
+ s = ares_malloc_zero(sizeof(*s));
+ if (s == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ if (*sconfig == NULL) {
+ *sconfig = ares__llist_create(ares_free);
+ if (*sconfig == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+ }
+
+ memcpy(&s->addr, addr, sizeof(s->addr));
+ s->udp_port = udp_port;
+ s->tcp_port = tcp_port;
+
+ /* Handle link-local enumeration */
+ if (ares_strlen(ll_iface) && ares__addr_is_linklocal(&s->addr)) {
+ status = ares__sconfig_linklocal(s, ll_iface);
+ /* Silently ignore this entry */
+ if (status != ARES_SUCCESS) {
+ status = ARES_SUCCESS;
+ goto fail;
+ }
+ }
+
+ if (ares__llist_insert_last(*sconfig, s) == NULL) {
+ status = ARES_ENOMEM;
+ goto fail;
+ }
+
+ return ARES_SUCCESS;
+
+fail:
+ ares_free(s);
+
+ return status;
+}
+
+/* Add the IPv4 or IPv6 nameservers in str (separated by commas or spaces) to
+ * the servers list, updating servers and nservers as required.
+ *
+ * If a nameserver is encapsulated in [ ] it may optionally include a port
+ * suffix, e.g.:
+ * [127.0.0.1]:59591
+ *
+ * The extended format is required to support OpenBSD's resolv.conf format:
+ * https://man.openbsd.org/OpenBSD-5.1/resolv.conf.5
+ * As well as MacOS libresolv that may include a non-default port number.
+ *
+ * This will silently ignore blacklisted IPv6 nameservers as detected by
+ * ares_ipv6_server_blacklisted().
+ *
+ * Returns an error code on failure, else ARES_SUCCESS.
+ */
+ares_status_t ares__sconfig_append_fromstr(ares__llist_t **sconfig,
+ const char *str,
+ ares_bool_t ignore_invalid)
+{
+ ares_status_t status = ARES_SUCCESS;
+ ares__buf_t *buf = NULL;
+ ares__llist_t *list = NULL;
+ ares__llist_node_t *node;
+
+ /* On Windows, there may be more than one nameserver specified in the same
+ * registry key, so we parse input as a space or comma separated list.
+ */
+ buf = ares__buf_create_const((const unsigned char *)str, ares_strlen(str));
+ if (buf == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ares__buf_split(buf, (const unsigned char *)" ,", 2,
+ ARES_BUF_SPLIT_NONE, 0, &list);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ for (node = ares__llist_node_first(list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ ares__buf_t *entry = ares__llist_node_val(node);
+ ares_sconfig_t s;
+
+ status = parse_nameserver(entry, &s);
+ if (status != ARES_SUCCESS) {
+ if (ignore_invalid) {
+ continue;
+ } else {
+ goto done;
+ }
+ }
+
+ status = ares__sconfig_append(sconfig, &s.addr, s.udp_port, s.tcp_port,
+ s.ll_iface);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__llist_destroy(list);
+ ares__buf_destroy(buf);
+ return status;
+}
+
+static unsigned short ares__sconfig_get_port(const ares_channel_t *channel,
+ const ares_sconfig_t *s,
+ ares_bool_t is_tcp)
+{
+ unsigned short port = is_tcp ? s->tcp_port : s->udp_port;
+
+ if (port == 0) {
+ port = is_tcp ? channel->tcp_port : channel->udp_port;
+ }
+
+ if (port == 0) {
+ port = 53;
+ }
+
+ return port;
+}
+
+static ares__slist_node_t *ares__server_find(ares_channel_t *channel,
+ const ares_sconfig_t *s)
+{
+ ares__slist_node_t *node;
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ const struct server_state *server = ares__slist_node_val(node);
+
+ if (!ares__addr_match(&server->addr, &s->addr)) {
+ continue;
+ }
+
+ if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) {
+ continue;
+ }
+
+ if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) {
+ continue;
+ }
+
+ return node;
+ }
+ return NULL;
+}
+
+static ares_bool_t ares__server_isdup(const ares_channel_t *channel,
+ ares__llist_node_t *s)
+{
+ /* Scan backwards to see if this is a duplicate */
+ ares__llist_node_t *prev;
+ const ares_sconfig_t *server = ares__llist_node_val(s);
+
+ for (prev = ares__llist_node_prev(s); prev != NULL;
+ prev = ares__llist_node_prev(prev)) {
+ const ares_sconfig_t *p = ares__llist_node_val(prev);
+
+ if (!ares__addr_match(&server->addr, &p->addr)) {
+ continue;
+ }
+
+ if (ares__sconfig_get_port(channel, server, ARES_TRUE) !=
+ ares__sconfig_get_port(channel, p, ARES_TRUE)) {
+ continue;
+ }
+
+ if (ares__sconfig_get_port(channel, server, ARES_FALSE) !=
+ ares__sconfig_get_port(channel, p, ARES_FALSE)) {
+ continue;
+ }
+
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static ares_status_t ares__server_create(ares_channel_t *channel,
+ const ares_sconfig_t *sconfig,
+ size_t idx)
+{
+ ares_status_t status;
+ struct server_state *server = ares_malloc_zero(sizeof(*server));
+
+ if (server == NULL) {
+ return ARES_ENOMEM;
+ }
+
+ server->idx = idx;
+ server->channel = channel;
+ server->udp_port = ares__sconfig_get_port(channel, sconfig, ARES_FALSE);
+ server->tcp_port = ares__sconfig_get_port(channel, sconfig, ARES_TRUE);
+ server->addr.family = sconfig->addr.family;
+ server->next_retry_time.tv_sec = 0;
+ server->next_retry_time.tv_usec = 0;
+
+ if (sconfig->addr.family == AF_INET) {
+ memcpy(&server->addr.addr.addr4, &sconfig->addr.addr.addr4,
+ sizeof(server->addr.addr.addr4));
+ } else if (sconfig->addr.family == AF_INET6) {
+ memcpy(&server->addr.addr.addr6, &sconfig->addr.addr.addr6,
+ sizeof(server->addr.addr.addr6));
+ }
+
+ /* Copy over link-local settings */
+ if (ares_strlen(sconfig->ll_iface)) {
+ ares_strcpy(server->ll_iface, sconfig->ll_iface, sizeof(server->ll_iface));
+ server->ll_scope = sconfig->ll_scope;
+ }
+
+ server->tcp_parser = ares__buf_create();
+ if (server->tcp_parser == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ server->tcp_send = ares__buf_create();
+ if (server->tcp_send == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ server->connections = ares__llist_create(NULL);
+ if (server->connections == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ if (ares__slist_insert(channel->servers, server) == NULL) {
+ status = ARES_ENOMEM;
+ goto done;
+ }
+
+ status = ARES_SUCCESS;
+
+done:
+ if (status != ARES_SUCCESS) {
+ ares__destroy_server(server);
+ }
+
+ return status;
+}
+
+static ares_bool_t ares__server_in_newconfig(const struct server_state *server,
+ ares__llist_t *srvlist)
+{
+ ares__llist_node_t *node;
+ const ares_channel_t *channel = server->channel;
+
+ for (node = ares__llist_node_first(srvlist); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares_sconfig_t *s = ares__llist_node_val(node);
+
+ if (!ares__addr_match(&server->addr, &s->addr)) {
+ continue;
+ }
+
+ if (server->tcp_port != ares__sconfig_get_port(channel, s, ARES_TRUE)) {
+ continue;
+ }
+
+ if (server->udp_port != ares__sconfig_get_port(channel, s, ARES_FALSE)) {
+ continue;
+ }
+
+ return ARES_TRUE;
+ }
+
+ return ARES_FALSE;
+}
+
+static void ares__servers_remove_stale(ares_channel_t *channel,
+ ares__llist_t *srvlist)
+{
+ ares__slist_node_t *snode = ares__slist_node_first(channel->servers);
+
+ while (snode != NULL) {
+ ares__slist_node_t *snext = ares__slist_node_next(snode);
+ const struct server_state *server = ares__slist_node_val(snode);
+ if (!ares__server_in_newconfig(server, srvlist)) {
+ /* This will clean up all server state via the destruction callback and
+ * move any queries to new servers */
+ ares__slist_node_destroy(snode);
+ }
+ snode = snext;
+ }
+}
+
+static void ares__servers_trim_single(ares_channel_t *channel)
+{
+ while (ares__slist_len(channel->servers) > 1) {
+ ares__slist_node_destroy(ares__slist_node_last(channel->servers));
+ }
+}
+
+ares_status_t ares__servers_update(ares_channel_t *channel,
+ ares__llist_t *server_list,
+ ares_bool_t user_specified)
+{
+ ares__llist_node_t *node;
+ size_t idx = 0;
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_EFORMERR;
+ }
+
+ ares__channel_lock(channel);
+
+ /* NOTE: a NULL or zero entry server list is considered valid due to
+ * real-world people needing support for this for their test harnesses
+ */
+
+ /* Add new entries */
+ for (node = ares__llist_node_first(server_list); node != NULL;
+ node = ares__llist_node_next(node)) {
+ const ares_sconfig_t *sconfig = ares__llist_node_val(node);
+ ares__slist_node_t *snode;
+
+ /* Don't add duplicate servers! */
+ if (ares__server_isdup(channel, node)) {
+ continue;
+ }
+
+ snode = ares__server_find(channel, sconfig);
+ if (snode != NULL) {
+ struct server_state *server = ares__slist_node_val(snode);
+
+ /* Copy over link-local settings. Its possible some of this data has
+ * changed, maybe ... */
+ if (ares_strlen(sconfig->ll_iface)) {
+ ares_strcpy(server->ll_iface, sconfig->ll_iface,
+ sizeof(server->ll_iface));
+ server->ll_scope = sconfig->ll_scope;
+ }
+
+ if (server->idx != idx) {
+ server->idx = idx;
+ /* Index changed, reinsert node, doesn't require any memory
+ * allocations so can't fail. */
+ ares__slist_node_reinsert(snode);
+ }
+ } else {
+ status = ares__server_create(channel, sconfig, idx);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ idx++;
+ }
+
+ /* Remove any servers that don't exist in the current configuration */
+ ares__servers_remove_stale(channel, server_list);
+
+ /* Trim to one server if ARES_FLAG_PRIMARY is set. */
+ if (channel->flags & ARES_FLAG_PRIMARY) {
+ ares__servers_trim_single(channel);
+ }
+
+ if (user_specified) {
+ /* Save servers as if they were passed in as an option */
+ channel->optmask |= ARES_OPT_SERVERS;
+ }
+
+ /* Clear any cached query results */
+ ares__qcache_flush(channel->qcache);
+
+ status = ARES_SUCCESS;
+
+done:
+ ares__channel_unlock(channel);
+ return status;
+}
+
+static ares_status_t
+ ares_addr_node_to_server_config_llist(const struct ares_addr_node *servers,
+ ares__llist_t **llist)
+{
+ const struct ares_addr_node *node;
+ ares__llist_t *s;
+
+ *llist = NULL;
+
+ s = ares__llist_create(ares_free);
+ if (s == NULL) {
+ goto fail;
+ }
+
+ for (node = servers; node != NULL; node = node->next) {
+ ares_sconfig_t *sconfig;
+
+ /* Invalid entry */
+ if (node->family != AF_INET && node->family != AF_INET6) {
+ continue;
+ }
+
+ sconfig = ares_malloc_zero(sizeof(*sconfig));
+ if (sconfig == NULL) {
+ goto fail;
+ }
+
+ sconfig->addr.family = node->family;
+ if (node->family == AF_INET) {
+ memcpy(&sconfig->addr.addr.addr4, &node->addr.addr4,
+ sizeof(sconfig->addr.addr.addr4));
+ } else if (sconfig->addr.family == AF_INET6) {
+ memcpy(&sconfig->addr.addr.addr6, &node->addr.addr6,
+ sizeof(sconfig->addr.addr.addr6));
+ }
+
+ if (ares__llist_insert_last(s, sconfig) == NULL) {
+ ares_free(sconfig);
+ goto fail;
+ }
+ }
+
+ *llist = s;
+ return ARES_SUCCESS;
+
+fail:
+ ares__llist_destroy(s);
+ return ARES_ENOMEM;
+}
+
+static ares_status_t ares_addr_port_node_to_server_config_llist(
+ const struct ares_addr_port_node *servers, ares__llist_t **llist)
+{
+ const struct ares_addr_port_node *node;
+ ares__llist_t *s;
+
+ *llist = NULL;
+
+ s = ares__llist_create(ares_free);
+ if (s == NULL) {
+ goto fail;
+ }
+
+ for (node = servers; node != NULL; node = node->next) {
+ ares_sconfig_t *sconfig;
+
+ /* Invalid entry */
+ if (node->family != AF_INET && node->family != AF_INET6) {
+ continue;
+ }
+
+ sconfig = ares_malloc_zero(sizeof(*sconfig));
+ if (sconfig == NULL) {
+ goto fail;
+ }
+
+ sconfig->addr.family = node->family;
+ if (node->family == AF_INET) {
+ memcpy(&sconfig->addr.addr.addr4, &node->addr.addr4,
+ sizeof(sconfig->addr.addr.addr4));
+ } else if (sconfig->addr.family == AF_INET6) {
+ memcpy(&sconfig->addr.addr.addr6, &node->addr.addr6,
+ sizeof(sconfig->addr.addr.addr6));
+ }
+
+ sconfig->tcp_port = (unsigned short)node->tcp_port;
+ sconfig->udp_port = (unsigned short)node->udp_port;
+
+ if (ares__llist_insert_last(s, sconfig) == NULL) {
+ ares_free(sconfig);
+ goto fail;
+ }
+ }
+
+ *llist = s;
+ return ARES_SUCCESS;
+
+fail:
+ ares__llist_destroy(s);
+ return ARES_ENOMEM;
+}
+
+ares_status_t ares_in_addr_to_server_config_llist(const struct in_addr *servers,
+ size_t nservers,
+ ares__llist_t **llist)
+{
+ size_t i;
+ ares__llist_t *s;
+
+ *llist = NULL;
+
+ s = ares__llist_create(ares_free);
+ if (s == NULL) {
+ goto fail;
+ }
+
+ for (i = 0; servers != NULL && i < nservers; i++) {
+ ares_sconfig_t *sconfig;
+
+ sconfig = ares_malloc_zero(sizeof(*sconfig));
+ if (sconfig == NULL) {
+ goto fail;
+ }
+
+ sconfig->addr.family = AF_INET;
+ memcpy(&sconfig->addr.addr.addr4, &servers[i],
+ sizeof(sconfig->addr.addr.addr4));
+
+ if (ares__llist_insert_last(s, sconfig) == NULL) {
+ goto fail;
+ }
+ }
+
+ *llist = s;
+ return ARES_SUCCESS;
+
+fail:
+ ares__llist_destroy(s);
+ return ARES_ENOMEM;
+}
+
+int ares_get_servers(ares_channel_t *channel, struct ares_addr_node **servers)
+{
+ struct ares_addr_node *srvr_head = NULL;
+ struct ares_addr_node *srvr_last = NULL;
+ struct ares_addr_node *srvr_curr;
+ ares_status_t status = ARES_SUCCESS;
+ ares__slist_node_t *node;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ ares__channel_lock(channel);
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ const struct server_state *server = ares__slist_node_val(node);
+
+ /* Allocate storage for this server node appending it to the list */
+ srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_NODE);
+ if (!srvr_curr) {
+ status = ARES_ENOMEM;
+ break;
+ }
+ if (srvr_last) {
+ srvr_last->next = srvr_curr;
+ } else {
+ srvr_head = srvr_curr;
+ }
+ srvr_last = srvr_curr;
+
+ /* Fill this server node data */
+ srvr_curr->family = server->addr.family;
+ if (srvr_curr->family == AF_INET) {
+ memcpy(&srvr_curr->addr.addr4, &server->addr.addr.addr4,
+ sizeof(srvr_curr->addr.addr4));
+ } else {
+ memcpy(&srvr_curr->addr.addr6, &server->addr.addr.addr6,
+ sizeof(srvr_curr->addr.addr6));
+ }
+ }
+
+ if (status != ARES_SUCCESS) {
+ ares_free_data(srvr_head);
+ srvr_head = NULL;
+ }
+
+ *servers = srvr_head;
+
+ ares__channel_unlock(channel);
+
+ return (int)status;
+}
+
+int ares_get_servers_ports(ares_channel_t *channel,
+ struct ares_addr_port_node **servers)
+{
+ struct ares_addr_port_node *srvr_head = NULL;
+ struct ares_addr_port_node *srvr_last = NULL;
+ struct ares_addr_port_node *srvr_curr;
+ ares_status_t status = ARES_SUCCESS;
+ ares__slist_node_t *node;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ ares__channel_lock(channel);
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ const struct server_state *server = ares__slist_node_val(node);
+
+ /* Allocate storage for this server node appending it to the list */
+ srvr_curr = ares_malloc_data(ARES_DATATYPE_ADDR_PORT_NODE);
+ if (!srvr_curr) {
+ status = ARES_ENOMEM;
+ break;
+ }
+ if (srvr_last) {
+ srvr_last->next = srvr_curr;
+ } else {
+ srvr_head = srvr_curr;
+ }
+ srvr_last = srvr_curr;
+
+ /* Fill this server node data */
+ srvr_curr->family = server->addr.family;
+ srvr_curr->udp_port = server->udp_port;
+ srvr_curr->tcp_port = server->tcp_port;
+
+ if (srvr_curr->family == AF_INET) {
+ memcpy(&srvr_curr->addr.addr4, &server->addr.addr.addr4,
+ sizeof(srvr_curr->addr.addr4));
+ } else {
+ memcpy(&srvr_curr->addr.addr6, &server->addr.addr.addr6,
+ sizeof(srvr_curr->addr.addr6));
+ }
+ }
+
+ if (status != ARES_SUCCESS) {
+ ares_free_data(srvr_head);
+ srvr_head = NULL;
+ }
+
+ *servers = srvr_head;
+
+ ares__channel_unlock(channel);
+ return (int)status;
+}
+
+int ares_set_servers(ares_channel_t *channel,
+ const struct ares_addr_node *servers)
+{
+ ares__llist_t *slist;
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ status = ares_addr_node_to_server_config_llist(servers, &slist);
+ if (status != ARES_SUCCESS) {
+ return (int)status;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
+
+ ares__llist_destroy(slist);
+
+ return (int)status;
+}
+
+int ares_set_servers_ports(ares_channel_t *channel,
+ const struct ares_addr_port_node *servers)
+{
+ ares__llist_t *slist;
+ ares_status_t status;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ status = ares_addr_port_node_to_server_config_llist(servers, &slist);
+ if (status != ARES_SUCCESS) {
+ return (int)status;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
+
+ ares__llist_destroy(slist);
+
+ return (int)status;
+}
+
+/* Incoming string format: host[:port][,host[:port]]... */
+/* IPv6 addresses with ports require square brackets [fe80::1]:53 */
+static ares_status_t set_servers_csv(ares_channel_t *channel, const char *_csv)
+{
+ ares_status_t status;
+ ares__llist_t *slist = NULL;
+
+ if (channel == NULL) {
+ return ARES_ENODATA;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+
+ if (ares_strlen(_csv) == 0) {
+ /* blank all servers */
+ return ares__servers_update(channel, NULL, ARES_TRUE);
+ }
+
+ status = ares__sconfig_append_fromstr(&slist, _csv, ARES_FALSE);
+ if (status != ARES_SUCCESS) {
+ ares__llist_destroy(slist);
+ return status;
+ }
+
+ /* NOTE: lock is in ares__servers_update() */
+ status = ares__servers_update(channel, slist, ARES_TRUE);
+
+ ares__llist_destroy(slist);
+
+ return status;
+}
+
+/* We'll go ahead and honor ports anyhow */
+int ares_set_servers_csv(ares_channel_t *channel, const char *_csv)
+{
+ /* NOTE: lock is in ares__servers_update() */
+ return (int)set_servers_csv(channel, _csv);
+}
+
+int ares_set_servers_ports_csv(ares_channel_t *channel, const char *_csv)
+{
+ /* NOTE: lock is in ares__servers_update() */
+ return (int)set_servers_csv(channel, _csv);
+}
+
+char *ares_get_servers_csv(ares_channel_t *channel)
+{
+ ares__buf_t *buf = NULL;
+ char *out = NULL;
+ ares__slist_node_t *node;
+
+ ares__channel_lock(channel);
+
+ buf = ares__buf_create();
+ if (buf == NULL) {
+ goto done;
+ }
+
+ for (node = ares__slist_node_first(channel->servers); node != NULL;
+ node = ares__slist_node_next(node)) {
+ ares_status_t status;
+ const struct server_state *server = ares__slist_node_val(node);
+ char addr[64];
+
+ if (ares__buf_len(buf)) {
+ status = ares__buf_append_byte(buf, ',');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* ipv4addr or [ipv6addr] */
+ if (server->addr.family == AF_INET6) {
+ status = ares__buf_append_byte(buf, '[');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ ares_inet_ntop(server->addr.family, &server->addr.addr, addr, sizeof(addr));
+
+ status = ares__buf_append_str(buf, addr);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ if (server->addr.family == AF_INET6) {
+ status = ares__buf_append_byte(buf, ']');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+
+ /* :port */
+ status = ares__buf_append_byte(buf, ':');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_num_dec(buf, server->udp_port, 0);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ /* %iface */
+ if (ares_strlen(server->ll_iface)) {
+ status = ares__buf_append_byte(buf, '%');
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+
+ status = ares__buf_append_str(buf, server->ll_iface);
+ if (status != ARES_SUCCESS) {
+ goto done;
+ }
+ }
+ }
+
+ out = ares__buf_finish_str(buf, NULL);
+ buf = NULL;
+
+done:
+ ares__channel_unlock(channel);
+ ares__buf_destroy(buf);
+ return out;
+}
diff --git a/contrib/libs/c-ares/src/lib/ares_version.c b/contrib/libs/c-ares/src/lib/ares_version.c
index b6a62da86d..ca15fa77dc 100644
--- a/contrib/libs/c-ares/src/lib/ares_version.c
+++ b/contrib/libs/c-ares/src/lib/ares_version.c
@@ -29,8 +29,9 @@
const char *ares_version(int *version)
{
- if(version)
+ if (version) {
*version = ARES_VERSION;
+ }
return ARES_VERSION_STR;
}
diff --git a/contrib/libs/c-ares/src/lib/bitncmp.c b/contrib/libs/c-ares/src/lib/bitncmp.c
deleted file mode 100644
index 5a5a07f8ac..0000000000
--- a/contrib/libs/c-ares/src/lib/bitncmp.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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.
- *
- * SPDX-License-Identifier: MIT
- */
-
-#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 % 8) == 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/src/lib/bitncmp.h b/contrib/libs/c-ares/src/lib/bitncmp.h
deleted file mode 100644
index 8e39eb510c..0000000000
--- a/contrib/libs/c-ares/src/lib/bitncmp.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* MIT License
- *
- * Copyright (c) 2005 Dominick Meglio
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * SPDX-License-Identifier: MIT
- */
-#ifndef __ARES_BITNCMP_H
-#define __ARES_BITNCMP_H
-
-#ifndef HAVE_BITNCMP
-int ares__bitncmp(const void *l, const void *r, 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/src/lib/config-win32.h b/contrib/libs/c-ares/src/lib/config-win32.h
index 94692d6c36..752e17afe6 100644
--- a/contrib/libs/c-ares/src/lib/config-win32.h
+++ b/contrib/libs/c-ares/src/lib/config-win32.h
@@ -42,7 +42,7 @@
/* Define if you have the <getopt.h> header file. */
#if defined(__MINGW32__) || defined(__POCC__)
-#define HAVE_GETOPT_H 1
+# define HAVE_GETOPT_H 1
#endif
/* Define if you have the <limits.h> header file. */
@@ -50,7 +50,7 @@
/* Define if you have the <process.h> header file. */
#ifndef __SALFORDC__
-#define HAVE_PROCESS_H 1
+# define HAVE_PROCESS_H 1
#endif
/* Define if you have the <signal.h> header file. */
@@ -64,8 +64,8 @@
/* Define if you have the <unistd.h> header file. */
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
- defined(__POCC__)
-#define HAVE_UNISTD_H 1
+ defined(__POCC__)
+# define HAVE_UNISTD_H 1
#endif
/* Define if you have the <windows.h> header file. */
@@ -76,12 +76,29 @@
/* Define if you have the <winsock2.h> header file. */
#ifndef __SALFORDC__
-#define HAVE_WINSOCK2_H 1
+# define HAVE_WINSOCK2_H 1
#endif
/* Define if you have the <ws2tcpip.h> header file. */
#ifndef __SALFORDC__
-#define HAVE_WS2TCPIP_H 1
+# define HAVE_WS2TCPIP_H 1
+#endif
+
+/* Define if you have <iphlpapi.h> header file */
+#define HAVE_IPHLPAPI_H 1
+
+/* Define if you have <netioapi.h> header file */
+#ifndef __WATCOMC__
+# define HAVE_NETIOAPI_H 1
+#endif
+
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_SYS_STAT_H 1
+
+/* If we are building with OpenWatcom, we need to specify that we have
+ * <stdint.h>. */
+#if defined(__WATCOMC__)
+# define HAVE_STDINT_H
#endif
/* Define to 1 if you have the <sys/uio.h> header file. */
@@ -94,15 +111,9 @@
/* 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 */
/* ---------------------------------------------------------------- */
@@ -202,38 +213,30 @@
/* Specifics for the Watt-32 tcp/ip stack. */
#ifdef WATT32
- #define SOCKET int
- #define NS_INADDRSZ 4
- #define HAVE_ARPA_NAMESER_H 1
- #define HAVE_ARPA_INET_H 1
- #define HAVE_NETDB_H 1
- #define HAVE_NETINET_IN_H 1
- #define HAVE_SYS_SOCKET_H 1
- #define HAVE_NETINET_TCP_H 1
- #define HAVE_AF_INET6 1
- #define HAVE_PF_INET6 1
- #define HAVE_STRUCT_IN6_ADDR 1
- #define HAVE_STRUCT_SOCKADDR_IN6 1
- #undef HAVE_WINSOCK_H
- #undef HAVE_WINSOCK2_H
- #undef HAVE_WS2TCPIP_H
+# define SOCKET int
+# define NS_INADDRSZ 4
+# define HAVE_ARPA_NAMESER_H 1
+# define HAVE_ARPA_INET_H 1
+# define HAVE_NETDB_H 1
+# define HAVE_NETINET_IN_H 1
+# define HAVE_SYS_SOCKET_H 1
+# define HAVE_NETINET_TCP_H 1
+# define HAVE_AF_INET6 1
+# define HAVE_PF_INET6 1
+# define HAVE_STRUCT_IN6_ADDR 1
+# define HAVE_STRUCT_SOCKADDR_IN6 1
+# undef HAVE_WINSOCK_H
+# undef HAVE_WINSOCK2_H
+# undef HAVE_WS2TCPIP_H
#endif
+/* Threading support enabled */
+#define CARES_THREADS 1
+
/* ---------------------------------------------------------------- */
/* TYPEDEF REPLACEMENTS */
/* ---------------------------------------------------------------- */
-/* 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 */
/* ---------------------------------------------------------------- */
@@ -247,7 +250,7 @@
/* Define if you have struct sockaddr_storage. */
#if !defined(__SALFORDC__) && !defined(__BORLANDC__)
-#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+# define HAVE_STRUCT_SOCKADDR_STORAGE 1
#endif
/* Define if you have struct timeval. */
@@ -259,26 +262,22 @@
/* Define to avoid VS2005 complaining about portable C functions. */
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
-# define _CRT_SECURE_NO_DEPRECATE 1
+# define _CRT_SECURE_NO_DEPRECATE 1
# define _CRT_NONSTDC_NO_DEPRECATE 1
#endif
-/* Set the Target to Vista. However, any symbols required above Win2000
- * should be loaded via LoadLibrary() */
+/* Set the Target to Win8 */
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
-# define VS2008_MIN_TARGET 0x0600
+# define MSVC_MIN_TARGET 0x0602
#endif
-/* VS2008 default target settings and minimum build target check. */
+/* MSVC default target settings */
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
# ifndef _WIN32_WINNT
-# define _WIN32_WINNT VS2008_MIN_TARGET
+# define _WIN32_WINNT MSVC_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
+# define WINVER MSVC_MIN_TARGET
# endif
#endif
@@ -286,10 +285,10 @@
target is Windows Vista. */
#if defined(__POCC__) && (__POCC__ >= 500)
# ifndef _WIN32_WINNT
-# define _WIN32_WINNT 0x0600
+# define _WIN32_WINNT 0x0602
# endif
# ifndef WINVER
-# define WINVER 0x0600
+# define WINVER 0x0602
# endif
#endif
@@ -326,27 +325,38 @@
/* Define if you have address family AF_INET6. */
#ifdef HAVE_WINSOCK2_H
-#define HAVE_AF_INET6 1
+# define HAVE_AF_INET6 1
#endif
/* Define if you have protocol family PF_INET6. */
#ifdef HAVE_WINSOCK2_H
-#define HAVE_PF_INET6 1
+# define HAVE_PF_INET6 1
#endif
/* Define if you have struct in6_addr. */
#ifdef HAVE_WS2TCPIP_H
-#define HAVE_STRUCT_IN6_ADDR 1
+# define HAVE_STRUCT_IN6_ADDR 1
#endif
/* Define if you have struct sockaddr_in6. */
#ifdef HAVE_WS2TCPIP_H
-#define HAVE_STRUCT_SOCKADDR_IN6 1
+# define HAVE_STRUCT_SOCKADDR_IN6 1
#endif
/* Define if you have sockaddr_in6 with scopeid. */
#ifdef HAVE_WS2TCPIP_H
-#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+# define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1
+#endif
+
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) && !defined(__WATCOMC__)
+/* Define if you have if_nametoindex() */
+# define HAVE_IF_NAMETOINDEX 1
+/* Define if you have if_indextoname() */
+# define HAVE_IF_INDEXTONAME 1
+/* Define to 1 if you have the `ConvertInterfaceIndexToLuid' function. */
+# define HAVE_CONVERTINTERFACEINDEXTOLUID 1
+/* Define to 1 if you have the `ConvertInterfaceLuidToNameA' function. */
+# define HAVE_CONVERTINTERFACELUIDTONAMEA 1
#endif
/* ---------------------------------------------------------------- */
@@ -360,10 +370,10 @@
*/
#if defined(_WIN32_WCE) && !defined(HAVE_ERRNO_H)
-# define ENOENT ERROR_FILE_NOT_FOUND
-# define ESRCH ERROR_PATH_NOT_FOUND
-# define ENOMEM ERROR_NOT_ENOUGH_MEMORY
-# define ENOSPC ERROR_INVALID_PARAMETER
+# define ENOENT ERROR_FILE_NOT_FOUND
+# define ESRCH ERROR_PATH_NOT_FOUND
+# define ENOMEM ERROR_NOT_ENOUGH_MEMORY
+# define ENOSPC ERROR_INVALID_PARAMETER
#endif
#endif /* HEADER_CARES_CONFIG_WIN32_H */
diff --git a/contrib/libs/c-ares/src/lib/inet_net_pton.c b/contrib/libs/c-ares/src/lib/inet_net_pton.c
index d3924c3767..19429f205d 100644
--- a/contrib/libs/c-ares/src/lib/inet_net_pton.c
+++ b/contrib/libs/c-ares/src/lib/inet_net_pton.c
@@ -31,11 +31,12 @@
#include "ares.h"
#include "ares_ipv6.h"
-#include "ares_nowarn.h"
#include "ares_inet_net_pton.h"
+#include "ares_private.h"
-const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } };
+const struct ares_in6_addr ares_in6addr_any = { { { 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0 } } };
/*
* static int
@@ -52,202 +53,233 @@ const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,
* 0b11110000 in its fourth octet.
* note:
* On Windows we store the error in the thread errno, not
- * in the winsock error code. This is to avoid loosing the
+ * in the winsock error code. This is to avoid losing the
* actual last winsock error. So use macro ERRNO to fetch the
- * errno this funtion sets when returning (-1), not SOCKERRNO.
+ * errno this function sets when returning (-1), not SOCKERRNO.
* author:
* Paul Vixie (ISC), June 1996
*/
-static int
-ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
+static int ares_inet_net_pton_ipv4(const char *src, unsigned char *dst,
+ size_t size)
{
- static const char xdigits[] = "0123456789abcdef";
- static const char digits[] = "0123456789";
- int n, ch, tmp = 0, dirty, bits;
+ static const char xdigits[] = "0123456789abcdef";
+ static const char digits[] = "0123456789";
+ int n;
+ int ch;
+ int tmp = 0;
+ int dirty;
+ int bits;
const unsigned char *odst = dst;
ch = *src++;
- if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
- && ISASCII(src[1])
- && ISXDIGIT(src[1])) {
+ if (ch == '0' && (src[0] == 'x' || src[0] == 'X') && ISASCII(src[1]) &&
+ ISXDIGIT(src[1])) {
/* Hexadecimal: Eat nybble string. */
- if (!size)
+ if (!size) {
goto emsgsize;
+ }
dirty = 0;
- src++; /* skip x or X. */
+ src++; /* skip x or X. */
while ((ch = *src++) != '\0' && ISASCII(ch) && ISXDIGIT(ch)) {
- if (ISUPPER(ch))
+ if (ISUPPER(ch)) {
ch = tolower(ch);
- n = aresx_sztosi(strchr(xdigits, ch) - xdigits);
- if (dirty == 0)
+ }
+ n = (int)(strchr(xdigits, ch) - xdigits);
+ if (dirty == 0) {
tmp = n;
- else
+ } else {
tmp = (tmp << 4) | n;
+ }
if (++dirty == 2) {
- if (!size--)
+ if (!size--) {
goto emsgsize;
- *dst++ = (unsigned char) tmp;
- dirty = 0;
+ }
+ *dst++ = (unsigned char)tmp;
+ dirty = 0;
}
}
- if (dirty) { /* Odd trailing nybble? */
- if (!size--)
+ if (dirty) { /* Odd trailing nybble? */
+ if (!size--) {
goto emsgsize;
- *dst++ = (unsigned char) (tmp << 4);
+ }
+ *dst++ = (unsigned char)(tmp << 4);
}
} else if (ISASCII(ch) && ISDIGIT(ch)) {
/* Decimal: eat dotted digit string. */
for (;;) {
tmp = 0;
do {
- n = aresx_sztosi(strchr(digits, ch) - digits);
+ n = (int)(strchr(digits, ch) - digits);
tmp *= 10;
tmp += n;
- if (tmp > 255)
+ if (tmp > 255) {
goto enoent;
- } while ((ch = *src++) != '\0' &&
- ISASCII(ch) && ISDIGIT(ch));
- if (!size--)
+ }
+ } while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch));
+ if (!size--) {
goto emsgsize;
- *dst++ = (unsigned char) tmp;
- if (ch == '\0' || ch == '/')
+ }
+ *dst++ = (unsigned char)tmp;
+ if (ch == '\0' || ch == '/') {
break;
- if (ch != '.')
+ }
+ if (ch != '.') {
goto enoent;
+ }
ch = *src++;
- if (!ISASCII(ch) || !ISDIGIT(ch))
+ if (!ISASCII(ch) || !ISDIGIT(ch)) {
goto enoent;
+ }
}
- } else
+ } else {
goto enoent;
+ }
bits = -1;
- if (ch == '/' && ISASCII(src[0]) &&
- ISDIGIT(src[0]) && dst > odst) {
+ if (ch == '/' && ISASCII(src[0]) && ISDIGIT(src[0]) && dst > odst) {
/* CIDR width specifier. Nothing can follow it. */
- ch = *src++; /* Skip over the /. */
+ ch = *src++; /* Skip over the /. */
bits = 0;
do {
- n = aresx_sztosi(strchr(digits, ch) - digits);
+ n = (int)(strchr(digits, ch) - digits);
bits *= 10;
bits += n;
- if (bits > 32)
+ if (bits > 32) {
goto enoent;
+ }
} while ((ch = *src++) != '\0' && ISASCII(ch) && ISDIGIT(ch));
- if (ch != '\0')
+ if (ch != '\0') {
goto enoent;
+ }
}
/* Firey death and destruction unless we prefetched EOS. */
- if (ch != '\0')
+ if (ch != '\0') {
goto enoent;
+ }
/* If nothing was written to the destination, we found no address. */
- if (dst == odst)
- goto enoent; /* LCOV_EXCL_LINE: all valid paths above increment dst */
+ if (dst == odst) {
+ goto enoent; /* LCOV_EXCL_LINE: all valid paths above increment dst */
+ }
/* If no CIDR spec was given, infer width from net class. */
if (bits == -1) {
- if (*odst >= 240) /* Class E */
+ if (*odst >= 240) { /* Class E */
bits = 32;
- else if (*odst >= 224) /* Class D */
+ } else if (*odst >= 224) { /* Class D */
bits = 8;
- else if (*odst >= 192) /* Class C */
+ } else if (*odst >= 192) { /* Class C */
bits = 24;
- else if (*odst >= 128) /* Class B */
+ } else if (*odst >= 128) { /* Class B */
bits = 16;
- else /* Class A */
+ } else { /* Class A */
bits = 8;
+ }
/* If imputed mask is narrower than specified octets, widen. */
- if (bits < ((dst - odst) * 8))
- bits = aresx_sztosi(dst - odst) * 8;
+ if (bits < ((dst - odst) * 8)) {
+ bits = (int)(dst - odst) * 8;
+ }
/*
* If there are no additional bits specified for a class D
* address adjust bits to 4.
*/
- if (bits == 8 && *odst == 224)
+ if (bits == 8 && *odst == 224) {
bits = 4;
+ }
}
/* Extend network to cover the actual mask. */
while (bits > ((dst - odst) * 8)) {
- if (!size--)
+ if (!size--) {
goto emsgsize;
+ }
*dst++ = '\0';
}
- return (bits);
+ return bits;
- enoent:
+enoent:
SET_ERRNO(ENOENT);
- return (-1);
+ return -1;
- emsgsize:
+emsgsize:
SET_ERRNO(EMSGSIZE);
- return (-1);
+ return -1;
}
-static int
-getbits(const char *src, int *bitsp)
+static int getbits(const char *src, size_t *bitsp)
{
static const char digits[] = "0123456789";
- int n;
- int val;
- char ch;
+ size_t n;
+ size_t val;
+ char ch;
val = 0;
- n = 0;
+ n = 0;
while ((ch = *src++) != '\0') {
const char *pch;
pch = strchr(digits, ch);
if (pch != NULL) {
- if (n++ != 0 && val == 0) /* no leading zeros */
- return (0);
+ if (n++ != 0 && val == 0) { /* no leading zeros */
+ return 0;
+ }
val *= 10;
- val += aresx_sztosi(pch - digits);
- if (val > 128) /* range */
- return (0);
+ val += (size_t)(pch - digits);
+ if (val > 128) { /* range */
+ return 0;
+ }
continue;
}
- return (0);
+ return 0;
+ }
+ if (n == 0) {
+ return 0;
}
- if (n == 0)
- return (0);
*bitsp = val;
- return (1);
+ return 1;
}
-
-static int
-ares_inet_pton6(const char *src, unsigned char *dst)
+static int ares_inet_pton6(const char *src, unsigned char *dst)
{
- static const char xdigits_l[] = "0123456789abcdef",
- xdigits_u[] = "0123456789ABCDEF";
- unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
- const char *xdigits, *curtok;
- int ch, saw_xdigit, count_xdigit;
- unsigned int val;
+ static const char xdigits_l[] = "0123456789abcdef";
+ static const char xdigits_u[] = "0123456789ABCDEF";
+ unsigned char tmp[NS_IN6ADDRSZ];
+ unsigned char *tp;
+ unsigned char *endp;
+ unsigned char *colonp;
+ const char *xdigits;
+ const char *curtok;
+ int ch;
+ int saw_xdigit;
+ int count_xdigit;
+ unsigned int val;
memset((tp = tmp), '\0', NS_IN6ADDRSZ);
- endp = tp + NS_IN6ADDRSZ;
+ endp = tp + NS_IN6ADDRSZ;
colonp = NULL;
/* Leading :: requires some special handling. */
- if (*src == ':')
- if (*++src != ':')
+ if (*src == ':') {
+ if (*++src != ':') {
goto enoent;
- curtok = src;
+ }
+ }
+ curtok = src;
saw_xdigit = count_xdigit = 0;
- val = 0;
+ val = 0;
while ((ch = *src++) != '\0') {
const char *pch;
- if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
+ if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) {
pch = strchr((xdigits = xdigits_u), ch);
+ }
if (pch != NULL) {
- if (count_xdigit >= 4)
+ if (count_xdigit >= 4) {
goto enoent;
+ }
val <<= 4;
- val |= (unsigned int)(pch - xdigits);
- if (val > 0xffff)
+ val |= (unsigned int)(pch - xdigits);
+ if (val > 0xffff) {
goto enoent;
+ }
saw_xdigit = 1;
count_xdigit++;
continue;
@@ -255,35 +287,38 @@ ares_inet_pton6(const char *src, unsigned char *dst)
if (ch == ':') {
curtok = src;
if (!saw_xdigit) {
- if (colonp)
+ if (colonp) {
goto enoent;
+ }
colonp = tp;
continue;
} else if (*src == '\0') {
goto enoent;
}
- if (tp + NS_INT16SZ > endp)
+ if (tp + NS_INT16SZ > endp) {
goto enoent;
- *tp++ = (unsigned char) (val >> 8) & 0xff;
- *tp++ = (unsigned char) val & 0xff;
- saw_xdigit = 0;
+ }
+ *tp++ = (unsigned char)(val >> 8) & 0xff;
+ *tp++ = (unsigned char)val & 0xff;
+ saw_xdigit = 0;
count_xdigit = 0;
- val = 0;
+ val = 0;
continue;
}
if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
ares_inet_net_pton_ipv4(curtok, tp, NS_INADDRSZ) > 0) {
- tp += NS_INADDRSZ;
- saw_xdigit = 0;
- break; /* '\0' was seen by inet_pton4(). */
+ tp += NS_INADDRSZ;
+ saw_xdigit = 0;
+ break; /* '\0' was seen by inet_pton4(). */
}
goto enoent;
}
if (saw_xdigit) {
- if (tp + NS_INT16SZ > endp)
+ if (tp + NS_INT16SZ > endp) {
goto enoent;
- *tp++ = (unsigned char) (val >> 8) & 0xff;
- *tp++ = (unsigned char) val & 0xff;
+ }
+ *tp++ = (unsigned char)(val >> 8) & 0xff;
+ *tp++ = (unsigned char)val & 0xff;
}
if (colonp != NULL) {
/*
@@ -291,67 +326,71 @@ ares_inet_pton6(const char *src, unsigned char *dst)
* overlapping regions, we'll do the shift by hand.
*/
const int n = (int)(tp - colonp);
- int i;
+ int i;
- if (tp == endp)
+ if (tp == endp) {
goto enoent;
+ }
for (i = 1; i <= n; i++) {
- endp[- i] = colonp[n - i];
+ endp[-i] = colonp[n - i];
colonp[n - i] = 0;
}
tp = endp;
}
- if (tp != endp)
+ if (tp != endp) {
goto enoent;
+ }
memcpy(dst, tmp, NS_IN6ADDRSZ);
- return (1);
+ return 1;
enoent:
SET_ERRNO(ENOENT);
- return (-1);
+ return -1;
}
-static int
-ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
+static int ares_inet_net_pton_ipv6(const char *src, unsigned char *dst,
+ size_t size)
{
struct ares_in6_addr in6;
int ret;
- int bits;
+ size_t bits;
size_t bytes;
char buf[INET6_ADDRSTRLEN + sizeof("/128")];
char *sep;
- if (strlen(src) >= sizeof buf) {
+ if (ares_strlen(src) >= sizeof buf) {
SET_ERRNO(EMSGSIZE);
- return (-1);
+ return -1;
}
- strncpy(buf, src, sizeof buf);
+ ares_strcpy(buf, src, sizeof buf);
sep = strchr(buf, '/');
- if (sep != NULL)
+ if (sep != NULL) {
*sep++ = '\0';
+ }
ret = ares_inet_pton6(buf, (unsigned char *)&in6);
- if (ret != 1)
- return (-1);
+ if (ret != 1) {
+ return -1;
+ }
- if (sep == NULL)
+ if (sep == NULL) {
bits = 128;
- else {
+ } else {
if (!getbits(sep, &bits)) {
SET_ERRNO(ENOENT);
- return (-1);
+ return -1;
}
}
bytes = (bits + 7) / 8;
if (bytes > size) {
SET_ERRNO(EMSGSIZE);
- return (-1);
+ return -1;
}
memcpy(dst, &in6, bytes);
- return (bits);
+ return (int)bits;
}
/*
@@ -366,42 +405,41 @@ ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
* not a valid network specification.
* note:
* On Windows we store the error in the thread errno, not
- * in the winsock error code. This is to avoid loosing the
+ * in the winsock error code. This is to avoid losing the
* actual last winsock error. So use macro ERRNO to fetch the
- * errno this funtion sets when returning (-1), not SOCKERRNO.
+ * errno this function sets when returning (-1), not SOCKERRNO.
* author:
* Paul Vixie (ISC), June 1996
*/
-int
-ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
+int ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
{
switch (af) {
- case AF_INET:
- return (ares_inet_net_pton_ipv4(src, dst, size));
- case AF_INET6:
- return (ares_inet_net_pton_ipv6(src, dst, size));
- default:
- SET_ERRNO(EAFNOSUPPORT);
- return (-1);
+ case AF_INET:
+ return ares_inet_net_pton_ipv4(src, dst, size);
+ case AF_INET6:
+ return ares_inet_net_pton_ipv6(src, dst, size);
+ default:
+ SET_ERRNO(EAFNOSUPPORT);
+ return -1;
}
}
int ares_inet_pton(int af, const char *src, void *dst)
{
- int result;
+ int result;
size_t size;
- if (af == AF_INET)
+ if (af == AF_INET) {
size = sizeof(struct in_addr);
- else if (af == AF_INET6)
+ } else if (af == AF_INET6) {
size = sizeof(struct ares_in6_addr);
- else
- {
+ } else {
SET_ERRNO(EAFNOSUPPORT);
return -1;
}
result = ares_inet_net_pton(af, src, dst, size);
- if (result == -1 && ERRNO == ENOENT)
+ if (result == -1 && ERRNO == ENOENT) {
return 0;
- return (result > -1 ? 1 : -1);
+ }
+ return (result > -1) ? 1 : -1;
}
diff --git a/contrib/libs/c-ares/src/lib/inet_ntop.c b/contrib/libs/c-ares/src/lib/inet_ntop.c
index 246d630647..622befa995 100644
--- a/contrib/libs/c-ares/src/lib/inet_ntop.c
+++ b/contrib/libs/c-ares/src/lib/inet_ntop.c
@@ -30,6 +30,7 @@
#include "ares.h"
#include "ares_ipv6.h"
+#include "ares_private.h"
#ifndef HAVE_INET_NTOP
@@ -48,23 +49,23 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size);
* pointer to presentation format address (`dst'), or NULL (see errno).
* note:
* On Windows we store the error in the thread errno, not
- * in the winsock error code. This is to avoid loosing the
+ * in the winsock error code. This is to avoid losing the
* actual last winsock error. So use macro ERRNO to fetch the
* errno this function sets when returning NULL, not SOCKERRNO.
* author:
* Paul Vixie, 1996.
*/
-const char *
-ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size)
+const char *ares_inet_ntop(int af, const void *src, char *dst,
+ ares_socklen_t size)
{
switch (af) {
- case AF_INET:
- return (inet_ntop4(src, dst, (size_t)size));
- case AF_INET6:
- return (inet_ntop6(src, dst, (size_t)size));
- default:
- SET_ERRNO(EAFNOSUPPORT);
- return (NULL);
+ case AF_INET:
+ return (inet_ntop4(src, dst, (size_t)size));
+ case AF_INET6:
+ return (inet_ntop6(src, dst, (size_t)size));
+ default:
+ SET_ERRNO(EAFNOSUPPORT);
+ return (NULL);
}
/* NOTREACHED */
}
@@ -80,17 +81,17 @@ ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size)
* author:
* Paul Vixie, 1996.
*/
-static const char *
-inet_ntop4(const unsigned char *src, char *dst, size_t size)
+static const char *inet_ntop4(const unsigned char *src, char *dst, size_t size)
{
static const char fmt[] = "%u.%u.%u.%u";
- char tmp[sizeof("255.255.255.255")];
+ char tmp[sizeof("255.255.255.255")];
- if ((size_t)snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]) >= size) {
+ if ((size_t)snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]) >=
+ size) {
SET_ERRNO(ENOSPC);
return (NULL);
}
- strcpy(dst, tmp);
+ ares_strcpy(dst, tmp, size);
return (dst);
}
@@ -100,8 +101,7 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size)
* author:
* Paul Vixie, 1996.
*/
-static const char *
-inet_ntop6(const unsigned char *src, char *dst, size_t size)
+static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size)
{
/*
* Note that int32_t and int16_t need only be "at least" large enough
@@ -110,11 +110,15 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
* Keep this in mind if you think this function should have been coded
* to use pointer overlays. All the world's not a VAX.
*/
- char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
+ char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
char *tp;
- struct { int base, len; } best, cur;
+
+ struct {
+ int base, len;
+ } best, cur;
+
unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
- int i;
+ int i;
/*
* Preprocess:
@@ -122,32 +126,37 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
* Find the longest run of 0x00's in src[] for :: shorthanding.
*/
memset(words, '\0', sizeof(words));
- for (i = 0; i < NS_IN6ADDRSZ; i++)
- words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
+ for (i = 0; i < NS_IN6ADDRSZ; i++) {
+ words[i / 2] |= (unsigned int)(src[i] << ((1 - (i % 2)) << 3));
+ }
best.base = -1;
- best.len = 0;
- cur.base = -1;
- cur.len = 0;
+ best.len = 0;
+ cur.base = -1;
+ cur.len = 0;
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {
if (words[i] == 0) {
- if (cur.base == -1)
+ if (cur.base == -1) {
cur.base = i, cur.len = 1;
- else
+ } else {
cur.len++;
+ }
} else {
if (cur.base != -1) {
- if (best.base == -1 || cur.len > best.len)
+ if (best.base == -1 || cur.len > best.len) {
best = cur;
+ }
cur.base = -1;
}
}
}
if (cur.base != -1) {
- if (best.base == -1 || cur.len > best.len)
+ if (best.base == -1 || cur.len > best.len) {
best = cur;
+ }
}
- if (best.base != -1 && best.len < 2)
+ if (best.base != -1 && best.len < 2) {
best.base = -1;
+ }
/*
* Format the result.
@@ -155,29 +164,33 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
tp = tmp;
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {
/* Are we inside the best run of 0x00's? */
- if (best.base != -1 && i >= best.base &&
- i < (best.base + best.len)) {
- if (i == best.base)
+ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) {
+ if (i == best.base) {
*tp++ = ':';
+ }
continue;
}
/* Are we following an initial run of 0x00s or any real hex? */
- if (i != 0)
+ if (i != 0) {
*tp++ = ':';
+ }
/* Is this address an encapsulated IPv4? */
- if (i == 6 && best.base == 0 && (best.len == 6 ||
- (best.len == 7 && words[7] != 0x0001) ||
- (best.len == 5 && words[5] == 0xffff))) {
- if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp)))
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 7 && words[7] != 0x0001) ||
+ (best.len == 5 && words[5] == 0xffff))) {
+ if (!inet_ntop4(src + 12, tp, sizeof(tmp) - (size_t)(tp - tmp))) {
return (NULL);
- tp += strlen(tp);
+ }
+ tp += ares_strlen(tp);
break;
}
- tp += snprintf(tp, sizeof(tmp)-(tp-tmp), "%x", words[i]);
+ tp += snprintf(tp, sizeof(tmp) - (size_t)(tp - tmp), "%x", words[i]);
}
/* Was it a trailing run of 0x00's? */
- if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ))
+ if (best.base != -1 &&
+ (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) {
*tp++ = ':';
+ }
*tp++ = '\0';
/*
@@ -187,14 +200,14 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
SET_ERRNO(ENOSPC);
return (NULL);
}
- strcpy(dst, tmp);
+ ares_strcpy(dst, tmp, size);
return (dst);
}
-#else /* HAVE_INET_NTOP */
+#else /* HAVE_INET_NTOP */
-const char *
-ares_inet_ntop(int af, const void *src, char *dst, ares_socklen_t size)
+const char *ares_inet_ntop(int af, const void *src, char *dst,
+ ares_socklen_t size)
{
/* just relay this to the underlying function */
return inet_ntop(af, src, dst, size);
diff --git a/contrib/libs/c-ares/src/lib/setup_once.h b/contrib/libs/c-ares/src/lib/setup_once.h
index 1e9c531a9d..38527ec442 100644
--- a/contrib/libs/c-ares/src/lib/setup_once.h
+++ b/contrib/libs/c-ares/src/lib/setup_once.h
@@ -48,47 +48,40 @@
#include <ctype.h>
#ifdef HAVE_ERRNO_H
-#include <errno.h>
+# include <errno.h>
#endif
#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
+# include <sys/types.h>
#endif
#ifdef NEED_MALLOC_H
-#include <malloc.h>
+# include <malloc.h>
#endif
#ifdef NEED_MEMORY_H
-#include <memory.h>
+# include <memory.h>
#endif
#ifdef HAVE_SYS_STAT_H
-#include <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>
+# include <sys/time.h>
#endif
-#else
+
#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
+# include <time.h>
#endif
#ifdef WIN32
-#include <io.h>
-#include <fcntl.h>
-#endif
-
-#if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T)
-#include <stdbool.h>
+# include <io.h>
+# include <fcntl.h>
#endif
#ifdef HAVE_UNISTD_H
-#include <unistd.h>
+# include <unistd.h>
#endif
#ifdef __hpux
@@ -102,12 +95,8 @@
# endif
#endif
-#ifdef HAVE_SYS_RANDOM_H
-#include <sys/random.h>
-#endif
-
#ifdef HAVE_SYS_SOCKET_H
-#include <sys/socket.h>
+# include <sys/socket.h>
#endif
#ifdef __hpux
@@ -126,8 +115,8 @@
#ifndef HAVE_STRUCT_TIMEVAL
struct timeval {
- long tv_sec;
- long tv_usec;
+ long tv_sec;
+ long tv_usec;
};
#endif
@@ -138,17 +127,17 @@ struct timeval {
*/
#if defined(HAVE_MSG_NOSIGNAL) && defined(MSG_NOSIGNAL)
-#define SEND_4TH_ARG MSG_NOSIGNAL
+# define SEND_4TH_ARG MSG_NOSIGNAL
#else
-#define SEND_4TH_ARG 0
+# 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))
+# 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)
/*
@@ -173,97 +162,86 @@ struct timeval {
* SEND_TYPE_RETV must also be defined.
*/
-#if !defined(RECV_TYPE_ARG1) || \
- !defined(RECV_TYPE_ARG2) || \
- !defined(RECV_TYPE_ARG3) || \
- !defined(RECV_TYPE_ARG4) || \
+# 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
+/* */
+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
+# 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))
+# 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)
+# 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
+# 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
+# ifndef swrite
/* */
Error Missing_definition_of_macro_swrite
- /* */
-#endif
+/* */
+# endif
#endif /* HAVE_SEND */
#if 0
-#if defined(HAVE_RECVFROM)
+# 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)
+# 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
+# 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 */
+# endif
+# endif /* HAVE_RECVFROM */
-#ifdef RECVFROM_TYPE_ARG6_IS_VOID
-# define RECVFROM_ARG6_T int
-#else
-# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6
-#endif
+# ifdef RECVFROM_TYPE_ARG6_IS_VOID
+# define RECVFROM_ARG6_T int
+# else
+# define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6
+# endif
#endif /* if 0 */
@@ -272,13 +250,13 @@ struct timeval {
*/
#if defined(HAVE_CLOSESOCKET)
-# define sclose(x) closesocket((x))
+# define sclose(x) closesocket((x))
#elif defined(HAVE_CLOSESOCKET_CAMEL)
-# define sclose(x) CloseSocket((x))
+# define sclose(x) CloseSocket((x))
#elif defined(HAVE_CLOSE_S)
-# define sclose(x) close_s((x))
+# define sclose(x) close_s((x))
#else
-# define sclose(x) close((x))
+# define sclose(x) close((x))
#endif
@@ -287,73 +265,21 @@ struct timeval {
* 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
-
+#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) (((unsigned char)x) <= 127 ? 1 : 0)
-/*
- * 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.
- */
+#define ISBLANK(x) \
+ (int)((((unsigned char)x) == ' ') || (((unsigned char)x) == '\t'))
-#ifndef TRUE
-#define TRUE true
-#endif
-#ifndef FALSE
-#define FALSE false
-#endif
+#define TOLOWER(x) (tolower((int)((unsigned char)x)))
/*
@@ -361,60 +287,31 @@ struct timeval {
* avoiding compiler warnings. Mostly intended for other macro definitions.
*/
-#define WHILE_FALSE while(0)
+#define WHILE_FALSE while (0)
#if defined(_MSC_VER) && !defined(__POCC__)
# undef WHILE_FALSE
# if (_MSC_VER < 1500)
-# define WHILE_FALSE while(1, 0)
+# define WHILE_FALSE while (1, 0)
# else
-# define WHILE_FALSE \
-__pragma(warning(push)) \
-__pragma(warning(disable:4127)) \
-while(0) \
-__pragma(warning(pop))
+# 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
+# define DEBUGF(x) x
#else
-#define DEBUGF(x) do { } WHILE_FALSE
+# define DEBUGF(x) \
+ do { \
+ } \
+ WHILE_FALSE
#endif
@@ -423,9 +320,12 @@ typedef int sig_atomic_t;
*/
#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
-#define DEBUGASSERT(x) assert(x)
+# define DEBUGASSERT(x) assert(x)
#else
-#define DEBUGASSERT(x) do { } WHILE_FALSE
+# define DEBUGASSERT(x) \
+ do { \
+ } \
+ WHILE_FALSE
#endif
@@ -435,11 +335,11 @@ typedef int sig_atomic_t;
*/
#ifdef USE_WINSOCK
-#define SOCKERRNO ((int)WSAGetLastError())
-#define SET_SOCKERRNO(x) (WSASetLastError((int)(x)))
+# define SOCKERRNO ((int)WSAGetLastError())
+# define SET_SOCKERRNO(x) (WSASetLastError((int)(x)))
#else
-#define SOCKERRNO (errno)
-#define SET_SOCKERRNO(x) (errno = (x))
+# define SOCKERRNO (errno)
+# define SET_SOCKERRNO(x) (errno = (x))
#endif
@@ -449,11 +349,11 @@ typedef int sig_atomic_t;
*/
#if defined(WIN32) && !defined(WATT32)
-#define ERRNO ((int)GetLastError())
-#define SET_ERRNO(x) (SetLastError((DWORD)(x)))
+# define ERRNO ((int)GetLastError())
+# define SET_ERRNO(x) (SetLastError((DWORD)(x)))
#else
-#define ERRNO (errno)
-#define SET_ERRNO(x) (errno = (x))
+# define ERRNO (errno)
+# define SET_ERRNO(x) (errno = (x))
#endif
@@ -462,78 +362,78 @@ typedef int sig_atomic_t;
*/
#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
+# 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
@@ -541,9 +441,9 @@ typedef int sig_atomic_t;
* 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
+#if defined(__VMS) && defined(__INITIAL_POINTER_SIZE) && \
+ (__INITIAL_POINTER_SIZE == 64)
+# define getpwuid __32_getpwuid
#endif
@@ -552,9 +452,9 @@ typedef int sig_atomic_t;
*/
#ifdef __VMS
-#define argv_item_t __char_ptr32
+# define argv_item_t __char_ptr32
#else
-#define argv_item_t char *
+# define argv_item_t char *
#endif
diff --git a/contrib/libs/c-ares/src/lib/windows_port.c b/contrib/libs/c-ares/src/lib/windows_port.c
index 5977b8493e..d5f0ad3abf 100644
--- a/contrib/libs/c-ares/src/lib/windows_port.c
+++ b/contrib/libs/c-ares/src/lib/windows_port.c
@@ -13,18 +13,17 @@
*/
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
-#ifdef __WATCOMC__
+# ifdef __WATCOMC__
/*
* Watcom needs a DllMain() in order to initialise the clib startup code.
*/
-BOOL
-WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved)
+BOOL WINAPI DllMain(HINSTANCE hnd, DWORD reason, LPVOID reserved)
{
- (void) hnd;
- (void) reason;
- (void) reserved;
+ (void)hnd;
+ (void)reason;
+ (void)reserved;
return (TRUE);
}
-#endif
+# endif
#endif /* WIN32 builds only */
diff --git a/contrib/libs/c-ares/ya.make b/contrib/libs/c-ares/ya.make
index a72f1f9e6d..30d390111a 100644
--- a/contrib/libs/c-ares/ya.make
+++ b/contrib/libs/c-ares/ya.make
@@ -5,16 +5,15 @@ LIBRARY()
LICENSE(
BSD-3-Clause AND
ISC AND
- LicenseRef-scancode-mit-no-advert-export-control AND
MIT AND
Public-Domain
)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.20.1)
+VERSION(1.28.1)
-ORIGINAL_SOURCE(https://github.com/c-ares/c-ares/archive/cares-1_20_1.tar.gz)
+ORIGINAL_SOURCE(https://github.com/c-ares/c-ares/archive/cares-1_28_1.tar.gz)
PEERDIR(
contrib/libs/libc_compat
@@ -52,22 +51,36 @@ SRCS(
src/lib/ares__addrinfo_localhost.c
src/lib/ares__buf.c
src/lib/ares__close_sockets.c
- src/lib/ares__get_hostent.c
+ src/lib/ares__hosts_file.c
src/lib/ares__htable.c
src/lib/ares__htable_asvp.c
- src/lib/ares__htable_stvp.c
+ src/lib/ares__htable_strvp.c
+ src/lib/ares__htable_szvp.c
+ src/lib/ares__iface_ips.c
src/lib/ares__llist.c
src/lib/ares__parse_into_addrinfo.c
- src/lib/ares__read_line.c
- src/lib/ares__readaddrinfo.c
src/lib/ares__slist.c
+ src/lib/ares__socket.c
src/lib/ares__sortaddrinfo.c
+ src/lib/ares__threads.c
src/lib/ares__timeval.c
src/lib/ares_android.c
src/lib/ares_cancel.c
src/lib/ares_create_query.c
src/lib/ares_data.c
src/lib/ares_destroy.c
+ src/lib/ares_dns_mapping.c
+ src/lib/ares_dns_name.c
+ src/lib/ares_dns_parse.c
+ src/lib/ares_dns_record.c
+ src/lib/ares_dns_write.c
+ src/lib/ares_event_epoll.c
+ src/lib/ares_event_kqueue.c
+ src/lib/ares_event_poll.c
+ src/lib/ares_event_select.c
+ src/lib/ares_event_thread.c
+ src/lib/ares_event_wake_pipe.c
+ src/lib/ares_event_win32.c
src/lib/ares_expand_name.c
src/lib/ares_expand_string.c
src/lib/ares_fds.c
@@ -82,8 +95,7 @@ SRCS(
src/lib/ares_getsock.c
src/lib/ares_init.c
src/lib/ares_library_init.c
- src/lib/ares_mkquery.c
- src/lib/ares_nowarn.c
+ src/lib/ares_math.c
src/lib/ares_options.c
src/lib/ares_parse_a_reply.c
src/lib/ares_parse_aaaa_reply.c
@@ -98,18 +110,21 @@ SRCS(
src/lib/ares_parse_uri_reply.c
src/lib/ares_platform.c
src/lib/ares_process.c
+ src/lib/ares_qcache.c
src/lib/ares_query.c
src/lib/ares_rand.c
src/lib/ares_search.c
src/lib/ares_send.c
+ src/lib/ares_str.c
src/lib/ares_strcasecmp.c
- src/lib/ares_strdup.c
src/lib/ares_strerror.c
src/lib/ares_strsplit.c
+ src/lib/ares_sysconfig.c
+ src/lib/ares_sysconfig_files.c
src/lib/ares_timeout.c
+ src/lib/ares_update_servers.c
src/lib/ares_version.c
src/lib/atomic.cpp
- src/lib/bitncmp.c
src/lib/inet_net_pton.c
src/lib/inet_ntop.c
src/lib/windows_port.c
diff --git a/contrib/libs/cxxsupp/libcxxmsvc/include/__config b/contrib/libs/cxxsupp/libcxxmsvc/include/__config
index 2914d9a1e2..f7da838dfb 100644
--- a/contrib/libs/cxxsupp/libcxxmsvc/include/__config
+++ b/contrib/libs/cxxsupp/libcxxmsvc/include/__config
@@ -327,7 +327,8 @@
#endif // defined(_WIN32)
#ifdef __sun__
-# include <sys/isa_defs.h>
+// #error to silence 'ya' include checks
+#error #include <sys/isa_defs.h>
# ifdef _LITTLE_ENDIAN
# define _LIBCPP_LITTLE_ENDIAN
# else
diff --git a/contrib/libs/cxxsupp/libcxxmsvc/ya.make b/contrib/libs/cxxsupp/libcxxmsvc/ya.make
index ec2b78caf6..160c722f74 100644
--- a/contrib/libs/cxxsupp/libcxxmsvc/ya.make
+++ b/contrib/libs/cxxsupp/libcxxmsvc/ya.make
@@ -1,4 +1,4 @@
-# Generated by devtools/yamaker/ym2
+# Previously, it was imported using devtools/yamaker/ym2. Now it is not under automation
LIBRARY()
diff --git a/contrib/libs/dtl/ChangeLog b/contrib/libs/dtl/ChangeLog
index de19a6bee3..3bf2e85908 100644
--- a/contrib/libs/dtl/ChangeLog
+++ b/contrib/libs/dtl/ChangeLog
@@ -1,3 +1,9 @@
+2024-07-11 Tatsuhiko Kubo <cubicdaiya@gmail.com>
+
+ * bugfix: fix compilation error in C++14 (#18). Thanks to @ZaychukAleksey
+
+ * 1.21 released
+
2022-04-11 Tatsuhiko Kubo <cubicdaiya@gmail.com>
* bugfix: fixed invalid offset in unified format difference when difference is too large.
diff --git a/contrib/libs/dtl/dtl/Diff.hpp b/contrib/libs/dtl/dtl/Diff.hpp
index 8c9c774f5d..57067f9f02 100644
--- a/contrib/libs/dtl/dtl/Diff.hpp
+++ b/contrib/libs/dtl/dtl/Diff.hpp
@@ -164,7 +164,7 @@ namespace dtl {
return trivial;
}
- void enableTrivial () const {
+ void enableTrivial () {
this->trivial = true;
}
diff --git a/contrib/libs/dtl/dtl/variables.hpp b/contrib/libs/dtl/dtl/variables.hpp
index 6720ec8663..4f53a88789 100644
--- a/contrib/libs/dtl/dtl/variables.hpp
+++ b/contrib/libs/dtl/dtl/variables.hpp
@@ -63,7 +63,7 @@ namespace dtl {
/**
* version string
*/
- const string version = "1.20";
+ const string version = "1.21";
/**
* type of edit for SES
diff --git a/contrib/libs/dtl/ya.make b/contrib/libs/dtl/ya.make
index 80028875ce..8e61f56df4 100644
--- a/contrib/libs/dtl/ya.make
+++ b/contrib/libs/dtl/ya.make
@@ -9,8 +9,8 @@ LICENSE(
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.20)
+VERSION(1.21)
-ORIGINAL_SOURCE(https://github.com/cubicdaiya/dtl/archive/v1.20.tar.gz)
+ORIGINAL_SOURCE(https://github.com/cubicdaiya/dtl/archive/v1.21.tar.gz)
END()
diff --git a/contrib/libs/hyperscan/runtime_avx512/ya.make b/contrib/libs/hyperscan/runtime_avx512/ya.make
index 5d839da1ea..2547ada5f8 100644
--- a/contrib/libs/hyperscan/runtime_avx512/ya.make
+++ b/contrib/libs/hyperscan/runtime_avx512/ya.make
@@ -15,6 +15,8 @@ NO_COMPILER_WARNINGS()
NO_RUNTIME()
+NO_SANITIZE()
+
CFLAGS(
${SSE41_CFLAGS}
-DHAVE_SSE41
diff --git a/contrib/libs/libc_compat/ubuntu_14/aligned_alloc.c b/contrib/libs/libc_compat/ubuntu_14/aligned_alloc.c
deleted file mode 100644
index c4a1378624..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/aligned_alloc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <malloc.h>
-#include <stdlib.h>
-
-__attribute__((weak)) void* aligned_alloc(size_t alignment, size_t size) {
- return memalign(alignment, size);
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/c16rtomb.c b/contrib/libs/libc_compat/ubuntu_14/c16rtomb.c
deleted file mode 100644
index 39ca3758fa..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/c16rtomb.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <uchar.h>
-#include <errno.h>
-#include <wchar.h>
-
-size_t c16rtomb(char *restrict s, char16_t c16, mbstate_t *restrict ps)
-{
- static unsigned internal_state;
- if (!ps) ps = (void *)&internal_state;
- unsigned *x = (unsigned *)ps;
- wchar_t wc;
-
- if (!s) {
- if (*x) goto ilseq;
- return 1;
- }
-
- if (!*x && c16 - 0xd800u < 0x400) {
- *x = c16 - 0xd7c0 << 10;
- return 0;
- }
-
- if (*x) {
- if (c16 - 0xdc00u >= 0x400) goto ilseq;
- else wc = *x + c16 - 0xdc00;
- *x = 0;
- } else {
- wc = c16;
- }
- return wcrtomb(s, wc, 0);
-
-ilseq:
- *x = 0;
- errno = EILSEQ;
- return -1;
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/c32rtomb.c b/contrib/libs/libc_compat/ubuntu_14/c32rtomb.c
deleted file mode 100644
index 67851328e8..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/c32rtomb.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <uchar.h>
-#include <wchar.h>
-
-size_t c32rtomb(char *restrict s, char32_t c32, mbstate_t *restrict ps)
-{
- return wcrtomb(s, c32, ps);
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/features.h b/contrib/libs/libc_compat/ubuntu_14/features.h
deleted file mode 100644
index 9fbab45ab5..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/features.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#pragma once
-
-#define weak __attribute__((__weak__))
-#define weak_alias(old, new) \
- extern __typeof(old) new __attribute__((__weak__, __alias__(#old)))
diff --git a/contrib/libs/libc_compat/ubuntu_14/getauxval.cpp b/contrib/libs/libc_compat/ubuntu_14/getauxval.cpp
deleted file mode 100644
index 9f20dd0195..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/getauxval.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <sys/auxv.h>
-
-#include "glibc.h"
-#include "features.h"
-
-extern "C" {
- unsigned long getauxval(unsigned long item) noexcept {
- return NUbuntuCompat::GetGlibc().GetAuxVal(item);
- }
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/glibc.cpp b/contrib/libs/libc_compat/ubuntu_14/glibc.cpp
deleted file mode 100644
index 1cc444bce1..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/glibc.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <elf.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "glibc.h"
-#include "features.h"
-
-namespace {
- void ReadAuxVector(Elf64_auxv_t** begin, Elf64_auxv_t** end) noexcept {
- int fd = open("/proc/self/auxv", O_RDONLY | O_CLOEXEC);
- if (fd == -1) {
- return;
- }
-
- constexpr size_t item_size = sizeof(Elf64_auxv_t);
- constexpr size_t block_size = item_size * 32;
-
- size_t bytes_read = 0;
- size_t size = 0;
-
- struct TBuffer {
- ~TBuffer() {
- free(Pointer);
- }
- char* Pointer = nullptr;
- } buffer;
-
- while (true) {
- size_t bytes_left = size - bytes_read;
-
- if (!bytes_left) {
- size += block_size;
- char* new_buffer = (char*)realloc(buffer.Pointer, size);
- if (!new_buffer) {
- return;
- }
- buffer.Pointer = new_buffer;
- continue;
- }
-
- ssize_t r = read(fd, buffer.Pointer + bytes_read, bytes_left);
- if (!r) {
- break;
- } else if (r < 0) {
- if (errno == EINTR) {
- continue;
- } else {
- return;
- }
- }
-
- bytes_read += r;
- }
-
- size_t item_count = bytes_read / item_size;
- *begin = (Elf64_auxv_t*)buffer.Pointer;
- *end = (Elf64_auxv_t*)(buffer.Pointer + item_count * item_size);
- buffer.Pointer = nullptr;
- }
-}
-
-extern "C" {
- weak unsigned long __getauxval(unsigned long item);
-}
-
-namespace NUbuntuCompat {
-
- TGlibc::TGlibc() noexcept
- : AuxVectorBegin(nullptr)
- , AuxVectorEnd(nullptr)
- {
- if (!__getauxval) {
- ReadAuxVector((Elf64_auxv_t**)&AuxVectorBegin, (Elf64_auxv_t**)&AuxVectorEnd);
- }
-
- Secure = (bool)GetAuxVal(AT_SECURE);
- }
-
- TGlibc::~TGlibc() noexcept {
- free(AuxVectorBegin);
- }
-
- unsigned long TGlibc::GetAuxVal(unsigned long item) noexcept {
- if (__getauxval) {
- return __getauxval(item);
- }
-
- for (Elf64_auxv_t* p = (Elf64_auxv_t*)AuxVectorBegin; p < (Elf64_auxv_t*)AuxVectorEnd; ++p) {
- if (p->a_type == item) {
- return p->a_un.a_val;
- }
- }
-
- errno = ENOENT;
- return 0;
- }
-
- bool TGlibc::IsSecure() noexcept {
- return Secure;
- }
-
- static TGlibc __attribute__((__init_priority__(101))) GlibcInstance;
-
- TGlibc& GetGlibc() noexcept {
- return GlibcInstance;
- }
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/glibc.h b/contrib/libs/libc_compat/ubuntu_14/glibc.h
deleted file mode 100644
index fdabcb0158..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/glibc.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-typedef unsigned long (*TGetAuxVal)(unsigned long);
-
-namespace NUbuntuCompat {
- class TGlibc {
- public:
- TGlibc() noexcept;
- ~TGlibc() noexcept;
- unsigned long GetAuxVal(unsigned long item) noexcept;
- bool IsSecure() noexcept;
-
- private:
- void* AuxVectorBegin;
- void* AuxVectorEnd;
- bool Secure;
- };
-
- TGlibc& GetGlibc() noexcept;
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/mbrtoc16.c b/contrib/libs/libc_compat/ubuntu_14/mbrtoc16.c
deleted file mode 100644
index 765ff9037c..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/mbrtoc16.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <uchar.h>
-#include <wchar.h>
-
-size_t mbrtoc16(char16_t *restrict pc16, const char *restrict s, size_t n, mbstate_t *restrict ps)
-{
- static unsigned internal_state;
- if (!ps) ps = (void *)&internal_state;
- unsigned *pending = (unsigned *)ps;
-
- if (!s) return mbrtoc16(0, "", 1, ps);
-
- /* mbrtowc states for partial UTF-8 characters have the high bit set;
- * we use nonzero states without high bit for pending surrogates. */
- if ((int)*pending > 0) {
- if (pc16) *pc16 = *pending;
- *pending = 0;
- return -3;
- }
-
- wchar_t wc;
- size_t ret = mbrtowc(&wc, s, n, ps);
- if (ret <= 4) {
- if (wc >= 0x10000) {
- *pending = (wc & 0x3ff) + 0xdc00;
- wc = 0xd7c0 + (wc >> 10);
- }
- if (pc16) *pc16 = wc;
- }
- return ret;
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/mbrtoc32.c b/contrib/libs/libc_compat/ubuntu_14/mbrtoc32.c
deleted file mode 100644
index 9b6b236739..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/mbrtoc32.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <uchar.h>
-#include <wchar.h>
-
-size_t mbrtoc32(char32_t *restrict pc32, const char *restrict s, size_t n, mbstate_t *restrict ps)
-{
- static unsigned internal_state;
- if (!ps) ps = (void *)&internal_state;
- if (!s) return mbrtoc32(0, "", 1, ps);
- wchar_t wc;
- size_t ret = mbrtowc(&wc, s, n, ps);
- if (ret <= 4 && pc32) *pc32 = wc;
- return ret;
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/secure_getenv.cpp b/contrib/libs/libc_compat/ubuntu_14/secure_getenv.cpp
deleted file mode 100644
index 14e3e90906..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/secure_getenv.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdlib.h>
-
-#include "glibc.h"
-
-extern "C" {
- char *secure_getenv(const char *name) noexcept {
- if (NUbuntuCompat::GetGlibc().IsSecure()) {
- return nullptr;
- }
- return getenv(name);
- }
-}
diff --git a/contrib/libs/libc_compat/ubuntu_14/timespec_get.c b/contrib/libs/libc_compat/ubuntu_14/timespec_get.c
deleted file mode 100644
index 742b62ec84..0000000000
--- a/contrib/libs/libc_compat/ubuntu_14/timespec_get.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <time.h>
-
-/* There is no other implemented value than TIME_UTC; all other values
- * are considered erroneous. */
-int timespec_get(struct timespec * ts, int base)
-{
- if (base != TIME_UTC) return 0;
- int ret = clock_gettime(CLOCK_REALTIME, ts);
- return ret < 0 ? 0 : base;
-}
diff --git a/contrib/libs/lz4/README.md b/contrib/libs/lz4/README.md
index 08d1cef2bf..9039da35af 100644
--- a/contrib/libs/lz4/README.md
+++ b/contrib/libs/lz4/README.md
@@ -100,7 +100,7 @@ The following build macro can be selected to adjust source code behavior at comp
passed as argument to become a compression state is suitably aligned.
This test can be disabled if it proves flaky, by setting this value to 0.
-- `LZ4_USER_MEMORY_FUNCTIONS` : replace calls to `<stdlib,h>`'s `malloc()`, `calloc()` and `free()`
+- `LZ4_USER_MEMORY_FUNCTIONS` : replace calls to `<stdlib.h>`'s `malloc()`, `calloc()` and `free()`
by user-defined functions, which must be named `LZ4_malloc()`, `LZ4_calloc()` and `LZ4_free()`.
User functions must be available at link time.
@@ -108,6 +108,12 @@ The following build macro can be selected to adjust source code behavior at comp
Remove support of dynamic memory allocation.
For more details, see description of this macro in `lib/lz4.c`.
+- `LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT` : experimental feature aimed at producing the same
+ compressed output on platforms of different endianness (i.e. little-endian and big-endian).
+ Output on little-endian platforms shall remain unchanged, while big-endian platforms will start producing
+ the same output as little-endian ones. This isn't expected to impact backward- and forward-compatibility
+ in any way.
+
- `LZ4_FREESTANDING` : by setting this build macro to 1,
LZ4/HC removes dependencies on the C standard library,
including allocation functions and `memmove()`, `memcpy()`, and `memset()`.
@@ -115,6 +121,24 @@ The following build macro can be selected to adjust source code behavior at comp
(embedded, bootloader, etc).
For more details, see description of this macro in `lib/lz4.h`.
+- `LZ4_HEAPMODE` : Select how stateless compression functions like `LZ4_compress_default()`
+ allocate memory for their hash table,
+ in memory stack (0:default, fastest), or in memory heap (1:requires malloc()).
+
+- `LZ4HC_HEAPMODE` : Select how stateless HC compression functions like `LZ4_compress_HC()`
+ allocate memory for their workspace:
+ in stack (0), or in heap (1:default).
+ Since workspace is rather large, stack can be inconvenient, hence heap mode is recommended.
+
+- `LZ4F_HEAPMODE` : selects how `LZ4F_compressFrame()` allocates the compression state,
+ either on stack (default, value 0) or using heap memory (value 1).
+
+
+#### Makefile variables
+
+The following `Makefile` variables can be selected to alter the profile of produced binaries :
+- `BUILD_SHARED` : generate `liblz4` dynamic library (enabled by default)
+- `BUILD_STATIC` : generate `liblz4` static library (enabled by default)
#### Amalgamation
diff --git a/contrib/libs/lz4/lz4.c b/contrib/libs/lz4/lz4.c
index 654bfdf32f..a2f7abee19 100644
--- a/contrib/libs/lz4/lz4.c
+++ b/contrib/libs/lz4/lz4.c
@@ -1,6 +1,6 @@
/*
LZ4 - Fast LZ compression algorithm
- Copyright (C) 2011-2020, Yann Collet.
+ Copyright (C) 2011-2023, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
@@ -37,7 +37,8 @@
**************************************/
/*
* LZ4_HEAPMODE :
- * Select how default compression functions will allocate memory for their hash table,
+ * Select how stateless compression functions like `LZ4_compress_default()`
+ * allocate memory for their hash table,
* in memory stack (0:default, fastest), or in memory heap (1:requires malloc()).
*/
#ifndef LZ4_HEAPMODE
@@ -78,7 +79,7 @@
( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \
|| defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
# define LZ4_FORCE_MEMORY_ACCESS 2
-# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__)
+# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) || defined(_MSC_VER)
# define LZ4_FORCE_MEMORY_ACCESS 1
# endif
#endif
@@ -105,15 +106,13 @@
# define LZ4_SRC_INCLUDED 1
#endif
-#ifndef LZ4_STATIC_LINKING_ONLY
-#define LZ4_STATIC_LINKING_ONLY
-#endif
-
#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS
-#define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */
+# define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */
#endif
-#define LZ4_STATIC_LINKING_ONLY /* LZ4_DISTANCE_MAX */
+#ifndef LZ4_STATIC_LINKING_ONLY
+# define LZ4_STATIC_LINKING_ONLY
+#endif
#include "lz4.h"
/* see also "memory routines" below */
@@ -125,14 +124,17 @@
# include <intrin.h> /* only present in VS2005+ */
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
# pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */
+# pragma warning(disable : 6239) /* disable: C6239: (<non-zero constant> && <expression>) always evaluates to the result of <expression> */
+# pragma warning(disable : 6240) /* disable: C6240: (<expression> && <non-zero constant>) always evaluates to the result of <expression> */
+# pragma warning(disable : 6326) /* disable: C6326: Potential comparison of a constant with another constant */
#endif /* _MSC_VER */
#ifndef LZ4_FORCE_INLINE
-# ifdef _MSC_VER /* Visual Studio */
+# if defined (_MSC_VER) && !defined (__clang__) /* MSVC */
# define LZ4_FORCE_INLINE static __forceinline
# else
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
-# ifdef __GNUC__
+# if defined (__GNUC__) || defined (__clang__)
# define LZ4_FORCE_INLINE static inline __attribute__((always_inline))
# else
# define LZ4_FORCE_INLINE static inline
@@ -279,7 +281,7 @@ static const int LZ4_minLength = (MFLIMIT+1);
static int g_debuglog_enable = 1;
# define DEBUGLOG(l, ...) { \
if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \
- fprintf(stderr, __FILE__ ": "); \
+ fprintf(stderr, __FILE__ " %i: ", __LINE__); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " \n"); \
} }
@@ -364,6 +366,11 @@ static unsigned LZ4_isLittleEndian(void)
return one.c[0];
}
+#if defined(__GNUC__) || defined(__INTEL_COMPILER)
+#define LZ4_PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
+#elif defined(_MSC_VER)
+#define LZ4_PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop))
+#endif
#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2)
/* lie to the compiler about data alignment; use with caution */
@@ -379,14 +386,16 @@ static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; }
/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
/* currently only defined for gcc and icc */
-typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) LZ4_unalign;
+LZ4_PACK(typedef struct { U16 u16; }) LZ4_unalign16;
+LZ4_PACK(typedef struct { U32 u32; }) LZ4_unalign32;
+LZ4_PACK(typedef struct { reg_t uArch; }) LZ4_unalignST;
-static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign*)ptr)->u16; }
-static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign*)ptr)->u32; }
-static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalign*)ptr)->uArch; }
+static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign16*)ptr)->u16; }
+static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign32*)ptr)->u32; }
+static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalignST*)ptr)->uArch; }
-static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign*)memPtr)->u16 = value; }
-static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign*)memPtr)->u32 = value; }
+static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign16*)memPtr)->u16 = value; }
+static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign32*)memPtr)->u32 = value; }
#else /* safe and portable access using memcpy() */
@@ -424,9 +433,21 @@ static U16 LZ4_readLE16(const void* memPtr)
return LZ4_read16(memPtr);
} else {
const BYTE* p = (const BYTE*)memPtr;
- return (U16)((U16)p[0] + (p[1]<<8));
+ return (U16)((U16)p[0] | (p[1]<<8));
+ }
+}
+
+#ifdef LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT
+static U32 LZ4_readLE32(const void* memPtr)
+{
+ if (LZ4_isLittleEndian()) {
+ return LZ4_read32(memPtr);
+ } else {
+ const BYTE* p = (const BYTE*)memPtr;
+ return (U32)p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24);
}
}
+#endif
static void LZ4_writeLE16(void* memPtr, U16 value)
{
@@ -509,7 +530,7 @@ LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd)
/* LZ4_memcpy_using_offset() presumes :
* - dstEnd >= dstPtr + MINMATCH
- * - there is at least 8 bytes available to write after dstEnd */
+ * - there is at least 12 bytes available to write after dstEnd */
LZ4_FORCE_INLINE void
LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset)
{
@@ -524,12 +545,12 @@ LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const si
case 2:
LZ4_memcpy(v, srcPtr, 2);
LZ4_memcpy(&v[2], srcPtr, 2);
-#if defined(_MSC_VER) && (_MSC_VER <= 1933) /* MSVC 2022 ver 17.3 or earlier */
+#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */
# pragma warning(push)
# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */
#endif
LZ4_memcpy(&v[4], v, 4);
-#if defined(_MSC_VER) && (_MSC_VER <= 1933) /* MSVC 2022 ver 17.3 or earlier */
+#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */
# pragma warning(pop)
#endif
break;
@@ -776,7 +797,12 @@ LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType)
LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType)
{
if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType);
+
+#ifdef LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT
+ return LZ4_hash4(LZ4_readLE32(p), tableType);
+#else
return LZ4_hash4(LZ4_read32(p), tableType);
+#endif
}
LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType)
@@ -803,23 +829,19 @@ LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableT
}
}
+/* LZ4_putPosition*() : only used in byPtr mode */
LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h,
- void* tableBase, tableType_t const tableType,
- const BYTE* srcBase)
+ void* tableBase, tableType_t const tableType)
{
- switch (tableType)
- {
- case clearedTable: { /* illegal! */ assert(0); return; }
- case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; }
- case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; }
- case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; }
- }
+ const BYTE** const hashTable = (const BYTE**)tableBase;
+ assert(tableType == byPtr); (void)tableType;
+ hashTable[h] = p;
}
-LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase)
+LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType)
{
U32 const h = LZ4_hashPosition(p, tableType);
- LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase);
+ LZ4_putPositionOnHash(p, h, tableBase, tableType);
}
/* LZ4_getIndexOnHash() :
@@ -844,20 +866,18 @@ LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_
assert(0); return 0; /* forbidden case */
}
-static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType, const BYTE* srcBase)
+static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType)
{
- if (tableType == byPtr) { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; }
- if (tableType == byU32) { const U32* const hashTable = (const U32*) tableBase; return hashTable[h] + srcBase; }
- { const U16* const hashTable = (const U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */
+ assert(tableType == byPtr); (void)tableType;
+ { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; }
}
LZ4_FORCE_INLINE const BYTE*
LZ4_getPosition(const BYTE* p,
- const void* tableBase, tableType_t tableType,
- const BYTE* srcBase)
+ const void* tableBase, tableType_t tableType)
{
U32 const h = LZ4_hashPosition(p, tableType);
- return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase);
+ return LZ4_getPositionOnHash(h, tableBase, tableType);
}
LZ4_FORCE_INLINE void
@@ -901,9 +921,9 @@ LZ4_prepareTable(LZ4_stream_t_internal* const cctx,
cctx->dictSize = 0;
}
-/** LZ4_compress_generic() :
+/** LZ4_compress_generic_validated() :
* inlined, to ensure branches are decided at compilation time.
- * Presumed already validated at this stage:
+ * The following conditions are presumed already validated:
* - source != NULL
* - inputSize > 0
*/
@@ -921,10 +941,10 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
const int acceleration)
{
int result;
- const BYTE* ip = (const BYTE*) source;
+ const BYTE* ip = (const BYTE*)source;
U32 const startIndex = cctx->currentOffset;
- const BYTE* base = (const BYTE*) source - startIndex;
+ const BYTE* base = (const BYTE*)source - startIndex;
const BYTE* lowLimit;
const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx;
@@ -932,7 +952,8 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary;
const U32 dictSize =
dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize;
- const U32 dictDelta = (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with index in current context */
+ const U32 dictDelta =
+ (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with indexes in current context */
int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx);
U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */
@@ -957,11 +978,11 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType);
assert(ip != NULL);
+ if (tableType == byU16) assert(inputSize<LZ4_64Klimit); /* Size too large (not within 64K limit) */
+ if (tableType == byPtr) assert(dictDirective==noDict); /* only supported use case with byPtr */
/* If init conditions are not met, we don't have to mark stream
* as having dirty context, since no action was taken yet */
if (outputDirective == fillOutput && maxOutputSize < 1) { return 0; } /* Impossible to store anything */
- if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) { return 0; } /* Size too large (not within 64K limit) */
- if (tableType==byPtr) assert(dictDirective==noDict); /* only supported use case with byPtr */
assert(acceleration >= 1);
lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0);
@@ -981,7 +1002,12 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
if (inputSize<LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */
/* First Byte */
- LZ4_putPosition(ip, cctx->hashTable, tableType, base);
+ { U32 const h = LZ4_hashPosition(ip, tableType);
+ if (tableType == byPtr) {
+ LZ4_putPositionOnHash(ip, h, cctx->hashTable, byPtr);
+ } else {
+ LZ4_putIndexOnHash(startIndex, h, cctx->hashTable, tableType);
+ } }
ip++; forwardH = LZ4_hashPosition(ip, tableType);
/* Main Loop */
@@ -1004,9 +1030,9 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals;
assert(ip < mflimitPlusOne);
- match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base);
+ match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType);
forwardH = LZ4_hashPosition(forwardIp, tableType);
- LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base);
+ LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType);
} while ( (match+LZ4_DISTANCE_MAX < ip)
|| (LZ4_read32(match) != LZ4_read32(ip)) );
@@ -1077,7 +1103,10 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
/* Catch up */
filledIp = ip;
- while (((ip>anchor) & (match > lowLimit)) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; }
+ assert(ip > anchor); /* this is always true as ip has been advanced before entering the main loop */
+ if ((match > lowLimit) && unlikely(ip[-1] == match[-1])) {
+ do { ip--; match--; } while (((ip > anchor) & (match > lowLimit)) && (unlikely(ip[-1] == match[-1])));
+ }
/* Encode Literals */
{ unsigned const litLength = (unsigned)(ip - anchor);
@@ -1092,7 +1121,7 @@ LZ4_FORCE_INLINE int LZ4_compress_generic_validated(
goto _last_literals;
}
if (litLength >= RUN_MASK) {
- int len = (int)(litLength - RUN_MASK);
+ unsigned len = litLength - RUN_MASK;
*token = (RUN_MASK<<ML_BITS);
for(; len >= 255 ; len-=255) *op++ = 255;
*op++ = (BYTE)len;
@@ -1204,13 +1233,19 @@ _next_match:
if (ip >= mflimitPlusOne) break;
/* Fill table */
- LZ4_putPosition(ip-2, cctx->hashTable, tableType, base);
+ { U32 const h = LZ4_hashPosition(ip-2, tableType);
+ if (tableType == byPtr) {
+ LZ4_putPositionOnHash(ip-2, h, cctx->hashTable, byPtr);
+ } else {
+ U32 const idx = (U32)((ip-2) - base);
+ LZ4_putIndexOnHash(idx, h, cctx->hashTable, tableType);
+ } }
/* Test next position */
if (tableType == byPtr) {
- match = LZ4_getPosition(ip, cctx->hashTable, tableType, base);
- LZ4_putPosition(ip, cctx->hashTable, tableType, base);
+ match = LZ4_getPosition(ip, cctx->hashTable, tableType);
+ LZ4_putPosition(ip, cctx->hashTable, tableType);
if ( (match+LZ4_DISTANCE_MAX >= ip)
&& (LZ4_read32(match) == LZ4_read32(ip)) )
{ token=op++; *token=0; goto _next_match; }
@@ -1224,6 +1259,7 @@ _next_match:
if (dictDirective == usingDictCtx) {
if (matchIndex < startIndex) {
/* there was no match, try the dictionary */
+ assert(tableType == byU32);
matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32);
match = dictBase + matchIndex;
lowLimit = dictionary; /* required for match length counter */
@@ -1377,9 +1413,10 @@ int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int
*/
int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration)
{
- LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)state)->internal_donotuse;
+ LZ4_stream_t_internal* const ctx = &((LZ4_stream_t*)state)->internal_donotuse;
if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT;
if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX;
+ assert(ctx != NULL);
if (dstCapacity >= LZ4_compressBound(srcSize)) {
if (srcSize < LZ4_64Klimit) {
@@ -1413,17 +1450,17 @@ int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst
}
-int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)
+int LZ4_compress_fast(const char* src, char* dest, int srcSize, int dstCapacity, int acceleration)
{
int result;
#if (LZ4_HEAPMODE)
- LZ4_stream_t* ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */
+ LZ4_stream_t* const ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */
if (ctxPtr == NULL) return 0;
#else
LZ4_stream_t ctx;
LZ4_stream_t* const ctxPtr = &ctx;
#endif
- result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration);
+ result = LZ4_compress_fast_extState(ctxPtr, src, dest, srcSize, dstCapacity, acceleration);
#if (LZ4_HEAPMODE)
FREEMEM(ctxPtr);
@@ -1432,43 +1469,51 @@ int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutp
}
-int LZ4_compress_default(const char* src, char* dst, int srcSize, int maxOutputSize)
+int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity)
{
- return LZ4_compress_fast(src, dst, srcSize, maxOutputSize, 1);
+ return LZ4_compress_fast(src, dst, srcSize, dstCapacity, 1);
}
/* Note!: This function leaves the stream in an unclean/broken state!
* It is not safe to subsequently use the same state with a _fastReset() or
* _continue() call without resetting it. */
-static int LZ4_compress_destSize_extState (LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize)
+static int LZ4_compress_destSize_extState_internal(LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration)
{
void* const s = LZ4_initStream(state, sizeof (*state));
assert(s != NULL); (void)s;
if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */
- return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1);
+ return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, acceleration);
} else {
if (*srcSizePtr < LZ4_64Klimit) {
- return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, 1);
+ return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, acceleration);
} else {
tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32;
- return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, 1);
+ return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, acceleration);
} }
}
+int LZ4_compress_destSize_extState(void* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration)
+{
+ int const r = LZ4_compress_destSize_extState_internal((LZ4_stream_t*)state, src, dst, srcSizePtr, targetDstSize, acceleration);
+ /* clean the state on exit */
+ LZ4_initStream(state, sizeof (LZ4_stream_t));
+ return r;
+}
+
int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize)
{
#if (LZ4_HEAPMODE)
- LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */
+ LZ4_stream_t* const ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */
if (ctx == NULL) return 0;
#else
LZ4_stream_t ctxBody;
- LZ4_stream_t* ctx = &ctxBody;
+ LZ4_stream_t* const ctx = &ctxBody;
#endif
- int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize);
+ int result = LZ4_compress_destSize_extState_internal(ctx, src, dst, srcSizePtr, targetDstSize, 1);
#if (LZ4_HEAPMODE)
FREEMEM(ctx);
@@ -1537,14 +1582,17 @@ int LZ4_freeStream (LZ4_stream_t* LZ4_stream)
#endif
+typedef enum { _ld_fast, _ld_slow } LoadDict_mode_e;
#define HASH_UNIT sizeof(reg_t)
-int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize)
+int LZ4_loadDict_internal(LZ4_stream_t* LZ4_dict,
+ const char* dictionary, int dictSize,
+ LoadDict_mode_e _ld)
{
- LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse;
+ LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse;
const tableType_t tableType = byU32;
const BYTE* p = (const BYTE*)dictionary;
const BYTE* const dictEnd = p + dictSize;
- const BYTE* base;
+ U32 idx32;
DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict);
@@ -1567,19 +1615,46 @@ int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize)
}
if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB;
- base = dictEnd - dict->currentOffset;
dict->dictionary = p;
dict->dictSize = (U32)(dictEnd - p);
dict->tableType = (U32)tableType;
+ idx32 = dict->currentOffset - dict->dictSize;
while (p <= dictEnd-HASH_UNIT) {
- LZ4_putPosition(p, dict->hashTable, tableType, base);
- p+=3;
+ U32 const h = LZ4_hashPosition(p, tableType);
+ /* Note: overwriting => favors positions end of dictionary */
+ LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType);
+ p+=3; idx32+=3;
+ }
+
+ if (_ld == _ld_slow) {
+ /* Fill hash table with additional references, to improve compression capability */
+ p = dict->dictionary;
+ idx32 = dict->currentOffset - dict->dictSize;
+ while (p <= dictEnd-HASH_UNIT) {
+ U32 const h = LZ4_hashPosition(p, tableType);
+ U32 const limit = dict->currentOffset - 64 KB;
+ if (LZ4_getIndexOnHash(h, dict->hashTable, tableType) <= limit) {
+ /* Note: not overwriting => favors positions beginning of dictionary */
+ LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType);
+ }
+ p++; idx32++;
+ }
}
return (int)dict->dictSize;
}
+int LZ4_loadDict(LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize)
+{
+ return LZ4_loadDict_internal(LZ4_dict, dictionary, dictSize, _ld_fast);
+}
+
+int LZ4_loadDictSlow(LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize)
+{
+ return LZ4_loadDict_internal(LZ4_dict, dictionary, dictSize, _ld_slow);
+}
+
void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream)
{
const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL :
@@ -1711,7 +1786,7 @@ int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream,
/* Hidden debug function, to force-test external dictionary mode */
int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize)
{
- LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse;
+ LZ4_stream_t_internal* const streamPtr = &LZ4_dict->internal_donotuse;
int result;
LZ4_renormDictT(streamPtr, srcSize);
@@ -1774,7 +1849,7 @@ typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive;
* does not know end of input
* presumes input is well formed
* note : will consume at least one byte */
-size_t read_long_length_no_check(const BYTE** pp)
+static size_t read_long_length_no_check(const BYTE** pp)
{
size_t b, l = 0;
do { b = **pp; (*pp)++; l += b; } while (b==255);
@@ -1911,6 +1986,17 @@ read_variable_length(const BYTE** ip, const BYTE* ilimit,
if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */
return rvl_error;
}
+ s = **ip;
+ (*ip)++;
+ length += s;
+ if (unlikely((*ip) > ilimit)) { /* read limit reached */
+ return rvl_error;
+ }
+ /* accumulator overflow detection (32-bit mode only) */
+ if ((sizeof(length) < 8) && unlikely(length > ((Rvl_t)(-1)/2)) ) {
+ return rvl_error;
+ }
+ if (likely(s != 255)) return length;
do {
s = **ip;
(*ip)++;
@@ -1919,10 +2005,10 @@ read_variable_length(const BYTE** ip, const BYTE* ilimit,
return rvl_error;
}
/* accumulator overflow detection (32-bit mode only) */
- if ((sizeof(length)<8) && unlikely(length > ((Rvl_t)(-1)/2)) ) {
+ if ((sizeof(length) < 8) && unlikely(length > ((Rvl_t)(-1)/2)) ) {
return rvl_error;
}
- } while (s==255);
+ } while (s == 255);
return length;
}
@@ -1988,63 +2074,73 @@ LZ4_decompress_generic(
* note : fast loop may show a regression for some client arm chips. */
#if LZ4_FAST_DEC_LOOP
if ((oend - op) < FASTLOOP_SAFE_DISTANCE) {
- DEBUGLOG(6, "skip fast decode loop");
+ DEBUGLOG(6, "move to safe decode loop");
goto safe_decode;
}
/* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */
+ DEBUGLOG(6, "using fast decode loop");
while (1) {
/* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */
assert(oend - op >= FASTLOOP_SAFE_DISTANCE);
assert(ip < iend);
token = *ip++;
length = token >> ML_BITS; /* literal length */
+ DEBUGLOG(7, "blockPos%6u: litLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length);
/* decode literal length */
if (length == RUN_MASK) {
size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1);
- if (addl == rvl_error) { goto _output_error; }
+ if (addl == rvl_error) {
+ DEBUGLOG(6, "error reading long literal length");
+ goto _output_error;
+ }
length += addl;
if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */
if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */
/* copy literals */
- cpy = op+length;
LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH);
- if ((cpy>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; }
- LZ4_wildCopy32(op, ip, cpy);
- ip += length; op = cpy;
- } else {
- cpy = op+length;
- DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length);
+ if ((op+length>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; }
+ LZ4_wildCopy32(op, ip, op+length);
+ ip += length; op += length;
+ } else if (ip <= iend-(16 + 1/*max lit + offset + nextToken*/)) {
/* We don't need to check oend, since we check it once for each loop below */
- if (ip > iend-(16 + 1/*max lit + offset + nextToken*/)) { goto safe_literal_copy; }
+ DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length);
/* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */
LZ4_memcpy(op, ip, 16);
- ip += length; op = cpy;
+ ip += length; op += length;
+ } else {
+ goto safe_literal_copy;
}
/* get offset */
offset = LZ4_readLE16(ip); ip+=2;
+ DEBUGLOG(6, "blockPos%6u: offset = %u", (unsigned)(op-(BYTE*)dst), (unsigned)offset);
match = op - offset;
assert(match <= op); /* overflow check */
/* get matchlength */
length = token & ML_MASK;
+ DEBUGLOG(7, " match length token = %u (len==%u)", (unsigned)length, (unsigned)length+MINMATCH);
if (length == ML_MASK) {
size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0);
- if (addl == rvl_error) { goto _output_error; }
+ if (addl == rvl_error) {
+ DEBUGLOG(5, "error reading long match length");
+ goto _output_error;
+ }
length += addl;
length += MINMATCH;
+ DEBUGLOG(7, " long match length == %u", (unsigned)length);
if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */
- if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */
if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) {
goto safe_match_copy;
}
} else {
length += MINMATCH;
if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) {
+ DEBUGLOG(7, "moving to safe_match_copy (ml==%u)", (unsigned)length);
goto safe_match_copy;
}
@@ -2062,7 +2158,10 @@ LZ4_decompress_generic(
continue;
} } }
- if (checkOffset && (unlikely(match + dictSize < lowPrefix))) { goto _output_error; } /* Error : offset outside buffers */
+ if ( checkOffset && (unlikely(match + dictSize < lowPrefix)) ) {
+ DEBUGLOG(5, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match);
+ goto _output_error;
+ }
/* match starting within external dictionary */
if ((dict==usingExtDict) && (match < lowPrefix)) {
assert(dictEnd != NULL);
@@ -2071,7 +2170,8 @@ LZ4_decompress_generic(
DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd");
length = MIN(length, (size_t)(oend-op));
} else {
- goto _output_error; /* end-of-block condition violated */
+ DEBUGLOG(6, "end-of-block condition violated")
+ goto _output_error;
} }
if (length <= (size_t)(lowPrefix-match)) {
@@ -2111,10 +2211,12 @@ LZ4_decompress_generic(
#endif
/* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */
+ DEBUGLOG(6, "using safe decode loop");
while (1) {
assert(ip < iend);
token = *ip++;
length = token >> ML_BITS; /* literal length */
+ DEBUGLOG(7, "blockPos%6u: litLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length);
/* A two-stage shortcut for the most common case:
* 1) If the literal length is 0..14, and there is enough space,
@@ -2135,6 +2237,7 @@ LZ4_decompress_generic(
/* The second stage: prepare for match copying, decode full info.
* If it doesn't work out, the info won't be wasted. */
length = token & ML_MASK; /* match length */
+ DEBUGLOG(7, "blockPos%6u: matchLength token = %u (len=%u)", (unsigned)(op-(BYTE*)dst), (unsigned)length, (unsigned)length + 4);
offset = LZ4_readLE16(ip); ip += 2;
match = op - offset;
assert(match <= op); /* check overflow */
@@ -2166,11 +2269,12 @@ LZ4_decompress_generic(
if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */
}
- /* copy literals */
- cpy = op+length;
#if LZ4_FAST_DEC_LOOP
safe_literal_copy:
#endif
+ /* copy literals */
+ cpy = op+length;
+
LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH);
if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) {
/* We've either hit the input parsing restriction or the output parsing restriction.
@@ -2206,9 +2310,10 @@ LZ4_decompress_generic(
* so check that we exactly consume the input and don't overrun the output buffer.
*/
if ((ip+length != iend) || (cpy > oend)) {
- DEBUGLOG(6, "should have been last run of literals")
- DEBUGLOG(6, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend);
- DEBUGLOG(6, "or cpy(%p) > oend(%p)", cpy, oend);
+ DEBUGLOG(5, "should have been last run of literals")
+ DEBUGLOG(5, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend);
+ DEBUGLOG(5, "or cpy(%p) > (oend-MFLIMIT)(%p)", cpy, oend-MFLIMIT);
+ DEBUGLOG(5, "after writing %u bytes / %i bytes available", (unsigned)(op-(BYTE*)dst), outputSize);
goto _output_error;
}
}
@@ -2234,6 +2339,7 @@ LZ4_decompress_generic(
/* get matchlength */
length = token & ML_MASK;
+ DEBUGLOG(7, "blockPos%6u: matchLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length);
_copy_match:
if (length == ML_MASK) {
@@ -2323,7 +2429,7 @@ LZ4_decompress_generic(
while (op < cpy) { *op++ = *match++; }
} else {
LZ4_memcpy(op, match, 8);
- if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); }
+ if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); }
}
op = cpy; /* wildcopy correction */
}
@@ -2418,6 +2524,7 @@ int LZ4_decompress_safe_forceExtDict(const char* source, char* dest,
int compressedSize, int maxOutputSize,
const void* dictStart, size_t dictSize)
{
+ DEBUGLOG(5, "LZ4_decompress_safe_forceExtDict");
return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize,
decode_full_block, usingExtDict,
(BYTE*)dest, (const BYTE*)dictStart, dictSize);
diff --git a/contrib/libs/lz4/lz4.h b/contrib/libs/lz4/lz4.h
index 46caa7f6f5..427c1e6e94 100644
--- a/contrib/libs/lz4/lz4.h
+++ b/contrib/libs/lz4/lz4.h
@@ -1,7 +1,7 @@
/*
* LZ4 - Fast LZ compression algorithm
* Header File
- * Copyright (C) 2011-2020, Yann Collet.
+ * Copyright (C) 2011-2023, Yann Collet.
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
@@ -129,8 +129,8 @@ extern "C" {
/*------ Version ------*/
#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
-#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */
-#define LZ4_VERSION_RELEASE 4 /* for tweaks, bug-fixes, or development */
+#define LZ4_VERSION_MINOR 10 /* for new (non-breaking) interface capabilities */
+#define LZ4_VERSION_RELEASE 0 /* for tweaks, bug-fixes, or development */
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
@@ -144,23 +144,25 @@ LZ4LIB_API const char* LZ4_versionString (void); /**< library version string;
/*-************************************
-* Tuning parameter
+* Tuning memory usage
**************************************/
-#define LZ4_MEMORY_USAGE_MIN 10
-#define LZ4_MEMORY_USAGE_DEFAULT 14
-#define LZ4_MEMORY_USAGE_MAX 20
-
/*!
* LZ4_MEMORY_USAGE :
- * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; )
- * Increasing memory usage improves compression ratio, at the cost of speed.
+ * Can be selected at compile time, by setting LZ4_MEMORY_USAGE.
+ * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB)
+ * Increasing memory usage improves compression ratio, generally at the cost of speed.
* Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality.
- * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache
+ * Default value is 14, for 16KB, which nicely fits into most L1 caches.
*/
#ifndef LZ4_MEMORY_USAGE
# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT
#endif
+/* These are absolute limits, they should not be changed by users */
+#define LZ4_MEMORY_USAGE_MIN 10
+#define LZ4_MEMORY_USAGE_DEFAULT 14
+#define LZ4_MEMORY_USAGE_MAX 20
+
#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN)
# error "LZ4_MEMORY_USAGE is too small !"
#endif
@@ -189,8 +191,9 @@ LZ4LIB_API const char* LZ4_versionString (void); /**< library version string;
LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity);
/*! LZ4_decompress_safe() :
- * compressedSize : is the exact complete size of the compressed block.
- * dstCapacity : is the size of destination buffer (which must be already allocated), presumed an upper bound of decompressed size.
+ * @compressedSize : is the exact complete size of the compressed block.
+ * @dstCapacity : is the size of destination buffer (which must be already allocated),
+ * presumed an upper bound of decompressed size.
* @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity)
* If destination buffer is not large enough, decoding will stop and output an error code (negative value).
* If the source stream is detected malformed, the function will stop decoding and return a negative result.
@@ -242,20 +245,20 @@ LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int d
LZ4LIB_API int LZ4_sizeofState(void);
LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
-
/*! LZ4_compress_destSize() :
* Reverse the logic : compresses as much data as possible from 'src' buffer
- * into already allocated buffer 'dst', of size >= 'targetDestSize'.
+ * into already allocated buffer 'dst', of size >= 'dstCapacity'.
* This function either compresses the entire 'src' content into 'dst' if it's large enough,
* or fill 'dst' buffer completely with as much data as possible from 'src'.
* note: acceleration parameter is fixed to "default".
*
- * *srcSizePtr : will be modified to indicate how many bytes where read from 'src' to fill 'dst'.
+ * *srcSizePtr : in+out parameter. Initially contains size of input.
+ * Will be modified to indicate how many bytes where read from 'src' to fill 'dst'.
* New value is necessarily <= input value.
- * @return : Nb bytes written into 'dst' (necessarily <= targetDestSize)
+ * @return : Nb bytes written into 'dst' (necessarily <= dstCapacity)
* or 0 if compression fails.
*
- * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed un v1.9.2+):
+ * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+):
* the produced compressed content could, in specific circumstances,
* require to be decompressed into a destination buffer larger
* by at least 1 byte than the content to decompress.
@@ -266,8 +269,7 @@ LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* d
* a dstCapacity which is > decompressedSize, by at least 1 byte.
* See https://github.com/lz4/lz4/issues/859 for details
*/
-LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize);
-
+LZ4LIB_API int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize);
/*! LZ4_decompress_safe_partial() :
* Decompress an LZ4 compressed block, of size 'srcSize' at position 'src',
@@ -311,7 +313,7 @@ LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcS
***********************************************/
typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */
-/**
+/*!
Note about RC_INVOKED
- RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio).
@@ -361,13 +363,58 @@ LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
* LZ4_loadDict() triggers a reset, so any previous data will be forgotten.
* The same dictionary will have to be loaded on decompression side for successful decoding.
* Dictionary are useful for better compression of small data (KB range).
- * While LZ4 accept any input as dictionary,
- * results are generally better when using Zstandard's Dictionary Builder.
+ * While LZ4 itself accepts any input as dictionary, dictionary efficiency is also a topic.
+ * When in doubt, employ the Zstandard's Dictionary Builder.
* Loading a size of 0 is allowed, and is the same as reset.
- * @return : loaded dictionary size, in bytes (necessarily <= 64 KB)
+ * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded)
*/
LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);
+/*! LZ4_loadDictSlow() : v1.10.0+
+ * Same as LZ4_loadDict(),
+ * but uses a bit more cpu to reference the dictionary content more thoroughly.
+ * This is expected to slightly improve compression ratio.
+ * The extra-cpu cost is likely worth it if the dictionary is re-used across multiple sessions.
+ * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded)
+ */
+LZ4LIB_API int LZ4_loadDictSlow(LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);
+
+/*! LZ4_attach_dictionary() : stable since v1.10.0
+ *
+ * This allows efficient re-use of a static dictionary multiple times.
+ *
+ * Rather than re-loading the dictionary buffer into a working context before
+ * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a
+ * working LZ4_stream_t, this function introduces a no-copy setup mechanism,
+ * in which the working stream references @dictionaryStream in-place.
+ *
+ * Several assumptions are made about the state of @dictionaryStream.
+ * Currently, only states which have been prepared by LZ4_loadDict() or
+ * LZ4_loadDictSlow() should be expected to work.
+ *
+ * Alternatively, the provided @dictionaryStream may be NULL,
+ * in which case any existing dictionary stream is unset.
+ *
+ * If a dictionary is provided, it replaces any pre-existing stream history.
+ * The dictionary contents are the only history that can be referenced and
+ * logically immediately precede the data compressed in the first subsequent
+ * compression call.
+ *
+ * The dictionary will only remain attached to the working stream through the
+ * first compression call, at the end of which it is cleared.
+ * @dictionaryStream stream (and source buffer) must remain in-place / accessible / unchanged
+ * through the completion of the compression session.
+ *
+ * Note: there is no equivalent LZ4_attach_*() method on the decompression side
+ * because there is no initialization cost, hence no need to share the cost across multiple sessions.
+ * To decompress LZ4 blocks using dictionary, attached or not,
+ * just employ the regular LZ4_setStreamDecode() for streaming,
+ * or the stateless LZ4_decompress_safe_usingDict() for one-shot decompression.
+ */
+LZ4LIB_API void
+LZ4_attach_dictionary(LZ4_stream_t* workingStream,
+ const LZ4_stream_t* dictionaryStream);
+
/*! LZ4_compress_fast_continue() :
* Compress 'src' content using data from previously compressed blocks, for better compression ratio.
* 'dst' buffer must be already allocated.
@@ -443,11 +490,24 @@ LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const
LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize);
#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */
-/*! LZ4_decompress_*_continue() :
- * These decoding functions allow decompression of consecutive blocks in "streaming" mode.
- * A block is an unsplittable entity, it must be presented entirely to a decompression function.
- * Decompression functions only accepts one block at a time.
- * The last 64KB of previously decoded data *must* remain available and unmodified at the memory position where they were decoded.
+/*! LZ4_decompress_safe_continue() :
+ * This decoding function allows decompression of consecutive blocks in "streaming" mode.
+ * The difference with the usual independent blocks is that
+ * new blocks are allowed to find references into former blocks.
+ * A block is an unsplittable entity, and must be presented entirely to the decompression function.
+ * LZ4_decompress_safe_continue() only accepts one block at a time.
+ * It's modeled after `LZ4_decompress_safe()` and behaves similarly.
+ *
+ * @LZ4_streamDecode : decompression state, tracking the position in memory of past data
+ * @compressedSize : exact complete size of one compressed block.
+ * @dstCapacity : size of destination buffer (which must be already allocated),
+ * must be an upper bound of decompressed size.
+ * @return : number of bytes decompressed into destination buffer (necessarily <= dstCapacity)
+ * If destination buffer is not large enough, decoding will stop and output an error code (negative value).
+ * If the source stream is detected malformed, the function will stop decoding and return a negative result.
+ *
+ * The last 64KB of previously decoded data *must* remain available and unmodified
+ * at the memory position where they were previously decoded.
* If less than 64KB of data has been decoded, all the data must be present.
*
* Special : if decompression side sets a ring buffer, it must respect one of the following conditions :
@@ -474,10 +534,10 @@ LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode,
int srcSize, int dstCapacity);
-/*! LZ4_decompress_*_usingDict() :
- * These decoding functions work the same as
- * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue()
- * They are stand-alone, and don't need an LZ4_streamDecode_t structure.
+/*! LZ4_decompress_safe_usingDict() :
+ * Works the same as
+ * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue()
+ * However, it's stateless: it doesn't need any LZ4_streamDecode_t state.
* Dictionary is presumed stable : it must remain accessible and unmodified during decompression.
* Performance tip : Decompression speed can be substantially increased
* when dst == dictStart + dictSize.
@@ -487,6 +547,12 @@ LZ4_decompress_safe_usingDict(const char* src, char* dst,
int srcSize, int dstCapacity,
const char* dictStart, int dictSize);
+/*! LZ4_decompress_safe_partial_usingDict() :
+ * Behaves the same as LZ4_decompress_safe_partial()
+ * with the added ability to specify a memory segment for past data.
+ * Performance tip : Decompression speed can be substantially increased
+ * when dst == dictStart + dictSize.
+ */
LZ4LIB_API int
LZ4_decompress_safe_partial_usingDict(const char* src, char* dst,
int compressedSize,
@@ -526,9 +592,9 @@ LZ4_decompress_safe_partial_usingDict(const char* src, char* dst,
#define LZ4_STATIC_3504398509
#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS
-#define LZ4LIB_STATIC_API LZ4LIB_API
+# define LZ4LIB_STATIC_API LZ4LIB_API
#else
-#define LZ4LIB_STATIC_API
+# define LZ4LIB_STATIC_API
#endif
@@ -544,36 +610,11 @@ LZ4_decompress_safe_partial_usingDict(const char* src, char* dst,
*/
LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
-/*! LZ4_attach_dictionary() :
- * This is an experimental API that allows
- * efficient use of a static dictionary many times.
- *
- * Rather than re-loading the dictionary buffer into a working context before
- * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a
- * working LZ4_stream_t, this function introduces a no-copy setup mechanism,
- * in which the working stream references the dictionary stream in-place.
- *
- * Several assumptions are made about the state of the dictionary stream.
- * Currently, only streams which have been prepared by LZ4_loadDict() should
- * be expected to work.
- *
- * Alternatively, the provided dictionaryStream may be NULL,
- * in which case any existing dictionary stream is unset.
- *
- * If a dictionary is provided, it replaces any pre-existing stream history.
- * The dictionary contents are the only history that can be referenced and
- * logically immediately precede the data compressed in the first subsequent
- * compression call.
- *
- * The dictionary will only remain attached to the working stream through the
- * first compression call, at the end of which it is cleared. The dictionary
- * stream (and source buffer) must remain in-place / accessible / unchanged
- * through the completion of the first compression call on the stream.
+/*! LZ4_compress_destSize_extState() : introduced in v1.10.0
+ * Same as LZ4_compress_destSize(), but using an externally allocated state.
+ * Also: exposes @acceleration
*/
-LZ4LIB_STATIC_API void
-LZ4_attach_dictionary(LZ4_stream_t* workingStream,
- const LZ4_stream_t* dictionaryStream);
-
+int LZ4_compress_destSize_extState(void* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration);
/*! In-place compression and decompression
*
@@ -685,7 +726,7 @@ struct LZ4_stream_t_internal {
/* Implicit padding to ensure structure is aligned */
};
-#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */
+#define LZ4_STREAM_MINSIZE ((1UL << (LZ4_MEMORY_USAGE)) + 32) /* static size, for inter-version compatibility */
union LZ4_stream_u {
char minStateSize[LZ4_STREAM_MINSIZE];
LZ4_stream_t_internal internal_donotuse;
@@ -706,7 +747,7 @@ union LZ4_stream_u {
* Note2: An LZ4_stream_t structure guarantees correct alignment and size.
* Note3: Before v1.9.0, use LZ4_resetStream() instead
**/
-LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size);
+LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* stateBuffer, size_t size);
/*! LZ4_streamDecode_t :
@@ -823,11 +864,12 @@ LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4
* But they may happen if input data is invalid (error or intentional tampering).
* As a consequence, use these functions in trusted environments with trusted data **only**.
*/
-LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead")
+LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_partial() instead")
LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize);
-LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead")
+LZ4_DEPRECATED("This function is deprecated and unsafe. Consider migrating towards LZ4_decompress_safe_continue() instead. "
+ "Note that the contract will change (requires block's compressed size, instead of decompressed size)")
LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize);
-LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead")
+LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_partial_usingDict() instead")
LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize);
/*! LZ4_resetStream() :
diff --git a/contrib/libs/lz4/lz4file.c b/contrib/libs/lz4/lz4file.c
index eaf9b1704d..a4197ea80d 100644
--- a/contrib/libs/lz4/lz4file.c
+++ b/contrib/libs/lz4/lz4file.c
@@ -31,11 +31,21 @@
* - LZ4 homepage : http://www.lz4.org
* - LZ4 source repository : https://github.com/lz4/lz4
*/
-#include <stdlib.h>
+#include <stdlib.h> /* malloc, free */
#include <string.h>
+#include <assert.h>
#include "lz4.h"
#include "lz4file.h"
+static LZ4F_errorCode_t returnErrorCode(LZ4F_errorCodes code)
+{
+ return (LZ4F_errorCode_t)-(ptrdiff_t)code;
+}
+#undef RETURN_ERROR
+#define RETURN_ERROR(e) return returnErrorCode(LZ4F_ERROR_ ## e)
+
+/* ===== read API ===== */
+
struct LZ4_readFile_s {
LZ4F_dctx* dctxPtr;
FILE* fp;
@@ -45,76 +55,80 @@ struct LZ4_readFile_s {
size_t srcBufMaxSize;
};
-struct LZ4_writeFile_s {
- LZ4F_cctx* cctxPtr;
- FILE* fp;
- LZ4_byte* dstBuf;
- size_t maxWriteSize;
- size_t dstBufMaxSize;
- LZ4F_errorCode_t errCode;
-};
+static void LZ4F_freeReadFile(LZ4_readFile_t* lz4fRead)
+{
+ if (lz4fRead==NULL) return;
+ LZ4F_freeDecompressionContext(lz4fRead->dctxPtr);
+ free(lz4fRead->srcBuf);
+ free(lz4fRead);
+}
+
+static void LZ4F_freeAndNullReadFile(LZ4_readFile_t** statePtr)
+{
+ assert(statePtr != NULL);
+ LZ4F_freeReadFile(*statePtr);
+ *statePtr = NULL;
+}
LZ4F_errorCode_t LZ4F_readOpen(LZ4_readFile_t** lz4fRead, FILE* fp)
{
char buf[LZ4F_HEADER_SIZE_MAX];
size_t consumedSize;
LZ4F_errorCode_t ret;
- LZ4F_frameInfo_t info;
if (fp == NULL || lz4fRead == NULL) {
- return -LZ4F_ERROR_GENERIC;
+ RETURN_ERROR(parameter_null);
}
*lz4fRead = (LZ4_readFile_t*)calloc(1, sizeof(LZ4_readFile_t));
if (*lz4fRead == NULL) {
- return -LZ4F_ERROR_allocation_failed;
+ RETURN_ERROR(allocation_failed);
}
- ret = LZ4F_createDecompressionContext(&(*lz4fRead)->dctxPtr, LZ4F_getVersion());
+ ret = LZ4F_createDecompressionContext(&(*lz4fRead)->dctxPtr, LZ4F_VERSION);
if (LZ4F_isError(ret)) {
- free(*lz4fRead);
+ LZ4F_freeAndNullReadFile(lz4fRead);
return ret;
}
(*lz4fRead)->fp = fp;
consumedSize = fread(buf, 1, sizeof(buf), (*lz4fRead)->fp);
if (consumedSize != sizeof(buf)) {
- free(*lz4fRead);
- return -LZ4F_ERROR_GENERIC;
+ LZ4F_freeAndNullReadFile(lz4fRead);
+ RETURN_ERROR(io_read);
}
- ret = LZ4F_getFrameInfo((*lz4fRead)->dctxPtr, &info, buf, &consumedSize);
- if (LZ4F_isError(ret)) {
- LZ4F_freeDecompressionContext((*lz4fRead)->dctxPtr);
- free(*lz4fRead);
- return ret;
+ { LZ4F_frameInfo_t info;
+ LZ4F_errorCode_t const r = LZ4F_getFrameInfo((*lz4fRead)->dctxPtr, &info, buf, &consumedSize);
+ if (LZ4F_isError(r)) {
+ LZ4F_freeAndNullReadFile(lz4fRead);
+ return r;
}
- switch (info.blockSizeID) {
- case LZ4F_default :
- case LZ4F_max64KB :
- (*lz4fRead)->srcBufMaxSize = 64 * 1024;
- break;
- case LZ4F_max256KB:
- (*lz4fRead)->srcBufMaxSize = 256 * 1024;
- break;
- case LZ4F_max1MB:
- (*lz4fRead)->srcBufMaxSize = 1 * 1024 * 1024;
- break;
- case LZ4F_max4MB:
- (*lz4fRead)->srcBufMaxSize = 4 * 1024 * 1024;
- break;
- default:
- LZ4F_freeDecompressionContext((*lz4fRead)->dctxPtr);
- free(*lz4fRead);
- return -LZ4F_ERROR_maxBlockSize_invalid;
+ switch (info.blockSizeID) {
+ case LZ4F_default :
+ case LZ4F_max64KB :
+ (*lz4fRead)->srcBufMaxSize = 64 * 1024;
+ break;
+ case LZ4F_max256KB:
+ (*lz4fRead)->srcBufMaxSize = 256 * 1024;
+ break;
+ case LZ4F_max1MB:
+ (*lz4fRead)->srcBufMaxSize = 1 * 1024 * 1024;
+ break;
+ case LZ4F_max4MB:
+ (*lz4fRead)->srcBufMaxSize = 4 * 1024 * 1024;
+ break;
+ default:
+ LZ4F_freeAndNullReadFile(lz4fRead);
+ RETURN_ERROR(maxBlockSize_invalid);
+ }
}
(*lz4fRead)->srcBuf = (LZ4_byte*)malloc((*lz4fRead)->srcBufMaxSize);
if ((*lz4fRead)->srcBuf == NULL) {
- LZ4F_freeDecompressionContext((*lz4fRead)->dctxPtr);
- free(lz4fRead);
- return -LZ4F_ERROR_allocation_failed;
+ LZ4F_freeAndNullReadFile(lz4fRead);
+ RETURN_ERROR(allocation_failed);
}
(*lz4fRead)->srcBufSize = sizeof(buf) - consumedSize;
@@ -129,7 +143,7 @@ size_t LZ4F_read(LZ4_readFile_t* lz4fRead, void* buf, size_t size)
size_t next = 0;
if (lz4fRead == NULL || buf == NULL)
- return -LZ4F_ERROR_GENERIC;
+ RETURN_ERROR(parameter_null);
while (next < size) {
size_t srcsize = lz4fRead->srcBufSize - lz4fRead->srcBufNext;
@@ -142,12 +156,10 @@ size_t LZ4F_read(LZ4_readFile_t* lz4fRead, void* buf, size_t size)
lz4fRead->srcBufSize = ret;
srcsize = lz4fRead->srcBufSize;
lz4fRead->srcBufNext = 0;
- }
- else if (ret == 0) {
+ } else if (ret == 0) {
break;
- }
- else {
- return -LZ4F_ERROR_GENERIC;
+ } else {
+ RETURN_ERROR(io_read);
}
}
@@ -171,24 +183,48 @@ size_t LZ4F_read(LZ4_readFile_t* lz4fRead, void* buf, size_t size)
LZ4F_errorCode_t LZ4F_readClose(LZ4_readFile_t* lz4fRead)
{
if (lz4fRead == NULL)
- return -LZ4F_ERROR_GENERIC;
- LZ4F_freeDecompressionContext(lz4fRead->dctxPtr);
- free(lz4fRead->srcBuf);
- free(lz4fRead);
+ RETURN_ERROR(parameter_null);
+ LZ4F_freeReadFile(lz4fRead);
return LZ4F_OK_NoError;
}
+/* ===== write API ===== */
+
+struct LZ4_writeFile_s {
+ LZ4F_cctx* cctxPtr;
+ FILE* fp;
+ LZ4_byte* dstBuf;
+ size_t maxWriteSize;
+ size_t dstBufMaxSize;
+ LZ4F_errorCode_t errCode;
+};
+
+static void LZ4F_freeWriteFile(LZ4_writeFile_t* state)
+{
+ if (state == NULL) return;
+ LZ4F_freeCompressionContext(state->cctxPtr);
+ free(state->dstBuf);
+ free(state);
+}
+
+static void LZ4F_freeAndNullWriteFile(LZ4_writeFile_t** statePtr)
+{
+ assert(statePtr != NULL);
+ LZ4F_freeWriteFile(*statePtr);
+ *statePtr = NULL;
+}
+
LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite, FILE* fp, const LZ4F_preferences_t* prefsPtr)
{
LZ4_byte buf[LZ4F_HEADER_SIZE_MAX];
size_t ret;
if (fp == NULL || lz4fWrite == NULL)
- return -LZ4F_ERROR_GENERIC;
+ RETURN_ERROR(parameter_null);
- *lz4fWrite = (LZ4_writeFile_t*)malloc(sizeof(LZ4_writeFile_t));
+ *lz4fWrite = (LZ4_writeFile_t*)calloc(1, sizeof(LZ4_writeFile_t));
if (*lz4fWrite == NULL) {
- return -LZ4F_ERROR_allocation_failed;
+ RETURN_ERROR(allocation_failed);
}
if (prefsPtr != NULL) {
switch (prefsPtr->frameInfo.blockSizeID) {
@@ -206,8 +242,8 @@ LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite, FILE* fp, const LZ4
(*lz4fWrite)->maxWriteSize = 4 * 1024 * 1024;
break;
default:
- free(lz4fWrite);
- return -LZ4F_ERROR_maxBlockSize_invalid;
+ LZ4F_freeAndNullWriteFile(lz4fWrite);
+ RETURN_ERROR(maxBlockSize_invalid);
}
} else {
(*lz4fWrite)->maxWriteSize = 64 * 1024;
@@ -216,30 +252,25 @@ LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite, FILE* fp, const LZ4
(*lz4fWrite)->dstBufMaxSize = LZ4F_compressBound((*lz4fWrite)->maxWriteSize, prefsPtr);
(*lz4fWrite)->dstBuf = (LZ4_byte*)malloc((*lz4fWrite)->dstBufMaxSize);
if ((*lz4fWrite)->dstBuf == NULL) {
- free(*lz4fWrite);
- return -LZ4F_ERROR_allocation_failed;
+ LZ4F_freeAndNullWriteFile(lz4fWrite);
+ RETURN_ERROR(allocation_failed);
}
- ret = LZ4F_createCompressionContext(&(*lz4fWrite)->cctxPtr, LZ4F_getVersion());
+ ret = LZ4F_createCompressionContext(&(*lz4fWrite)->cctxPtr, LZ4F_VERSION);
if (LZ4F_isError(ret)) {
- free((*lz4fWrite)->dstBuf);
- free(*lz4fWrite);
+ LZ4F_freeAndNullWriteFile(lz4fWrite);
return ret;
}
ret = LZ4F_compressBegin((*lz4fWrite)->cctxPtr, buf, LZ4F_HEADER_SIZE_MAX, prefsPtr);
if (LZ4F_isError(ret)) {
- LZ4F_freeCompressionContext((*lz4fWrite)->cctxPtr);
- free((*lz4fWrite)->dstBuf);
- free(*lz4fWrite);
+ LZ4F_freeAndNullWriteFile(lz4fWrite);
return ret;
}
if (ret != fwrite(buf, 1, ret, fp)) {
- LZ4F_freeCompressionContext((*lz4fWrite)->cctxPtr);
- free((*lz4fWrite)->dstBuf);
- free(*lz4fWrite);
- return -LZ4F_ERROR_GENERIC;
+ LZ4F_freeAndNullWriteFile(lz4fWrite);
+ RETURN_ERROR(io_write);
}
(*lz4fWrite)->fp = fp;
@@ -247,15 +278,15 @@ LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite, FILE* fp, const LZ4
return LZ4F_OK_NoError;
}
-size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, void* buf, size_t size)
+size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, const void* buf, size_t size)
{
- LZ4_byte* p = (LZ4_byte*)buf;
+ const LZ4_byte* p = (const LZ4_byte*)buf;
size_t remain = size;
size_t chunk;
size_t ret;
if (lz4fWrite == NULL || buf == NULL)
- return -LZ4F_ERROR_GENERIC;
+ RETURN_ERROR(parameter_null);
while (remain) {
if (remain > lz4fWrite->maxWriteSize)
chunk = lz4fWrite->maxWriteSize;
@@ -271,9 +302,9 @@ size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, void* buf, size_t size)
return ret;
}
- if(ret != fwrite(lz4fWrite->dstBuf, 1, ret, lz4fWrite->fp)) {
- lz4fWrite->errCode = -LZ4F_ERROR_GENERIC;
- return -LZ4F_ERROR_GENERIC;
+ if (ret != fwrite(lz4fWrite->dstBuf, 1, ret, lz4fWrite->fp)) {
+ lz4fWrite->errCode = returnErrorCode(LZ4F_ERROR_io_write);
+ RETURN_ERROR(io_write);
}
p += chunk;
@@ -287,8 +318,9 @@ LZ4F_errorCode_t LZ4F_writeClose(LZ4_writeFile_t* lz4fWrite)
{
LZ4F_errorCode_t ret = LZ4F_OK_NoError;
- if (lz4fWrite == NULL)
- return -LZ4F_ERROR_GENERIC;
+ if (lz4fWrite == NULL) {
+ RETURN_ERROR(parameter_null);
+ }
if (lz4fWrite->errCode == LZ4F_OK_NoError) {
ret = LZ4F_compressEnd(lz4fWrite->cctxPtr,
@@ -299,13 +331,11 @@ LZ4F_errorCode_t LZ4F_writeClose(LZ4_writeFile_t* lz4fWrite)
}
if (ret != fwrite(lz4fWrite->dstBuf, 1, ret, lz4fWrite->fp)) {
- ret = -LZ4F_ERROR_GENERIC;
+ ret = returnErrorCode(LZ4F_ERROR_io_write);
}
}
out:
- LZ4F_freeCompressionContext(lz4fWrite->cctxPtr);
- free(lz4fWrite->dstBuf);
- free(lz4fWrite);
+ LZ4F_freeWriteFile(lz4fWrite);
return ret;
}
diff --git a/contrib/libs/lz4/lz4file.h b/contrib/libs/lz4/lz4file.h
index 5527130720..598ad705ea 100644
--- a/contrib/libs/lz4/lz4file.h
+++ b/contrib/libs/lz4/lz4file.h
@@ -38,7 +38,7 @@ extern "C" {
#ifndef LZ4FILE_H
#define LZ4FILE_H
-#include <stdio.h>
+#include <stdio.h> /* FILE* */
#include "lz4frame_static.h"
typedef struct LZ4_readFile_s LZ4_readFile_t;
@@ -78,7 +78,7 @@ LZ4FLIB_STATIC_API LZ4F_errorCode_t LZ4F_writeOpen(LZ4_writeFile_t** lz4fWrite,
* `buf` write data buffer.
* `size` write data buffer size.
*/
-LZ4FLIB_STATIC_API size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, void* buf, size_t size);
+LZ4FLIB_STATIC_API size_t LZ4F_write(LZ4_writeFile_t* lz4fWrite, const void* buf, size_t size);
/*! LZ4F_writeClose() :
* Close lz4file handle.
diff --git a/contrib/libs/lz4/lz4frame.c b/contrib/libs/lz4/lz4frame.c
index 174f9ae4f2..f89c055799 100644
--- a/contrib/libs/lz4/lz4frame.c
+++ b/contrib/libs/lz4/lz4frame.c
@@ -44,6 +44,7 @@
/*-************************************
* Compiler Options
**************************************/
+#include <limits.h>
#ifdef _MSC_VER /* Visual Studio */
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
#endif
@@ -54,8 +55,8 @@
**************************************/
/*
* LZ4F_HEAPMODE :
- * Select how default compression functions will allocate memory for their hash table,
- * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()).
+ * Control how LZ4F_compressFrame allocates the Compression State,
+ * either on stack (0:default, fastest), or in memory heap (1:requires malloc()).
*/
#ifndef LZ4F_HEAPMODE
# define LZ4F_HEAPMODE 0
@@ -125,8 +126,9 @@ static void* LZ4F_malloc(size_t s, LZ4F_CustomMem cmem)
static void LZ4F_free(void* p, LZ4F_CustomMem cmem)
{
- /* custom malloc defined : use it */
+ if (p == NULL) return;
if (cmem.customFree != NULL) {
+ /* custom allocation defined : use it */
cmem.customFree(cmem.opaqueState, p);
return;
}
@@ -153,7 +155,7 @@ static void LZ4F_free(void* p, LZ4F_CustomMem cmem)
static int g_debuglog_enable = 1;
# define DEBUGLOG(l, ...) { \
if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \
- fprintf(stderr, __FILE__ ": "); \
+ fprintf(stderr, __FILE__ " (%i): ", __LINE__ ); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " \n"); \
} }
@@ -186,9 +188,9 @@ static U32 LZ4F_readLE32 (const void* src)
{
const BYTE* const srcPtr = (const BYTE*)src;
U32 value32 = srcPtr[0];
- value32 += ((U32)srcPtr[1])<< 8;
- value32 += ((U32)srcPtr[2])<<16;
- value32 += ((U32)srcPtr[3])<<24;
+ value32 |= ((U32)srcPtr[1])<< 8;
+ value32 |= ((U32)srcPtr[2])<<16;
+ value32 |= ((U32)srcPtr[3])<<24;
return value32;
}
@@ -205,13 +207,13 @@ static U64 LZ4F_readLE64 (const void* src)
{
const BYTE* const srcPtr = (const BYTE*)src;
U64 value64 = srcPtr[0];
- value64 += ((U64)srcPtr[1]<<8);
- value64 += ((U64)srcPtr[2]<<16);
- value64 += ((U64)srcPtr[3]<<24);
- value64 += ((U64)srcPtr[4]<<32);
- value64 += ((U64)srcPtr[5]<<40);
- value64 += ((U64)srcPtr[6]<<48);
- value64 += ((U64)srcPtr[7]<<56);
+ value64 |= ((U64)srcPtr[1]<<8);
+ value64 |= ((U64)srcPtr[2]<<16);
+ value64 |= ((U64)srcPtr[3]<<24);
+ value64 |= ((U64)srcPtr[4]<<32);
+ value64 |= ((U64)srcPtr[5]<<40);
+ value64 |= ((U64)srcPtr[6]<<48);
+ value64 |= ((U64)srcPtr[7]<<56);
return value64;
}
@@ -257,14 +259,15 @@ static const size_t BFSize = LZ4F_BLOCK_CHECKSUM_SIZE; /* block footer : checks
* Structures and local types
**************************************/
-typedef enum { LZ4B_COMPRESSED, LZ4B_UNCOMPRESSED} LZ4F_blockCompression_t;
+typedef enum { LZ4B_COMPRESSED, LZ4B_UNCOMPRESSED} LZ4F_BlockCompressMode_e;
+typedef enum { ctxNone, ctxFast, ctxHC } LZ4F_CtxType_e;
typedef struct LZ4F_cctx_s
{
LZ4F_CustomMem cmem;
LZ4F_preferences_t prefs;
U32 version;
- U32 cStage;
+ U32 cStage; /* 0 : compression uninitialized ; 1 : initialized, can compress */
const LZ4F_CDict* cdict;
size_t maxBlockSize;
size_t maxBufferSize;
@@ -275,8 +278,8 @@ typedef struct LZ4F_cctx_s
XXH32_state_t xxh;
void* lz4CtxPtr;
U16 lz4CtxAlloc; /* sized for: 0 = none, 1 = lz4 ctx, 2 = lz4hc ctx */
- U16 lz4CtxState; /* in use as: 0 = none, 1 = lz4 ctx, 2 = lz4hc ctx */
- LZ4F_blockCompression_t blockCompression;
+ U16 lz4CtxType; /* in use as: 0 = none, 1 = lz4 ctx, 2 = lz4hc ctx */
+ LZ4F_BlockCompressMode_e blockCompressMode;
} LZ4F_cctx_t;
@@ -314,9 +317,14 @@ static LZ4F_errorCode_t LZ4F_returnErrorCode(LZ4F_errorCodes code)
#define RETURN_ERROR(e) return LZ4F_returnErrorCode(LZ4F_ERROR_ ## e)
-#define RETURN_ERROR_IF(c,e) if (c) RETURN_ERROR(e)
+#define RETURN_ERROR_IF(c,e) do { \
+ if (c) { \
+ DEBUGLOG(3, "Error: " #c); \
+ RETURN_ERROR(e); \
+ } \
+ } while (0)
-#define FORWARD_IF_ERROR(r) if (LZ4F_isError(r)) return (r)
+#define FORWARD_IF_ERROR(r) do { if (LZ4F_isError(r)) return (r); } while (0)
unsigned LZ4F_getVersion(void) { return LZ4F_VERSION; }
@@ -429,6 +437,7 @@ size_t LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx,
BYTE* dstPtr = dstStart;
BYTE* const dstEnd = dstStart + dstCapacity;
+ DEBUGLOG(4, "LZ4F_compressFrame_usingCDict (srcSize=%u)", (unsigned)srcSize);
if (preferencesPtr!=NULL)
prefs = *preferencesPtr;
else
@@ -494,7 +503,7 @@ size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity,
LZ4_initStream(&lz4ctx, sizeof(lz4ctx));
cctxPtr->lz4CtxPtr = &lz4ctx;
cctxPtr->lz4CtxAlloc = 1;
- cctxPtr->lz4CtxState = 1;
+ cctxPtr->lz4CtxType = ctxFast;
}
#endif
DEBUGLOG(4, "LZ4F_compressFrame");
@@ -539,18 +548,19 @@ LZ4F_createCDict_advanced(LZ4F_CustomMem cmem, const void* dictBuffer, size_t di
dictSize = 64 KB;
}
cdict->dictContent = LZ4F_malloc(dictSize, cmem);
+ /* note: using @cmem to allocate => can't use default create */
cdict->fastCtx = (LZ4_stream_t*)LZ4F_malloc(sizeof(LZ4_stream_t), cmem);
- if (cdict->fastCtx)
- LZ4_initStream(cdict->fastCtx, sizeof(LZ4_stream_t));
cdict->HCCtx = (LZ4_streamHC_t*)LZ4F_malloc(sizeof(LZ4_streamHC_t), cmem);
- if (cdict->HCCtx)
- LZ4_initStream(cdict->HCCtx, sizeof(LZ4_streamHC_t));
if (!cdict->dictContent || !cdict->fastCtx || !cdict->HCCtx) {
LZ4F_freeCDict(cdict);
return NULL;
}
memcpy(cdict->dictContent, dictStart, dictSize);
- LZ4_loadDict (cdict->fastCtx, (const char*)cdict->dictContent, (int)dictSize);
+ LZ4_initStream(cdict->fastCtx, sizeof(LZ4_stream_t));
+ LZ4_loadDictSlow(cdict->fastCtx, (const char*)cdict->dictContent, (int)dictSize);
+ LZ4_initStreamHC(cdict->HCCtx, sizeof(LZ4_streamHC_t));
+ /* note: we don't know at this point which compression level is going to be used
+ * as a consequence, HCCtx is created for the more common HC mode */
LZ4_setCompressionLevel(cdict->HCCtx, LZ4HC_CLEVEL_DEFAULT);
LZ4_loadDictHC(cdict->HCCtx, (const char*)cdict->dictContent, (int)dictSize);
return cdict;
@@ -616,7 +626,6 @@ LZ4F_createCompressionContext(LZ4F_cctx** LZ4F_compressionContextPtr, unsigned v
return LZ4F_OK_NoError;
}
-
LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctxPtr)
{
if (cctxPtr != NULL) { /* support free on NULL */
@@ -641,7 +650,7 @@ static void LZ4F_initStream(void* ctx,
int level,
LZ4F_blockMode_t blockMode) {
if (level < LZ4HC_CLEVEL_MIN) {
- if (cdict != NULL || blockMode == LZ4F_blockLinked) {
+ if (cdict || blockMode == LZ4F_blockLinked) {
/* In these cases, we will call LZ4_compress_fast_continue(),
* which needs an already reset context. Otherwise, we'll call a
* one-shot API. The non-continued APIs internally perform their own
@@ -649,11 +658,18 @@ static void LZ4F_initStream(void* ctx,
* tableType they need the context to be in. So in that case this
* would be misguided / wasted work. */
LZ4_resetStream_fast((LZ4_stream_t*)ctx);
+ if (cdict)
+ LZ4_attach_dictionary((LZ4_stream_t*)ctx, cdict->fastCtx);
}
- LZ4_attach_dictionary((LZ4_stream_t *)ctx, cdict ? cdict->fastCtx : NULL);
+ /* In these cases, we'll call a one-shot API.
+ * The non-continued APIs internally perform their own resets
+ * at the beginning of their calls, where they know
+ * which tableType they need the context to be in.
+ * Therefore, a reset here would be wasted work. */
} else {
LZ4_resetStreamHC_fast((LZ4_streamHC_t*)ctx, level);
- LZ4_attach_HC_dictionary((LZ4_streamHC_t *)ctx, cdict ? cdict->HCCtx : NULL);
+ if (cdict)
+ LZ4_attach_HC_dictionary((LZ4_streamHC_t*)ctx, cdict->HCCtx);
}
}
@@ -668,14 +684,12 @@ static int ctxTypeID_to_size(int ctxTypeID) {
}
}
-/*! LZ4F_compressBegin_usingCDict() :
- * init streaming compression AND writes frame header into @dstBuffer.
- * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
- * @return : number of bytes written into @dstBuffer for the header
- * or an error code (can be tested using LZ4F_isError())
+/* LZ4F_compressBegin_internal()
+ * Note: only accepts @cdict _or_ @dictBuffer as non NULL.
*/
-size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr,
+size_t LZ4F_compressBegin_internal(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
+ const void* dictBuffer, size_t dictSize,
const LZ4F_CDict* cdict,
const LZ4F_preferences_t* preferencesPtr)
{
@@ -685,71 +699,85 @@ size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr,
RETURN_ERROR_IF(dstCapacity < maxFHSize, dstMaxSize_tooSmall);
if (preferencesPtr == NULL) preferencesPtr = &prefNull;
- cctxPtr->prefs = *preferencesPtr;
+ cctx->prefs = *preferencesPtr;
/* cctx Management */
- { U16 const ctxTypeID = (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) ? 1 : 2;
+ { U16 const ctxTypeID = (cctx->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) ? 1 : 2;
int requiredSize = ctxTypeID_to_size(ctxTypeID);
- int allocatedSize = ctxTypeID_to_size(cctxPtr->lz4CtxAlloc);
+ int allocatedSize = ctxTypeID_to_size(cctx->lz4CtxAlloc);
if (allocatedSize < requiredSize) {
/* not enough space allocated */
- LZ4F_free(cctxPtr->lz4CtxPtr, cctxPtr->cmem);
- if (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) {
+ LZ4F_free(cctx->lz4CtxPtr, cctx->cmem);
+ if (cctx->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) {
/* must take ownership of memory allocation,
* in order to respect custom allocator contract */
- cctxPtr->lz4CtxPtr = LZ4F_malloc(sizeof(LZ4_stream_t), cctxPtr->cmem);
- if (cctxPtr->lz4CtxPtr)
- LZ4_initStream(cctxPtr->lz4CtxPtr, sizeof(LZ4_stream_t));
+ cctx->lz4CtxPtr = LZ4F_malloc(sizeof(LZ4_stream_t), cctx->cmem);
+ if (cctx->lz4CtxPtr)
+ LZ4_initStream(cctx->lz4CtxPtr, sizeof(LZ4_stream_t));
} else {
- cctxPtr->lz4CtxPtr = LZ4F_malloc(sizeof(LZ4_streamHC_t), cctxPtr->cmem);
- if (cctxPtr->lz4CtxPtr)
- LZ4_initStreamHC(cctxPtr->lz4CtxPtr, sizeof(LZ4_streamHC_t));
+ cctx->lz4CtxPtr = LZ4F_malloc(sizeof(LZ4_streamHC_t), cctx->cmem);
+ if (cctx->lz4CtxPtr)
+ LZ4_initStreamHC(cctx->lz4CtxPtr, sizeof(LZ4_streamHC_t));
}
- RETURN_ERROR_IF(cctxPtr->lz4CtxPtr == NULL, allocation_failed);
- cctxPtr->lz4CtxAlloc = ctxTypeID;
- cctxPtr->lz4CtxState = ctxTypeID;
- } else if (cctxPtr->lz4CtxState != ctxTypeID) {
+ RETURN_ERROR_IF(cctx->lz4CtxPtr == NULL, allocation_failed);
+ cctx->lz4CtxAlloc = ctxTypeID;
+ cctx->lz4CtxType = ctxTypeID;
+ } else if (cctx->lz4CtxType != ctxTypeID) {
/* otherwise, a sufficient buffer is already allocated,
* but we need to reset it to the correct context type */
- if (cctxPtr->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) {
- LZ4_initStream((LZ4_stream_t*)cctxPtr->lz4CtxPtr, sizeof(LZ4_stream_t));
+ if (cctx->prefs.compressionLevel < LZ4HC_CLEVEL_MIN) {
+ LZ4_initStream((LZ4_stream_t*)cctx->lz4CtxPtr, sizeof(LZ4_stream_t));
} else {
- LZ4_initStreamHC((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, sizeof(LZ4_streamHC_t));
- LZ4_setCompressionLevel((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, cctxPtr->prefs.compressionLevel);
+ LZ4_initStreamHC((LZ4_streamHC_t*)cctx->lz4CtxPtr, sizeof(LZ4_streamHC_t));
+ LZ4_setCompressionLevel((LZ4_streamHC_t*)cctx->lz4CtxPtr, cctx->prefs.compressionLevel);
}
- cctxPtr->lz4CtxState = ctxTypeID;
+ cctx->lz4CtxType = ctxTypeID;
} }
/* Buffer Management */
- if (cctxPtr->prefs.frameInfo.blockSizeID == 0)
- cctxPtr->prefs.frameInfo.blockSizeID = LZ4F_BLOCKSIZEID_DEFAULT;
- cctxPtr->maxBlockSize = LZ4F_getBlockSize(cctxPtr->prefs.frameInfo.blockSizeID);
+ if (cctx->prefs.frameInfo.blockSizeID == 0)
+ cctx->prefs.frameInfo.blockSizeID = LZ4F_BLOCKSIZEID_DEFAULT;
+ cctx->maxBlockSize = LZ4F_getBlockSize(cctx->prefs.frameInfo.blockSizeID);
{ size_t const requiredBuffSize = preferencesPtr->autoFlush ?
- ((cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) ? 64 KB : 0) : /* only needs past data up to window size */
- cctxPtr->maxBlockSize + ((cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) ? 128 KB : 0);
-
- if (cctxPtr->maxBufferSize < requiredBuffSize) {
- cctxPtr->maxBufferSize = 0;
- LZ4F_free(cctxPtr->tmpBuff, cctxPtr->cmem);
- cctxPtr->tmpBuff = (BYTE*)LZ4F_calloc(requiredBuffSize, cctxPtr->cmem);
- RETURN_ERROR_IF(cctxPtr->tmpBuff == NULL, allocation_failed);
- cctxPtr->maxBufferSize = requiredBuffSize;
+ ((cctx->prefs.frameInfo.blockMode == LZ4F_blockLinked) ? 64 KB : 0) : /* only needs past data up to window size */
+ cctx->maxBlockSize + ((cctx->prefs.frameInfo.blockMode == LZ4F_blockLinked) ? 128 KB : 0);
+
+ if (cctx->maxBufferSize < requiredBuffSize) {
+ cctx->maxBufferSize = 0;
+ LZ4F_free(cctx->tmpBuff, cctx->cmem);
+ cctx->tmpBuff = (BYTE*)LZ4F_malloc(requiredBuffSize, cctx->cmem);
+ RETURN_ERROR_IF(cctx->tmpBuff == NULL, allocation_failed);
+ cctx->maxBufferSize = requiredBuffSize;
} }
- cctxPtr->tmpIn = cctxPtr->tmpBuff;
- cctxPtr->tmpInSize = 0;
- (void)XXH32_reset(&(cctxPtr->xxh), 0);
+ cctx->tmpIn = cctx->tmpBuff;
+ cctx->tmpInSize = 0;
+ (void)XXH32_reset(&(cctx->xxh), 0);
/* context init */
- cctxPtr->cdict = cdict;
- if (cctxPtr->prefs.frameInfo.blockMode == LZ4F_blockLinked) {
+ cctx->cdict = cdict;
+ if (cctx->prefs.frameInfo.blockMode == LZ4F_blockLinked) {
/* frame init only for blockLinked : blockIndependent will be init at each block */
- LZ4F_initStream(cctxPtr->lz4CtxPtr, cdict, cctxPtr->prefs.compressionLevel, LZ4F_blockLinked);
+ LZ4F_initStream(cctx->lz4CtxPtr, cdict, cctx->prefs.compressionLevel, LZ4F_blockLinked);
}
if (preferencesPtr->compressionLevel >= LZ4HC_CLEVEL_MIN) {
- LZ4_favorDecompressionSpeed((LZ4_streamHC_t*)cctxPtr->lz4CtxPtr, (int)preferencesPtr->favorDecSpeed);
+ LZ4_favorDecompressionSpeed((LZ4_streamHC_t*)cctx->lz4CtxPtr, (int)preferencesPtr->favorDecSpeed);
+ }
+ if (dictBuffer) {
+ assert(cdict == NULL);
+ RETURN_ERROR_IF(dictSize > INT_MAX, parameter_invalid);
+ if (cctx->lz4CtxType == ctxFast) {
+ /* lz4 fast*/
+ LZ4_loadDict((LZ4_stream_t*)cctx->lz4CtxPtr, (const char*)dictBuffer, (int)dictSize);
+ } else {
+ /* lz4hc */
+ assert(cctx->lz4CtxType == ctxHC);
+ LZ4_loadDictHC((LZ4_streamHC_t*)cctx->lz4CtxPtr, (const char*)dictBuffer, (int)dictSize);
+ }
}
+ /* Stage 2 : Write Frame Header */
+
/* Magic Number */
LZ4F_writeLE32(dstPtr, LZ4F_MAGICNUMBER);
dstPtr += 4;
@@ -757,22 +785,22 @@ size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr,
/* FLG Byte */
*dstPtr++ = (BYTE)(((1 & _2BITS) << 6) /* Version('01') */
- + ((cctxPtr->prefs.frameInfo.blockMode & _1BIT ) << 5)
- + ((cctxPtr->prefs.frameInfo.blockChecksumFlag & _1BIT ) << 4)
- + ((unsigned)(cctxPtr->prefs.frameInfo.contentSize > 0) << 3)
- + ((cctxPtr->prefs.frameInfo.contentChecksumFlag & _1BIT ) << 2)
- + (cctxPtr->prefs.frameInfo.dictID > 0) );
+ + ((cctx->prefs.frameInfo.blockMode & _1BIT ) << 5)
+ + ((cctx->prefs.frameInfo.blockChecksumFlag & _1BIT ) << 4)
+ + ((unsigned)(cctx->prefs.frameInfo.contentSize > 0) << 3)
+ + ((cctx->prefs.frameInfo.contentChecksumFlag & _1BIT ) << 2)
+ + (cctx->prefs.frameInfo.dictID > 0) );
/* BD Byte */
- *dstPtr++ = (BYTE)((cctxPtr->prefs.frameInfo.blockSizeID & _3BITS) << 4);
+ *dstPtr++ = (BYTE)((cctx->prefs.frameInfo.blockSizeID & _3BITS) << 4);
/* Optional Frame content size field */
- if (cctxPtr->prefs.frameInfo.contentSize) {
- LZ4F_writeLE64(dstPtr, cctxPtr->prefs.frameInfo.contentSize);
+ if (cctx->prefs.frameInfo.contentSize) {
+ LZ4F_writeLE64(dstPtr, cctx->prefs.frameInfo.contentSize);
dstPtr += 8;
- cctxPtr->totalInSize = 0;
+ cctx->totalInSize = 0;
}
/* Optional dictionary ID field */
- if (cctxPtr->prefs.frameInfo.dictID) {
- LZ4F_writeLE32(dstPtr, cctxPtr->prefs.frameInfo.dictID);
+ if (cctx->prefs.frameInfo.dictID) {
+ LZ4F_writeLE32(dstPtr, cctx->prefs.frameInfo.dictID);
dstPtr += 4;
}
/* Header CRC Byte */
@@ -780,24 +808,54 @@ size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctxPtr,
dstPtr++;
}
- cctxPtr->cStage = 1; /* header written, now request input data block */
+ cctx->cStage = 1; /* header written, now request input data block */
return (size_t)(dstPtr - dstStart);
}
+size_t LZ4F_compressBegin(LZ4F_cctx* cctx,
+ void* dstBuffer, size_t dstCapacity,
+ const LZ4F_preferences_t* preferencesPtr)
+{
+ return LZ4F_compressBegin_internal(cctx, dstBuffer, dstCapacity,
+ NULL, 0,
+ NULL, preferencesPtr);
+}
-/*! LZ4F_compressBegin() :
- * init streaming compression AND writes frame header into @dstBuffer.
- * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
- * @preferencesPtr can be NULL, in which case default parameters are selected.
- * @return : number of bytes written into dstBuffer for the header
- * or an error code (can be tested using LZ4F_isError())
- */
-size_t LZ4F_compressBegin(LZ4F_cctx* cctxPtr,
+/* LZ4F_compressBegin_usingDictOnce:
+ * Hidden implementation,
+ * employed for multi-threaded compression
+ * when frame defines linked blocks */
+size_t LZ4F_compressBegin_usingDictOnce(LZ4F_cctx* cctx,
+ void* dstBuffer, size_t dstCapacity,
+ const void* dict, size_t dictSize,
+ const LZ4F_preferences_t* preferencesPtr)
+{
+ return LZ4F_compressBegin_internal(cctx, dstBuffer, dstCapacity,
+ dict, dictSize,
+ NULL, preferencesPtr);
+}
+
+size_t LZ4F_compressBegin_usingDict(LZ4F_cctx* cctx,
+ void* dstBuffer, size_t dstCapacity,
+ const void* dict, size_t dictSize,
+ const LZ4F_preferences_t* preferencesPtr)
+{
+ /* note : incorrect implementation :
+ * this will only use the dictionary once,
+ * instead of once *per* block when frames defines independent blocks */
+ return LZ4F_compressBegin_usingDictOnce(cctx, dstBuffer, dstCapacity,
+ dict, dictSize,
+ preferencesPtr);
+}
+
+size_t LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx,
void* dstBuffer, size_t dstCapacity,
+ const LZ4F_CDict* cdict,
const LZ4F_preferences_t* preferencesPtr)
{
- return LZ4F_compressBegin_usingCDict(cctxPtr, dstBuffer, dstCapacity,
- NULL, preferencesPtr);
+ return LZ4F_compressBegin_internal(cctx, dstBuffer, dstCapacity,
+ NULL, 0,
+ cdict, preferencesPtr);
}
@@ -891,9 +949,10 @@ static int LZ4F_doNotCompressBlock(void* ctx, const char* src, char* dst, int sr
return 0;
}
-static compressFunc_t LZ4F_selectCompression(LZ4F_blockMode_t blockMode, int level, LZ4F_blockCompression_t compressMode)
+static compressFunc_t LZ4F_selectCompression(LZ4F_blockMode_t blockMode, int level, LZ4F_BlockCompressMode_e compressMode)
{
- if (compressMode == LZ4B_UNCOMPRESSED) return LZ4F_doNotCompressBlock;
+ if (compressMode == LZ4B_UNCOMPRESSED)
+ return LZ4F_doNotCompressBlock;
if (level < LZ4HC_CLEVEL_MIN) {
if (blockMode == LZ4F_blockIndependent) return LZ4F_compressBlock;
return LZ4F_compressBlock_continue;
@@ -931,7 +990,7 @@ static size_t LZ4F_compressUpdateImpl(LZ4F_cctx* cctxPtr,
void* dstBuffer, size_t dstCapacity,
const void* srcBuffer, size_t srcSize,
const LZ4F_compressOptions_t* compressOptionsPtr,
- LZ4F_blockCompression_t blockCompression)
+ LZ4F_BlockCompressMode_e blockCompression)
{
size_t const blockSize = cctxPtr->maxBlockSize;
const BYTE* srcPtr = (const BYTE*)srcBuffer;
@@ -951,10 +1010,10 @@ static size_t LZ4F_compressUpdateImpl(LZ4F_cctx* cctxPtr,
RETURN_ERROR(dstMaxSize_tooSmall);
/* flush currently written block, to continue with new block compression */
- if (cctxPtr->blockCompression != blockCompression) {
+ if (cctxPtr->blockCompressMode != blockCompression) {
bytesWritten = LZ4F_flush(cctxPtr, dstBuffer, dstCapacity, compressOptionsPtr);
dstPtr += bytesWritten;
- cctxPtr->blockCompression = blockCompression;
+ cctxPtr->blockCompressMode = blockCompression;
}
if (compressOptionsPtr == NULL) compressOptionsPtr = &k_cOptionsNull;
@@ -1068,13 +1127,9 @@ size_t LZ4F_compressUpdate(LZ4F_cctx* cctxPtr,
compressOptionsPtr, LZ4B_COMPRESSED);
}
-/*! LZ4F_compressUpdate() :
- * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary.
- * When successful, the function always entirely consumes @srcBuffer.
- * src data is either buffered or compressed into @dstBuffer.
- * If previously an uncompressed block was written, buffered data is flushed
- * before appending compressed data is continued.
- * This is only supported when LZ4F_blockIndependent is used
+/*! LZ4F_uncompressedUpdate() :
+ * Same as LZ4F_compressUpdate(), but requests blocks to be sent uncompressed.
+ * This symbol is only supported when LZ4F_blockIndependent is used
* @dstCapacity MUST be >= LZ4F_compressBound(srcSize, preferencesPtr).
* @compressOptionsPtr is optional : provide NULL to mean "default".
* @return : the number of bytes written into dstBuffer. It can be zero, meaning input data was just buffered.
@@ -1084,8 +1139,8 @@ size_t LZ4F_compressUpdate(LZ4F_cctx* cctxPtr,
size_t LZ4F_uncompressedUpdate(LZ4F_cctx* cctxPtr,
void* dstBuffer, size_t dstCapacity,
const void* srcBuffer, size_t srcSize,
- const LZ4F_compressOptions_t* compressOptionsPtr) {
- RETURN_ERROR_IF(cctxPtr->prefs.frameInfo.blockMode != LZ4F_blockIndependent, blockMode_invalid);
+ const LZ4F_compressOptions_t* compressOptionsPtr)
+{
return LZ4F_compressUpdateImpl(cctxPtr,
dstBuffer, dstCapacity,
srcBuffer, srcSize,
@@ -1115,7 +1170,7 @@ size_t LZ4F_flush(LZ4F_cctx* cctxPtr,
(void)compressOptionsPtr; /* not useful (yet) */
/* select compression function */
- compress = LZ4F_selectCompression(cctxPtr->prefs.frameInfo.blockMode, cctxPtr->prefs.compressionLevel, cctxPtr->blockCompression);
+ compress = LZ4F_selectCompression(cctxPtr->prefs.frameInfo.blockMode, cctxPtr->prefs.compressionLevel, cctxPtr->blockCompressMode);
/* compress tmp buffer */
dstPtr += LZ4F_makeBlock(dstPtr,
@@ -1170,13 +1225,12 @@ size_t LZ4F_compressEnd(LZ4F_cctx* cctxPtr,
if (cctxPtr->prefs.frameInfo.contentChecksumFlag == LZ4F_contentChecksumEnabled) {
U32 const xxh = XXH32_digest(&(cctxPtr->xxh));
RETURN_ERROR_IF(dstCapacity < 8, dstMaxSize_tooSmall);
- DEBUGLOG(5,"Writing 32-bit content checksum");
+ DEBUGLOG(5,"Writing 32-bit content checksum (0x%0X)", xxh);
LZ4F_writeLE32(dstPtr, xxh);
dstPtr+=4; /* content Checksum */
}
cctxPtr->cStage = 0; /* state is now re-usable (with identical preferences) */
- cctxPtr->maxBufferSize = 0; /* reuse HC context */
if (cctxPtr->prefs.frameInfo.contentSize) {
if (cctxPtr->prefs.frameInfo.contentSize != cctxPtr->totalInSize)
@@ -1270,13 +1324,14 @@ LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx)
/*==--- Streaming Decompression operations ---==*/
-
void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx)
{
+ DEBUGLOG(5, "LZ4F_resetDecompressionContext");
dctx->dStage = dstage_getFrameHeader;
dctx->dict = NULL;
dctx->dictSize = 0;
dctx->skipChecksum = 0;
+ dctx->frameRemainingSize = 0;
}
@@ -1333,6 +1388,7 @@ static size_t LZ4F_decodeHeader(LZ4F_dctx* dctx, const void* src, size_t srcSize
if (((FLG>>1)&_1BIT) != 0) RETURN_ERROR(reservedFlag_set); /* Reserved bit */
if (version != 1) RETURN_ERROR(headerVersion_wrong); /* Version Number, only supported value */
}
+ DEBUGLOG(6, "contentSizeFlag: %u", contentSizeFlag);
/* Frame Header Size */
frameHeaderSize = minFHSize + (contentSizeFlag?8:0) + (dictIDFlag?4:0);
@@ -1369,8 +1425,9 @@ static size_t LZ4F_decodeHeader(LZ4F_dctx* dctx, const void* src, size_t srcSize
dctx->frameInfo.contentChecksumFlag = (LZ4F_contentChecksum_t)contentChecksumFlag;
dctx->frameInfo.blockSizeID = (LZ4F_blockSizeID_t)blockSizeID;
dctx->maxBlockSize = LZ4F_getBlockSize((LZ4F_blockSizeID_t)blockSizeID);
- if (contentSizeFlag)
+ if (contentSizeFlag) {
dctx->frameRemainingSize = dctx->frameInfo.contentSize = LZ4F_readLE64(srcPtr+6);
+ }
if (dictIDFlag)
dctx->frameInfo.dictID = LZ4F_readLE32(srcPtr + frameHeaderSize - 5);
@@ -1570,7 +1627,7 @@ size_t LZ4F_decompress(LZ4F_dctx* dctx,
size_t nextSrcSizeHint = 1;
- DEBUGLOG(5, "LZ4F_decompress : %p,%u => %p,%u",
+ DEBUGLOG(5, "LZ4F_decompress: src[%p](%u) => dst[%p](%u)",
srcBuffer, (unsigned)*srcSizePtr, dstBuffer, (unsigned)*dstSizePtr);
if (dstBuffer == NULL) assert(*dstSizePtr == 0);
MEM_INIT(&optionsNull, 0, sizeof(optionsNull));
@@ -1722,10 +1779,10 @@ size_t LZ4F_decompress(LZ4F_dctx* dctx,
/* history management (linked blocks only)*/
if (dctx->frameInfo.blockMode == LZ4F_blockLinked) {
LZ4F_updateDict(dctx, dstPtr, sizeToCopy, dstStart, 0);
- } }
-
- srcPtr += sizeToCopy;
- dstPtr += sizeToCopy;
+ }
+ srcPtr += sizeToCopy;
+ dstPtr += sizeToCopy;
+ }
if (sizeToCopy == dctx->tmpInTarget) { /* all done */
if (dctx->frameInfo.blockChecksumFlag) {
dctx->tmpInSize = 0;
@@ -1959,6 +2016,7 @@ size_t LZ4F_decompress(LZ4F_dctx* dctx,
if (!dctx->skipChecksum) {
U32 const readCRC = LZ4F_readLE32(selectedIn);
U32 const resultCRC = XXH32_digest(&(dctx->xxh));
+ DEBUGLOG(4, "frame checksum: stored 0x%0X vs 0x%0X processed", readCRC, resultCRC);
#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
RETURN_ERROR_IF(readCRC != resultCRC, contentChecksum_invalid);
#else
diff --git a/contrib/libs/lz4/lz4frame.h b/contrib/libs/lz4/lz4frame.h
index 1bdf6c4fcb..b8ae322767 100644
--- a/contrib/libs/lz4/lz4frame.h
+++ b/contrib/libs/lz4/lz4frame.h
@@ -173,16 +173,16 @@ typedef LZ4F_contentChecksum_t contentChecksum_t;
* setting all parameters to default.
* It's then possible to update selectively some parameters */
typedef struct {
- LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default */
- LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default */
- LZ4F_contentChecksum_t contentChecksumFlag; /* 1: frame terminated with 32-bit checksum of decompressed data; 0: disabled (default) */
+ LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default (LZ4F_max64KB) */
+ LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default (LZ4F_blockLinked) */
+ LZ4F_contentChecksum_t contentChecksumFlag; /* 1: add a 32-bit checksum of frame's decompressed data; 0 == default (disabled) */
LZ4F_frameType_t frameType; /* read-only field : LZ4F_frame or LZ4F_skippableFrame */
unsigned long long contentSize; /* Size of uncompressed content ; 0 == unknown */
unsigned dictID; /* Dictionary ID, sent by compressor to help decoder select correct dictionary; 0 == no dictID provided */
- LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0: disabled (default) */
+ LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0 == default (disabled) */
} LZ4F_frameInfo_t;
-#define LZ4F_INIT_FRAMEINFO { LZ4F_default, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame, 0ULL, 0U, LZ4F_noBlockChecksum } /* v1.8.3+ */
+#define LZ4F_INIT_FRAMEINFO { LZ4F_max64KB, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame, 0ULL, 0U, LZ4F_noBlockChecksum } /* v1.8.3+ */
/*! LZ4F_preferences_t :
* makes it possible to supply advanced compression instructions to streaming interface.
@@ -204,7 +204,26 @@ typedef struct {
* Simple compression function
***********************************/
-LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */
+/*! LZ4F_compressFrame() :
+ * Compress srcBuffer content into an LZ4-compressed frame.
+ * It's a one shot operation, all input content is consumed, and all output is generated.
+ *
+ * Note : it's a stateless operation (no LZ4F_cctx state needed).
+ * In order to reduce load on the allocator, LZ4F_compressFrame(), by default,
+ * uses the stack to allocate space for the compression state and some table.
+ * If this usage of the stack is too much for your application,
+ * consider compiling `lz4frame.c` with compile-time macro LZ4F_HEAPMODE set to 1 instead.
+ * All state allocations will use the Heap.
+ * It also means each invocation of LZ4F_compressFrame() will trigger several internal alloc/free invocations.
+ *
+ * @dstCapacity MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr).
+ * @preferencesPtr is optional : one can provide NULL, in which case all preferences are set to default.
+ * @return : number of bytes written into dstBuffer.
+ * or an error code if it fails (can be tested using LZ4F_isError())
+ */
+LZ4FLIB_API size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity,
+ const void* srcBuffer, size_t srcSize,
+ const LZ4F_preferences_t* preferencesPtr);
/*! LZ4F_compressFrameBound() :
* Returns the maximum possible compressed size with LZ4F_compressFrame() given srcSize and preferences.
@@ -214,16 +233,11 @@ LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */
*/
LZ4FLIB_API size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr);
-/*! LZ4F_compressFrame() :
- * Compress an entire srcBuffer into a valid LZ4 frame.
- * dstCapacity MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr).
- * The LZ4F_preferences_t structure is optional : you can provide NULL as argument. All preferences will be set to default.
- * @return : number of bytes written into dstBuffer.
- * or an error code if it fails (can be tested using LZ4F_isError())
+
+/*! LZ4F_compressionLevel_max() :
+ * @return maximum allowed compression level (currently: 12)
*/
-LZ4FLIB_API size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity,
- const void* srcBuffer, size_t srcSize,
- const LZ4F_preferences_t* preferencesPtr);
+LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */
/*-***********************************
@@ -278,7 +292,7 @@ LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctx);
/*! LZ4F_compressBegin() :
* will write the frame header into dstBuffer.
* dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
- * `prefsPtr` is optional : you can provide NULL as argument, all preferences will then be set to default.
+ * `prefsPtr` is optional : NULL can be provided to set all preferences to default.
* @return : number of bytes written into dstBuffer for the header
* or an error code (which can be tested using LZ4F_isError())
*/
@@ -355,8 +369,9 @@ typedef struct LZ4F_dctx_s LZ4F_dctx; /* incomplete type */
typedef LZ4F_dctx* LZ4F_decompressionContext_t; /* compatibility with previous API versions */
typedef struct {
- unsigned stableDst; /* pledges that last 64KB decompressed data will remain available unmodified between invocations.
- * This optimization skips storage operations in tmp buffers. */
+ unsigned stableDst; /* pledges that last 64KB decompressed data is present right before @dstBuffer pointer.
+ * This optimization skips internal storage operations.
+ * Once set, this pledge must remain valid up to the end of current frame. */
unsigned skipChecksums; /* disable checksum calculation and verification, even when one is present in frame, to save CPU time.
* Setting this option to 1 once disables all checksums for the rest of the frame. */
unsigned reserved1; /* must be set to zero for forward compatibility */
@@ -463,6 +478,11 @@ LZ4F_getFrameInfo(LZ4F_dctx* dctx,
* `dstBuffer` can freely change between each consecutive function invocation.
* `dstBuffer` content will be overwritten.
*
+ * Note: if `LZ4F_getFrameInfo()` is called before `LZ4F_decompress()`, srcBuffer must be updated to reflect
+ * the number of bytes consumed after reading the frame header. Failure to update srcBuffer before calling
+ * `LZ4F_decompress()` will cause decompression failure or, even worse, successful but incorrect decompression.
+ * See the `LZ4F_getFrameInfo()` docs for details.
+ *
* @return : an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call.
* Schematically, it's the size of the current (or remaining) compressed block + header of next block.
* Respecting the hint provides some small speed benefit, because it skips intermediate buffers.
@@ -493,6 +513,109 @@ LZ4F_decompress(LZ4F_dctx* dctx,
LZ4FLIB_API void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always successful */
+/**********************************
+ * Dictionary compression API
+ *********************************/
+
+/* A Dictionary is useful for the compression of small messages (KB range).
+ * It dramatically improves compression efficiency.
+ *
+ * LZ4 can ingest any input as dictionary, though only the last 64 KB are useful.
+ * Better results are generally achieved by using Zstandard's Dictionary Builder
+ * to generate a high-quality dictionary from a set of samples.
+ *
+ * The same dictionary will have to be used on the decompression side
+ * for decoding to be successful.
+ * To help identify the correct dictionary at decoding stage,
+ * the frame header allows optional embedding of a dictID field.
+ */
+
+/*! LZ4F_compressBegin_usingDict() : stable since v1.10
+ * Inits dictionary compression streaming, and writes the frame header into dstBuffer.
+ * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
+ * @prefsPtr is optional : one may provide NULL as argument,
+ * however, it's the only way to provide dictID in the frame header.
+ * @dictBuffer must outlive the compression session.
+ * @return : number of bytes written into dstBuffer for the header,
+ * or an error code (which can be tested using LZ4F_isError())
+ * NOTE: The LZ4Frame spec allows each independent block to be compressed with the dictionary,
+ * but this entry supports a more limited scenario, where only the first block uses the dictionary.
+ * This is still useful for small data, which only need one block anyway.
+ * For larger inputs, one may be more interested in LZ4F_compressFrame_usingCDict() below.
+ */
+LZ4FLIB_API size_t
+LZ4F_compressBegin_usingDict(LZ4F_cctx* cctx,
+ void* dstBuffer, size_t dstCapacity,
+ const void* dictBuffer, size_t dictSize,
+ const LZ4F_preferences_t* prefsPtr);
+
+/*! LZ4F_decompress_usingDict() : stable since v1.10
+ * Same as LZ4F_decompress(), using a predefined dictionary.
+ * Dictionary is used "in place", without any preprocessing.
+** It must remain accessible throughout the entire frame decoding. */
+LZ4FLIB_API size_t
+LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr,
+ void* dstBuffer, size_t* dstSizePtr,
+ const void* srcBuffer, size_t* srcSizePtr,
+ const void* dict, size_t dictSize,
+ const LZ4F_decompressOptions_t* decompressOptionsPtr);
+
+/*****************************************
+ * Bulk processing dictionary compression
+ *****************************************/
+
+/* Loading a dictionary has a cost, since it involves construction of tables.
+ * The Bulk processing dictionary API makes it possible to share this cost
+ * over an arbitrary number of compression jobs, even concurrently,
+ * markedly improving compression latency for these cases.
+ *
+ * Note that there is no corresponding bulk API for the decompression side,
+ * because dictionary does not carry any initialization cost for decompression.
+ * Use the regular LZ4F_decompress_usingDict() there.
+ */
+typedef struct LZ4F_CDict_s LZ4F_CDict;
+
+/*! LZ4_createCDict() : stable since v1.10
+ * When compressing multiple messages / blocks using the same dictionary, it's recommended to initialize it just once.
+ * LZ4_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay.
+ * LZ4_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.
+ * @dictBuffer can be released after LZ4_CDict creation, since its content is copied within CDict. */
+LZ4FLIB_API LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize);
+LZ4FLIB_API void LZ4F_freeCDict(LZ4F_CDict* CDict);
+
+/*! LZ4_compressFrame_usingCDict() : stable since v1.10
+ * Compress an entire srcBuffer into a valid LZ4 frame using a digested Dictionary.
+ * @cctx must point to a context created by LZ4F_createCompressionContext().
+ * If @cdict==NULL, compress without a dictionary.
+ * @dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr).
+ * If this condition is not respected, function will fail (@return an errorCode).
+ * The LZ4F_preferences_t structure is optional : one may provide NULL as argument,
+ * but it's not recommended, as it's the only way to provide @dictID in the frame header.
+ * @return : number of bytes written into dstBuffer.
+ * or an error code if it fails (can be tested using LZ4F_isError())
+ * Note: for larger inputs generating multiple independent blocks,
+ * this entry point uses the dictionary for each block. */
+LZ4FLIB_API size_t
+LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx,
+ void* dst, size_t dstCapacity,
+ const void* src, size_t srcSize,
+ const LZ4F_CDict* cdict,
+ const LZ4F_preferences_t* preferencesPtr);
+
+/*! LZ4F_compressBegin_usingCDict() : stable since v1.10
+ * Inits streaming dictionary compression, and writes the frame header into dstBuffer.
+ * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
+ * @prefsPtr is optional : one may provide NULL as argument,
+ * note however that it's the only way to insert a @dictID in the frame header.
+ * @cdict must outlive the compression session.
+ * @return : number of bytes written into dstBuffer for the header,
+ * or an error code, which can be tested using LZ4F_isError(). */
+LZ4FLIB_API size_t
+LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx,
+ void* dstBuffer, size_t dstCapacity,
+ const LZ4F_CDict* cdict,
+ const LZ4F_preferences_t* prefsPtr);
+
#if defined (__cplusplus)
}
@@ -503,11 +626,8 @@ LZ4FLIB_API void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always su
#if defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843)
#define LZ4F_H_STATIC_09782039843
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-/* These declarations are not stable and may change in the future.
+/* Note :
+ * The below declarations are not stable and may change in the future.
* They are therefore only safe to depend on
* when the caller is statically linked against the library.
* To access their declarations, define LZ4F_STATIC_LINKING_ONLY.
@@ -517,6 +637,11 @@ extern "C" {
* by defining LZ4F_PUBLISH_STATIC_FUNCTIONS.
* Use at your own risk.
*/
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
#ifdef LZ4F_PUBLISH_STATIC_FUNCTIONS
# define LZ4FLIB_STATIC_API LZ4FLIB_API
#else
@@ -530,7 +655,7 @@ extern "C" {
ITEM(ERROR_GENERIC) \
ITEM(ERROR_maxBlockSize_invalid) \
ITEM(ERROR_blockMode_invalid) \
- ITEM(ERROR_contentChecksumFlag_invalid) \
+ ITEM(ERROR_parameter_invalid) \
ITEM(ERROR_compressionLevel_invalid) \
ITEM(ERROR_headerVersion_wrong) \
ITEM(ERROR_blockChecksum_invalid) \
@@ -548,6 +673,8 @@ extern "C" {
ITEM(ERROR_frameDecoding_alreadyStarted) \
ITEM(ERROR_compressionState_uninitialized) \
ITEM(ERROR_parameter_null) \
+ ITEM(ERROR_io_write) \
+ ITEM(ERROR_io_read) \
ITEM(ERROR_maxCode)
#define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM,
@@ -558,22 +685,26 @@ typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM)
LZ4FLIB_STATIC_API LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult);
+/**********************************
+ * Advanced compression operations
+ *********************************/
/*! LZ4F_getBlockSize() :
- * Return, in scalar format (size_t),
- * the maximum block size associated with blockSizeID.
+ * @return, in scalar format (size_t),
+ * the maximum block size associated with @blockSizeID,
+ * or an error code (can be tested using LZ4F_isError()) if @blockSizeID is invalid.
**/
LZ4FLIB_STATIC_API size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID);
/*! LZ4F_uncompressedUpdate() :
- * LZ4F_uncompressedUpdate() can be called repetitively to add as much data uncompressed data as necessary.
+ * LZ4F_uncompressedUpdate() can be called repetitively to add data stored as uncompressed blocks.
* Important rule: dstCapacity MUST be large enough to store the entire source buffer as
* no compression is done for this operation
* If this condition is not respected, LZ4F_uncompressedUpdate() will fail (result is an errorCode).
* After an error, the state is left in a UB state, and must be re-initialized or freed.
- * If previously a compressed block was written, buffered data is flushed
+ * If previously a compressed block was written, buffered data is flushed first,
* before appending uncompressed data is continued.
- * This is only supported when LZ4F_blockIndependent is used
+ * This operation is only supported when LZ4F_blockIndependent is used.
* `cOptPtr` is optional : NULL can be provided, in which case all options are set to default.
* @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered).
* or an error code if it fails (which can be tested using LZ4F_isError())
@@ -585,82 +716,10 @@ LZ4F_uncompressedUpdate(LZ4F_cctx* cctx,
const LZ4F_compressOptions_t* cOptPtr);
/**********************************
- * Bulk processing dictionary API
+ * Custom memory allocation
*********************************/
-/* A Dictionary is useful for the compression of small messages (KB range).
- * It dramatically improves compression efficiency.
- *
- * LZ4 can ingest any input as dictionary, though only the last 64 KB are useful.
- * Best results are generally achieved by using Zstandard's Dictionary Builder
- * to generate a high-quality dictionary from a set of samples.
- *
- * Loading a dictionary has a cost, since it involves construction of tables.
- * The Bulk processing dictionary API makes it possible to share this cost
- * over an arbitrary number of compression jobs, even concurrently,
- * markedly improving compression latency for these cases.
- *
- * The same dictionary will have to be used on the decompression side
- * for decoding to be successful.
- * To help identify the correct dictionary at decoding stage,
- * the frame header allows optional embedding of a dictID field.
- */
-typedef struct LZ4F_CDict_s LZ4F_CDict;
-
-/*! LZ4_createCDict() :
- * When compressing multiple messages / blocks using the same dictionary, it's recommended to load it just once.
- * LZ4_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay.
- * LZ4_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.
- * `dictBuffer` can be released after LZ4_CDict creation, since its content is copied within CDict */
-LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize);
-LZ4FLIB_STATIC_API void LZ4F_freeCDict(LZ4F_CDict* CDict);
-
-
-/*! LZ4_compressFrame_usingCDict() :
- * Compress an entire srcBuffer into a valid LZ4 frame using a digested Dictionary.
- * cctx must point to a context created by LZ4F_createCompressionContext().
- * If cdict==NULL, compress without a dictionary.
- * dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr).
- * If this condition is not respected, function will fail (@return an errorCode).
- * The LZ4F_preferences_t structure is optional : you may provide NULL as argument,
- * but it's not recommended, as it's the only way to provide dictID in the frame header.
- * @return : number of bytes written into dstBuffer.
- * or an error code if it fails (can be tested using LZ4F_isError()) */
-LZ4FLIB_STATIC_API size_t
-LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx,
- void* dst, size_t dstCapacity,
- const void* src, size_t srcSize,
- const LZ4F_CDict* cdict,
- const LZ4F_preferences_t* preferencesPtr);
-
-
-/*! LZ4F_compressBegin_usingCDict() :
- * Inits streaming dictionary compression, and writes the frame header into dstBuffer.
- * dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes.
- * `prefsPtr` is optional : you may provide NULL as argument,
- * however, it's the only way to provide dictID in the frame header.
- * @return : number of bytes written into dstBuffer for the header,
- * or an error code (which can be tested using LZ4F_isError()) */
-LZ4FLIB_STATIC_API size_t
-LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx,
- void* dstBuffer, size_t dstCapacity,
- const LZ4F_CDict* cdict,
- const LZ4F_preferences_t* prefsPtr);
-
-
-/*! LZ4F_decompress_usingDict() :
- * Same as LZ4F_decompress(), using a predefined dictionary.
- * Dictionary is used "in place", without any preprocessing.
-** It must remain accessible throughout the entire frame decoding. */
-LZ4FLIB_STATIC_API size_t
-LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr,
- void* dstBuffer, size_t* dstSizePtr,
- const void* srcBuffer, size_t* srcSizePtr,
- const void* dict, size_t dictSize,
- const LZ4F_decompressOptions_t* decompressOptionsPtr);
-
-
-/*! Custom memory allocation :
+/*! Custom memory allocation : v1.9.4+
* These prototypes make it possible to pass custom allocation/free functions.
* LZ4F_customMem is provided at state creation time, using LZ4F_create*_advanced() listed below.
* All allocation/free operations will be completed using these custom variants instead of regular <stdlib.h> ones.
diff --git a/contrib/libs/lz4/lz4hc.c b/contrib/libs/lz4/lz4hc.c
index b21ad6bb59..4d8c36a697 100644
--- a/contrib/libs/lz4/lz4hc.c
+++ b/contrib/libs/lz4/lz4hc.c
@@ -39,9 +39,10 @@
***************************************/
/*! HEAPMODE :
- * Select how default compression function will allocate workplace memory,
- * in stack (0:fastest), or in heap (1:requires malloc()).
- * Since workplace is rather large, heap mode is recommended.
+ * Select how stateless HC compression functions like `LZ4_compress_HC()`
+ * allocate memory for their workspace:
+ * in stack (0:fastest), or in heap (1:default, requires malloc()).
+ * Since workspace is rather large, heap mode is recommended.
**/
#ifndef LZ4HC_HEAPMODE
# define LZ4HC_HEAPMODE 1
@@ -51,19 +52,19 @@
/*=== Dependency ===*/
#define LZ4_HC_STATIC_LINKING_ONLY
#include "lz4hc.h"
+#include <limits.h>
-/*=== Common definitions ===*/
-#if defined(__GNUC__)
+/*=== Shared lz4.c code ===*/
+#ifndef LZ4_SRC_INCLUDED
+# if defined(__GNUC__)
# pragma GCC diagnostic ignored "-Wunused-function"
-#endif
-#if defined (__clang__)
+# endif
+# if defined (__clang__)
# pragma clang diagnostic ignored "-Wunused-function"
-#endif
-
-#define LZ4_COMMONDEFS_ONLY
-#ifndef LZ4_SRC_INCLUDED
-#include "lz4.c" /* LZ4_count, constants, mem */
+# endif
+# define LZ4_COMMONDEFS_ONLY
+# include "lz4.c" /* LZ4_count, constants, mem */
#endif
@@ -79,17 +80,158 @@ typedef enum { noDictCtx, usingDictCtxHc } dictCtx_directive;
/*=== Macros ===*/
#define MIN(a,b) ( (a) < (b) ? (a) : (b) )
#define MAX(a,b) ( (a) > (b) ? (a) : (b) )
-#define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG))
-#define DELTANEXTMAXD(p) chainTable[(p) & LZ4HC_MAXD_MASK] /* flexible, LZ4HC_MAXD dependent */
+
+
+/*=== Levels definition ===*/
+typedef enum { lz4mid, lz4hc, lz4opt } lz4hc_strat_e;
+typedef struct {
+ lz4hc_strat_e strat;
+ int nbSearches;
+ U32 targetLength;
+} cParams_t;
+static const cParams_t k_clTable[LZ4HC_CLEVEL_MAX+1] = {
+ { lz4mid, 2, 16 }, /* 0, unused */
+ { lz4mid, 2, 16 }, /* 1, unused */
+ { lz4mid, 2, 16 }, /* 2 */
+ { lz4hc, 4, 16 }, /* 3 */
+ { lz4hc, 8, 16 }, /* 4 */
+ { lz4hc, 16, 16 }, /* 5 */
+ { lz4hc, 32, 16 }, /* 6 */
+ { lz4hc, 64, 16 }, /* 7 */
+ { lz4hc, 128, 16 }, /* 8 */
+ { lz4hc, 256, 16 }, /* 9 */
+ { lz4opt, 96, 64 }, /*10==LZ4HC_CLEVEL_OPT_MIN*/
+ { lz4opt, 512,128 }, /*11 */
+ { lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */
+};
+
+static cParams_t LZ4HC_getCLevelParams(int cLevel)
+{
+ /* note : clevel convention is a bit different from lz4frame,
+ * possibly something worth revisiting for consistency */
+ if (cLevel < 1)
+ cLevel = LZ4HC_CLEVEL_DEFAULT;
+ cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel);
+ return k_clTable[cLevel];
+}
+
+
+/*=== Hashing ===*/
+#define LZ4HC_HASHSIZE 4
+#define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG))
+static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); }
+
+#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2)
+/* lie to the compiler about data alignment; use with caution */
+static U64 LZ4_read64(const void* memPtr) { return *(const U64*) memPtr; }
+
+#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1)
+/* __pack instructions are safer, but compiler specific */
+LZ4_PACK(typedef struct { U64 u64; }) LZ4_unalign64;
+static U64 LZ4_read64(const void* ptr) { return ((const LZ4_unalign64*)ptr)->u64; }
+
+#else /* safe and portable access using memcpy() */
+static U64 LZ4_read64(const void* memPtr)
+{
+ U64 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val;
+}
+
+#endif /* LZ4_FORCE_MEMORY_ACCESS */
+
+#define LZ4MID_HASHSIZE 8
+#define LZ4MID_HASHLOG (LZ4HC_HASH_LOG-1)
+#define LZ4MID_HASHTABLESIZE (1 << LZ4MID_HASHLOG)
+
+static U32 LZ4MID_hash4(U32 v) { return (v * 2654435761U) >> (32-LZ4MID_HASHLOG); }
+static U32 LZ4MID_hash4Ptr(const void* ptr) { return LZ4MID_hash4(LZ4_read32(ptr)); }
+/* note: hash7 hashes the lower 56-bits.
+ * It presumes input was read using little endian.*/
+static U32 LZ4MID_hash7(U64 v) { return (U32)(((v << (64-56)) * 58295818150454627ULL) >> (64-LZ4MID_HASHLOG)) ; }
+static U64 LZ4_readLE64(const void* memPtr);
+static U32 LZ4MID_hash8Ptr(const void* ptr) { return LZ4MID_hash7(LZ4_readLE64(ptr)); }
+
+static U64 LZ4_readLE64(const void* memPtr)
+{
+ if (LZ4_isLittleEndian()) {
+ return LZ4_read64(memPtr);
+ } else {
+ const BYTE* p = (const BYTE*)memPtr;
+ /* note: relies on the compiler to simplify this expression */
+ return (U64)p[0] | ((U64)p[1]<<8) | ((U64)p[2]<<16) | ((U64)p[3]<<24)
+ | ((U64)p[4]<<32) | ((U64)p[5]<<40) | ((U64)p[6]<<48) | ((U64)p[7]<<56);
+ }
+}
+
+
+/*=== Count match length ===*/
+LZ4_FORCE_INLINE
+unsigned LZ4HC_NbCommonBytes32(U32 val)
+{
+ assert(val != 0);
+ if (LZ4_isLittleEndian()) {
+# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT)
+ unsigned long r;
+ _BitScanReverse(&r, val);
+ return (unsigned)((31 - r) >> 3);
+# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \
+ ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \
+ !defined(LZ4_FORCE_SW_BITCOUNT)
+ return (unsigned)__builtin_clz(val) >> 3;
+# else
+ val >>= 8;
+ val = ((((val + 0x00FFFF00) | 0x00FFFFFF) + val) |
+ (val + 0x00FF0000)) >> 24;
+ return (unsigned)val ^ 3;
+# endif
+ } else {
+# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT)
+ unsigned long r;
+ _BitScanForward(&r, val);
+ return (unsigned)(r >> 3);
+# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \
+ ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \
+ !defined(LZ4_FORCE_SW_BITCOUNT)
+ return (unsigned)__builtin_ctz(val) >> 3;
+# else
+ const U32 m = 0x01010101;
+ return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24;
+# endif
+ }
+}
+
+/** LZ4HC_countBack() :
+ * @return : negative value, nb of common bytes before ip/match */
+LZ4_FORCE_INLINE
+int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match,
+ const BYTE* const iMin, const BYTE* const mMin)
+{
+ int back = 0;
+ int const min = (int)MAX(iMin - ip, mMin - match);
+ assert(min <= 0);
+ assert(ip >= iMin); assert((size_t)(ip-iMin) < (1U<<31));
+ assert(match >= mMin); assert((size_t)(match - mMin) < (1U<<31));
+
+ while ((back - min) > 3) {
+ U32 const v = LZ4_read32(ip + back - 4) ^ LZ4_read32(match + back - 4);
+ if (v) {
+ return (back - (int)LZ4HC_NbCommonBytes32(v));
+ } else back -= 4; /* 4-byte step */
+ }
+ /* check remainder if any */
+ while ( (back > min)
+ && (ip[back-1] == match[back-1]) )
+ back--;
+ return back;
+}
+
+/*=== Chain table updates ===*/
#define DELTANEXTU16(table, pos) table[(U16)(pos)] /* faster */
/* Make fields passed to, and updated by LZ4HC_encodeSequence explicit */
#define UPDATABLE(ip, op, anchor) &ip, &op, &anchor
-static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); }
-
/**************************************
-* HC Compression
+* Init
**************************************/
static void LZ4HC_clearTables (LZ4HC_CCtx_internal* hc4)
{
@@ -101,6 +243,7 @@ static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start)
{
size_t const bufferSize = (size_t)(hc4->end - hc4->prefixStart);
size_t newStartingOffset = bufferSize + hc4->dictLimit;
+ DEBUGLOG(5, "LZ4HC_init_internal");
assert(newStartingOffset >= bufferSize); /* check overflow */
if (newStartingOffset > 1 GB) {
LZ4HC_clearTables(hc4);
@@ -116,6 +259,524 @@ static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start)
}
+/**************************************
+* Encode
+**************************************/
+/* LZ4HC_encodeSequence() :
+ * @return : 0 if ok,
+ * 1 if buffer issue detected */
+LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
+ const BYTE** _ip,
+ BYTE** _op,
+ const BYTE** _anchor,
+ int matchLength,
+ int offset,
+ limitedOutput_directive limit,
+ BYTE* oend)
+{
+#define ip (*_ip)
+#define op (*_op)
+#define anchor (*_anchor)
+
+ size_t length;
+ BYTE* const token = op++;
+
+#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 6)
+ static const BYTE* start = NULL;
+ static U32 totalCost = 0;
+ U32 const pos = (start==NULL) ? 0 : (U32)(anchor - start);
+ U32 const ll = (U32)(ip - anchor);
+ U32 const llAdd = (ll>=15) ? ((ll-15) / 255) + 1 : 0;
+ U32 const mlAdd = (matchLength>=19) ? ((matchLength-19) / 255) + 1 : 0;
+ U32 const cost = 1 + llAdd + ll + 2 + mlAdd;
+ if (start==NULL) start = anchor; /* only works for single segment */
+ /* g_debuglog_enable = (pos >= 2228) & (pos <= 2262); */
+ DEBUGLOG(6, "pos:%7u -- literals:%4u, match:%4i, offset:%5i, cost:%4u + %5u",
+ pos,
+ (U32)(ip - anchor), matchLength, offset,
+ cost, totalCost);
+ totalCost += cost;
+#endif
+
+ /* Encode Literal length */
+ length = (size_t)(ip - anchor);
+ LZ4_STATIC_ASSERT(notLimited == 0);
+ /* Check output limit */
+ if (limit && ((op + (length / 255) + length + (2 + 1 + LASTLITERALS)) > oend)) {
+ DEBUGLOG(6, "Not enough room to write %i literals (%i bytes remaining)",
+ (int)length, (int)(oend - op));
+ return 1;
+ }
+ if (length >= RUN_MASK) {
+ size_t len = length - RUN_MASK;
+ *token = (RUN_MASK << ML_BITS);
+ for(; len >= 255 ; len -= 255) *op++ = 255;
+ *op++ = (BYTE)len;
+ } else {
+ *token = (BYTE)(length << ML_BITS);
+ }
+
+ /* Copy Literals */
+ LZ4_wildCopy8(op, anchor, op + length);
+ op += length;
+
+ /* Encode Offset */
+ assert(offset <= LZ4_DISTANCE_MAX );
+ assert(offset > 0);
+ LZ4_writeLE16(op, (U16)(offset)); op += 2;
+
+ /* Encode MatchLength */
+ assert(matchLength >= MINMATCH);
+ length = (size_t)matchLength - MINMATCH;
+ if (limit && (op + (length / 255) + (1 + LASTLITERALS) > oend)) {
+ DEBUGLOG(6, "Not enough room to write match length");
+ return 1; /* Check output limit */
+ }
+ if (length >= ML_MASK) {
+ *token += ML_MASK;
+ length -= ML_MASK;
+ for(; length >= 510 ; length -= 510) { *op++ = 255; *op++ = 255; }
+ if (length >= 255) { length -= 255; *op++ = 255; }
+ *op++ = (BYTE)length;
+ } else {
+ *token += (BYTE)(length);
+ }
+
+ /* Prepare next loop */
+ ip += matchLength;
+ anchor = ip;
+
+ return 0;
+
+#undef ip
+#undef op
+#undef anchor
+}
+
+
+typedef struct {
+ int off;
+ int len;
+ int back; /* negative value */
+} LZ4HC_match_t;
+
+LZ4HC_match_t LZ4HC_searchExtDict(const BYTE* ip, U32 ipIndex,
+ const BYTE* const iLowLimit, const BYTE* const iHighLimit,
+ const LZ4HC_CCtx_internal* dictCtx, U32 gDictEndIndex,
+ int currentBestML, int nbAttempts)
+{
+ size_t const lDictEndIndex = (size_t)(dictCtx->end - dictCtx->prefixStart) + dictCtx->dictLimit;
+ U32 lDictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)];
+ U32 matchIndex = lDictMatchIndex + gDictEndIndex - (U32)lDictEndIndex;
+ int offset = 0, sBack = 0;
+ assert(lDictEndIndex <= 1 GB);
+ if (lDictMatchIndex>0)
+ DEBUGLOG(7, "lDictEndIndex = %zu, lDictMatchIndex = %u", lDictEndIndex, lDictMatchIndex);
+ while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) {
+ const BYTE* const matchPtr = dictCtx->prefixStart - dictCtx->dictLimit + lDictMatchIndex;
+
+ if (LZ4_read32(matchPtr) == LZ4_read32(ip)) {
+ int mlt;
+ int back = 0;
+ const BYTE* vLimit = ip + (lDictEndIndex - lDictMatchIndex);
+ if (vLimit > iHighLimit) vLimit = iHighLimit;
+ mlt = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
+ back = (ip > iLowLimit) ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->prefixStart) : 0;
+ mlt -= back;
+ if (mlt > currentBestML) {
+ currentBestML = mlt;
+ offset = (int)(ipIndex - matchIndex);
+ sBack = back;
+ DEBUGLOG(7, "found match of length %i within extDictCtx", currentBestML);
+ } }
+
+ { U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, lDictMatchIndex);
+ lDictMatchIndex -= nextOffset;
+ matchIndex -= nextOffset;
+ } }
+
+ { LZ4HC_match_t md;
+ md.len = currentBestML;
+ md.off = offset;
+ md.back = sBack;
+ return md;
+ }
+}
+
+typedef LZ4HC_match_t (*LZ4MID_searchIntoDict_f)(const BYTE* ip, U32 ipIndex,
+ const BYTE* const iHighLimit,
+ const LZ4HC_CCtx_internal* dictCtx, U32 gDictEndIndex);
+
+static LZ4HC_match_t LZ4MID_searchHCDict(const BYTE* ip, U32 ipIndex,
+ const BYTE* const iHighLimit,
+ const LZ4HC_CCtx_internal* dictCtx, U32 gDictEndIndex)
+{
+ return LZ4HC_searchExtDict(ip,ipIndex,
+ ip, iHighLimit,
+ dictCtx, gDictEndIndex,
+ MINMATCH-1, 2);
+}
+
+static LZ4HC_match_t LZ4MID_searchExtDict(const BYTE* ip, U32 ipIndex,
+ const BYTE* const iHighLimit,
+ const LZ4HC_CCtx_internal* dictCtx, U32 gDictEndIndex)
+{
+ size_t const lDictEndIndex = (size_t)(dictCtx->end - dictCtx->prefixStart) + dictCtx->dictLimit;
+ const U32* const hash4Table = dictCtx->hashTable;
+ const U32* const hash8Table = hash4Table + LZ4MID_HASHTABLESIZE;
+ DEBUGLOG(7, "LZ4MID_searchExtDict (ipIdx=%u)", ipIndex);
+
+ /* search long match first */
+ { U32 l8DictMatchIndex = hash8Table[LZ4MID_hash8Ptr(ip)];
+ U32 m8Index = l8DictMatchIndex + gDictEndIndex - (U32)lDictEndIndex;
+ assert(lDictEndIndex <= 1 GB);
+ if (ipIndex - m8Index <= LZ4_DISTANCE_MAX) {
+ const BYTE* const matchPtr = dictCtx->prefixStart - dictCtx->dictLimit + l8DictMatchIndex;
+ const size_t safeLen = MIN(lDictEndIndex - l8DictMatchIndex, (size_t)(iHighLimit - ip));
+ int mlt = (int)LZ4_count(ip, matchPtr, ip + safeLen);
+ if (mlt >= MINMATCH) {
+ LZ4HC_match_t md;
+ DEBUGLOG(7, "Found long ExtDict match of len=%u", mlt);
+ md.len = mlt;
+ md.off = (int)(ipIndex - m8Index);
+ md.back = 0;
+ return md;
+ }
+ }
+ }
+
+ /* search for short match second */
+ { U32 l4DictMatchIndex = hash4Table[LZ4MID_hash4Ptr(ip)];
+ U32 m4Index = l4DictMatchIndex + gDictEndIndex - (U32)lDictEndIndex;
+ if (ipIndex - m4Index <= LZ4_DISTANCE_MAX) {
+ const BYTE* const matchPtr = dictCtx->prefixStart - dictCtx->dictLimit + l4DictMatchIndex;
+ const size_t safeLen = MIN(lDictEndIndex - l4DictMatchIndex, (size_t)(iHighLimit - ip));
+ int mlt = (int)LZ4_count(ip, matchPtr, ip + safeLen);
+ if (mlt >= MINMATCH) {
+ LZ4HC_match_t md;
+ DEBUGLOG(7, "Found short ExtDict match of len=%u", mlt);
+ md.len = mlt;
+ md.off = (int)(ipIndex - m4Index);
+ md.back = 0;
+ return md;
+ }
+ }
+ }
+
+ /* nothing found */
+ { LZ4HC_match_t const md = {0, 0, 0 };
+ return md;
+ }
+}
+
+/**************************************
+* Mid Compression (level 2)
+**************************************/
+
+LZ4_FORCE_INLINE void
+LZ4MID_addPosition(U32* hTable, U32 hValue, U32 index)
+{
+ hTable[hValue] = index;
+}
+
+#define ADDPOS8(_p, _idx) LZ4MID_addPosition(hash8Table, LZ4MID_hash8Ptr(_p), _idx)
+#define ADDPOS4(_p, _idx) LZ4MID_addPosition(hash4Table, LZ4MID_hash4Ptr(_p), _idx)
+
+/* Fill hash tables with references into dictionary.
+ * The resulting table is only exploitable by LZ4MID (level 2) */
+static void
+LZ4MID_fillHTable (LZ4HC_CCtx_internal* cctx, const void* dict, size_t size)
+{
+ U32* const hash4Table = cctx->hashTable;
+ U32* const hash8Table = hash4Table + LZ4MID_HASHTABLESIZE;
+ const BYTE* const prefixPtr = (const BYTE*)dict;
+ U32 const prefixIdx = cctx->dictLimit;
+ U32 const target = prefixIdx + (U32)size - LZ4MID_HASHSIZE;
+ U32 idx = cctx->nextToUpdate;
+ assert(dict == cctx->prefixStart);
+ DEBUGLOG(4, "LZ4MID_fillHTable (size:%zu)", size);
+ if (size <= LZ4MID_HASHSIZE)
+ return;
+
+ for (; idx < target; idx += 3) {
+ ADDPOS4(prefixPtr+idx-prefixIdx, idx);
+ ADDPOS8(prefixPtr+idx+1-prefixIdx, idx+1);
+ }
+
+ idx = (size > 32 KB + LZ4MID_HASHSIZE) ? target - 32 KB : cctx->nextToUpdate;
+ for (; idx < target; idx += 1) {
+ ADDPOS8(prefixPtr+idx-prefixIdx, idx);
+ }
+
+ cctx->nextToUpdate = target;
+}
+
+static LZ4MID_searchIntoDict_f select_searchDict_function(const LZ4HC_CCtx_internal* dictCtx)
+{
+ if (dictCtx == NULL) return NULL;
+ if (LZ4HC_getCLevelParams(dictCtx->compressionLevel).strat == lz4mid)
+ return LZ4MID_searchExtDict;
+ return LZ4MID_searchHCDict;
+}
+
+static int LZ4MID_compress (
+ LZ4HC_CCtx_internal* const ctx,
+ const char* const src,
+ char* const dst,
+ int* srcSizePtr,
+ int const maxOutputSize,
+ const limitedOutput_directive limit,
+ const dictCtx_directive dict
+ )
+{
+ U32* const hash4Table = ctx->hashTable;
+ U32* const hash8Table = hash4Table + LZ4MID_HASHTABLESIZE;
+ const BYTE* ip = (const BYTE*)src;
+ const BYTE* anchor = ip;
+ const BYTE* const iend = ip + *srcSizePtr;
+ const BYTE* const mflimit = iend - MFLIMIT;
+ const BYTE* const matchlimit = (iend - LASTLITERALS);
+ const BYTE* const ilimit = (iend - LZ4MID_HASHSIZE);
+ BYTE* op = (BYTE*)dst;
+ BYTE* oend = op + maxOutputSize;
+
+ const BYTE* const prefixPtr = ctx->prefixStart;
+ const U32 prefixIdx = ctx->dictLimit;
+ const U32 ilimitIdx = (U32)(ilimit - prefixPtr) + prefixIdx;
+ const BYTE* const dictStart = ctx->dictStart;
+ const U32 dictIdx = ctx->lowLimit;
+ const U32 gDictEndIndex = ctx->lowLimit;
+ const LZ4MID_searchIntoDict_f searchIntoDict = (dict == usingDictCtxHc) ? select_searchDict_function(ctx->dictCtx) : NULL;
+ unsigned matchLength;
+ unsigned matchDistance;
+
+ /* input sanitization */
+ DEBUGLOG(5, "LZ4MID_compress (%i bytes)", *srcSizePtr);
+ if (dict == usingDictCtxHc) DEBUGLOG(5, "usingDictCtxHc");
+ assert(*srcSizePtr >= 0);
+ if (*srcSizePtr) assert(src != NULL);
+ if (maxOutputSize) assert(dst != NULL);
+ if (*srcSizePtr < 0) return 0; /* invalid */
+ if (maxOutputSize < 0) return 0; /* invalid */
+ if (*srcSizePtr > LZ4_MAX_INPUT_SIZE) {
+ /* forbidden: no input is allowed to be that large */
+ return 0;
+ }
+ if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */
+ if (*srcSizePtr < LZ4_minLength)
+ goto _lz4mid_last_literals; /* Input too small, no compression (all literals) */
+
+ /* main loop */
+ while (ip <= mflimit) {
+ const U32 ipIndex = (U32)(ip - prefixPtr) + prefixIdx;
+ /* search long match */
+ { U32 const h8 = LZ4MID_hash8Ptr(ip);
+ U32 const pos8 = hash8Table[h8];
+ assert(h8 < LZ4MID_HASHTABLESIZE);
+ assert(pos8 < ipIndex);
+ LZ4MID_addPosition(hash8Table, h8, ipIndex);
+ if (ipIndex - pos8 <= LZ4_DISTANCE_MAX) {
+ /* match candidate found */
+ if (pos8 >= prefixIdx) {
+ const BYTE* const matchPtr = prefixPtr + pos8 - prefixIdx;
+ assert(matchPtr < ip);
+ matchLength = LZ4_count(ip, matchPtr, matchlimit);
+ if (matchLength >= MINMATCH) {
+ DEBUGLOG(7, "found long match at pos %u (len=%u)", pos8, matchLength);
+ matchDistance = ipIndex - pos8;
+ goto _lz4mid_encode_sequence;
+ }
+ } else {
+ if (pos8 >= dictIdx) {
+ /* extDict match candidate */
+ const BYTE* const matchPtr = dictStart + (pos8 - dictIdx);
+ const size_t safeLen = MIN(prefixIdx - pos8, (size_t)(matchlimit - ip));
+ matchLength = LZ4_count(ip, matchPtr, ip + safeLen);
+ if (matchLength >= MINMATCH) {
+ DEBUGLOG(7, "found long match at ExtDict pos %u (len=%u)", pos8, matchLength);
+ matchDistance = ipIndex - pos8;
+ goto _lz4mid_encode_sequence;
+ }
+ }
+ }
+ } }
+ /* search short match */
+ { U32 const h4 = LZ4MID_hash4Ptr(ip);
+ U32 const pos4 = hash4Table[h4];
+ assert(h4 < LZ4MID_HASHTABLESIZE);
+ assert(pos4 < ipIndex);
+ LZ4MID_addPosition(hash4Table, h4, ipIndex);
+ if (ipIndex - pos4 <= LZ4_DISTANCE_MAX) {
+ /* match candidate found */
+ if (pos4 >= prefixIdx) {
+ /* only search within prefix */
+ const BYTE* const matchPtr = prefixPtr + (pos4 - prefixIdx);
+ assert(matchPtr < ip);
+ assert(matchPtr >= prefixPtr);
+ matchLength = LZ4_count(ip, matchPtr, matchlimit);
+ if (matchLength >= MINMATCH) {
+ /* short match found, let's just check ip+1 for longer */
+ U32 const h8 = LZ4MID_hash8Ptr(ip+1);
+ U32 const pos8 = hash8Table[h8];
+ U32 const m2Distance = ipIndex + 1 - pos8;
+ matchDistance = ipIndex - pos4;
+ if ( m2Distance <= LZ4_DISTANCE_MAX
+ && pos8 >= prefixIdx /* only search within prefix */
+ && likely(ip < mflimit)
+ ) {
+ const BYTE* const m2Ptr = prefixPtr + (pos8 - prefixIdx);
+ unsigned ml2 = LZ4_count(ip+1, m2Ptr, matchlimit);
+ if (ml2 > matchLength) {
+ LZ4MID_addPosition(hash8Table, h8, ipIndex+1);
+ ip++;
+ matchLength = ml2;
+ matchDistance = m2Distance;
+ } }
+ goto _lz4mid_encode_sequence;
+ }
+ } else {
+ if (pos4 >= dictIdx) {
+ /* extDict match candidate */
+ const BYTE* const matchPtr = dictStart + (pos4 - dictIdx);
+ const size_t safeLen = MIN(prefixIdx - pos4, (size_t)(matchlimit - ip));
+ matchLength = LZ4_count(ip, matchPtr, ip + safeLen);
+ if (matchLength >= MINMATCH) {
+ DEBUGLOG(7, "found match at ExtDict pos %u (len=%u)", pos4, matchLength);
+ matchDistance = ipIndex - pos4;
+ goto _lz4mid_encode_sequence;
+ }
+ }
+ }
+ } }
+ /* no match found in prefix */
+ if ( (dict == usingDictCtxHc)
+ && (ipIndex - gDictEndIndex < LZ4_DISTANCE_MAX - 8) ) {
+ /* search a match into external dictionary */
+ LZ4HC_match_t dMatch = searchIntoDict(ip, ipIndex,
+ matchlimit,
+ ctx->dictCtx, gDictEndIndex);
+ if (dMatch.len >= MINMATCH) {
+ DEBUGLOG(7, "found Dictionary match (offset=%i)", dMatch.off);
+ assert(dMatch.back == 0);
+ matchLength = (unsigned)dMatch.len;
+ matchDistance = (unsigned)dMatch.off;
+ goto _lz4mid_encode_sequence;
+ }
+ }
+ /* no match found */
+ ip += 1 + ((ip-anchor) >> 9); /* skip faster over incompressible data */
+ continue;
+
+_lz4mid_encode_sequence:
+ /* catch back */
+ while (((ip > anchor) & ((U32)(ip-prefixPtr) > matchDistance)) && (unlikely(ip[-1] == ip[-(int)matchDistance-1]))) {
+ ip--; matchLength++;
+ };
+
+ /* fill table with beginning of match */
+ ADDPOS8(ip+1, ipIndex+1);
+ ADDPOS8(ip+2, ipIndex+2);
+ ADDPOS4(ip+1, ipIndex+1);
+
+ /* encode */
+ { BYTE* const saved_op = op;
+ /* LZ4HC_encodeSequence always updates @op; on success, it updates @ip and @anchor */
+ if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ (int)matchLength, (int)matchDistance,
+ limit, oend) ) {
+ op = saved_op; /* restore @op value before failed LZ4HC_encodeSequence */
+ goto _lz4mid_dest_overflow;
+ }
+ }
+
+ /* fill table with end of match */
+ { U32 endMatchIdx = (U32)(ip-prefixPtr) + prefixIdx;
+ U32 pos_m2 = endMatchIdx - 2;
+ if (pos_m2 < ilimitIdx) {
+ if (likely(ip - prefixPtr > 5)) {
+ ADDPOS8(ip-5, endMatchIdx - 5);
+ }
+ ADDPOS8(ip-3, endMatchIdx - 3);
+ ADDPOS8(ip-2, endMatchIdx - 2);
+ ADDPOS4(ip-2, endMatchIdx - 2);
+ ADDPOS4(ip-1, endMatchIdx - 1);
+ }
+ }
+ }
+
+_lz4mid_last_literals:
+ /* Encode Last Literals */
+ { size_t lastRunSize = (size_t)(iend - anchor); /* literals */
+ size_t llAdd = (lastRunSize + 255 - RUN_MASK) / 255;
+ size_t const totalSize = 1 + llAdd + lastRunSize;
+ if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */
+ if (limit && (op + totalSize > oend)) {
+ if (limit == limitedOutput) return 0; /* not enough space in @dst */
+ /* adapt lastRunSize to fill 'dest' */
+ lastRunSize = (size_t)(oend - op) - 1 /*token*/;
+ llAdd = (lastRunSize + 256 - RUN_MASK) / 256;
+ lastRunSize -= llAdd;
+ }
+ DEBUGLOG(6, "Final literal run : %i literals", (int)lastRunSize);
+ ip = anchor + lastRunSize; /* can be != iend if limit==fillOutput */
+
+ if (lastRunSize >= RUN_MASK) {
+ size_t accumulator = lastRunSize - RUN_MASK;
+ *op++ = (RUN_MASK << ML_BITS);
+ for(; accumulator >= 255 ; accumulator -= 255)
+ *op++ = 255;
+ *op++ = (BYTE) accumulator;
+ } else {
+ *op++ = (BYTE)(lastRunSize << ML_BITS);
+ }
+ assert(lastRunSize <= (size_t)(oend - op));
+ LZ4_memcpy(op, anchor, lastRunSize);
+ op += lastRunSize;
+ }
+
+ /* End */
+ DEBUGLOG(5, "compressed %i bytes into %i bytes", *srcSizePtr, (int)((char*)op - dst));
+ assert(ip >= (const BYTE*)src);
+ assert(ip <= iend);
+ *srcSizePtr = (int)(ip - (const BYTE*)src);
+ assert((char*)op >= dst);
+ assert(op <= oend);
+ assert((char*)op - dst < INT_MAX);
+ return (int)((char*)op - dst);
+
+_lz4mid_dest_overflow:
+ if (limit == fillOutput) {
+ /* Assumption : @ip, @anchor, @optr and @matchLength must be set correctly */
+ size_t const ll = (size_t)(ip - anchor);
+ size_t const ll_addbytes = (ll + 240) / 255;
+ size_t const ll_totalCost = 1 + ll_addbytes + ll;
+ BYTE* const maxLitPos = oend - 3; /* 2 for offset, 1 for token */
+ DEBUGLOG(6, "Last sequence is overflowing : %u literals, %u remaining space",
+ (unsigned)ll, (unsigned)(oend-op));
+ if (op + ll_totalCost <= maxLitPos) {
+ /* ll validated; now adjust match length */
+ size_t const bytesLeftForMl = (size_t)(maxLitPos - (op+ll_totalCost));
+ size_t const maxMlSize = MINMATCH + (ML_MASK-1) + (bytesLeftForMl * 255);
+ assert(maxMlSize < INT_MAX);
+ if ((size_t)matchLength > maxMlSize) matchLength= (unsigned)maxMlSize;
+ if ((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1 + matchLength >= MFLIMIT) {
+ DEBUGLOG(6, "Let's encode a last sequence (ll=%u, ml=%u)", (unsigned)ll, matchLength);
+ LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ (int)matchLength, (int)matchDistance,
+ notLimited, oend);
+ } }
+ DEBUGLOG(6, "Let's finish with a run of literals (%u bytes left)", (unsigned)(oend-op));
+ goto _lz4mid_last_literals;
+ }
+ /* compression failed */
+ return 0;
+}
+
+
+/**************************************
+* HC Compression - Search
+**************************************/
+
/* Update chains up to ip (excluded) */
LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip)
{
@@ -140,23 +801,6 @@ LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip)
hc4->nextToUpdate = target;
}
-/** LZ4HC_countBack() :
- * @return : negative value, nb of common bytes before ip/match */
-LZ4_FORCE_INLINE
-int LZ4HC_countBack(const BYTE* const ip, const BYTE* const match,
- const BYTE* const iMin, const BYTE* const mMin)
-{
- int back = 0;
- int const min = (int)MAX(iMin - ip, mMin - match);
- assert(min <= 0);
- assert(ip >= iMin); assert((size_t)(ip-iMin) < (1U<<31));
- assert(match >= mMin); assert((size_t)(match - mMin) < (1U<<31));
- while ( (back > min)
- && (ip[back-1] == match[back-1]) )
- back--;
- return back;
-}
-
#if defined(_MSC_VER)
# define LZ4HC_rotl32(x,r) _rotl(x,r)
#else
@@ -236,22 +880,21 @@ static int LZ4HC_protectDictEnd(U32 const dictLimit, U32 const matchIndex)
typedef enum { rep_untested, rep_not, rep_confirmed } repeat_state_e;
typedef enum { favorCompressionRatio=0, favorDecompressionSpeed } HCfavor_e;
-LZ4_FORCE_INLINE int
+
+LZ4_FORCE_INLINE LZ4HC_match_t
LZ4HC_InsertAndGetWiderMatch (
LZ4HC_CCtx_internal* const hc4,
const BYTE* const ip,
const BYTE* const iLowLimit, const BYTE* const iHighLimit,
int longest,
- const BYTE** matchpos,
- const BYTE** startpos,
const int maxNbAttempts,
const int patternAnalysis, const int chainSwap,
const dictCtx_directive dict,
const HCfavor_e favorDecSpeed)
{
U16* const chainTable = hc4->chainTable;
- U32* const HashTable = hc4->hashTable;
- const LZ4HC_CCtx_internal * const dictCtx = hc4->dictCtx;
+ U32* const hashTable = hc4->hashTable;
+ const LZ4HC_CCtx_internal* const dictCtx = hc4->dictCtx;
const BYTE* const prefixPtr = hc4->prefixStart;
const U32 prefixIdx = hc4->dictLimit;
const U32 ipIndex = (U32)(ip - prefixPtr) + prefixIdx;
@@ -267,22 +910,24 @@ LZ4HC_InsertAndGetWiderMatch (
U32 matchIndex;
repeat_state_e repeat = rep_untested;
size_t srcPatternLength = 0;
+ int offset = 0, sBack = 0;
DEBUGLOG(7, "LZ4HC_InsertAndGetWiderMatch");
/* First Match */
- LZ4HC_Insert(hc4, ip);
- matchIndex = HashTable[LZ4HC_hashPtr(ip)];
- DEBUGLOG(7, "First match at index %u / %u (lowestMatchIndex)",
- matchIndex, lowestMatchIndex);
+ LZ4HC_Insert(hc4, ip); /* insert all prior positions up to ip (excluded) */
+ matchIndex = hashTable[LZ4HC_hashPtr(ip)];
+ DEBUGLOG(7, "First candidate match for pos %u found at index %u / %u (lowestMatchIndex)",
+ ipIndex, matchIndex, lowestMatchIndex);
while ((matchIndex>=lowestMatchIndex) && (nbAttempts>0)) {
int matchLength=0;
nbAttempts--;
assert(matchIndex < ipIndex);
if (favorDecSpeed && (ipIndex - matchIndex < 8)) {
- /* do nothing */
+ /* do nothing:
+ * favorDecSpeed intentionally skips matches with offset < 8 */
} else if (matchIndex >= prefixIdx) { /* within current Prefix */
- const BYTE* const matchPtr = prefixPtr + matchIndex - prefixIdx;
+ const BYTE* const matchPtr = prefixPtr + (matchIndex - prefixIdx);
assert(matchPtr < ip);
assert(longest >= 1);
if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) {
@@ -292,10 +937,11 @@ LZ4HC_InsertAndGetWiderMatch (
matchLength -= back;
if (matchLength > longest) {
longest = matchLength;
- *matchpos = matchPtr + back;
- *startpos = ip + back;
+ offset = (int)(ipIndex - matchIndex);
+ sBack = back;
+ DEBUGLOG(7, "Found match of len=%i within prefix, offset=%i, back=%i", longest, offset, -back);
} } }
- } else { /* lowestMatchIndex <= matchIndex < dictLimit */
+ } else { /* lowestMatchIndex <= matchIndex < dictLimit : within Ext Dict */
const BYTE* const matchPtr = dictStart + (matchIndex - dictIdx);
assert(matchIndex >= dictIdx);
if ( likely(matchIndex <= prefixIdx - 4)
@@ -310,8 +956,9 @@ LZ4HC_InsertAndGetWiderMatch (
matchLength -= back;
if (matchLength > longest) {
longest = matchLength;
- *matchpos = prefixPtr - prefixIdx + matchIndex + back; /* virtual pos, relative to ip, to retrieve offset */
- *startpos = ip + back;
+ offset = (int)(ipIndex - matchIndex);
+ sBack = back;
+ DEBUGLOG(7, "Found match of len=%i within dict, offset=%i, back=%i", longest, offset, -back);
} } }
if (chainSwap && matchLength==longest) { /* better match => select a better chain */
@@ -344,6 +991,7 @@ LZ4HC_InsertAndGetWiderMatch (
if (repeat == rep_untested) {
if ( ((pattern & 0xFFFF) == (pattern >> 16))
& ((pattern & 0xFF) == (pattern >> 24)) ) {
+ DEBUGLOG(7, "Repeat pattern detected, char %02X", pattern >> 24);
repeat = rep_confirmed;
srcPatternLength = LZ4HC_countPattern(ip+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern);
} else {
@@ -352,7 +1000,7 @@ LZ4HC_InsertAndGetWiderMatch (
if ( (repeat == rep_confirmed) && (matchCandidateIdx >= lowestMatchIndex)
&& LZ4HC_protectDictEnd(prefixIdx, matchCandidateIdx) ) {
const int extDict = matchCandidateIdx < prefixIdx;
- const BYTE* const matchPtr = (extDict ? dictStart - dictIdx : prefixPtr - prefixIdx) + matchCandidateIdx;
+ const BYTE* const matchPtr = extDict ? dictStart + (matchCandidateIdx - dictIdx) : prefixPtr + (matchCandidateIdx - prefixIdx);
if (LZ4_read32(matchPtr) == pattern) { /* good candidate */
const BYTE* const iLimit = extDict ? dictEnd : iHighLimit;
size_t forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iLimit, pattern) + sizeof(pattern);
@@ -398,8 +1046,9 @@ LZ4HC_InsertAndGetWiderMatch (
if ((size_t)(ip - prefixPtr) + prefixIdx - matchIndex > LZ4_DISTANCE_MAX) break;
assert(maxML < 2 GB);
longest = (int)maxML;
- *matchpos = prefixPtr - prefixIdx + matchIndex; /* virtual pos, relative to ip, to retrieve offset */
- *startpos = ip;
+ offset = (int)(ipIndex - matchIndex);
+ assert(sBack == 0);
+ DEBUGLOG(7, "Found repeat pattern match of len=%i, offset=%i", longest, offset);
}
{ U32 const distToNextPattern = DELTANEXTU16(chainTable, matchIndex);
if (distToNextPattern > matchIndex) break; /* avoid overflow */
@@ -416,11 +1065,12 @@ LZ4HC_InsertAndGetWiderMatch (
if ( dict == usingDictCtxHc
&& nbAttempts > 0
- && ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) {
+ && withinStartDistance) {
size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->prefixStart) + dictCtx->dictLimit;
U32 dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)];
assert(dictEndOffset <= 1 GB);
matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset;
+ if (dictMatchIndex>0) DEBUGLOG(7, "dictEndOffset = %zu, dictMatchIndex = %u => relative matchIndex = %i", dictEndOffset, dictMatchIndex, (int)dictMatchIndex - (int)dictEndOffset);
while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) {
const BYTE* const matchPtr = dictCtx->prefixStart - dictCtx->dictLimit + dictMatchIndex;
@@ -434,8 +1084,9 @@ LZ4HC_InsertAndGetWiderMatch (
mlt -= back;
if (mlt > longest) {
longest = mlt;
- *matchpos = prefixPtr - prefixIdx + matchIndex + back;
- *startpos = ip + back;
+ offset = (int)(ipIndex - matchIndex);
+ sBack = back;
+ DEBUGLOG(7, "found match of length %i within extDictCtx", longest);
} }
{ U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex);
@@ -443,112 +1094,29 @@ LZ4HC_InsertAndGetWiderMatch (
matchIndex -= nextOffset;
} } }
- return longest;
+ { LZ4HC_match_t md;
+ assert(longest >= 0);
+ md.len = longest;
+ md.off = offset;
+ md.back = sBack;
+ return md;
+ }
}
-LZ4_FORCE_INLINE int
+LZ4_FORCE_INLINE LZ4HC_match_t
LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4, /* Index table will be updated */
const BYTE* const ip, const BYTE* const iLimit,
- const BYTE** matchpos,
const int maxNbAttempts,
const int patternAnalysis,
const dictCtx_directive dict)
{
- const BYTE* uselessPtr = ip;
+ DEBUGLOG(7, "LZ4HC_InsertAndFindBestMatch");
/* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos),
* but this won't be the case here, as we define iLowLimit==ip,
* so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */
- return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, matchpos, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio);
+ return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio);
}
-/* LZ4HC_encodeSequence() :
- * @return : 0 if ok,
- * 1 if buffer issue detected */
-LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
- const BYTE** _ip,
- BYTE** _op,
- const BYTE** _anchor,
- int matchLength,
- const BYTE* const match,
- limitedOutput_directive limit,
- BYTE* oend)
-{
-#define ip (*_ip)
-#define op (*_op)
-#define anchor (*_anchor)
-
- size_t length;
- BYTE* const token = op++;
-
-#if defined(LZ4_DEBUG) && (LZ4_DEBUG >= 6)
- static const BYTE* start = NULL;
- static U32 totalCost = 0;
- U32 const pos = (start==NULL) ? 0 : (U32)(anchor - start);
- U32 const ll = (U32)(ip - anchor);
- U32 const llAdd = (ll>=15) ? ((ll-15) / 255) + 1 : 0;
- U32 const mlAdd = (matchLength>=19) ? ((matchLength-19) / 255) + 1 : 0;
- U32 const cost = 1 + llAdd + ll + 2 + mlAdd;
- if (start==NULL) start = anchor; /* only works for single segment */
- /* g_debuglog_enable = (pos >= 2228) & (pos <= 2262); */
- DEBUGLOG(6, "pos:%7u -- literals:%4u, match:%4i, offset:%5u, cost:%4u + %5u",
- pos,
- (U32)(ip - anchor), matchLength, (U32)(ip-match),
- cost, totalCost);
- totalCost += cost;
-#endif
-
- /* Encode Literal length */
- length = (size_t)(ip - anchor);
- LZ4_STATIC_ASSERT(notLimited == 0);
- /* Check output limit */
- if (limit && ((op + (length / 255) + length + (2 + 1 + LASTLITERALS)) > oend)) {
- DEBUGLOG(6, "Not enough room to write %i literals (%i bytes remaining)",
- (int)length, (int)(oend - op));
- return 1;
- }
- if (length >= RUN_MASK) {
- size_t len = length - RUN_MASK;
- *token = (RUN_MASK << ML_BITS);
- for(; len >= 255 ; len -= 255) *op++ = 255;
- *op++ = (BYTE)len;
- } else {
- *token = (BYTE)(length << ML_BITS);
- }
-
- /* Copy Literals */
- LZ4_wildCopy8(op, anchor, op + length);
- op += length;
-
- /* Encode Offset */
- assert( (ip - match) <= LZ4_DISTANCE_MAX ); /* note : consider providing offset as a value, rather than as a pointer difference */
- LZ4_writeLE16(op, (U16)(ip - match)); op += 2;
-
- /* Encode MatchLength */
- assert(matchLength >= MINMATCH);
- length = (size_t)matchLength - MINMATCH;
- if (limit && (op + (length / 255) + (1 + LASTLITERALS) > oend)) {
- DEBUGLOG(6, "Not enough room to write match length");
- return 1; /* Check output limit */
- }
- if (length >= ML_MASK) {
- *token += ML_MASK;
- length -= ML_MASK;
- for(; length >= 510 ; length -= 510) { *op++ = 255; *op++ = 255; }
- if (length >= 255) { length -= 255; *op++ = 255; }
- *op++ = (BYTE)length;
- } else {
- *token += (BYTE)(length);
- }
-
- /* Prepare next loop */
- ip += matchLength;
- anchor = ip;
-
- return 0;
-}
-#undef ip
-#undef op
-#undef anchor
LZ4_FORCE_INLINE int LZ4HC_compress_hashChain (
LZ4HC_CCtx_internal* const ctx,
@@ -574,127 +1142,130 @@ LZ4_FORCE_INLINE int LZ4HC_compress_hashChain (
BYTE* op = (BYTE*) dest;
BYTE* oend = op + maxOutputSize;
- int ml0, ml, ml2, ml3;
const BYTE* start0;
- const BYTE* ref0;
- const BYTE* ref = NULL;
const BYTE* start2 = NULL;
- const BYTE* ref2 = NULL;
const BYTE* start3 = NULL;
- const BYTE* ref3 = NULL;
+ LZ4HC_match_t m0, m1, m2, m3;
+ const LZ4HC_match_t nomatch = {0, 0, 0};
/* init */
+ DEBUGLOG(5, "LZ4HC_compress_hashChain (dict?=>%i)", dict);
*srcSizePtr = 0;
if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */
if (inputSize < LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */
/* Main Loop */
while (ip <= mflimit) {
- ml = LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, &ref, maxNbAttempts, patternAnalysis, dict);
- if (ml<MINMATCH) { ip++; continue; }
+ m1 = LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, maxNbAttempts, patternAnalysis, dict);
+ if (m1.len<MINMATCH) { ip++; continue; }
/* saved, in case we would skip too much */
- start0 = ip; ref0 = ref; ml0 = ml;
+ start0 = ip; m0 = m1;
_Search2:
- if (ip+ml <= mflimit) {
- ml2 = LZ4HC_InsertAndGetWiderMatch(ctx,
- ip + ml - 2, ip + 0, matchlimit, ml, &ref2, &start2,
+ DEBUGLOG(7, "_Search2 (currently found match of size %i)", m1.len);
+ if (ip+m1.len <= mflimit) {
+ start2 = ip + m1.len - 2;
+ m2 = LZ4HC_InsertAndGetWiderMatch(ctx,
+ start2, ip + 0, matchlimit, m1.len,
maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio);
+ start2 += m2.back;
} else {
- ml2 = ml;
+ m2 = nomatch; /* do not search further */
}
- if (ml2 == ml) { /* No better match => encode ML1 */
+ if (m2.len <= m1.len) { /* No better match => encode ML1 immediately */
optr = op;
- if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
+ if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ m1.len, m1.off,
+ limit, oend) )
+ goto _dest_overflow;
continue;
}
if (start0 < ip) { /* first match was skipped at least once */
- if (start2 < ip + ml0) { /* squeezing ML1 between ML0(original ML1) and ML2 */
- ip = start0; ref = ref0; ml = ml0; /* restore initial ML1 */
+ if (start2 < ip + m0.len) { /* squeezing ML1 between ML0(original ML1) and ML2 */
+ ip = start0; m1 = m0; /* restore initial Match1 */
} }
/* Here, start0==ip */
if ((start2 - ip) < 3) { /* First Match too small : removed */
- ml = ml2;
ip = start2;
- ref =ref2;
+ m1 = m2;
goto _Search2;
}
_Search3:
- /* At this stage, we have :
- * ml2 > ml1, and
- * ip1+3 <= ip2 (usually < ip1+ml1) */
if ((start2 - ip) < OPTIMAL_ML) {
int correction;
- int new_ml = ml;
+ int new_ml = m1.len;
if (new_ml > OPTIMAL_ML) new_ml = OPTIMAL_ML;
- if (ip+new_ml > start2 + ml2 - MINMATCH) new_ml = (int)(start2 - ip) + ml2 - MINMATCH;
+ if (ip+new_ml > start2 + m2.len - MINMATCH)
+ new_ml = (int)(start2 - ip) + m2.len - MINMATCH;
correction = new_ml - (int)(start2 - ip);
if (correction > 0) {
start2 += correction;
- ref2 += correction;
- ml2 -= correction;
+ m2.len -= correction;
}
}
- /* Now, we have start2 = ip+new_ml, with new_ml = min(ml, OPTIMAL_ML=18) */
- if (start2 + ml2 <= mflimit) {
- ml3 = LZ4HC_InsertAndGetWiderMatch(ctx,
- start2 + ml2 - 3, start2, matchlimit, ml2, &ref3, &start3,
+ if (start2 + m2.len <= mflimit) {
+ start3 = start2 + m2.len - 3;
+ m3 = LZ4HC_InsertAndGetWiderMatch(ctx,
+ start3, start2, matchlimit, m2.len,
maxNbAttempts, patternAnalysis, 0, dict, favorCompressionRatio);
+ start3 += m3.back;
} else {
- ml3 = ml2;
+ m3 = nomatch; /* do not search further */
}
- if (ml3 == ml2) { /* No better match => encode ML1 and ML2 */
+ if (m3.len <= m2.len) { /* No better match => encode ML1 and ML2 */
/* ip & ref are known; Now for ml */
- if (start2 < ip+ml) ml = (int)(start2 - ip);
+ if (start2 < ip+m1.len) m1.len = (int)(start2 - ip);
/* Now, encode 2 sequences */
optr = op;
- if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
+ if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ m1.len, m1.off,
+ limit, oend) )
+ goto _dest_overflow;
ip = start2;
optr = op;
- if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml2, ref2, limit, oend)) {
- ml = ml2;
- ref = ref2;
+ if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ m2.len, m2.off,
+ limit, oend) ) {
+ m1 = m2;
goto _dest_overflow;
}
continue;
}
- if (start3 < ip+ml+3) { /* Not enough space for match 2 : remove it */
- if (start3 >= (ip+ml)) { /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */
- if (start2 < ip+ml) {
- int correction = (int)(ip+ml - start2);
+ if (start3 < ip+m1.len+3) { /* Not enough space for match 2 : remove it */
+ if (start3 >= (ip+m1.len)) { /* can write Seq1 immediately ==> Seq2 is removed, so Seq3 becomes Seq1 */
+ if (start2 < ip+m1.len) {
+ int correction = (int)(ip+m1.len - start2);
start2 += correction;
- ref2 += correction;
- ml2 -= correction;
- if (ml2 < MINMATCH) {
+ m2.len -= correction;
+ if (m2.len < MINMATCH) {
start2 = start3;
- ref2 = ref3;
- ml2 = ml3;
+ m2 = m3;
}
}
optr = op;
- if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
+ if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ m1.len, m1.off,
+ limit, oend) )
+ goto _dest_overflow;
ip = start3;
- ref = ref3;
- ml = ml3;
+ m1 = m3;
start0 = start2;
- ref0 = ref2;
- ml0 = ml2;
+ m0 = m2;
goto _Search2;
}
start2 = start3;
- ref2 = ref3;
- ml2 = ml3;
+ m2 = m3;
goto _Search3;
}
@@ -703,29 +1274,32 @@ _Search3:
* let's write the first one ML1.
* ip & ref are known; Now decide ml.
*/
- if (start2 < ip+ml) {
+ if (start2 < ip+m1.len) {
if ((start2 - ip) < OPTIMAL_ML) {
int correction;
- if (ml > OPTIMAL_ML) ml = OPTIMAL_ML;
- if (ip + ml > start2 + ml2 - MINMATCH) ml = (int)(start2 - ip) + ml2 - MINMATCH;
- correction = ml - (int)(start2 - ip);
+ if (m1.len > OPTIMAL_ML) m1.len = OPTIMAL_ML;
+ if (ip + m1.len > start2 + m2.len - MINMATCH)
+ m1.len = (int)(start2 - ip) + m2.len - MINMATCH;
+ correction = m1.len - (int)(start2 - ip);
if (correction > 0) {
start2 += correction;
- ref2 += correction;
- ml2 -= correction;
+ m2.len -= correction;
}
} else {
- ml = (int)(start2 - ip);
+ m1.len = (int)(start2 - ip);
}
}
optr = op;
- if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
+ if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor),
+ m1.len, m1.off,
+ limit, oend) )
+ goto _dest_overflow;
/* ML2 becomes ML1 */
- ip = start2; ref = ref2; ml = ml2;
+ ip = start2; m1 = m2;
/* ML3 becomes ML2 */
- start2 = start3; ref2 = ref3; ml2 = ml3;
+ start2 = start3; m2 = m3;
/* let's find a new ML3 */
goto _Search3;
@@ -765,7 +1339,7 @@ _last_literals:
_dest_overflow:
if (limit == fillOutput) {
- /* Assumption : ip, anchor, ml and ref must be set correctly */
+ /* Assumption : @ip, @anchor, @optr and @m1 must be set correctly */
size_t const ll = (size_t)(ip - anchor);
size_t const ll_addbytes = (ll + 240) / 255;
size_t const ll_totalCost = 1 + ll_addbytes + ll;
@@ -776,10 +1350,10 @@ _dest_overflow:
/* ll validated; now adjust match length */
size_t const bytesLeftForMl = (size_t)(maxLitPos - (op+ll_totalCost));
size_t const maxMlSize = MINMATCH + (ML_MASK-1) + (bytesLeftForMl * 255);
- assert(maxMlSize < INT_MAX); assert(ml >= 0);
- if ((size_t)ml > maxMlSize) ml = (int)maxMlSize;
- if ((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1 + ml >= MFLIMIT) {
- LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, notLimited, oend);
+ assert(maxMlSize < INT_MAX); assert(m1.len >= 0);
+ if ((size_t)m1.len > maxMlSize) m1.len = (int)maxMlSize;
+ if ((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1 + m1.len >= MFLIMIT) {
+ LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), m1.len, m1.off, notLimited, oend);
} }
goto _last_literals;
}
@@ -796,54 +1370,34 @@ static int LZ4HC_compress_optimal( LZ4HC_CCtx_internal* ctx,
const dictCtx_directive dict,
const HCfavor_e favorDecSpeed);
-
-LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal (
- LZ4HC_CCtx_internal* const ctx,
- const char* const src,
- char* const dst,
- int* const srcSizePtr,
- int const dstCapacity,
- int cLevel,
- const limitedOutput_directive limit,
- const dictCtx_directive dict
- )
+LZ4_FORCE_INLINE int
+LZ4HC_compress_generic_internal (
+ LZ4HC_CCtx_internal* const ctx,
+ const char* const src,
+ char* const dst,
+ int* const srcSizePtr,
+ int const dstCapacity,
+ int cLevel,
+ const limitedOutput_directive limit,
+ const dictCtx_directive dict
+ )
{
- typedef enum { lz4hc, lz4opt } lz4hc_strat_e;
- typedef struct {
- lz4hc_strat_e strat;
- int nbSearches;
- U32 targetLength;
- } cParams_t;
- static const cParams_t clTable[LZ4HC_CLEVEL_MAX+1] = {
- { lz4hc, 2, 16 }, /* 0, unused */
- { lz4hc, 2, 16 }, /* 1, unused */
- { lz4hc, 2, 16 }, /* 2, unused */
- { lz4hc, 4, 16 }, /* 3 */
- { lz4hc, 8, 16 }, /* 4 */
- { lz4hc, 16, 16 }, /* 5 */
- { lz4hc, 32, 16 }, /* 6 */
- { lz4hc, 64, 16 }, /* 7 */
- { lz4hc, 128, 16 }, /* 8 */
- { lz4hc, 256, 16 }, /* 9 */
- { lz4opt, 96, 64 }, /*10==LZ4HC_CLEVEL_OPT_MIN*/
- { lz4opt, 512,128 }, /*11 */
- { lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */
- };
-
- DEBUGLOG(4, "LZ4HC_compress_generic(ctx=%p, src=%p, srcSize=%d, limit=%d)",
- ctx, src, *srcSizePtr, limit);
+ DEBUGLOG(5, "LZ4HC_compress_generic_internal(src=%p, srcSize=%d)",
+ src, *srcSizePtr);
if (limit == fillOutput && dstCapacity < 1) return 0; /* Impossible to store anything */
- if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size (too large or negative) */
+ if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size (too large or negative) */
ctx->end += *srcSizePtr;
- if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT; /* note : convention is different from lz4frame, maybe something to review */
- cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel);
- { cParams_t const cParam = clTable[cLevel];
+ { cParams_t const cParam = LZ4HC_getCLevelParams(cLevel);
HCfavor_e const favor = ctx->favorDecSpeed ? favorDecompressionSpeed : favorCompressionRatio;
int result;
- if (cParam.strat == lz4hc) {
+ if (cParam.strat == lz4mid) {
+ result = LZ4MID_compress(ctx,
+ src, dst, srcSizePtr, dstCapacity,
+ limit, dict);
+ } else if (cParam.strat == lz4hc) {
result = LZ4HC_compress_hashChain(ctx,
src, dst, srcSizePtr, dstCapacity,
cParam.nbSearches, limit, dict);
@@ -852,7 +1406,7 @@ LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal (
result = LZ4HC_compress_optimal(ctx,
src, dst, srcSizePtr, dstCapacity,
cParam.nbSearches, cParam.targetLength, limit,
- cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */
+ cLevel >= LZ4HC_CLEVEL_MAX, /* ultra mode */
dict, favor);
}
if (result <= 0) ctx->dirty = 1;
@@ -877,6 +1431,13 @@ LZ4HC_compress_generic_noDictCtx (
return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, noDictCtx);
}
+static int isStateCompatible(const LZ4HC_CCtx_internal* ctx1, const LZ4HC_CCtx_internal* ctx2)
+{
+ int const isMid1 = LZ4HC_getCLevelParams(ctx1->compressionLevel).strat == lz4mid;
+ int const isMid2 = LZ4HC_getCLevelParams(ctx2->compressionLevel).strat == lz4mid;
+ return !(isMid1 ^ isMid2);
+}
+
static int
LZ4HC_compress_generic_dictCtx (
LZ4HC_CCtx_internal* const ctx,
@@ -893,7 +1454,7 @@ LZ4HC_compress_generic_dictCtx (
if (position >= 64 KB) {
ctx->dictCtx = NULL;
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
- } else if (position == 0 && *srcSizePtr > 4 KB) {
+ } else if (position == 0 && *srcSizePtr > 4 KB && isStateCompatible(ctx, ctx->dictCtx)) {
LZ4_memcpy(ctx, ctx->dictCtx, sizeof(LZ4HC_CCtx_internal));
LZ4HC_setExternalDict(ctx, (const BYTE *)src);
ctx->compressionLevel = (short)cLevel;
@@ -965,6 +1526,7 @@ int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, in
LZ4_streamHC_t state;
LZ4_streamHC_t* const statePtr = &state;
#endif
+ DEBUGLOG(5, "LZ4_compress_HC")
cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel);
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
FREEMEM(statePtr);
@@ -1032,18 +1594,16 @@ void LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
{
- DEBUGLOG(4, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel);
- if (LZ4_streamHCPtr->internal_donotuse.dirty) {
+ LZ4HC_CCtx_internal* const s = &LZ4_streamHCPtr->internal_donotuse;
+ DEBUGLOG(5, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel);
+ if (s->dirty) {
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr));
} else {
- /* preserve end - prefixStart : can trigger clearTable's threshold */
- if (LZ4_streamHCPtr->internal_donotuse.end != NULL) {
- LZ4_streamHCPtr->internal_donotuse.end -= (uptrval)LZ4_streamHCPtr->internal_donotuse.prefixStart;
- } else {
- assert(LZ4_streamHCPtr->internal_donotuse.prefixStart == NULL);
- }
- LZ4_streamHCPtr->internal_donotuse.prefixStart = NULL;
- LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL;
+ assert(s->end >= s->prefixStart);
+ s->dictLimit += (U32)(s->end - s->prefixStart);
+ s->prefixStart = NULL;
+ s->end = NULL;
+ s->dictCtx = NULL;
}
LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);
}
@@ -1067,7 +1627,9 @@ int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr,
const char* dictionary, int dictSize)
{
LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;
- DEBUGLOG(4, "LZ4_loadDictHC(ctx:%p, dict:%p, dictSize:%d)", LZ4_streamHCPtr, dictionary, dictSize);
+ cParams_t cp;
+ DEBUGLOG(4, "LZ4_loadDictHC(ctx:%p, dict:%p, dictSize:%d, clevel=%d)", LZ4_streamHCPtr, dictionary, dictSize, ctxPtr->compressionLevel);
+ assert(dictSize >= 0);
assert(LZ4_streamHCPtr != NULL);
if (dictSize > 64 KB) {
dictionary += (size_t)dictSize - 64 KB;
@@ -1077,10 +1639,15 @@ int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr,
{ int const cLevel = ctxPtr->compressionLevel;
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr));
LZ4_setCompressionLevel(LZ4_streamHCPtr, cLevel);
+ cp = LZ4HC_getCLevelParams(cLevel);
}
LZ4HC_init_internal (ctxPtr, (const BYTE*)dictionary);
ctxPtr->end = (const BYTE*)dictionary + dictSize;
- if (dictSize >= 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3);
+ if (cp.strat == lz4mid) {
+ LZ4MID_fillHTable (ctxPtr, dictionary, (size_t)dictSize);
+ } else {
+ if (dictSize >= LZ4HC_HASHSIZE) LZ4HC_Insert (ctxPtr, ctxPtr->end-3);
+ }
return dictSize;
}
@@ -1093,8 +1660,10 @@ void LZ4_attach_HC_dictionary(LZ4_streamHC_t *working_stream, const LZ4_streamHC
static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock)
{
DEBUGLOG(4, "LZ4HC_setExternalDict(%p, %p)", ctxPtr, newBlock);
- if (ctxPtr->end >= ctxPtr->prefixStart + 4)
- LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */
+ if ( (ctxPtr->end >= ctxPtr->prefixStart + 4)
+ && (LZ4HC_getCLevelParams(ctxPtr->compressionLevel).strat != lz4mid) ) {
+ LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */
+ }
/* Only one memory segment for extDict, so any previous extDict is lost at this stage */
ctxPtr->lowLimit = ctxPtr->dictLimit;
@@ -1119,7 +1688,8 @@ LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
LZ4_streamHCPtr, src, *srcSizePtr, limit);
assert(ctxPtr != NULL);
/* auto-init if forgotten */
- if (ctxPtr->prefixStart == NULL) LZ4HC_init_internal (ctxPtr, (const BYTE*) src);
+ if (ctxPtr->prefixStart == NULL)
+ LZ4HC_init_internal (ctxPtr, (const BYTE*) src);
/* Check overflow */
if ((size_t)(ctxPtr->end - ctxPtr->prefixStart) + ctxPtr->dictLimit > 2 GB) {
@@ -1140,7 +1710,8 @@ LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
if (sourceEnd > dictEnd) sourceEnd = dictEnd;
ctxPtr->lowLimit += (U32)(sourceEnd - ctxPtr->dictStart);
ctxPtr->dictStart += (U32)(sourceEnd - ctxPtr->dictStart);
- if (ctxPtr->dictLimit - ctxPtr->lowLimit < 4) {
+ /* invalidate dictionary is it's too small */
+ if (ctxPtr->dictLimit - ctxPtr->lowLimit < LZ4HC_HASHSIZE) {
ctxPtr->lowLimit = ctxPtr->dictLimit;
ctxPtr->dictStart = ctxPtr->prefixStart;
} } }
@@ -1150,6 +1721,7 @@ LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
int LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int srcSize, int dstCapacity)
{
+ DEBUGLOG(5, "LZ4_compress_HC_continue");
if (dstCapacity < LZ4_compressBound(srcSize))
return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput);
else
@@ -1162,7 +1734,6 @@ int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const ch
}
-
/* LZ4_saveDictHC :
* save history content
* into a user-provided buffer
@@ -1179,10 +1750,10 @@ int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictS
if (dictSize > prefixSize) dictSize = prefixSize;
if (safeBuffer == NULL) assert(dictSize == 0);
if (dictSize > 0)
- LZ4_memmove(safeBuffer, streamPtr->end - dictSize, dictSize);
+ LZ4_memmove(safeBuffer, streamPtr->end - dictSize, (size_t)dictSize);
{ U32 const endIndex = (U32)(streamPtr->end - streamPtr->prefixStart) + streamPtr->dictLimit;
- streamPtr->end = (const BYTE*)safeBuffer + dictSize;
- streamPtr->prefixStart = streamPtr->end - dictSize;
+ streamPtr->end = (safeBuffer == NULL) ? NULL : (const BYTE*)safeBuffer + dictSize;
+ streamPtr->prefixStart = (const BYTE*)safeBuffer;
streamPtr->dictLimit = endIndex - (U32)dictSize;
streamPtr->lowLimit = endIndex - (U32)dictSize;
streamPtr->dictStart = streamPtr->prefixStart;
@@ -1193,75 +1764,6 @@ int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictS
}
-/***************************************************
-* Deprecated Functions
-***************************************************/
-
-/* These functions currently generate deprecation warnings */
-
-/* Wrappers for deprecated compression functions */
-int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); }
-int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); }
-int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }
-int LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); }
-int LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); }
-int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); }
-int LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }
-int LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); }
-int LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); }
-int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); }
-
-
-/* Deprecated streaming functions */
-int LZ4_sizeofStreamStateHC(void) { return sizeof(LZ4_streamHC_t); }
-
-/* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t)
- * @return : 0 on success, !=0 if error */
-int LZ4_resetStreamStateHC(void* state, char* inputBuffer)
-{
- LZ4_streamHC_t* const hc4 = LZ4_initStreamHC(state, sizeof(*hc4));
- if (hc4 == NULL) return 1; /* init failed */
- LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
- return 0;
-}
-
-#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
-void* LZ4_createHC (const char* inputBuffer)
-{
- LZ4_streamHC_t* const hc4 = LZ4_createStreamHC();
- if (hc4 == NULL) return NULL; /* not enough memory */
- LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
- return hc4;
-}
-
-int LZ4_freeHC (void* LZ4HC_Data)
-{
- if (!LZ4HC_Data) return 0; /* support free on NULL */
- FREEMEM(LZ4HC_Data);
- return 0;
-}
-#endif
-
-int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel)
-{
- return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited);
-}
-
-int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel)
-{
- return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput);
-}
-
-char* LZ4_slideInputBufferHC(void* LZ4HC_Data)
-{
- LZ4_streamHC_t* const ctx = (LZ4_streamHC_t*)LZ4HC_Data;
- const BYTE* bufferStart = ctx->internal_donotuse.prefixStart - ctx->internal_donotuse.dictLimit + ctx->internal_donotuse.lowLimit;
- LZ4_resetStreamHC_fast(ctx, ctx->internal_donotuse.compressionLevel);
- /* avoid const char * -> char * conversion warning :( */
- return (char*)(uptrval)bufferStart;
-}
-
-
/* ================================================
* LZ4 Optimal parser (levels [LZ4HC_CLEVEL_OPT_MIN - LZ4HC_CLEVEL_MAX])
* ===============================================*/
@@ -1282,7 +1784,6 @@ LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen)
return price;
}
-
/* requires mlen >= MINMATCH */
LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen)
{
@@ -1298,12 +1799,6 @@ LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen)
return price;
}
-
-typedef struct {
- int off;
- int len;
-} LZ4HC_match_t;
-
LZ4_FORCE_INLINE LZ4HC_match_t
LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal* const ctx,
const BYTE* ip, const BYTE* const iHighLimit,
@@ -1311,19 +1806,17 @@ LZ4HC_FindLongerMatch(LZ4HC_CCtx_internal* const ctx,
const dictCtx_directive dict,
const HCfavor_e favorDecSpeed)
{
- LZ4HC_match_t match = { 0 , 0 };
- const BYTE* matchPtr = NULL;
+ LZ4HC_match_t const match0 = { 0 , 0, 0 };
/* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos),
* but this won't be the case here, as we define iLowLimit==ip,
- * so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */
- int matchLength = LZ4HC_InsertAndGetWiderMatch(ctx, ip, ip, iHighLimit, minLen, &matchPtr, &ip, nbSearches, 1 /*patternAnalysis*/, 1 /*chainSwap*/, dict, favorDecSpeed);
- if (matchLength <= minLen) return match;
+ ** so LZ4HC_InsertAndGetWiderMatch() won't be allowed to search past ip */
+ LZ4HC_match_t md = LZ4HC_InsertAndGetWiderMatch(ctx, ip, ip, iHighLimit, minLen, nbSearches, 1 /*patternAnalysis*/, 1 /*chainSwap*/, dict, favorDecSpeed);
+ assert(md.back == 0);
+ if (md.len <= minLen) return match0;
if (favorDecSpeed) {
- if ((matchLength>18) & (matchLength<=36)) matchLength=18; /* favor shortcut */
+ if ((md.len>18) & (md.len<=36)) md.len=18; /* favor dec.speed (shortcut) */
}
- match.len = matchLength;
- match.off = (int)(ip-matchPtr);
- return match;
+ return md;
}
@@ -1356,7 +1849,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
BYTE* opSaved = (BYTE*) dst;
BYTE* oend = op + dstCapacity;
int ovml = MINMATCH; /* overflow - last sequence */
- const BYTE* ovref = NULL;
+ int ovoff = 0;
/* init */
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
@@ -1379,11 +1872,10 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
if ((size_t)firstMatch.len > sufficient_len) {
/* good enough solution : immediate encoding */
int const firstML = firstMatch.len;
- const BYTE* const matchPos = ip - firstMatch.off;
opSaved = op;
- if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, matchPos, limit, oend) ) { /* updates ip, op and anchor */
+ if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, firstMatch.off, limit, oend) ) { /* updates ip, op and anchor */
ovml = firstML;
- ovref = matchPos;
+ ovoff = firstMatch.off;
goto _dest_overflow;
}
continue;
@@ -1401,11 +1893,11 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
rPos, cost, opt[rPos].litlen);
} }
/* set prices using initial match */
- { int mlen = MINMATCH;
- int const matchML = firstMatch.len; /* necessarily < sufficient_len < LZ4_OPT_NUM */
+ { int const matchML = firstMatch.len; /* necessarily < sufficient_len < LZ4_OPT_NUM */
int const offset = firstMatch.off;
+ int mlen;
assert(matchML < LZ4_OPT_NUM);
- for ( ; mlen <= matchML ; mlen++) {
+ for (mlen = MINMATCH ; mlen <= matchML ; mlen++) {
int const cost = LZ4HC_sequencePrice(llen, mlen);
opt[mlen].mlen = mlen;
opt[mlen].off = offset;
@@ -1557,9 +2049,9 @@ encode: /* cur, last_match_pos, best_mlen, best_off must be set */
assert(ml >= MINMATCH);
assert((offset >= 1) && (offset <= LZ4_DISTANCE_MAX));
opSaved = op;
- if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ip - offset, limit, oend) ) { /* updates ip, op and anchor */
+ if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, offset, limit, oend) ) { /* updates ip, op and anchor */
ovml = ml;
- ovref = ip - offset;
+ ovoff = offset;
goto _dest_overflow;
} } }
} /* while (ip <= mflimit) */
@@ -1618,14 +2110,83 @@ if (limit == fillOutput) {
if ((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1 + ovml >= MFLIMIT) {
DEBUGLOG(6, "Space to end : %i + ml (%i)", (int)((oend + LASTLITERALS) - (op + ll_totalCost + 2) - 1), ovml);
DEBUGLOG(6, "Before : ip = %p, anchor = %p", ip, anchor);
- LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ovml, ovref, notLimited, oend);
+ LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ovml, ovoff, notLimited, oend);
DEBUGLOG(6, "After : ip = %p, anchor = %p", ip, anchor);
} }
goto _last_literals;
}
_return_label:
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
- FREEMEM(opt);
+ if (opt) FREEMEM(opt);
#endif
return retval;
}
+
+
+/***************************************************
+* Deprecated Functions
+***************************************************/
+
+/* These functions currently generate deprecation warnings */
+
+/* Wrappers for deprecated compression functions */
+int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); }
+int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); }
+int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }
+int LZ4_compressHC2_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, cLevel); }
+int LZ4_compressHC_withStateHC (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, LZ4_compressBound(srcSize), 0); }
+int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_extStateHC (state, src, dst, srcSize, maxDstSize, 0); }
+int LZ4_compressHC2_withStateHC (void* state, const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }
+int LZ4_compressHC2_limitedOutput_withStateHC (void* state, const char* src, char* dst, int srcSize, int maxDstSize, int cLevel) { return LZ4_compress_HC_extStateHC(state, src, dst, srcSize, maxDstSize, cLevel); }
+int LZ4_compressHC_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, LZ4_compressBound(srcSize)); }
+int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC_continue (ctx, src, dst, srcSize, maxDstSize); }
+
+
+/* Deprecated streaming functions */
+int LZ4_sizeofStreamStateHC(void) { return sizeof(LZ4_streamHC_t); }
+
+/* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t)
+ * @return : 0 on success, !=0 if error */
+int LZ4_resetStreamStateHC(void* state, char* inputBuffer)
+{
+ LZ4_streamHC_t* const hc4 = LZ4_initStreamHC(state, sizeof(*hc4));
+ if (hc4 == NULL) return 1; /* init failed */
+ LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
+ return 0;
+}
+
+#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
+void* LZ4_createHC (const char* inputBuffer)
+{
+ LZ4_streamHC_t* const hc4 = LZ4_createStreamHC();
+ if (hc4 == NULL) return NULL; /* not enough memory */
+ LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
+ return hc4;
+}
+
+int LZ4_freeHC (void* LZ4HC_Data)
+{
+ if (!LZ4HC_Data) return 0; /* support free on NULL */
+ FREEMEM(LZ4HC_Data);
+ return 0;
+}
+#endif
+
+int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel)
+{
+ return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited);
+}
+
+int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel)
+{
+ return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, dstCapacity, cLevel, limitedOutput);
+}
+
+char* LZ4_slideInputBufferHC(void* LZ4HC_Data)
+{
+ LZ4HC_CCtx_internal* const s = &((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse;
+ const BYTE* const bufferStart = s->prefixStart - s->dictLimit + s->lowLimit;
+ LZ4_resetStreamHC_fast((LZ4_streamHC_t*)LZ4HC_Data, s->compressionLevel);
+ /* ugly conversion trick, required to evade (const char*) -> (char*) cast-qual warning :( */
+ return (char*)(uptrval)bufferStart;
+}
diff --git a/contrib/libs/lz4/lz4hc.h b/contrib/libs/lz4/lz4hc.h
index e937acfefd..992bc8cdd7 100644
--- a/contrib/libs/lz4/lz4hc.h
+++ b/contrib/libs/lz4/lz4hc.h
@@ -44,7 +44,7 @@ extern "C" {
/* --- Useful constants --- */
-#define LZ4HC_CLEVEL_MIN 3
+#define LZ4HC_CLEVEL_MIN 2
#define LZ4HC_CLEVEL_DEFAULT 9
#define LZ4HC_CLEVEL_OPT_MIN 10
#define LZ4HC_CLEVEL_MAX 12
@@ -126,6 +126,8 @@ LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);
After reset, a first "fictional block" can be designated as initial dictionary,
using LZ4_loadDictHC() (Optional).
+ Note: In order for LZ4_loadDictHC() to create the correct data structure,
+ it is essential to set the compression level _before_ loading the dictionary.
Invoke LZ4_compress_HC_continue() to compress each successive block.
The number of blocks is unlimited.
@@ -135,12 +137,12 @@ LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);
It's allowed to update compression level anytime between blocks,
using LZ4_setCompressionLevel() (experimental).
- 'dst' buffer should be sized to handle worst case scenarios
+ @dst buffer should be sized to handle worst case scenarios
(see LZ4_compressBound(), it ensures compression success).
In case of failure, the API does not guarantee recovery,
so the state _must_ be reset.
To ensure compression success
- whenever `dst` buffer size cannot be made >= LZ4_compressBound(),
+ whenever @dst buffer size cannot be made >= LZ4_compressBound(),
consider using LZ4_compress_HC_continue_destSize().
Whenever previous input blocks can't be preserved unmodified in-place during compression of next blocks,
@@ -176,6 +178,34 @@ LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr
LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize);
+/*! LZ4_attach_HC_dictionary() : stable since v1.10.0
+ * This API allows for the efficient re-use of a static dictionary many times.
+ *
+ * Rather than re-loading the dictionary buffer into a working context before
+ * each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a
+ * working LZ4_streamHC_t, this function introduces a no-copy setup mechanism,
+ * in which the working stream references the dictionary stream in-place.
+ *
+ * Several assumptions are made about the state of the dictionary stream.
+ * Currently, only streams which have been prepared by LZ4_loadDictHC() should
+ * be expected to work.
+ *
+ * Alternatively, the provided dictionary stream pointer may be NULL, in which
+ * case any existing dictionary stream is unset.
+ *
+ * A dictionary should only be attached to a stream without any history (i.e.,
+ * a stream that has just been reset).
+ *
+ * The dictionary will remain attached to the working stream only for the
+ * current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the
+ * dictionary context association from the working stream. The dictionary
+ * stream (and source buffer) must remain in-place / accessible / unchanged
+ * through the lifetime of the stream session.
+ */
+LZ4LIB_API void
+LZ4_attach_HC_dictionary(LZ4_streamHC_t* working_stream,
+ const LZ4_streamHC_t* dictionary_stream);
+
/*^**********************************************
* !!!!!! STATIC LINKING ONLY !!!!!!
@@ -204,18 +234,18 @@ LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, in
typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal;
struct LZ4HC_CCtx_internal
{
- LZ4_u32 hashTable[LZ4HC_HASHTABLESIZE];
- LZ4_u16 chainTable[LZ4HC_MAXD];
- const LZ4_byte* end; /* next block here to continue on current prefix */
+ LZ4_u32 hashTable[LZ4HC_HASHTABLESIZE];
+ LZ4_u16 chainTable[LZ4HC_MAXD];
+ const LZ4_byte* end; /* next block here to continue on current prefix */
const LZ4_byte* prefixStart; /* Indexes relative to this position */
const LZ4_byte* dictStart; /* alternate reference for extDict */
- LZ4_u32 dictLimit; /* below that point, need extDict */
- LZ4_u32 lowLimit; /* below that point, no more dict */
- LZ4_u32 nextToUpdate; /* index from which to continue dictionary update */
- short compressionLevel;
- LZ4_i8 favorDecSpeed; /* favor decompression speed if this flag set,
- otherwise, favor compression ratio */
- LZ4_i8 dirty; /* stream has to be fully reset if this flag is set */
+ LZ4_u32 dictLimit; /* below that point, need extDict */
+ LZ4_u32 lowLimit; /* below that point, no more history */
+ LZ4_u32 nextToUpdate; /* index from which to continue dictionary update */
+ short compressionLevel;
+ LZ4_i8 favorDecSpeed; /* favor decompression speed if this flag set,
+ otherwise, favor compression ratio */
+ LZ4_i8 dirty; /* stream has to be fully reset if this flag is set */
const LZ4HC_CCtx_internal* dictCtx;
};
@@ -376,35 +406,6 @@ LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset (
int srcSize, int dstCapacity,
int compressionLevel);
-/*! LZ4_attach_HC_dictionary() :
- * This is an experimental API that allows for the efficient use of a
- * static dictionary many times.
- *
- * Rather than re-loading the dictionary buffer into a working context before
- * each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a
- * working LZ4_streamHC_t, this function introduces a no-copy setup mechanism,
- * in which the working stream references the dictionary stream in-place.
- *
- * Several assumptions are made about the state of the dictionary stream.
- * Currently, only streams which have been prepared by LZ4_loadDictHC() should
- * be expected to work.
- *
- * Alternatively, the provided dictionary stream pointer may be NULL, in which
- * case any existing dictionary stream is unset.
- *
- * A dictionary should only be attached to a stream without any history (i.e.,
- * a stream that has just been reset).
- *
- * The dictionary will remain attached to the working stream only for the
- * current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the
- * dictionary context association from the working stream. The dictionary
- * stream (and source buffer) must remain in-place / accessible / unchanged
- * through the lifetime of the stream session.
- */
-LZ4LIB_STATIC_API void LZ4_attach_HC_dictionary(
- LZ4_streamHC_t *working_stream,
- const LZ4_streamHC_t *dictionary_stream);
-
#if defined (__cplusplus)
}
#endif
diff --git a/contrib/libs/lz4/ya.make b/contrib/libs/lz4/ya.make
index 78477250e2..8c8428bca6 100644
--- a/contrib/libs/lz4/ya.make
+++ b/contrib/libs/lz4/ya.make
@@ -6,9 +6,9 @@ LICENSE(BSD-2-Clause)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.9.4)
+VERSION(1.10.0)
-ORIGINAL_SOURCE(https://github.com/lz4/lz4/archive/v1.9.4.tar.gz)
+ORIGINAL_SOURCE(https://github.com/lz4/lz4/archive/v1.10.0.tar.gz)
PEERDIR(
contrib/libs/xxhash
diff --git a/contrib/libs/postgresql/src/include/port/darwin.h b/contrib/libs/postgresql/src/include/port/darwin.h
deleted file mode 100644
index 15fb69d6db..0000000000
--- a/contrib/libs/postgresql/src/include/port/darwin.h
+++ /dev/null
@@ -1,8 +0,0 @@
-/* src/include/port/darwin.h */
-
-#define __darwin__ 1
-
-#if HAVE_DECL_F_FULLFSYNC /* not present before macOS 10.3 */
-#define HAVE_FSYNC_WRITETHROUGH
-
-#endif
diff --git a/contrib/libs/postgresql/src/include/port/linux.h b/contrib/libs/postgresql/src/include/port/linux.h
deleted file mode 100644
index 7a6e46cdbb..0000000000
--- a/contrib/libs/postgresql/src/include/port/linux.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* src/include/port/linux.h */
-
-/*
- * As of July 2007, all known versions of the Linux kernel will sometimes
- * return EIDRM for a shmctl() operation when EINVAL is correct (it happens
- * when the low-order 15 bits of the supplied shm ID match the slot number
- * assigned to a newer shmem segment). We deal with this by assuming that
- * EIDRM means EINVAL in PGSharedMemoryIsInUse(). This is reasonably safe
- * since in fact Linux has no excuse for ever returning EIDRM; it doesn't
- * track removed segments in a way that would allow distinguishing them from
- * private ones. But someday that code might get upgraded, and we'd have
- * to have a kernel version test here.
- */
-#define HAVE_LINUX_EIDRM_BUG
-
-/*
- * Set the default wal_sync_method to fdatasync. With recent Linux versions,
- * xlogdefs.h's normal rules will prefer open_datasync, which (a) doesn't
- * perform better and (b) causes outright failures on ext4 data=journal
- * filesystems, because those don't support O_DIRECT.
- */
-#define PLATFORM_DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC
diff --git a/contrib/libs/postgresql/src/include/port/win32.h b/contrib/libs/postgresql/src/include/port/win32.h
deleted file mode 100644
index c6213c77c3..0000000000
--- a/contrib/libs/postgresql/src/include/port/win32.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* src/include/port/win32.h */
-
-/*
- * We always rely on the WIN32 macro being set by our build system,
- * but _WIN32 is the compiler pre-defined macro. So make sure we define
- * WIN32 whenever _WIN32 is set, to facilitate standalone building.
- */
-#if defined(_WIN32) && !defined(WIN32)
-#define WIN32
-#endif
-
-/*
- * Make sure _WIN32_WINNT has the minimum required value.
- * Leave a higher value in place. When building with at least Visual
- * Studio 2015 the minimum requirement is Windows Vista (0x0600) to
- * get support for GetLocaleInfoEx() with locales. For everything else
- * the minimum version is Windows XP (0x0501).
- */
-#if defined(_MSC_VER) && _MSC_VER >= 1900
-#define MIN_WINNT 0x0600
-#else
-#define MIN_WINNT 0x0501
-#endif
-
-#if defined(_WIN32_WINNT) && _WIN32_WINNT < MIN_WINNT
-#undef _WIN32_WINNT
-#endif
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT MIN_WINNT
-#endif
-
-/*
- * We need to prevent <crtdefs.h> from defining a symbol conflicting with
- * our errcode() function. Since it's likely to get included by standard
- * system headers, pre-emptively include it now.
- */
-#if defined(_MSC_VER) || defined(HAVE_CRTDEFS_H)
-#define errcode __msvc_errcode
-#include <crtdefs.h>
-#undef errcode
-#endif
-
-/*
- * defines for dynamic linking on Win32 platform
- */
-
-/*
- * Variables declared in the core backend and referenced by loadable
- * modules need to be marked "dllimport" in the core build, but
- * "dllexport" when the declaration is read in a loadable module.
- * No special markings should be used when compiling frontend code.
- */
-#ifndef FRONTEND
-#ifdef BUILDING_DLL
-#define PGDLLIMPORT __declspec (dllexport)
-#else
-#define PGDLLIMPORT __declspec (dllimport)
-#endif
-#endif
-
-/*
- * Under MSVC, functions exported by a loadable module must be marked
- * "dllexport". Other compilers don't need that.
- */
-#ifdef _MSC_VER
-#define PGDLLEXPORT __declspec (dllexport)
-#endif
-
-/*
- * Windows headers don't define this structure, but you can define it yourself
- * to use the functionality.
- */
-struct sockaddr_un
-{
- unsigned short sun_family;
- char sun_path[108];
-};
-#define HAVE_STRUCT_SOCKADDR_UN 1
diff --git a/contrib/libs/protobuf/src/google/protobuf/port_def.inc b/contrib/libs/protobuf/src/google/protobuf/port_def.inc
index adba3c8f11..c9ddec03cb 100644
--- a/contrib/libs/protobuf/src/google/protobuf/port_def.inc
+++ b/contrib/libs/protobuf/src/google/protobuf/port_def.inc
@@ -867,6 +867,9 @@
#endif // defined(__clang__) || PROTOBUF_GNUC_MIN(3, 0) || defined(_MSC_VER)
#if defined(__clang__)
+#if defined(FIX_UNUSED_PARAMETR_PLS)
+#pragma clang diagnostic push
+#endif
#pragma clang diagnostic ignored "-Wunused-parameter"
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
#endif // defined(__clang__)
diff --git a/contrib/libs/protobuf/src/google/protobuf/port_undef.inc b/contrib/libs/protobuf/src/google/protobuf/port_undef.inc
index e880fa5c59..fb22215ee8 100644
--- a/contrib/libs/protobuf/src/google/protobuf/port_undef.inc
+++ b/contrib/libs/protobuf/src/google/protobuf/port_undef.inc
@@ -154,6 +154,10 @@
#pragma GCC diagnostic pop
#endif
+#if defined(__clang__) && defined(FIX_UNUSED_PARAMETR_PLS)
+#pragma clang diagnostic pop
+#endif
+
// Pop the warning(push) from port_def.inc
#ifdef _MSC_VER
#pragma warning(pop)
diff --git a/contrib/libs/protobuf/ya.make b/contrib/libs/protobuf/ya.make
index ec90ec4cd6..5c676496d2 100644
--- a/contrib/libs/protobuf/ya.make
+++ b/contrib/libs/protobuf/ya.make
@@ -57,6 +57,10 @@ IF (OS_ANDROID)
EXTRALIBS(log)
ENDIF()
+IF (FIX_UNUSED_PARAMETR_PLS)
+ GLOBAL_CFLAGS(-DFIX_UNUSED_PARAMETR_PLS=yes)
+ENDIF()
+
SRCS(
GLOBAL src/google/protobuf/generated_message_util.cc
src/google/protobuf/any.cc
diff --git a/contrib/libs/protoc/src/google/protobuf/compiler/cpp/cpp_helpers.h b/contrib/libs/protoc/src/google/protobuf/compiler/cpp/cpp_helpers.h
deleted file mode 100644
index fe2ff1369a..0000000000
--- a/contrib/libs/protoc/src/google/protobuf/compiler/cpp/cpp_helpers.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "helpers.h" \ No newline at end of file
diff --git a/contrib/python/Flask/py3/flask/scaffold.py b/contrib/python/Flask/py3/flask/scaffold.py
index a58941c01d..8f301d9001 100644
--- a/contrib/python/Flask/py3/flask/scaffold.py
+++ b/contrib/python/Flask/py3/flask/scaffold.py
@@ -10,7 +10,7 @@ from functools import update_wrapper
from json import JSONDecoder
from json import JSONEncoder
-from jinja2 import ChoiceLoader, FileSystemLoader, ResourceLoader
+from jinja2 import ChoiceLoader, FileSystemLoader, ResourceLoader, PackageLoader
from werkzeug.exceptions import default_exceptions
from werkzeug.exceptions import HTTPException
@@ -359,6 +359,7 @@ class Scaffold:
if self.template_folder is not None:
return ChoiceLoader([
FileSystemLoader(os.path.join(self.root_path, self.template_folder)),
+ PackageLoader(self.import_name, self.template_folder, skip_unknown_package=True),
ResourceLoader(os.path.join(self._builtin_resource_prefix, self.template_folder), self.module_loader),
])
else:
diff --git a/contrib/python/Jinja2/py3/jinja2/loaders.py b/contrib/python/Jinja2/py3/jinja2/loaders.py
index b69ef29859..24951c35d2 100644
--- a/contrib/python/Jinja2/py3/jinja2/loaders.py
+++ b/contrib/python/Jinja2/py3/jinja2/loaders.py
@@ -279,6 +279,7 @@ class PackageLoader(BaseLoader):
package_name: str,
package_path: "str" = "templates",
encoding: str = "utf-8",
+ skip_unknown_package: bool = False,
) -> None:
package_path = os.path.normpath(package_path).rstrip(os.path.sep)
@@ -291,10 +292,17 @@ class PackageLoader(BaseLoader):
self.package_path = package_path
self.package_name = package_name
self.encoding = encoding
+ self.skip_unknown_package = skip_unknown_package
# Make sure the package exists. This also makes namespace
# packages work, otherwise get_loader returns None.
- package = import_module(package_name)
+ try:
+ package = import_module(package_name)
+ except ModuleNotFoundError:
+ if skip_unknown_package:
+ self._template_root = None
+ return
+ raise
spec = importlib.util.find_spec(package_name)
assert spec is not None, "An import spec was not found for the package."
loader = spec.loader
@@ -339,6 +347,9 @@ class PackageLoader(BaseLoader):
def get_source(
self, environment: "Environment", template: str
) -> t.Tuple[str, str, t.Optional[t.Callable[[], bool]]]:
+ if self._template_root is None and self.skip_unknown_package:
+ raise TemplateNotFound(template)
+
# Use posixpath even on Windows to avoid "drive:" or UNC
# segments breaking out of the search directory. Use normpath to
# convert Windows altsep to sep.
@@ -386,6 +397,9 @@ class PackageLoader(BaseLoader):
def list_templates(self) -> t.List[str]:
results: t.List[str] = []
+ if self._template_root is None and self.skip_unknown_package:
+ return results
+
if self._archive is None and hasattr(self, "_package"):
prefix = os.path.join(self._template_root, self.package_path).encode() + b"/"
for name in arcadia_res.resfs_files(prefix):
diff --git a/contrib/python/cachetools/py3/.dist-info/METADATA b/contrib/python/cachetools/py3/.dist-info/METADATA
index 5846ebf167..6b6a201551 100644
--- a/contrib/python/cachetools/py3/.dist-info/METADATA
+++ b/contrib/python/cachetools/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: cachetools
-Version: 5.3.3
+Version: 5.4.0
Summary: Extensible memoizing collections and decorators
Home-page: https://github.com/tkem/cachetools/
Author: Thomas Kemmer
diff --git a/contrib/python/cachetools/py3/cachetools/__init__.py b/contrib/python/cachetools/py3/cachetools/__init__.py
index 341c1c7ff0..5a9a042cbd 100644
--- a/contrib/python/cachetools/py3/cachetools/__init__.py
+++ b/contrib/python/cachetools/py3/cachetools/__init__.py
@@ -13,7 +13,7 @@ __all__ = (
"cachedmethod",
)
-__version__ = "5.3.3"
+__version__ = "5.4.0"
import collections
import collections.abc
@@ -241,6 +241,10 @@ class MRUCache(Cache):
"""Most Recently Used (MRU) cache implementation."""
def __init__(self, maxsize, getsizeof=None):
+ from warnings import warn
+
+ warn("MRUCache is deprecated", DeprecationWarning, stacklevel=2)
+
Cache.__init__(self, maxsize, getsizeof)
self.__order = collections.OrderedDict()
diff --git a/contrib/python/cachetools/py3/cachetools/func.py b/contrib/python/cachetools/py3/cachetools/func.py
index 0c09a60b49..3eafddf113 100644
--- a/contrib/python/cachetools/py3/cachetools/func.py
+++ b/contrib/python/cachetools/py3/cachetools/func.py
@@ -82,6 +82,10 @@ def mru_cache(maxsize=128, typed=False):
up to `maxsize` results based on a Most Recently Used (MRU)
algorithm.
"""
+ from warnings import warn
+
+ warn("@mru_cache is deprecated", DeprecationWarning, stacklevel=2)
+
if maxsize is None:
return _cache({}, None, typed)
elif callable(maxsize):
diff --git a/contrib/python/cachetools/py3/cachetools/keys.py b/contrib/python/cachetools/py3/cachetools/keys.py
index f2feb4182b..8689b17b9d 100644
--- a/contrib/python/cachetools/py3/cachetools/keys.py
+++ b/contrib/python/cachetools/py3/cachetools/keys.py
@@ -1,6 +1,6 @@
"""Key functions for memoizing decorators."""
-__all__ = ("hashkey", "methodkey", "typedkey")
+__all__ = ("hashkey", "methodkey", "typedkey", "typedmethodkey")
class _HashedTuple(tuple):
@@ -55,3 +55,8 @@ def typedkey(*args, **kwargs):
key += tuple(type(v) for v in args)
key += tuple(type(v) for _, v in sorted(kwargs.items()))
return key
+
+
+def typedmethodkey(self, *args, **kwargs):
+ """Return a typed cache key for use with cached methods."""
+ return typedkey(*args, **kwargs)
diff --git a/contrib/python/cachetools/py3/ya.make b/contrib/python/cachetools/py3/ya.make
index 71b6f19603..ac118e7e26 100644
--- a/contrib/python/cachetools/py3/ya.make
+++ b/contrib/python/cachetools/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(5.3.3)
+VERSION(5.4.0)
LICENSE(MIT)
diff --git a/contrib/python/clickhouse-connect/.dist-info/METADATA b/contrib/python/clickhouse-connect/.dist-info/METADATA
index dac0751d94..7a4ae1cbbf 100644
--- a/contrib/python/clickhouse-connect/.dist-info/METADATA
+++ b/contrib/python/clickhouse-connect/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: clickhouse-connect
-Version: 0.7.15
+Version: 0.7.16
Summary: ClickHouse Database Core Driver for Python, Pandas, and Superset
Home-page: https://github.com/ClickHouse/clickhouse-connect
Author: ClickHouse Inc.
@@ -39,14 +39,14 @@ Requires-Dist: tzlocal >=4.0 ; extra == 'tzlocal'
## ClickHouse Connect
A high performance core database driver for connecting ClickHouse to Python, Pandas, and Superset
+
* Pandas DataFrames
* Numpy Arrays
* PyArrow Tables
* Superset Connector
* SQLAlchemy 1.3 and 1.4 (limited feature set)
-ClickHouse Connect currently uses the ClickHouse HTTP interface for maximum compatibility.
-
+ClickHouse Connect currently uses the ClickHouse HTTP interface for maximum compatibility.
### Installation
@@ -54,28 +54,30 @@ ClickHouse Connect currently uses the ClickHouse HTTP interface for maximum comp
pip install clickhouse-connect
```
-ClickHouse Connect requires Python 3.8 or higher.
-
+ClickHouse Connect requires Python 3.8 or higher.
### Superset Connectivity
-ClickHouse Connect is fully integrated with Apache Superset. Previous versions of ClickHouse Connect utilized a
+
+ClickHouse Connect is fully integrated with Apache Superset. Previous versions of ClickHouse Connect utilized a
dynamically loaded Superset Engine Spec, but as of Superset v2.1.0 the engine spec was incorporated into the main
-Apache Superset project and removed from clickhouse-connect in v0.6.0. If you have issues connecting to earlier
+Apache Superset project and removed from clickhouse-connect in v0.6.0. If you have issues connecting to earlier
versions of Superset, please use clickhouse-connect v0.5.25.
When creating a Superset Data Source, either use the provided connection dialog, or a SqlAlchemy DSN in the form
`clickhousedb://{username}:{password}@{host}:{port}`.
-
### SQLAlchemy Implementation
+
ClickHouse Connect incorporates a minimal SQLAlchemy implementation (without any ORM features) for compatibility with
-Superset. It has only been tested against SQLAlchemy versions 1.3.x and 1.4.x, and is unlikely to work with more
+Superset. It has only been tested against SQLAlchemy versions 1.3.x and 1.4.x, and is unlikely to work with more
complex SQLAlchemy applications.
+### Asyncio Support
+
+ClickHouse Connect provides an async wrapper, so that it is possible to use the client in an `asyncio` environment.
+See the [run_async example](./examples/run_async.py) for more details.
### Complete Documentation
+
The documentation for ClickHouse Connect has moved to
[ClickHouse Docs](https://clickhouse.com/docs/en/integrations/language-clients/python/intro)
-
-
-
diff --git a/contrib/python/clickhouse-connect/README.md b/contrib/python/clickhouse-connect/README.md
index 59f419e3f2..58defa499d 100644
--- a/contrib/python/clickhouse-connect/README.md
+++ b/contrib/python/clickhouse-connect/README.md
@@ -1,14 +1,14 @@
## ClickHouse Connect
A high performance core database driver for connecting ClickHouse to Python, Pandas, and Superset
+
* Pandas DataFrames
* Numpy Arrays
* PyArrow Tables
* Superset Connector
* SQLAlchemy 1.3 and 1.4 (limited feature set)
-ClickHouse Connect currently uses the ClickHouse HTTP interface for maximum compatibility.
-
+ClickHouse Connect currently uses the ClickHouse HTTP interface for maximum compatibility.
### Installation
@@ -16,28 +16,30 @@ ClickHouse Connect currently uses the ClickHouse HTTP interface for maximum comp
pip install clickhouse-connect
```
-ClickHouse Connect requires Python 3.8 or higher.
-
+ClickHouse Connect requires Python 3.8 or higher.
### Superset Connectivity
-ClickHouse Connect is fully integrated with Apache Superset. Previous versions of ClickHouse Connect utilized a
+
+ClickHouse Connect is fully integrated with Apache Superset. Previous versions of ClickHouse Connect utilized a
dynamically loaded Superset Engine Spec, but as of Superset v2.1.0 the engine spec was incorporated into the main
-Apache Superset project and removed from clickhouse-connect in v0.6.0. If you have issues connecting to earlier
+Apache Superset project and removed from clickhouse-connect in v0.6.0. If you have issues connecting to earlier
versions of Superset, please use clickhouse-connect v0.5.25.
When creating a Superset Data Source, either use the provided connection dialog, or a SqlAlchemy DSN in the form
`clickhousedb://{username}:{password}@{host}:{port}`.
-
### SQLAlchemy Implementation
+
ClickHouse Connect incorporates a minimal SQLAlchemy implementation (without any ORM features) for compatibility with
-Superset. It has only been tested against SQLAlchemy versions 1.3.x and 1.4.x, and is unlikely to work with more
+Superset. It has only been tested against SQLAlchemy versions 1.3.x and 1.4.x, and is unlikely to work with more
complex SQLAlchemy applications.
+### Asyncio Support
+
+ClickHouse Connect provides an async wrapper, so that it is possible to use the client in an `asyncio` environment.
+See the [run_async example](./examples/run_async.py) for more details.
### Complete Documentation
+
The documentation for ClickHouse Connect has moved to
[ClickHouse Docs](https://clickhouse.com/docs/en/integrations/language-clients/python/intro)
-
-
-
diff --git a/contrib/python/clickhouse-connect/clickhouse_connect/__init__.py b/contrib/python/clickhouse-connect/clickhouse_connect/__init__.py
index 81ee6dd3a0..737aed5b34 100644
--- a/contrib/python/clickhouse-connect/clickhouse_connect/__init__.py
+++ b/contrib/python/clickhouse-connect/clickhouse_connect/__init__.py
@@ -1,6 +1,6 @@
-from clickhouse_connect.driver import create_client
-
+from clickhouse_connect.driver import create_client, create_async_client
driver_name = 'clickhousedb'
get_client = create_client
+get_async_client = create_async_client
diff --git a/contrib/python/clickhouse-connect/clickhouse_connect/__version__.py b/contrib/python/clickhouse-connect/clickhouse_connect/__version__.py
index 8dec87cb67..d9a123ac6c 100644
--- a/contrib/python/clickhouse-connect/clickhouse_connect/__version__.py
+++ b/contrib/python/clickhouse-connect/clickhouse_connect/__version__.py
@@ -1 +1 @@
-version = '0.7.15'
+version = '0.7.16'
diff --git a/contrib/python/clickhouse-connect/clickhouse_connect/driver/__init__.py b/contrib/python/clickhouse-connect/clickhouse_connect/driver/__init__.py
index 2f0b11b132..27e16733d8 100644
--- a/contrib/python/clickhouse-connect/clickhouse_connect/driver/__init__.py
+++ b/contrib/python/clickhouse-connect/clickhouse_connect/driver/__init__.py
@@ -1,3 +1,4 @@
+import asyncio
from inspect import signature
from typing import Optional, Union, Dict, Any
from urllib.parse import urlparse, parse_qs
@@ -7,6 +8,7 @@ from clickhouse_connect.driver.client import Client
from clickhouse_connect.driver.common import dict_copy
from clickhouse_connect.driver.exceptions import ProgrammingError
from clickhouse_connect.driver.httpclient import HttpClient
+from clickhouse_connect.driver.asyncclient import AsyncClient
# pylint: disable=too-many-arguments,too-many-locals,too-many-branches
@@ -68,6 +70,7 @@ def create_client(*,
:param server_host_name This is the server host name that will be checked against a TLS certificate for
validity. This option can be used if using an ssh_tunnel or other indirect means to an ClickHouse server
where the `host` argument refers to the tunnel or proxy and not the actual ClickHouse server
+ :param autogenerate_session_id If set, this will override the 'autogenerate_session_id' common setting.
:return: ClickHouse Connect Client instance
"""
if dsn:
@@ -117,3 +120,78 @@ def default_port(interface: str, secure: bool):
if interface.startswith('http'):
return 8443 if secure else 8123
raise ValueError('Unrecognized ClickHouse interface')
+
+
+async def create_async_client(*,
+ host: str = None,
+ username: str = None,
+ password: str = '',
+ database: str = '__default__',
+ interface: Optional[str] = None,
+ port: int = 0,
+ secure: Union[bool, str] = False,
+ dsn: Optional[str] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ generic_args: Optional[Dict[str, Any]] = None,
+ **kwargs) -> AsyncClient:
+ """
+ The preferred method to get an async ClickHouse Connect Client instance.
+ For sync version, see create_client.
+
+ Unlike sync version, the 'autogenerate_session_id' setting by default is False.
+
+ :param host: The hostname or IP address of the ClickHouse server. If not set, localhost will be used.
+ :param username: The ClickHouse username. If not set, the default ClickHouse user will be used.
+ :param password: The password for username.
+ :param database: The default database for the connection. If not set, ClickHouse Connect will use the
+ default database for username.
+ :param interface: Must be http or https. Defaults to http, or to https if port is set to 8443 or 443
+ :param port: The ClickHouse HTTP or HTTPS port. If not set will default to 8123, or to 8443 if secure=True
+ or interface=https.
+ :param secure: Use https/TLS. This overrides inferred values from the interface or port arguments.
+ :param dsn: A string in standard DSN (Data Source Name) format. Other connection values (such as host or user)
+ will be extracted from this string if not set otherwise.
+ :param settings: ClickHouse server settings to be used with the session/every request
+ :param generic_args: Used internally to parse DBAPI connection strings into keyword arguments and ClickHouse settings.
+ It is not recommended to use this parameter externally
+ :param kwargs -- Recognized keyword arguments (used by the HTTP client), see below
+
+ :param compress: Enable compression for ClickHouse HTTP inserts and query results. True will select the preferred
+ compression method (lz4). A str of 'lz4', 'zstd', 'brotli', or 'gzip' can be used to use a specific compression type
+ :param query_limit: Default LIMIT on returned rows. 0 means no limit
+ :param connect_timeout: Timeout in seconds for the http connection
+ :param send_receive_timeout: Read timeout in seconds for http connection
+ :param client_name: client_name prepended to the HTTP User Agent header. Set this to track client queries
+ in the ClickHouse system.query_log.
+ :param send_progress: Deprecated, has no effect. Previous functionality is now automatically determined
+ :param verify: Verify the server certificate in secure/https mode
+ :param ca_cert: If verify is True, the file path to Certificate Authority root to validate ClickHouse server
+ certificate, in .pem format. Ignored if verify is False. This is not necessary if the ClickHouse server
+ certificate is trusted by the operating system. To trust the maintained list of "global" public root
+ certificates maintained by the Python 'certifi' package, set ca_cert to 'certifi'
+ :param client_cert: File path to a TLS Client certificate in .pem format. This file should contain any
+ applicable intermediate certificates
+ :param client_cert_key: File path to the private key for the Client Certificate. Required if the private key
+ is not included the Client Certificate key file
+ :param session_id ClickHouse session id. If not specified and the common setting 'autogenerate_session_id'
+ is True, the client will generate a UUID1 session id
+ :param pool_mgr Optional urllib3 PoolManager for this client. Useful for creating separate connection
+ pools for multiple client endpoints for applications with many clients
+ :param http_proxy http proxy address. Equivalent to setting the HTTP_PROXY environment variable
+ :param https_proxy https proxy address. Equivalent to setting the HTTPS_PROXY environment variable
+ :param server_host_name This is the server host name that will be checked against a TLS certificate for
+ validity. This option can be used if using an ssh_tunnel or other indirect means to an ClickHouse server
+ where the `host` argument refers to the tunnel or proxy and not the actual ClickHouse server
+ :param autogenerate_session_id If set, this will override the 'autogenerate_session_id' common setting.
+ :return: ClickHouse Connect Client instance
+ """
+
+ def _create_client():
+ if 'autogenerate_session_id' not in kwargs:
+ kwargs['autogenerate_session_id'] = False
+ return create_client(host=host, username=username, password=password, database=database, interface=interface,
+ port=port, secure=secure, dsn=dsn, settings=settings, generic_args=generic_args, **kwargs)
+
+ loop = asyncio.get_running_loop()
+ _client = await loop.run_in_executor(None, _create_client)
+ return AsyncClient(client=_client)
diff --git a/contrib/python/clickhouse-connect/clickhouse_connect/driver/asyncclient.py b/contrib/python/clickhouse-connect/clickhouse_connect/driver/asyncclient.py
new file mode 100644
index 0000000000..1a4ee7e429
--- /dev/null
+++ b/contrib/python/clickhouse-connect/clickhouse_connect/driver/asyncclient.py
@@ -0,0 +1,663 @@
+import asyncio
+import io
+from datetime import tzinfo
+from typing import Optional, Union, Dict, Any, Sequence, Iterable, Generator, BinaryIO
+
+from clickhouse_connect.driver.client import Client
+from clickhouse_connect.driver.common import StreamContext
+from clickhouse_connect.driver.external import ExternalData
+from clickhouse_connect.driver.query import QueryContext, QueryResult
+from clickhouse_connect.driver.summary import QuerySummary
+from clickhouse_connect.datatypes.base import ClickHouseType
+from clickhouse_connect.driver.insert import InsertContext
+
+
+# pylint: disable=too-many-public-methods, too-many-instance-attributes, too-many-arguments, too-many-locals
+class AsyncClient:
+ """
+ AsyncClient is a wrapper around the ClickHouse Client object that allows for async calls to the ClickHouse server.
+ Internally, each of the methods that uses IO is wrapped in a call to EventLoop.run_in_executor.
+ """
+
+ def __init__(self, *, client: Client):
+ self.client = client
+
+ def set_client_setting(self, key, value):
+ """
+ Set a clickhouse setting for the client after initialization. If a setting is not recognized by ClickHouse,
+ or the setting is identified as "read_only", this call will either throw a Programming exception or attempt
+ to send the setting anyway based on the common setting 'invalid_setting_action'.
+ :param key: ClickHouse setting name
+ :param value: ClickHouse setting value
+ """
+ self.client.set_client_setting(key=key, value=value)
+
+ def get_client_setting(self, key) -> Optional[str]:
+ """
+ :param key: The setting key
+ :return: The string value of the setting, if it exists, or None
+ """
+ return self.client.get_client_setting(key=key)
+
+ def min_version(self, version_str: str) -> bool:
+ """
+ Determine whether the connected server is at least the submitted version
+ For Altinity Stable versions like 22.8.15.25.altinitystable
+ the last condition in the first list comprehension expression is added
+ :param version_str: A version string consisting of up to 4 integers delimited by dots
+ :return: True if version_str is greater than the server_version, False if less than
+ """
+ return self.client.min_version(version_str)
+
+ def close(self):
+ """
+ Subclass implementation to close the connection to the server/deallocate the client
+ """
+ self.client.close()
+
+ async def query(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ column_oriented: Optional[bool] = None,
+ use_numpy: Optional[bool] = None,
+ max_str_len: Optional[int] = None,
+ context: QueryContext = None,
+ query_tz: Optional[Union[str, tzinfo]] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ external_data: Optional[ExternalData] = None) -> QueryResult:
+ """
+ Main query method for SELECT, DESCRIBE and other SQL statements that return a result matrix.
+ For parameters, see the create_query_context method.
+ :return: QueryResult -- data and metadata from response
+ """
+
+ def _query():
+ return self.client.query(query=query, parameters=parameters, settings=settings, query_formats=query_formats,
+ column_formats=column_formats, encoding=encoding, use_none=use_none,
+ column_oriented=column_oriented, use_numpy=use_numpy, max_str_len=max_str_len,
+ context=context, query_tz=query_tz, column_tzs=column_tzs,
+ external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query)
+ return result
+
+ async def query_column_block_stream(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ context: QueryContext = None,
+ query_tz: Optional[Union[str, tzinfo]] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ external_data: Optional[ExternalData] = None) -> StreamContext:
+ """
+ Variation of main query method that returns a stream of column oriented blocks.
+ For parameters, see the create_query_context method.
+ :return: StreamContext -- Iterable stream context that returns column oriented blocks
+ """
+
+ def _query_column_block_stream():
+ return self.client.query_column_block_stream(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats,
+ encoding=encoding, use_none=use_none, context=context,
+ query_tz=query_tz, column_tzs=column_tzs,
+ external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_column_block_stream)
+ return result
+
+ async def query_row_block_stream(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ context: QueryContext = None,
+ query_tz: Optional[Union[str, tzinfo]] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ external_data: Optional[ExternalData] = None) -> StreamContext:
+ """
+ Variation of main query method that returns a stream of row oriented blocks.
+ For parameters, see the create_query_context method.
+ :return: StreamContext -- Iterable stream context that returns blocks of rows
+ """
+
+ def _query_row_block_stream():
+ return self.client.query_row_block_stream(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats,
+ encoding=encoding, use_none=use_none, context=context,
+ query_tz=query_tz, column_tzs=column_tzs,
+ external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_row_block_stream)
+ return result
+
+ async def query_rows_stream(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ context: QueryContext = None,
+ query_tz: Optional[Union[str, tzinfo]] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ external_data: Optional[ExternalData] = None) -> StreamContext:
+ """
+ Variation of main query method that returns a stream of row oriented blocks.
+ For parameters, see the create_query_context method.
+ :return: StreamContext -- Iterable stream context that returns blocks of rows
+ """
+
+ def _query_rows_stream():
+ return self.client.query_rows_stream(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats,
+ encoding=encoding, use_none=use_none, context=context,
+ query_tz=query_tz, column_tzs=column_tzs,
+ external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_rows_stream)
+ return result
+
+ async def raw_query(self,
+ query: str,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ fmt: str = None,
+ use_database: bool = True,
+ external_data: Optional[ExternalData] = None) -> bytes:
+ """
+ Query method that simply returns the raw ClickHouse format bytes.
+ :param query: Query statement/format string
+ :param parameters: Optional dictionary used to format the query
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param fmt: ClickHouse output format
+ :param use_database Send the database parameter to ClickHouse so the command will be executed in the client
+ database context
+ :param external_data External data to send with the query
+ :return: bytes representing raw ClickHouse return value based on format
+ """
+
+ def _raw_query():
+ return self.client.raw_query(query=query, parameters=parameters, settings=settings, fmt=fmt,
+ use_database=use_database, external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _raw_query)
+ return result
+
+ async def raw_stream(self, query: str,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ fmt: str = None,
+ use_database: bool = True,
+ external_data: Optional[ExternalData] = None) -> io.IOBase:
+ """
+ Query method that returns the result as an io.IOBase iterator.
+ :param query: Query statement/format string
+ :param parameters: Optional dictionary used to format the query
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param fmt: ClickHouse output format
+ :param use_database Send the database parameter to ClickHouse so the command will be executed in the client
+ database context
+ :param external_data External data to send with the query
+ :return: io.IOBase stream/iterator for the result
+ """
+
+ def _raw_stream():
+ return self.client.raw_stream(query=query, parameters=parameters, settings=settings, fmt=fmt,
+ use_database=use_database, external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _raw_stream)
+ return result
+
+ async def query_np(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, str]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ max_str_len: Optional[int] = None,
+ context: QueryContext = None,
+ external_data: Optional[ExternalData] = None):
+ """
+ Query method that returns the results as a numpy array.
+ For parameter values, see the create_query_context method.
+ :return: Numpy array representing the result set
+ """
+
+ def _query_np():
+ return self.client.query_np(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats, encoding=encoding,
+ use_none=use_none, max_str_len=max_str_len, context=context,
+ external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_np)
+ return result
+
+ async def query_np_stream(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, str]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ max_str_len: Optional[int] = None,
+ context: QueryContext = None,
+ external_data: Optional[ExternalData] = None) -> StreamContext:
+ """
+ Query method that returns the results as a stream of numpy arrays.
+ For parameter values, see the create_query_context method.
+ :return: Generator that yield a numpy array per block representing the result set
+ """
+
+ def _query_np_stream():
+ return self.client.query_np_stream(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats,
+ encoding=encoding, use_none=use_none, max_str_len=max_str_len,
+ context=context, external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_np_stream)
+ return result
+
+ async def query_df(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, str]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ max_str_len: Optional[int] = None,
+ use_na_values: Optional[bool] = None,
+ query_tz: Optional[str] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ context: QueryContext = None,
+ external_data: Optional[ExternalData] = None,
+ use_extended_dtypes: Optional[bool] = None):
+ """
+ Query method that results the results as a pandas dataframe.
+ For parameter values, see the create_query_context method.
+ :return: Pandas dataframe representing the result set
+ """
+
+ def _query_df():
+ return self.client.query_df(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats, encoding=encoding,
+ use_none=use_none, max_str_len=max_str_len, use_na_values=use_na_values,
+ query_tz=query_tz, column_tzs=column_tzs, context=context,
+ external_data=external_data, use_extended_dtypes=use_extended_dtypes)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_df)
+ return result
+
+ async def query_df_stream(self,
+ query: Optional[str] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, str]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ max_str_len: Optional[int] = None,
+ use_na_values: Optional[bool] = None,
+ query_tz: Optional[str] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ context: QueryContext = None,
+ external_data: Optional[ExternalData] = None,
+ use_extended_dtypes: Optional[bool] = None) -> StreamContext:
+ """
+ Query method that returns the results as a StreamContext.
+ For parameter values, see the create_query_context method.
+ :return: Generator that yields a Pandas dataframe per block representing the result set
+ """
+
+ def _query_df_stream():
+ return self.client.query_df_stream(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats,
+ encoding=encoding,
+ use_none=use_none, max_str_len=max_str_len, use_na_values=use_na_values,
+ query_tz=query_tz, column_tzs=column_tzs, context=context,
+ external_data=external_data, use_extended_dtypes=use_extended_dtypes)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_df_stream)
+ return result
+
+ def create_query_context(self,
+ query: Optional[Union[str, bytes]] = None,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ query_formats: Optional[Dict[str, str]] = None,
+ column_formats: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
+ encoding: Optional[str] = None,
+ use_none: Optional[bool] = None,
+ column_oriented: Optional[bool] = None,
+ use_numpy: Optional[bool] = False,
+ max_str_len: Optional[int] = 0,
+ context: Optional[QueryContext] = None,
+ query_tz: Optional[Union[str, tzinfo]] = None,
+ column_tzs: Optional[Dict[str, Union[str, tzinfo]]] = None,
+ use_na_values: Optional[bool] = None,
+ streaming: bool = False,
+ as_pandas: bool = False,
+ external_data: Optional[ExternalData] = None,
+ use_extended_dtypes: Optional[bool] = None) -> QueryContext:
+ """
+ Creates or updates a reusable QueryContext object
+ :param query: Query statement/format string
+ :param parameters: Optional dictionary used to format the query
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param query_formats: See QueryContext __init__ docstring
+ :param column_formats: See QueryContext __init__ docstring
+ :param encoding: See QueryContext __init__ docstring
+ :param use_none: Use None for ClickHouse NULL instead of default values. Note that using None in Numpy
+ arrays will force the numpy array dtype to 'object', which is often inefficient. This effect also
+ will impact the performance of Pandas dataframes.
+ :param column_oriented: Deprecated. Controls orientation of the QueryResult result_set property
+ :param use_numpy: Return QueryResult columns as one-dimensional numpy arrays
+ :param max_str_len: Limit returned ClickHouse String values to this length, which allows a Numpy
+ structured array even with ClickHouse variable length String columns. If 0, Numpy arrays for
+ String columns will always be object arrays
+ :param context: An existing QueryContext to be updated with any provided parameter values
+ :param query_tz Either a string or a pytz tzinfo object. (Strings will be converted to tzinfo objects).
+ Values for any DateTime or DateTime64 column in the query will be converted to Python datetime.datetime
+ objects with the selected timezone
+ :param column_tzs A dictionary of column names to tzinfo objects (or strings that will be converted to
+ tzinfo objects). The timezone will be applied to datetime objects returned in the query
+ :param use_na_values: Deprecated alias for use_advanced_dtypes
+ :param as_pandas Return the result columns as pandas.Series objects
+ :param streaming Marker used to correctly configure streaming queries
+ :param external_data ClickHouse "external data" to send with query
+ :param use_extended_dtypes: Only relevant to Pandas Dataframe queries. Use Pandas "missing types", such as
+ pandas.NA and pandas.NaT for ClickHouse NULL values, as well as extended Pandas dtypes such as IntegerArray
+ and StringArray. Defaulted to True for query_df methods
+ :return: Reusable QueryContext
+ """
+
+ return self.client.create_query_context(query=query, parameters=parameters, settings=settings,
+ query_formats=query_formats, column_formats=column_formats,
+ encoding=encoding, use_none=use_none,
+ column_oriented=column_oriented,
+ use_numpy=use_numpy, max_str_len=max_str_len, context=context,
+ query_tz=query_tz, column_tzs=column_tzs,
+ use_na_values=use_na_values,
+ streaming=streaming, as_pandas=as_pandas,
+ external_data=external_data,
+ use_extended_dtypes=use_extended_dtypes)
+
+ async def query_arrow(self,
+ query: str,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ use_strings: Optional[bool] = None,
+ external_data: Optional[ExternalData] = None):
+ """
+ Query method using the ClickHouse Arrow format to return a PyArrow table
+ :param query: Query statement/format string
+ :param parameters: Optional dictionary used to format the query
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param use_strings: Convert ClickHouse String type to Arrow string type (instead of binary)
+ :param external_data ClickHouse "external data" to send with query
+ :return: PyArrow.Table
+ """
+
+ def _query_arrow():
+ return self.client.query_arrow(query=query, parameters=parameters, settings=settings,
+ use_strings=use_strings, external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_arrow)
+ return result
+
+ async def query_arrow_stream(self,
+ query: str,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ settings: Optional[Dict[str, Any]] = None,
+ use_strings: Optional[bool] = None,
+ external_data: Optional[ExternalData] = None) -> StreamContext:
+ """
+ Query method that returns the results as a stream of Arrow tables
+ :param query: Query statement/format string
+ :param parameters: Optional dictionary used to format the query
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param use_strings: Convert ClickHouse String type to Arrow string type (instead of binary)
+ :param external_data ClickHouse "external data" to send with query
+ :return: Generator that yields a PyArrow.Table for per block representing the result set
+ """
+
+ def _query_arrow_stream():
+ return self.client.query_arrow_stream(query=query, parameters=parameters, settings=settings,
+ use_strings=use_strings, external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _query_arrow_stream)
+ return result
+
+ async def command(self,
+ cmd: str,
+ parameters: Optional[Union[Sequence, Dict[str, Any]]] = None,
+ data: Union[str, bytes] = None,
+ settings: Dict[str, Any] = None,
+ use_database: bool = True,
+ external_data: Optional[ExternalData] = None) -> Union[str, int, Sequence[str], QuerySummary]:
+ """
+ Client method that returns a single value instead of a result set
+ :param cmd: ClickHouse query/command as a python format string
+ :param parameters: Optional dictionary of key/values pairs to be formatted
+ :param data: Optional 'data' for the command (for INSERT INTO in particular)
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param use_database: Send the database parameter to ClickHouse so the command will be executed in the client
+ database context. Otherwise, no database will be specified with the command. This is useful for determining
+ the default user database
+ :param external_data ClickHouse "external data" to send with command/query
+ :return: Decoded response from ClickHouse as either a string, int, or sequence of strings, or QuerySummary
+ if no data returned
+ """
+
+ def _command():
+ return self.client.command(cmd=cmd, parameters=parameters, data=data, settings=settings,
+ use_database=use_database, external_data=external_data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _command)
+ return result
+
+ async def ping(self) -> bool:
+ """
+ Validate the connection, does not throw an Exception (see debug logs)
+ :return: ClickHouse server is up and reachable
+ """
+
+ def _ping():
+ return self.client.ping()
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _ping)
+ return result
+
+ async def insert(self,
+ table: Optional[str] = None,
+ data: Sequence[Sequence[Any]] = None,
+ column_names: Union[str, Iterable[str]] = '*',
+ database: Optional[str] = None,
+ column_types: Sequence[ClickHouseType] = None,
+ column_type_names: Sequence[str] = None,
+ column_oriented: bool = False,
+ settings: Optional[Dict[str, Any]] = None,
+ context: InsertContext = None) -> QuerySummary:
+ """
+ Method to insert multiple rows/data matrix of native Python objects. If context is specified arguments
+ other than data are ignored
+ :param table: Target table
+ :param data: Sequence of sequences of Python data
+ :param column_names: Ordered list of column names or '*' if column types should be retrieved from the
+ ClickHouse table definition
+ :param database: Target database -- will use client default database if not specified.
+ :param column_types: ClickHouse column types. If set then column data does not need to be retrieved from
+ the server
+ :param column_type_names: ClickHouse column type names. If set then column data does not need to be
+ retrieved from the server
+ :param column_oriented: If true the data is already "pivoted" in column form
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param context: Optional reusable insert context to allow repeated inserts into the same table with
+ different data batches
+ :return: QuerySummary with summary information, throws exception if insert fails
+ """
+
+ def _insert():
+ return self.client.insert(table=table, data=data, column_names=column_names, database=database,
+ column_types=column_types, column_type_names=column_type_names,
+ column_oriented=column_oriented, settings=settings, context=context)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _insert)
+ return result
+
+ async def insert_df(self, table: str = None,
+ df=None,
+ database: Optional[str] = None,
+ settings: Optional[Dict] = None,
+ column_names: Optional[Sequence[str]] = None,
+ column_types: Sequence[ClickHouseType] = None,
+ column_type_names: Sequence[str] = None,
+ context: InsertContext = None) -> QuerySummary:
+ """
+ Insert a pandas DataFrame into ClickHouse. If context is specified arguments other than df are ignored
+ :param table: ClickHouse table
+ :param df: two-dimensional pandas dataframe
+ :param database: Optional ClickHouse database
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param column_names: An optional list of ClickHouse column names. If not set, the DataFrame column names
+ will be used
+ :param column_types: ClickHouse column types. If set then column data does not need to be retrieved from
+ the server
+ :param column_type_names: ClickHouse column type names. If set then column data does not need to be
+ retrieved from the server
+ :param context: Optional reusable insert context to allow repeated inserts into the same table with
+ different data batches
+ :return: QuerySummary with summary information, throws exception if insert fails
+ """
+
+ def _insert_df():
+ return self.client.insert_df(table=table, df=df, database=database, settings=settings,
+ column_names=column_names,
+ column_types=column_types, column_type_names=column_type_names,
+ context=context)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _insert_df)
+ return result
+
+ async def insert_arrow(self, table: str,
+ arrow_table, database: str = None,
+ settings: Optional[Dict] = None) -> QuerySummary:
+ """
+ Insert a PyArrow table DataFrame into ClickHouse using raw Arrow format
+ :param table: ClickHouse table
+ :param arrow_table: PyArrow Table object
+ :param database: Optional ClickHouse database
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :return: QuerySummary with summary information, throws exception if insert fails
+ """
+
+ def _insert_arrow():
+ return self.client.insert_arrow(table=table, arrow_table=arrow_table, database=database, settings=settings)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _insert_arrow)
+ return result
+
+ async def create_insert_context(self,
+ table: str,
+ column_names: Optional[Union[str, Sequence[str]]] = None,
+ database: Optional[str] = None,
+ column_types: Sequence[ClickHouseType] = None,
+ column_type_names: Sequence[str] = None,
+ column_oriented: bool = False,
+ settings: Optional[Dict[str, Any]] = None,
+ data: Optional[Sequence[Sequence[Any]]] = None) -> InsertContext:
+ """
+ Builds a reusable insert context to hold state for a duration of an insert
+ :param table: Target table
+ :param database: Target database. If not set, uses the client default database
+ :param column_names: Optional ordered list of column names. If not set, all columns ('*') will be assumed
+ in the order specified by the table definition
+ :param database: Target database -- will use client default database if not specified
+ :param column_types: ClickHouse column types. Optional Sequence of ClickHouseType objects. If neither column
+ types nor column type names are set, actual column types will be retrieved from the server.
+ :param column_type_names: ClickHouse column type names. Specified column types by name string
+ :param column_oriented: If true the data is already "pivoted" in column form
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param data: Initial dataset for insert
+ :return Reusable insert context
+ """
+
+ def _create_insert_context():
+ return self.client.create_insert_context(table=table, column_names=column_names, database=database,
+ column_types=column_types, column_type_names=column_type_names,
+ column_oriented=column_oriented, settings=settings, data=data)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _create_insert_context)
+ return result
+
+ async def data_insert(self, context: InsertContext) -> QuerySummary:
+ """
+ Subclass implementation of the data insert
+ :context: InsertContext parameter object
+ :return: No return, throws an exception if the insert fails
+ """
+
+ def _data_insert():
+ return self.client.data_insert(context=context)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _data_insert)
+ return result
+
+ async def raw_insert(self, table: str,
+ column_names: Optional[Sequence[str]] = None,
+ insert_block: Union[str, bytes, Generator[bytes, None, None], BinaryIO] = None,
+ settings: Optional[Dict] = None,
+ fmt: Optional[str] = None,
+ compression: Optional[str] = None) -> QuerySummary:
+ """
+ Insert data already formatted in a bytes object
+ :param table: Table name (whether qualified with the database name or not)
+ :param column_names: Sequence of column names
+ :param insert_block: Binary or string data already in a recognized ClickHouse format
+ :param settings: Optional dictionary of ClickHouse settings (key/string values)
+ :param compression: Recognized ClickHouse `Accept-Encoding` header compression value
+ :param fmt: Valid clickhouse format
+ """
+
+ def _raw_insert():
+ return self.client.raw_insert(table=table, column_names=column_names, insert_block=insert_block,
+ settings=settings, fmt=fmt, compression=compression)
+
+ loop = asyncio.get_running_loop()
+ result = await loop.run_in_executor(None, _raw_insert)
+ return result
diff --git a/contrib/python/clickhouse-connect/clickhouse_connect/driver/httpclient.py b/contrib/python/clickhouse-connect/clickhouse_connect/driver/httpclient.py
index 03b5bbe324..bf3c0d863f 100644
--- a/contrib/python/clickhouse-connect/clickhouse_connect/driver/httpclient.py
+++ b/contrib/python/clickhouse-connect/clickhouse_connect/driver/httpclient.py
@@ -69,7 +69,8 @@ class HttpClient(Client):
https_proxy: Optional[str] = None,
server_host_name: Optional[str] = None,
apply_server_timezone: Optional[Union[str, bool]] = None,
- show_clickhouse_errors: Optional[bool] = None):
+ show_clickhouse_errors: Optional[bool] = None,
+ autogenerate_session_id: Optional[bool] = None):
"""
Create an HTTP ClickHouse Connect client
See clickhouse_connect.get_client for parameters
@@ -93,7 +94,7 @@ class HttpClient(Client):
# pylint: disable=too-many-boolean-expressions
if not self.http and (server_host_name or ca_cert or client_cert or not verify or https_proxy):
options = {'verify': verify is not False}
- dict_add(options,'ca_cert', ca_cert)
+ dict_add(options, 'ca_cert', ca_cert)
dict_add(options, 'client_cert', client_cert)
dict_add(options, 'client_cert_key', client_cert_key)
if server_host_name:
@@ -128,9 +129,14 @@ class HttpClient(Client):
self._progress_interval = None
self._active_session = None
+ # allow to override the global autogenerate_session_id setting via the constructor params
+ _autogenerate_session_id = common.get_setting('autogenerate_session_id') \
+ if autogenerate_session_id is None \
+ else autogenerate_session_id
+
if session_id:
ch_settings['session_id'] = session_id
- elif 'session_id' not in ch_settings and common.get_setting('autogenerate_session_id'):
+ elif 'session_id' not in ch_settings and _autogenerate_session_id:
ch_settings['session_id'] = str(uuid.uuid4())
if coerce_bool(compress):
diff --git a/contrib/python/clickhouse-connect/ya.make b/contrib/python/clickhouse-connect/ya.make
index a1b0d07909..72a6155ce2 100644
--- a/contrib/python/clickhouse-connect/ya.make
+++ b/contrib/python/clickhouse-connect/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(0.7.15)
+VERSION(0.7.16)
LICENSE(Apache-2.0)
@@ -53,6 +53,7 @@ PY_SRCS(
clickhouse_connect/dbapi/connection.py
clickhouse_connect/dbapi/cursor.py
clickhouse_connect/driver/__init__.py
+ clickhouse_connect/driver/asyncclient.py
clickhouse_connect/driver/buffer.py
clickhouse_connect/driver/client.py
clickhouse_connect/driver/common.py
diff --git a/contrib/python/fonttools/.dist-info/METADATA b/contrib/python/fonttools/.dist-info/METADATA
index 832b0598ab..6694a8733c 100644
--- a/contrib/python/fonttools/.dist-info/METADATA
+++ b/contrib/python/fonttools/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: fonttools
-Version: 4.53.0
+Version: 4.53.1
Summary: Tools to manipulate font files
Home-page: http://github.com/fonttools/fonttools
Author: Just van Rossum
@@ -306,7 +306,8 @@ How to make a new release
2) Use semantic versioning to decide whether the new release will be a 'major',
'minor' or 'patch' release. It's usually one of the latter two, depending on
whether new backward compatible APIs were added, or simply some bugs were fixed.
-3) Run ``python setup.py release`` command from the tip of the ``main`` branch.
+3) From inside a venv, first do ``pip install -r dev-requirements.txt``, then run
+ the ``python setup.py release`` command from the tip of the ``main`` branch.
By default this bumps the third or 'patch' digit only, unless you pass ``--major``
or ``--minor`` to bump respectively the first or second digit.
This bumps the package version string, extracts the changes since the latest
@@ -375,6 +376,13 @@ Have fun!
Changelog
~~~~~~~~~
+4.53.1 (released 2024-07-05)
+----------------------------
+
+- [feaLib] Improve the sharing of inline chained lookups (#3559)
+- [otlLib] Correct the calculation of OS/2.usMaxContext with reversed chaining contextual single substitutions (#3569)
+- [misc.visitor] Visitors search the inheritance chain of objects they are visiting (#3581)
+
4.53.0 (released 2024-05-31)
----------------------------
diff --git a/contrib/python/fonttools/README.rst b/contrib/python/fonttools/README.rst
index 2274fbdc69..b604ea7ca5 100644
--- a/contrib/python/fonttools/README.rst
+++ b/contrib/python/fonttools/README.rst
@@ -232,7 +232,8 @@ How to make a new release
2) Use semantic versioning to decide whether the new release will be a 'major',
'minor' or 'patch' release. It's usually one of the latter two, depending on
whether new backward compatible APIs were added, or simply some bugs were fixed.
-3) Run ``python setup.py release`` command from the tip of the ``main`` branch.
+3) From inside a venv, first do ``pip install -r dev-requirements.txt``, then run
+ the ``python setup.py release`` command from the tip of the ``main`` branch.
By default this bumps the third or 'patch' digit only, unless you pass ``--major``
or ``--minor`` to bump respectively the first or second digit.
This bumps the package version string, extracts the changes since the latest
diff --git a/contrib/python/fonttools/fontTools/__init__.py b/contrib/python/fonttools/fontTools/__init__.py
index 0de5c155e3..f2c62f124b 100644
--- a/contrib/python/fonttools/fontTools/__init__.py
+++ b/contrib/python/fonttools/fontTools/__init__.py
@@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger
log = logging.getLogger(__name__)
-version = __version__ = "4.53.0"
+version = __version__ = "4.53.1"
__all__ = ["version", "log", "configLogger"]
diff --git a/contrib/python/fonttools/fontTools/feaLib/builder.py b/contrib/python/fonttools/fontTools/feaLib/builder.py
index a91381ddc1..bda855e1e9 100644
--- a/contrib/python/fonttools/fontTools/feaLib/builder.py
+++ b/contrib/python/fonttools/fontTools/feaLib/builder.py
@@ -1286,10 +1286,7 @@ class Builder(object):
self, location, prefix, glyph, suffix, replacements, forceChain=False
):
if prefix or suffix or forceChain:
- chain = self.get_lookup_(location, ChainContextSubstBuilder)
- sub = self.get_chained_lookup_(location, MultipleSubstBuilder)
- sub.mapping[glyph] = replacements
- chain.rules.append(ChainContextualRule(prefix, [{glyph}], suffix, [sub]))
+ self.add_multi_subst_chained_(location, prefix, glyph, suffix, replacements)
return
lookup = self.get_lookup_(location, MultipleSubstBuilder)
if glyph in lookup.mapping:
@@ -1369,7 +1366,7 @@ class Builder(object):
# https://github.com/fonttools/fonttools/issues/512
# https://github.com/fonttools/fonttools/issues/2150
chain = self.get_lookup_(location, ChainContextSubstBuilder)
- sub = chain.find_chainable_single_subst(mapping)
+ sub = chain.find_chainable_subst(mapping, SingleSubstBuilder)
if sub is None:
sub = self.get_chained_lookup_(location, SingleSubstBuilder)
sub.mapping.update(mapping)
@@ -1377,6 +1374,19 @@ class Builder(object):
ChainContextualRule(prefix, [list(mapping.keys())], suffix, [sub])
)
+ def add_multi_subst_chained_(self, location, prefix, glyph, suffix, replacements):
+ if not all(prefix) or not all(suffix):
+ raise FeatureLibError(
+ "Empty glyph class in contextual substitution", location
+ )
+ # https://github.com/fonttools/fonttools/issues/3551
+ chain = self.get_lookup_(location, ChainContextSubstBuilder)
+ sub = chain.find_chainable_subst({glyph: replacements}, MultipleSubstBuilder)
+ if sub is None:
+ sub = self.get_chained_lookup_(location, MultipleSubstBuilder)
+ sub.mapping[glyph] = replacements
+ chain.rules.append(ChainContextualRule(prefix, [{glyph}], suffix, [sub]))
+
# GSUB 8
def add_reverse_chain_single_subst(self, location, old_prefix, old_suffix, mapping):
if not mapping:
diff --git a/contrib/python/fonttools/fontTools/misc/visitor.py b/contrib/python/fonttools/fontTools/misc/visitor.py
index d289895467..6de432ef93 100644
--- a/contrib/python/fonttools/fontTools/misc/visitor.py
+++ b/contrib/python/fonttools/fontTools/misc/visitor.py
@@ -61,9 +61,10 @@ class Visitor(object):
if _visitors is None:
break
- m = celf._visitors.get(typ, None)
- if m is not None:
- return m
+ for base in typ.mro():
+ m = celf._visitors.get(base, None)
+ if m is not None:
+ return m
return _default
diff --git a/contrib/python/fonttools/fontTools/otlLib/builder.py b/contrib/python/fonttools/fontTools/otlLib/builder.py
index 70fd87ab57..8fc685683a 100644
--- a/contrib/python/fonttools/fontTools/otlLib/builder.py
+++ b/contrib/python/fonttools/fontTools/otlLib/builder.py
@@ -544,6 +544,10 @@ class ChainContextualBuilder(LookupBuilder):
f"{classRuleAttr}Count",
getattr(setForThisRule, f"{classRuleAttr}Count") + 1,
)
+ for i, classSet in enumerate(classSets):
+ if not getattr(classSet, classRuleAttr):
+ # class sets can be null so replace nop sets with None
+ classSets[i] = None
setattr(st, self.ruleSetAttr_(format=2, chaining=chaining), classSets)
setattr(
st, self.ruleSetAttr_(format=2, chaining=chaining) + "Count", len(classSets)
@@ -781,14 +785,14 @@ class ChainContextSubstBuilder(ChainContextualBuilder):
)
return result
- def find_chainable_single_subst(self, mapping):
- """Helper for add_single_subst_chained_()"""
+ def find_chainable_subst(self, mapping, builder_class):
+ """Helper for add_{single,multi}_subst_chained_()"""
res = None
for rule in self.rules[::-1]:
if rule.is_subtable_break:
return res
for sub in rule.lookups:
- if isinstance(sub, SingleSubstBuilder) and not any(
+ if isinstance(sub, builder_class) and not any(
g in mapping and mapping[g] != sub.mapping[g] for g in sub.mapping
):
res = sub
diff --git a/contrib/python/fonttools/fontTools/otlLib/maxContextCalc.py b/contrib/python/fonttools/fontTools/otlLib/maxContextCalc.py
index 03e7561b60..eee8d48f3c 100644
--- a/contrib/python/fonttools/fontTools/otlLib/maxContextCalc.py
+++ b/contrib/python/fonttools/fontTools/otlLib/maxContextCalc.py
@@ -92,5 +92,5 @@ def maxCtxContextualRule(maxCtx, st, chain):
if not chain:
return max(maxCtx, st.GlyphCount)
elif chain == "Reverse":
- return max(maxCtx, st.GlyphCount + st.LookAheadGlyphCount)
+ return max(maxCtx, 1 + st.LookAheadGlyphCount)
return max(maxCtx, st.InputGlyphCount + st.LookAheadGlyphCount)
diff --git a/contrib/python/fonttools/ya.make b/contrib/python/fonttools/ya.make
index 27248ee094..82ed3d848e 100644
--- a/contrib/python/fonttools/ya.make
+++ b/contrib/python/fonttools/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(4.53.0)
+VERSION(4.53.1)
LICENSE(MIT)
diff --git a/contrib/python/google-auth/py3/.dist-info/METADATA b/contrib/python/google-auth/py3/.dist-info/METADATA
index 040faf7bb3..1814862af6 100644
--- a/contrib/python/google-auth/py3/.dist-info/METADATA
+++ b/contrib/python/google-auth/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: google-auth
-Version: 2.31.0
+Version: 2.32.0
Summary: Google Authentication Library
Home-page: https://github.com/googleapis/google-auth-library-python
Author: Google Cloud Platform
diff --git a/contrib/python/google-auth/py3/google/auth/external_account.py b/contrib/python/google-auth/py3/google/auth/external_account.py
index 3943de2a34..df0511f255 100644
--- a/contrib/python/google-auth/py3/google/auth/external_account.py
+++ b/contrib/python/google-auth/py3/google/auth/external_account.py
@@ -31,6 +31,7 @@ import abc
import copy
from dataclasses import dataclass
import datetime
+import functools
import io
import json
import re
@@ -394,6 +395,12 @@ class Credentials(
def refresh(self, request):
scopes = self._scopes if self._scopes is not None else self._default_scopes
+ # Inject client certificate into request.
+ if self._mtls_required():
+ request = functools.partial(
+ request, cert=self._get_mtls_cert_and_key_paths()
+ )
+
if self._should_initialize_impersonated_credentials():
self._impersonated_credentials = self._initialize_impersonated_credentials()
@@ -523,6 +530,33 @@ class Credentials(
return metrics_options
+ def _mtls_required(self):
+ """Returns a boolean representing whether the current credential is configured
+ for mTLS and should add a certificate to the outgoing calls to the sts and service
+ account impersonation endpoint.
+
+ Returns:
+ bool: True if the credential is configured for mTLS, False if it is not.
+ """
+ return False
+
+ def _get_mtls_cert_and_key_paths(self):
+ """Gets the file locations for a certificate and private key file
+ to be used for configuring mTLS for the sts and service account
+ impersonation calls. Currently only expected to return a value when using
+ X509 workload identity federation.
+
+ Returns:
+ Tuple[str, str]: The cert and key file locations as strings in a tuple.
+
+ Raises:
+ NotImplementedError: When the current credential is not configured for
+ mTLS.
+ """
+ raise NotImplementedError(
+ "_get_mtls_cert_and_key_location must be implemented."
+ )
+
@classmethod
def from_info(cls, info, **kwargs):
"""Creates a Credentials instance from parsed external account info.
diff --git a/contrib/python/google-auth/py3/google/auth/identity_pool.py b/contrib/python/google-auth/py3/google/auth/identity_pool.py
index 1c97885a4a..47f9a55715 100644
--- a/contrib/python/google-auth/py3/google/auth/identity_pool.py
+++ b/contrib/python/google-auth/py3/google/auth/identity_pool.py
@@ -48,6 +48,7 @@ from typing import NamedTuple
from google.auth import _helpers
from google.auth import exceptions
from google.auth import external_account
+from google.auth.transport import _mtls_helper
class SubjectTokenSupplier(metaclass=abc.ABCMeta):
@@ -141,6 +142,14 @@ class _UrlSupplier(SubjectTokenSupplier):
)
+class _X509Supplier(SubjectTokenSupplier):
+ """Internal supplier for X509 workload credentials. This class is used internally and always returns an empty string as the subject token."""
+
+ @_helpers.copy_docstring(SubjectTokenSupplier)
+ def get_subject_token(self, context, request):
+ return ""
+
+
def _parse_token_data(token_content, format_type="text", subject_token_field_name=None):
if format_type == "text":
token = token_content.content
@@ -247,6 +256,7 @@ class Credentials(external_account.Credentials):
self._subject_token_supplier = subject_token_supplier
self._credential_source_file = None
self._credential_source_url = None
+ self._credential_source_certificate = None
else:
if not isinstance(credential_source, Mapping):
self._credential_source_executable = None
@@ -255,45 +265,22 @@ class Credentials(external_account.Credentials):
)
self._credential_source_file = credential_source.get("file")
self._credential_source_url = credential_source.get("url")
- self._credential_source_headers = credential_source.get("headers")
- credential_source_format = credential_source.get("format", {})
- # Get credential_source format type. When not provided, this
- # defaults to text.
- self._credential_source_format_type = (
- credential_source_format.get("type") or "text"
- )
+ self._credential_source_certificate = credential_source.get("certificate")
+
# environment_id is only supported in AWS or dedicated future external
# account credentials.
if "environment_id" in credential_source:
raise exceptions.MalformedError(
"Invalid Identity Pool credential_source field 'environment_id'"
)
- if self._credential_source_format_type not in ["text", "json"]:
- raise exceptions.MalformedError(
- "Invalid credential_source format '{}'".format(
- self._credential_source_format_type
- )
- )
- # For JSON types, get the required subject_token field name.
- if self._credential_source_format_type == "json":
- self._credential_source_field_name = credential_source_format.get(
- "subject_token_field_name"
- )
- if self._credential_source_field_name is None:
- raise exceptions.MalformedError(
- "Missing subject_token_field_name for JSON credential_source format"
- )
- else:
- self._credential_source_field_name = None
- if self._credential_source_file and self._credential_source_url:
- raise exceptions.MalformedError(
- "Ambiguous credential_source. 'file' is mutually exclusive with 'url'."
- )
- if not self._credential_source_file and not self._credential_source_url:
- raise exceptions.MalformedError(
- "Missing credential_source. A 'file' or 'url' must be provided."
- )
+ # check that only one of file, url, or certificate are provided.
+ self._validate_single_source()
+
+ if self._credential_source_certificate:
+ self._validate_certificate_config()
+ else:
+ self._validate_file_or_url_config(credential_source)
if self._credential_source_file:
self._subject_token_supplier = _FileSupplier(
@@ -301,13 +288,15 @@ class Credentials(external_account.Credentials):
self._credential_source_format_type,
self._credential_source_field_name,
)
- else:
+ elif self._credential_source_url:
self._subject_token_supplier = _UrlSupplier(
self._credential_source_url,
self._credential_source_format_type,
self._credential_source_field_name,
self._credential_source_headers,
)
+ else: # self._credential_source_certificate
+ self._subject_token_supplier = _X509Supplier()
@_helpers.copy_docstring(external_account.Credentials)
def retrieve_subject_token(self, request):
@@ -315,16 +304,31 @@ class Credentials(external_account.Credentials):
self._supplier_context, request
)
+ def _get_mtls_cert_and_key_paths(self):
+ if self._credential_source_certificate is None:
+ raise exceptions.RefreshError(
+ 'The credential is not configured to use mtls requests. The credential should include a "certificate" section in the credential source.'
+ )
+ else:
+ return _mtls_helper._get_workload_cert_and_key_paths(
+ self._certificate_config_location
+ )
+
+ def _mtls_required(self):
+ return self._credential_source_certificate is not None
+
def _create_default_metrics_options(self):
metrics_options = super(Credentials, self)._create_default_metrics_options()
- # Check that credential source is a dict before checking for file vs url. This check needs to be done
+ # Check that credential source is a dict before checking for credential type. This check needs to be done
# here because the external_account credential constructor needs to pass the metrics options to the
# impersonated credential object before the identity_pool credentials are validated.
if isinstance(self._credential_source, Mapping):
if self._credential_source.get("file"):
metrics_options["source"] = "file"
- else:
+ elif self._credential_source.get("url"):
metrics_options["source"] = "url"
+ else:
+ metrics_options["source"] = "x509"
else:
metrics_options["source"] = "programmatic"
return metrics_options
@@ -339,6 +343,67 @@ class Credentials(external_account.Credentials):
args.update({"subject_token_supplier": self._subject_token_supplier})
return args
+ def _validate_certificate_config(self):
+ self._certificate_config_location = self._credential_source_certificate.get(
+ "certificate_config_location"
+ )
+ use_default = self._credential_source_certificate.get(
+ "use_default_certificate_config"
+ )
+ if self._certificate_config_location and use_default:
+ raise exceptions.MalformedError(
+ "Invalid certificate configuration, certificate_config_location cannot be specified when use_default_certificate_config = true."
+ )
+ if not self._certificate_config_location and not use_default:
+ raise exceptions.MalformedError(
+ "Invalid certificate configuration, use_default_certificate_config should be true if no certificate_config_location is provided."
+ )
+
+ def _validate_file_or_url_config(self, credential_source):
+ self._credential_source_headers = credential_source.get("headers")
+ credential_source_format = credential_source.get("format", {})
+ # Get credential_source format type. When not provided, this
+ # defaults to text.
+ self._credential_source_format_type = (
+ credential_source_format.get("type") or "text"
+ )
+ if self._credential_source_format_type not in ["text", "json"]:
+ raise exceptions.MalformedError(
+ "Invalid credential_source format '{}'".format(
+ self._credential_source_format_type
+ )
+ )
+ # For JSON types, get the required subject_token field name.
+ if self._credential_source_format_type == "json":
+ self._credential_source_field_name = credential_source_format.get(
+ "subject_token_field_name"
+ )
+ if self._credential_source_field_name is None:
+ raise exceptions.MalformedError(
+ "Missing subject_token_field_name for JSON credential_source format"
+ )
+ else:
+ self._credential_source_field_name = None
+
+ def _validate_single_source(self):
+ credential_sources = [
+ self._credential_source_file,
+ self._credential_source_url,
+ self._credential_source_certificate,
+ ]
+ valid_credential_sources = list(
+ filter(lambda source: source is not None, credential_sources)
+ )
+
+ if len(valid_credential_sources) > 1:
+ raise exceptions.MalformedError(
+ "Ambiguous credential_source. 'file', 'url', and 'certificate' are mutually exclusive.."
+ )
+ if len(valid_credential_sources) != 1:
+ raise exceptions.MalformedError(
+ "Missing credential_source. A 'file', 'url', or 'certificate' must be provided."
+ )
+
@classmethod
def from_info(cls, info, **kwargs):
"""Creates an Identity Pool Credentials instance from parsed external account info.
diff --git a/contrib/python/google-auth/py3/google/auth/transport/_mtls_helper.py b/contrib/python/google-auth/py3/google/auth/transport/_mtls_helper.py
index e95b953a10..6299e2bdea 100644
--- a/contrib/python/google-auth/py3/google/auth/transport/_mtls_helper.py
+++ b/contrib/python/google-auth/py3/google/auth/transport/_mtls_helper.py
@@ -105,9 +105,50 @@ def _get_workload_cert_and_key(certificate_config_path=None):
google.auth.exceptions.ClientCertError: if problems occurs when retrieving
the certificate or key information.
"""
- absolute_path = _get_cert_config_path(certificate_config_path)
+
+ cert_path, key_path = _get_workload_cert_and_key_paths(certificate_config_path)
+
+ if cert_path is None and key_path is None:
+ return None, None
+
+ return _read_cert_and_key_files(cert_path, key_path)
+
+
+def _get_cert_config_path(certificate_config_path=None):
+ """Get the certificate configuration path based on the following order:
+
+ 1: Explicit override, if set
+ 2: Environment variable, if set
+ 3: Well-known location
+
+ Returns "None" if the selected config file does not exist.
+
+ Args:
+ certificate_config_path (string): The certificate config path. If provided, the well known
+ location and environment variable will be ignored.
+
+ Returns:
+ The absolute path of the certificate config file, and None if the file does not exist.
+ """
+
+ if certificate_config_path is None:
+ env_path = environ.get(_CERTIFICATE_CONFIGURATION_ENV, None)
+ if env_path is not None and env_path != "":
+ certificate_config_path = env_path
+ else:
+ certificate_config_path = _CERTIFICATE_CONFIGURATION_DEFAULT_PATH
+
+ certificate_config_path = path.expanduser(certificate_config_path)
+ if not path.exists(certificate_config_path):
+ return None
+ return certificate_config_path
+
+
+def _get_workload_cert_and_key_paths(config_path):
+ absolute_path = _get_cert_config_path(config_path)
if absolute_path is None:
return None, None
+
data = _load_json_file(absolute_path)
if "cert_configs" not in data:
@@ -142,37 +183,7 @@ def _get_workload_cert_and_key(certificate_config_path=None):
)
key_path = workload["key_path"]
- return _read_cert_and_key_files(cert_path, key_path)
-
-
-def _get_cert_config_path(certificate_config_path=None):
- """Gets the certificate configuration full path using the following order of precedence:
-
- 1: Explicit override, if set
- 2: Environment variable, if set
- 3: Well-known location
-
- Returns "None" if the selected config file does not exist.
-
- Args:
- certificate_config_path (string): The certificate config path. If provided, the well known
- location and environment variable will be ignored.
-
- Returns:
- The absolute path of the certificate config file, and None if the file does not exist.
- """
-
- if certificate_config_path is None:
- env_path = environ.get(_CERTIFICATE_CONFIGURATION_ENV, None)
- if env_path is not None and env_path != "":
- certificate_config_path = env_path
- else:
- certificate_config_path = _CERTIFICATE_CONFIGURATION_DEFAULT_PATH
-
- certificate_config_path = path.expanduser(certificate_config_path)
- if not path.exists(certificate_config_path):
- return None
- return certificate_config_path
+ return cert_path, key_path
def _read_cert_and_key_files(cert_path, key_path):
diff --git a/contrib/python/google-auth/py3/google/auth/version.py b/contrib/python/google-auth/py3/google/auth/version.py
index b9313c667d..51f7f62acd 100644
--- a/contrib/python/google-auth/py3/google/auth/version.py
+++ b/contrib/python/google-auth/py3/google/auth/version.py
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "2.31.0"
+__version__ = "2.32.0"
diff --git a/contrib/python/google-auth/py3/tests/test_external_account.py b/contrib/python/google-auth/py3/tests/test_external_account.py
index c458b21b64..3c372e6291 100644
--- a/contrib/python/google-auth/py3/tests/test_external_account.py
+++ b/contrib/python/google-auth/py3/tests/test_external_account.py
@@ -235,10 +235,16 @@ class TestCredentials(object):
return request
@classmethod
- def assert_token_request_kwargs(cls, request_kwargs, headers, request_data):
+ def assert_token_request_kwargs(
+ cls, request_kwargs, headers, request_data, cert=None
+ ):
assert request_kwargs["url"] == cls.TOKEN_URL
assert request_kwargs["method"] == "POST"
assert request_kwargs["headers"] == headers
+ if cert is not None:
+ assert request_kwargs["cert"] == cert
+ else:
+ assert "cert" not in request_kwargs
assert request_kwargs["body"] is not None
body_tuples = urllib.parse.parse_qsl(request_kwargs["body"])
for (k, v) in body_tuples:
@@ -246,10 +252,16 @@ class TestCredentials(object):
assert len(body_tuples) == len(request_data.keys())
@classmethod
- def assert_impersonation_request_kwargs(cls, request_kwargs, headers, request_data):
+ def assert_impersonation_request_kwargs(
+ cls, request_kwargs, headers, request_data, cert=None
+ ):
assert request_kwargs["url"] == cls.SERVICE_ACCOUNT_IMPERSONATION_URL
assert request_kwargs["method"] == "POST"
assert request_kwargs["headers"] == headers
+ if cert is not None:
+ assert request_kwargs["cert"] == cert
+ else:
+ assert "cert" not in request_kwargs
assert request_kwargs["body"] is not None
body_json = json.loads(request_kwargs["body"].decode("utf-8"))
assert body_json == request_data
@@ -670,6 +682,56 @@ class TestCredentials(object):
return_value=LANG_LIBRARY_METRICS_HEADER_VALUE,
)
@mock.patch("google.auth._helpers.utcnow", return_value=datetime.datetime.min)
+ @mock.patch(
+ "google.auth.external_account.Credentials._mtls_required", return_value=True
+ )
+ @mock.patch(
+ "google.auth.external_account.Credentials._get_mtls_cert_and_key_paths",
+ return_value=("path/to/cert.pem", "path/to/key.pem"),
+ )
+ def test_refresh_with_mtls(
+ self,
+ mock_get_mtls_cert_and_key_paths,
+ mock_mtls_required,
+ unused_utcnow,
+ mock_auth_lib_value,
+ ):
+ response = self.SUCCESS_RESPONSE.copy()
+ # Test custom expiration to confirm expiry is set correctly.
+ response["expires_in"] = 2800
+ expected_expiry = datetime.datetime.min + datetime.timedelta(
+ seconds=response["expires_in"]
+ )
+ headers = {
+ "Content-Type": "application/x-www-form-urlencoded",
+ "x-goog-api-client": "gl-python/3.7 auth/1.1 google-byoid-sdk sa-impersonation/false config-lifetime/false",
+ }
+ request_data = {
+ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
+ "audience": self.AUDIENCE,
+ "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
+ "subject_token": "subject_token_0",
+ "subject_token_type": self.SUBJECT_TOKEN_TYPE,
+ }
+ request = self.make_mock_request(status=http_client.OK, data=response)
+ credentials = self.make_credentials()
+
+ credentials.refresh(request)
+
+ expected_cert_path = ("path/to/cert.pem", "path/to/key.pem")
+ self.assert_token_request_kwargs(
+ request.call_args[1], headers, request_data, expected_cert_path
+ )
+ assert credentials.valid
+ assert credentials.expiry == expected_expiry
+ assert not credentials.expired
+ assert credentials.token == response["access_token"]
+
+ @mock.patch(
+ "google.auth.metrics.python_and_auth_lib_version",
+ return_value=LANG_LIBRARY_METRICS_HEADER_VALUE,
+ )
+ @mock.patch("google.auth._helpers.utcnow", return_value=datetime.datetime.min)
def test_refresh_workforce_without_client_auth_success(
self, unused_utcnow, test_auth_lib_value
):
@@ -877,6 +939,101 @@ class TestCredentials(object):
"google.auth.metrics.python_and_auth_lib_version",
return_value=LANG_LIBRARY_METRICS_HEADER_VALUE,
)
+ @mock.patch(
+ "google.auth.external_account.Credentials._mtls_required", return_value=True
+ )
+ @mock.patch(
+ "google.auth.external_account.Credentials._get_mtls_cert_and_key_paths",
+ return_value=("path/to/cert.pem", "path/to/key.pem"),
+ )
+ def test_refresh_impersonation_with_mtls_success(
+ self,
+ mock_get_mtls_cert_and_key_paths,
+ mock_mtls_required,
+ mock_metrics_header_value,
+ mock_auth_lib_value,
+ ):
+ # Simulate service account access token expires in 2800 seconds.
+ expire_time = (
+ _helpers.utcnow().replace(microsecond=0) + datetime.timedelta(seconds=2800)
+ ).isoformat("T") + "Z"
+ expected_expiry = datetime.datetime.strptime(expire_time, "%Y-%m-%dT%H:%M:%SZ")
+ # STS token exchange request/response.
+ token_response = self.SUCCESS_RESPONSE.copy()
+ token_headers = {
+ "Content-Type": "application/x-www-form-urlencoded",
+ "x-goog-api-client": "gl-python/3.7 auth/1.1 google-byoid-sdk sa-impersonation/true config-lifetime/false",
+ }
+ token_request_data = {
+ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
+ "audience": self.AUDIENCE,
+ "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
+ "subject_token": "subject_token_0",
+ "subject_token_type": self.SUBJECT_TOKEN_TYPE,
+ "scope": "https://www.googleapis.com/auth/iam",
+ }
+ # Service account impersonation request/response.
+ impersonation_response = {
+ "accessToken": "SA_ACCESS_TOKEN",
+ "expireTime": expire_time,
+ }
+ impersonation_headers = {
+ "Content-Type": "application/json",
+ "authorization": "Bearer {}".format(token_response["access_token"]),
+ "x-goog-api-client": IMPERSONATE_ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE,
+ "x-allowed-locations": "0x0",
+ }
+ impersonation_request_data = {
+ "delegates": None,
+ "scope": self.SCOPES,
+ "lifetime": "3600s",
+ }
+ # Initialize mock request to handle token exchange and service account
+ # impersonation request.
+ request = self.make_mock_request(
+ status=http_client.OK,
+ data=token_response,
+ impersonation_status=http_client.OK,
+ impersonation_data=impersonation_response,
+ )
+ # Initialize credentials with service account impersonation.
+ credentials = self.make_credentials(
+ service_account_impersonation_url=self.SERVICE_ACCOUNT_IMPERSONATION_URL,
+ scopes=self.SCOPES,
+ )
+
+ credentials.refresh(request)
+
+ # Only 2 requests should be processed.
+ assert len(request.call_args_list) == 2
+ # Verify token exchange request parameters.
+ expected_cert_paths = ("path/to/cert.pem", "path/to/key.pem")
+ self.assert_token_request_kwargs(
+ request.call_args_list[0][1],
+ token_headers,
+ token_request_data,
+ expected_cert_paths,
+ )
+ # Verify service account impersonation request parameters.
+ self.assert_impersonation_request_kwargs(
+ request.call_args_list[1][1],
+ impersonation_headers,
+ impersonation_request_data,
+ expected_cert_paths,
+ )
+ assert credentials.valid
+ assert credentials.expiry == expected_expiry
+ assert not credentials.expired
+ assert credentials.token == impersonation_response["accessToken"]
+
+ @mock.patch(
+ "google.auth.metrics.token_request_access_token_impersonate",
+ return_value=IMPERSONATE_ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE,
+ )
+ @mock.patch(
+ "google.auth.metrics.python_and_auth_lib_version",
+ return_value=LANG_LIBRARY_METRICS_HEADER_VALUE,
+ )
def test_refresh_workforce_impersonation_without_client_auth_success(
self, mock_metrics_header_value, mock_auth_lib_value
):
diff --git a/contrib/python/google-auth/py3/tests/test_identity_pool.py b/contrib/python/google-auth/py3/tests/test_identity_pool.py
index e4efe46c6b..cc6cbf0882 100644
--- a/contrib/python/google-auth/py3/tests/test_identity_pool.py
+++ b/contrib/python/google-auth/py3/tests/test_identity_pool.py
@@ -180,6 +180,12 @@ class TestCredentials(object):
"url": CREDENTIAL_URL,
"format": {"type": "json", "subject_token_field_name": "access_token"},
}
+ CREDENTIAL_SOURCE_CERTIFICATE = {
+ "certificate": {"use_default_certificate_config": "true"}
+ }
+ CREDENTIAL_SOURCE_CERTIFICATE_NOT_DEFAULT = {
+ "certificate": {"certificate_config_location": "path/to/config"}
+ }
SUCCESS_RESPONSE = {
"access_token": "ACCESS_TOKEN",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
@@ -678,6 +684,40 @@ class TestCredentials(object):
assert excinfo.match(r"Ambiguous credential_source")
+ def test_constructor_invalid_options_url_and_certificate(self):
+ credential_source = {
+ "url": self.CREDENTIAL_URL,
+ "certificate": {"certificate": {"use_default_certificate_config": True}},
+ }
+
+ with pytest.raises(ValueError) as excinfo:
+ self.make_credentials(credential_source=credential_source)
+
+ assert excinfo.match(r"Ambiguous credential_source")
+
+ def test_constructor_invalid_options_file_and_certificate(self):
+ credential_source = {
+ "file": SUBJECT_TOKEN_TEXT_FILE,
+ "certificate": {"certificate": {"use_default_certificate": True}},
+ }
+
+ with pytest.raises(ValueError) as excinfo:
+ self.make_credentials(credential_source=credential_source)
+
+ assert excinfo.match(r"Ambiguous credential_source")
+
+ def test_constructor_invalid_options_url_file_and_certificate(self):
+ credential_source = {
+ "file": SUBJECT_TOKEN_TEXT_FILE,
+ "url": self.CREDENTIAL_URL,
+ "certificate": {"certificate": {"use_default_certificate": True}},
+ }
+
+ with pytest.raises(ValueError) as excinfo:
+ self.make_credentials(credential_source=credential_source)
+
+ assert excinfo.match(r"Ambiguous credential_source")
+
def test_constructor_invalid_options_environment_id(self):
credential_source = {"url": self.CREDENTIAL_URL, "environment_id": "aws1"}
@@ -717,7 +757,7 @@ class TestCredentials(object):
)
def test_constructor_invalid_credential_source_format_type(self):
- credential_source = {"format": {"type": "xml"}}
+ credential_source = {"file": "test.txt", "format": {"type": "xml"}}
with pytest.raises(ValueError) as excinfo:
self.make_credentials(credential_source=credential_source)
@@ -725,7 +765,7 @@ class TestCredentials(object):
assert excinfo.match(r"Invalid credential_source format 'xml'")
def test_constructor_missing_subject_token_field_name(self):
- credential_source = {"format": {"type": "json"}}
+ credential_source = {"file": "test.txt", "format": {"type": "json"}}
with pytest.raises(ValueError) as excinfo:
self.make_credentials(credential_source=credential_source)
@@ -734,6 +774,27 @@ class TestCredentials(object):
r"Missing subject_token_field_name for JSON credential_source format"
)
+ def test_constructor_default_and_file_location_certificate(self):
+ credential_source = {
+ "certificate": {
+ "use_default_certificate_config": True,
+ "certificate_config_location": "test",
+ }
+ }
+
+ with pytest.raises(ValueError) as excinfo:
+ self.make_credentials(credential_source=credential_source)
+
+ assert excinfo.match(r"Invalid certificate configuration")
+
+ def test_constructor_no_default_or_file_location_certificate(self):
+ credential_source = {"certificate": {"use_default_certificate_config": False}}
+
+ with pytest.raises(ValueError) as excinfo:
+ self.make_credentials(credential_source=credential_source)
+
+ assert excinfo.match(r"Invalid certificate configuration")
+
def test_info_with_workforce_pool_user_project(self):
credentials = self.make_credentials(
audience=WORKFORCE_AUDIENCE,
@@ -783,6 +844,36 @@ class TestCredentials(object):
"universe_domain": DEFAULT_UNIVERSE_DOMAIN,
}
+ def test_info_with_certificate_credential_source(self):
+ credentials = self.make_credentials(
+ credential_source=self.CREDENTIAL_SOURCE_CERTIFICATE.copy()
+ )
+
+ assert credentials.info == {
+ "type": "external_account",
+ "audience": AUDIENCE,
+ "subject_token_type": SUBJECT_TOKEN_TYPE,
+ "token_url": TOKEN_URL,
+ "token_info_url": TOKEN_INFO_URL,
+ "credential_source": self.CREDENTIAL_SOURCE_CERTIFICATE,
+ "universe_domain": DEFAULT_UNIVERSE_DOMAIN,
+ }
+
+ def test_info_with_non_default_certificate_credential_source(self):
+ credentials = self.make_credentials(
+ credential_source=self.CREDENTIAL_SOURCE_CERTIFICATE_NOT_DEFAULT.copy()
+ )
+
+ assert credentials.info == {
+ "type": "external_account",
+ "audience": AUDIENCE,
+ "subject_token_type": SUBJECT_TOKEN_TYPE,
+ "token_url": TOKEN_URL,
+ "token_info_url": TOKEN_INFO_URL,
+ "credential_source": self.CREDENTIAL_SOURCE_CERTIFICATE_NOT_DEFAULT,
+ "universe_domain": DEFAULT_UNIVERSE_DOMAIN,
+ }
+
def test_info_with_default_token_url(self):
credentials = identity_pool.Credentials(
audience=AUDIENCE,
@@ -846,6 +937,15 @@ class TestCredentials(object):
assert subject_token == JSON_FILE_SUBJECT_TOKEN
+ def test_retrieve_subject_token_certificate(self):
+ credentials = self.make_credentials(
+ credential_source=self.CREDENTIAL_SOURCE_CERTIFICATE
+ )
+
+ subject_token = credentials.retrieve_subject_token(None)
+
+ assert subject_token == ""
+
def test_retrieve_subject_token_json_file_invalid_field_name(self):
credential_source = {
"file": SUBJECT_TOKEN_JSON_FILE,
@@ -1486,3 +1586,28 @@ class TestCredentials(object):
scopes=SCOPES,
default_scopes=None,
)
+
+ @mock.patch(
+ "google.auth.transport._mtls_helper._get_workload_cert_and_key_paths",
+ return_value=("cert", "key"),
+ )
+ def test_get_mtls_certs(self, mock_get_workload_cert_and_key_paths):
+ credentials = self.make_credentials(
+ credential_source=self.CREDENTIAL_SOURCE_CERTIFICATE.copy()
+ )
+
+ cert, key = credentials._get_mtls_cert_and_key_paths()
+ assert cert == "cert"
+ assert key == "key"
+
+ def test_get_mtls_certs_invalid(self):
+ credentials = self.make_credentials(
+ credential_source=self.CREDENTIAL_SOURCE_TEXT.copy()
+ )
+
+ with pytest.raises(exceptions.RefreshError) as excinfo:
+ credentials._get_mtls_cert_and_key_paths()
+
+ assert excinfo.match(
+ 'The credential is not configured to use mtls requests. The credential should include a "certificate" section in the credential source.'
+ )
diff --git a/contrib/python/google-auth/py3/ya.make b/contrib/python/google-auth/py3/ya.make
index 63ef7c67e4..4ea57aefcc 100644
--- a/contrib/python/google-auth/py3/ya.make
+++ b/contrib/python/google-auth/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(2.31.0)
+VERSION(2.32.0)
LICENSE(Apache-2.0)
diff --git a/contrib/python/hypothesis/py3/.dist-info/METADATA b/contrib/python/hypothesis/py3/.dist-info/METADATA
index 310e5a5007..ffee48a82f 100644
--- a/contrib/python/hypothesis/py3/.dist-info/METADATA
+++ b/contrib/python/hypothesis/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: hypothesis
-Version: 6.104.2
+Version: 6.108.2
Summary: A library for property-based testing
Home-page: https://hypothesis.works
Author: David R. MacIver and Zac Hatfield-Dodds
@@ -41,10 +41,10 @@ Requires-Dist: exceptiongroup >=1.0.0 ; python_version < "3.11"
Provides-Extra: all
Requires-Dist: black >=19.10b0 ; extra == 'all'
Requires-Dist: click >=7.0 ; extra == 'all'
-Requires-Dist: crosshair-tool >=0.0.55 ; extra == 'all'
+Requires-Dist: crosshair-tool >=0.0.61 ; extra == 'all'
Requires-Dist: django >=3.2 ; extra == 'all'
Requires-Dist: dpcontracts >=0.4 ; extra == 'all'
-Requires-Dist: hypothesis-crosshair >=0.0.4 ; extra == 'all'
+Requires-Dist: hypothesis-crosshair >=0.0.7 ; extra == 'all'
Requires-Dist: lark >=0.10.1 ; extra == 'all'
Requires-Dist: libcst >=0.3.16 ; extra == 'all'
Requires-Dist: numpy >=1.17.3 ; extra == 'all'
@@ -63,8 +63,8 @@ Requires-Dist: rich >=9.0.0 ; extra == 'cli'
Provides-Extra: codemods
Requires-Dist: libcst >=0.3.16 ; extra == 'codemods'
Provides-Extra: crosshair
-Requires-Dist: hypothesis-crosshair >=0.0.4 ; extra == 'crosshair'
-Requires-Dist: crosshair-tool >=0.0.55 ; extra == 'crosshair'
+Requires-Dist: hypothesis-crosshair >=0.0.7 ; extra == 'crosshair'
+Requires-Dist: crosshair-tool >=0.0.61 ; extra == 'crosshair'
Provides-Extra: dateutil
Requires-Dist: python-dateutil >=1.4 ; extra == 'dateutil'
Provides-Extra: django
diff --git a/contrib/python/hypothesis/py3/hypothesis/_settings.py b/contrib/python/hypothesis/py3/hypothesis/_settings.py
index 061292e9bd..d337be4f57 100644
--- a/contrib/python/hypothesis/py3/hypothesis/_settings.py
+++ b/contrib/python/hypothesis/py3/hypothesis/_settings.py
@@ -482,7 +482,7 @@ class HealthCheck(Enum, metaclass=HealthCheckMeta):
def all(cls) -> List["HealthCheck"]:
# Skipping of deprecated attributes is handled in HealthCheckMeta.__iter__
note_deprecation(
- "`Healthcheck.all()` is deprecated; use `list(HealthCheck)` instead.",
+ "`HealthCheck.all()` is deprecated; use `list(HealthCheck)` instead.",
since="2023-04-16",
has_codemod=True,
stacklevel=1,
diff --git a/contrib/python/hypothesis/py3/hypothesis/control.py b/contrib/python/hypothesis/py3/hypothesis/control.py
index ea085b0b55..69ccf19ef2 100644
--- a/contrib/python/hypothesis/py3/hypothesis/control.py
+++ b/contrib/python/hypothesis/py3/hypothesis/control.py
@@ -138,13 +138,11 @@ class BuildContext:
# The printer will discard duplicates which return different representations.
self.known_object_printers = defaultdict(list)
- def record_call(self, obj, func, args, kwargs, arg_slices=None):
+ def record_call(self, obj, func, args, kwargs):
name = get_pretty_function_description(func)
self.known_object_printers[IDKey(obj)].append(
- lambda obj, p, cycle: (
- p.text("<...>")
- if cycle
- else p.repr_call(name, args, kwargs, arg_slices=arg_slices)
+ lambda obj, p, cycle: p.maybe_repr_known_object_as_call(
+ obj, cycle, name, args, kwargs
)
)
@@ -299,6 +297,11 @@ def target(observation: Union[int, float], *, label: str = "") -> Union[int, flo
"Calling target() outside of a test is invalid. "
"Consider guarding this call with `if currently_in_test_context(): ...`"
)
+ elif context.data.provider.avoid_realization:
+ # We could in principle realize this in the engine, but it seems more
+ # efficient to have our alternative backend optimize it for us.
+ # See e.g. https://github.com/pschanely/hypothesis-crosshair/issues/3
+ return observation # pragma: no cover
verbose_report(f"Saw target({observation!r}, {label=})")
if label in context.data.target_observations:
diff --git a/contrib/python/hypothesis/py3/hypothesis/core.py b/contrib/python/hypothesis/py3/hypothesis/core.py
index c2767421cb..6b443a1427 100644
--- a/contrib/python/hypothesis/py3/hypothesis/core.py
+++ b/contrib/python/hypothesis/py3/hypothesis/core.py
@@ -18,6 +18,7 @@ import io
import math
import sys
import time
+import traceback
import types
import unittest
import warnings
@@ -57,9 +58,10 @@ from hypothesis.errors import (
DeadlineExceeded,
DidNotReproduce,
FailedHealthCheck,
- Flaky,
+ FlakyFailure,
+ FlakyReplay,
Found,
- HypothesisDeprecationWarning,
+ HypothesisException,
HypothesisWarning,
InvalidArgument,
NoSuchExample,
@@ -86,9 +88,9 @@ from hypothesis.internal.entropy import deterministic_PRNG
from hypothesis.internal.escalation import (
InterestingOrigin,
current_pytest_item,
- escalate_hypothesis_internal_error,
format_exception,
get_trimmed_traceback,
+ is_hypothesis_file,
)
from hypothesis.internal.healthcheck import fail_health_check
from hypothesis.internal.observability import (
@@ -797,6 +799,15 @@ class StateForActualGivenExecution:
current_pytest_item.value, "nodeid", None
) or get_pretty_function_description(self.wrapped_test)
+ def _should_trace(self):
+ _trace_obs = TESTCASE_CALLBACKS and OBSERVABILITY_COLLECT_COVERAGE
+ _trace_failure = (
+ self.failed_normally
+ and not self.failed_due_to_deadline
+ and {Phase.shrink, Phase.explain}.issubset(self.settings.phases)
+ )
+ return _trace_obs or _trace_failure
+
def execute_once(
self,
data,
@@ -989,12 +1000,27 @@ class StateForActualGivenExecution:
)
else:
report("Failed to reproduce exception. Expected: \n" + traceback)
- raise Flaky(
+ raise FlakyFailure(
f"Hypothesis {text_repr} produces unreliable results: "
- "Falsified on the first call but did not on a subsequent one"
- ) from exception
+ "Falsified on the first call but did not on a subsequent one",
+ [exception],
+ )
return result
+ def _flaky_replay_to_failure(
+ self, err: FlakyReplay, context: BaseException
+ ) -> FlakyFailure:
+ interesting_examples = [
+ self._runner.interesting_examples[io]
+ for io in err._interesting_origins
+ if io
+ ]
+ exceptions = [
+ ie.extra_information._expected_exception for ie in interesting_examples
+ ]
+ exceptions.append(context) # the offending assume (or whatever)
+ return FlakyFailure(err.reason, exceptions)
+
def _execute_once_for_engine(self, data: ConjectureData) -> None:
"""Wrapper around ``execute_once`` that intercepts test failure
exceptions and single-test control exceptions, and turns them into
@@ -1005,35 +1031,7 @@ class StateForActualGivenExecution:
"""
trace: Trace = set()
try:
- # this is actually covered by our tests, but only on >= 3.12.
- if (
- sys.version_info[:2] >= (3, 12)
- and sys.monitoring.get_tool(MONITORING_TOOL_ID) is not None
- ): # pragma: no cover
- warnings.warn(
- "avoiding tracing test function because tool id "
- f"{MONITORING_TOOL_ID} is already taken by tool "
- f"{sys.monitoring.get_tool(MONITORING_TOOL_ID)}.",
- HypothesisWarning,
- # I'm not sure computing a correct stacklevel is reasonable
- # given the number of entry points here.
- stacklevel=1,
- )
-
- _can_trace = (
- (sys.version_info[:2] < (3, 12) and sys.gettrace() is None)
- or (
- sys.version_info[:2] >= (3, 12)
- and sys.monitoring.get_tool(MONITORING_TOOL_ID) is None
- )
- ) and not PYPY
- _trace_obs = TESTCASE_CALLBACKS and OBSERVABILITY_COLLECT_COVERAGE
- _trace_failure = (
- self.failed_normally
- and not self.failed_due_to_deadline
- and {Phase.shrink, Phase.explain}.issubset(self.settings.phases)
- )
- if _can_trace and (_trace_obs or _trace_failure): # pragma: no cover
+ if self._should_trace() and Tracer.can_trace(): # pragma: no cover
# This is in fact covered by our *non-coverage* tests, but due to the
# settrace() contention *not* by our coverage tests. Ah well.
with Tracer() as tracer:
@@ -1055,13 +1053,17 @@ class StateForActualGivenExecution:
except UnsatisfiedAssumption as e:
# An "assume" check failed, so instead we inform the engine that
# this test run was invalid.
- data.mark_invalid(e.reason)
+ try:
+ data.mark_invalid(e.reason)
+ except FlakyReplay as err:
+ # This was unexpected, meaning that the assume was flaky.
+ # Report it as such.
+ raise self._flaky_replay_to_failure(err, e) from None
except StopTest:
# The engine knows how to handle this control exception, so it's
# OK to re-raise it.
raise
except (
- HypothesisDeprecationWarning,
FailedHealthCheck,
*skip_exceptions_to_reraise(),
):
@@ -1069,9 +1071,12 @@ class StateForActualGivenExecution:
# engine, so we re-raise them.
raise
except failure_exceptions_to_catch() as e:
- # If the error was raised by Hypothesis-internal code, re-raise it
- # as a fatal error instead of treating it as a test failure.
- escalate_hypothesis_internal_error()
+ # If an unhandled (i.e., non-Hypothesis) error was raised by
+ # Hypothesis-internal code, re-raise it as a fatal error instead
+ # of treating it as a test failure.
+ filepath = traceback.extract_tb(e.__traceback__)[-1][0]
+ if is_hypothesis_file(filepath) and not isinstance(e, HypothesisException):
+ raise
if data.frozen:
# This can happen if an error occurred in a finally
@@ -1113,6 +1118,10 @@ class StateForActualGivenExecution:
self.settings.backend != "hypothesis"
and not getattr(runner, "_switch_to_hypothesis_provider", False)
)
+ data._observability_args = data.provider.realize(
+ data._observability_args
+ )
+ self._string_repr = data.provider.realize(self._string_repr)
tc = make_testcase(
start_timestamp=self._start_timestamp,
test_name_or_nodeid=self.test_identifier,
@@ -1174,6 +1183,23 @@ class StateForActualGivenExecution:
rep = get_pretty_function_description(self.test)
raise Unsatisfiable(f"Unable to satisfy assumptions of {rep}")
+ # If we have not traced executions, warn about that now (but only when
+ # we'd expect to do so reliably, i.e. on CPython>=3.12)
+ if (
+ sys.version_info[:2] >= (3, 12)
+ and not PYPY
+ and self._should_trace()
+ and not Tracer.can_trace()
+ ): # pragma: no cover
+ # actually covered by our tests, but only on >= 3.12
+ warnings.warn(
+ "avoiding tracing test function because tool id "
+ f"{MONITORING_TOOL_ID} is already taken by tool "
+ f"{sys.monitoring.get_tool(MONITORING_TOOL_ID)}.",
+ HypothesisWarning,
+ stacklevel=3,
+ )
+
if not self.falsifying_examples:
return
elif not (self.settings.report_multiple_bugs and pytest_shows_exceptiongroups):
@@ -1212,12 +1238,28 @@ class StateForActualGivenExecution:
info._expected_traceback,
),
)
- except (UnsatisfiedAssumption, StopTest) as e:
- err = Flaky(
+ except StopTest as e:
+ # Link the expected exception from the first run. Not sure
+ # how to access the current exception, if it failed
+ # differently on this run. In fact, in the only known
+ # reproducer, the StopTest is caused by OVERRUN before the
+ # test is even executed. Possibly because all initial examples
+ # failed until the final non-traced replay, and something was
+ # exhausted? Possibly a FIXME, but sufficiently weird to
+ # ignore for now.
+ err = FlakyFailure(
+ "Inconsistent results: An example failed on the "
+ "first run but now succeeds (or fails with another "
+ "error, or is for some reason not runnable).",
+ [info._expected_exception or e], # (note: e is a BaseException)
+ )
+ errors_to_report.append((fragments, err))
+ except UnsatisfiedAssumption as e: # pragma: no cover # ironically flaky
+ err = FlakyFailure(
"Unreliable assumption: An example which satisfied "
"assumptions on the first run now fails it.",
+ [e],
)
- err.__cause__ = err.__context__ = e
errors_to_report.append((fragments, err))
except BaseException as e:
# If we have anything for explain-mode, this is the time to report.
diff --git a/contrib/python/hypothesis/py3/hypothesis/errors.py b/contrib/python/hypothesis/py3/hypothesis/errors.py
index 0d376a7493..1dcf4493b2 100644
--- a/contrib/python/hypothesis/py3/hypothesis/errors.py
+++ b/contrib/python/hypothesis/py3/hypothesis/errors.py
@@ -8,6 +8,8 @@
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/.
+from hypothesis.internal.compat import ExceptionGroup
+
class HypothesisException(Exception):
"""Generic parent class for exceptions thrown by Hypothesis."""
@@ -52,9 +54,42 @@ class Unsatisfiable(_Trimmable):
class Flaky(_Trimmable):
+ """Base class for indeterministic failures. Usually one of the more
+ specific subclasses (FlakyFailure or FlakyStrategyDefinition) is raised."""
+
+
+class FlakyReplay(Flaky):
+ """Internal error raised by the conjecture engine if flaky failures are
+ detected during replay.
+
+ Carries information allowing the runner to reconstruct the flakiness as
+ a FlakyFailure exception group for final presentation.
+ """
+
+ def __init__(self, reason, interesting_origins=None):
+ super().__init__(reason)
+ self.reason = reason
+ self._interesting_origins = interesting_origins
+
+
+class FlakyStrategyDefinition(Flaky):
+ """This function appears to cause inconsistent data generation.
+
+ Common causes for this problem are:
+ 1. The strategy depends on external state. e.g. it uses an external
+ random number generator. Try to make a version that passes all the
+ relevant state in from Hypothesis.
+ """
+
+
+class _WrappedBaseException(Exception):
+ """Used internally for wrapping BaseExceptions as components of FlakyFailure."""
+
+
+class FlakyFailure(ExceptionGroup, Flaky):
"""This function appears to fail non-deterministically: We have seen it
fail when passed this example at least once, but a subsequent invocation
- did not fail.
+ did not fail, or caused a distinct error.
Common causes for this problem are:
1. The function depends on external state. e.g. it uses an external
@@ -67,6 +102,19 @@ class Flaky(_Trimmable):
don't do that and testing those instead.
"""
+ def __new__(cls, msg, group):
+ # The Exception mixin forces this an ExceptionGroup (only accepting
+ # Exceptions, not BaseException). Usually BaseException is raised
+ # directly and will hence not be part of a FlakyFailure, but I'm not
+ # sure this assumption holds everywhere. So wrap any BaseExceptions.
+ group = list(group)
+ for i, exc in enumerate(group):
+ if not isinstance(exc, Exception):
+ err = _WrappedBaseException()
+ err.__cause__ = err.__context__ = exc
+ group[i] = err
+ return ExceptionGroup.__new__(cls, msg, group)
+
class InvalidArgument(_Trimmable, TypeError):
"""Used to indicate that the arguments to a Hypothesis function were in
@@ -175,11 +223,9 @@ class DidNotReproduce(HypothesisException):
pass
-class Found(Exception):
+class Found(HypothesisException):
"""Signal that the example matches condition. Internal use only."""
- hypothesis_internal_never_escalate = True
-
class RewindRecursive(Exception):
"""Signal that the type inference should be rewound due to recursive types. Internal use only."""
diff --git a/contrib/python/hypothesis/py3/hypothesis/extra/codemods.py b/contrib/python/hypothesis/py3/hypothesis/extra/codemods.py
index 3de0580ada..85d1d44fd6 100644
--- a/contrib/python/hypothesis/py3/hypothesis/extra/codemods.py
+++ b/contrib/python/hypothesis/py3/hypothesis/extra/codemods.py
@@ -68,7 +68,7 @@ def refactor(code: str) -> str:
transforms: List[VisitorBasedCodemodCommand] = [
HypothesisFixPositionalKeywonlyArgs(context),
HypothesisFixComplexMinMagnitude(context),
- HypothesisFixHealthcheckAll(context),
+ HypothesisFixHealthCheckAll(context),
HypothesisFixCharactersArguments(context),
]
for transform in transforms:
@@ -228,16 +228,16 @@ class HypothesisFixPositionalKeywonlyArgs(VisitorBasedCodemodCommand):
return updated_node.with_changes(args=newargs)
-class HypothesisFixHealthcheckAll(VisitorBasedCodemodCommand):
- """Replace Healthcheck.all() with list(Healthcheck)"""
+class HypothesisFixHealthCheckAll(VisitorBasedCodemodCommand):
+ """Replace HealthCheck.all() with list(HealthCheck)"""
- DESCRIPTION = "Replace Healthcheck.all() with list(Healthcheck)"
+ DESCRIPTION = "Replace HealthCheck.all() with list(HealthCheck)"
- @m.leave(m.Call(func=m.Attribute(m.Name("Healthcheck"), m.Name("all")), args=[]))
+ @m.leave(m.Call(func=m.Attribute(m.Name("HealthCheck"), m.Name("all")), args=[]))
def replace_healthcheck(self, original_node, updated_node):
return updated_node.with_changes(
func=cst.Name("list"),
- args=[cst.Arg(value=cst.Name("Healthcheck"))],
+ args=[cst.Arg(value=cst.Name("HealthCheck"))],
)
diff --git a/contrib/python/hypothesis/py3/hypothesis/extra/django/_fields.py b/contrib/python/hypothesis/py3/hypothesis/extra/django/_fields.py
index 181c8869f9..29f6dcf00a 100644
--- a/contrib/python/hypothesis/py3/hypothesis/extra/django/_fields.py
+++ b/contrib/python/hypothesis/py3/hypothesis/extra/django/_fields.py
@@ -57,7 +57,9 @@ def integers_for_field(min_value, max_value):
def timezones():
# From Django 4.0, the default is to use zoneinfo instead of pytz.
assert getattr(django.conf.settings, "USE_TZ", False)
- if getattr(django.conf.settings, "USE_DEPRECATED_PYTZ", True):
+ if django.VERSION < (5, 0, 0) and getattr(
+ django.conf.settings, "USE_DEPRECATED_PYTZ", True
+ ):
from hypothesis.extra.pytz import timezones
else:
from hypothesis.strategies import timezones
diff --git a/contrib/python/hypothesis/py3/hypothesis/extra/django/_impl.py b/contrib/python/hypothesis/py3/hypothesis/extra/django/_impl.py
index 5a7ab8f0e3..d4bcefb0c1 100644
--- a/contrib/python/hypothesis/py3/hypothesis/extra/django/_impl.py
+++ b/contrib/python/hypothesis/py3/hypothesis/extra/django/_impl.py
@@ -105,6 +105,7 @@ def from_model(
name not in field_strategies
and not field.auto_created
and not isinstance(field, dm.AutoField)
+ and not isinstance(field, getattr(dm, "GeneratedField", ()))
and field.default is dm.fields.NOT_PROVIDED
):
field_strategies[name] = from_field(field)
diff --git a/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py b/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py
index 0c4a5d8523..9179e2d28f 100644
--- a/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py
+++ b/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py
@@ -603,10 +603,14 @@ def _assert_eq(style: str, a: str, b: str) -> str:
def _imports_for_object(obj):
"""Return the imports for `obj`, which may be empty for e.g. lambdas"""
+ if type(obj) is getattr(types, "UnionType", object()):
+ return {mod for mod, _ in set().union(*map(_imports_for_object, obj.__args__))}
if isinstance(obj, (re.Pattern, re.Match)):
return {"re"}
if isinstance(obj, st.SearchStrategy):
return _imports_for_strategy(obj)
+ if isinstance(obj, getattr(sys.modules.get("numpy"), "dtype", ())):
+ return {("numpy", "dtype")}
try:
if is_generic_type(obj):
if isinstance(obj, TypeVar):
@@ -772,7 +776,7 @@ def _get_module(obj):
raise RuntimeError(f"Could not find module for ufunc {obj.__name__} ({obj!r}")
-def _get_qualname(obj, *, include_module=False):
+def _get_qualname(obj: Any, *, include_module: bool = False) -> str:
# Replacing angle-brackets for objects defined in `.<locals>.`
qname = getattr(obj, "__qualname__", obj.__name__)
qname = qname.replace("<", "_").replace(">", "_").replace(" ", "")
@@ -1133,6 +1137,60 @@ ROUNDTRIP_PAIRS = (
)
+def _get_testable_functions(thing: object) -> Dict[str, Callable]:
+ by_name = {}
+ if callable(thing):
+ funcs: List[Optional[Any]] = [thing]
+ elif isinstance(thing, types.ModuleType):
+ if hasattr(thing, "__all__"):
+ funcs = [getattr(thing, name, None) for name in thing.__all__]
+ elif hasattr(thing, "__package__"):
+ pkg = thing.__package__
+ funcs = [
+ v
+ for k, v in vars(thing).items()
+ if callable(v)
+ and not is_mock(v)
+ and ((not pkg) or getattr(v, "__module__", pkg).startswith(pkg))
+ and not k.startswith("_")
+ ]
+ if pkg and any(getattr(f, "__module__", pkg) == pkg for f in funcs):
+ funcs = [f for f in funcs if getattr(f, "__module__", pkg) == pkg]
+ else:
+ raise InvalidArgument(f"Can't test non-module non-callable {thing!r}")
+
+ for f in list(funcs):
+ if inspect.isclass(f):
+ funcs += [
+ v.__get__(f)
+ for k, v in vars(f).items()
+ if hasattr(v, "__func__") and not is_mock(v) and not k.startswith("_")
+ ]
+ for f in funcs:
+ try:
+ if (
+ (not is_mock(f))
+ and callable(f)
+ and _get_params(f)
+ and not isinstance(f, enum.EnumMeta)
+ ):
+ if getattr(thing, "__name__", None):
+ if inspect.isclass(thing):
+ KNOWN_FUNCTION_LOCATIONS[f] = _get_module_helper(thing)
+ elif isinstance(thing, types.ModuleType):
+ KNOWN_FUNCTION_LOCATIONS[f] = thing.__name__
+ try:
+ _get_params(f)
+ by_name[_get_qualname(f, include_module=True)] = f
+ except Exception:
+ # usually inspect.signature on C code such as socket.inet_aton,
+ # or Pandas 'CallableDynamicDoc' object has no attr. '__name__'
+ pass
+ except (TypeError, ValueError):
+ pass
+ return by_name
+
+
def magic(
*modules_or_functions: Union[Callable, types.ModuleType],
except_: Except = (),
@@ -1157,85 +1215,42 @@ def magic(
_check_style(style)
if not modules_or_functions:
raise InvalidArgument("Must pass at least one function or module to test.")
- functions = set()
+
+ parts = []
+ by_name = {}
+ imports = set()
+
for thing in modules_or_functions:
- if callable(thing):
- functions.add(thing)
- # class need to be added for exploration
- if inspect.isclass(thing):
- funcs: List[Optional[Any]] = [thing]
- else:
- funcs = []
- elif isinstance(thing, types.ModuleType):
- if hasattr(thing, "__all__"):
- funcs = [getattr(thing, name, None) for name in thing.__all__]
- elif hasattr(thing, "__package__"):
- pkg = thing.__package__
- funcs = [
- v
- for k, v in vars(thing).items()
- if callable(v)
- and not is_mock(v)
- and ((not pkg) or getattr(v, "__module__", pkg).startswith(pkg))
- and not k.startswith("_")
- ]
- if pkg and any(getattr(f, "__module__", pkg) == pkg for f in funcs):
- funcs = [f for f in funcs if getattr(f, "__module__", pkg) == pkg]
- else:
- raise InvalidArgument(f"Can't test non-module non-callable {thing!r}")
-
- for f in list(funcs):
- if inspect.isclass(f):
- funcs += [
- v.__get__(f)
- for k, v in vars(f).items()
- if hasattr(v, "__func__")
- and not is_mock(v)
- and not k.startswith("_")
- ]
- for f in funcs:
- try:
+ by_name.update(found := _get_testable_functions(thing))
+ if (not found) and isinstance(thing, types.ModuleType):
+ msg = f"# Found no testable functions in {thing.__name__} (from {thing.__file__!r})"
+ mods: list = []
+ for k in sorted(sys.modules, key=len):
if (
- (not is_mock(f))
- and callable(f)
- and _get_params(f)
- and not isinstance(f, enum.EnumMeta)
+ k.startswith(f"{thing.__name__}.")
+ and "._" not in k[len(thing.__name__) :]
+ and not k.startswith(tuple(f"{m}." for m in mods))
+ and _get_testable_functions(sys.modules[k])
):
- functions.add(f)
- if getattr(thing, "__name__", None):
- if inspect.isclass(thing):
- KNOWN_FUNCTION_LOCATIONS[f] = _get_module_helper(thing)
- else:
- KNOWN_FUNCTION_LOCATIONS[f] = thing.__name__
- except (TypeError, ValueError):
- pass
+ mods.append(k)
+ if mods:
+ msg += (
+ f"\n# Try writing tests for submodules, e.g. by using:\n"
+ f"# hypothesis write {' '.join(sorted(mods))}"
+ )
+ parts.append(msg)
- if annotate is None:
- annotate = _are_annotations_used(*functions)
+ if not by_name:
+ return "\n\n".join(parts)
- imports = set()
- parts = []
+ if annotate is None:
+ annotate = _are_annotations_used(*by_name.values())
def make_(how, *args, **kwargs):
imp, body = how(*args, **kwargs, except_=except_, style=style)
imports.update(imp)
parts.append(body)
- by_name = {}
- for f in functions:
- try:
- _get_params(f)
- by_name[_get_qualname(f, include_module=True)] = f
- except Exception:
- # usually inspect.signature on C code such as socket.inet_aton, sometimes
- # e.g. Pandas 'CallableDynamicDoc' object has no attribute '__name__'
- pass
- if not by_name:
- return (
- f"# Found no testable functions in\n"
- f"# {functions!r} from {modules_or_functions}\n"
- )
-
# Look for pairs of functions that roundtrip, based on known naming patterns.
for writename, readname in ROUNDTRIP_PAIRS:
for name in sorted(by_name):
diff --git a/contrib/python/hypothesis/py3/hypothesis/extra/numpy.py b/contrib/python/hypothesis/py3/hypothesis/extra/numpy.py
index 3754192d70..de0940c97d 100644
--- a/contrib/python/hypothesis/py3/hypothesis/extra/numpy.py
+++ b/contrib/python/hypothesis/py3/hypothesis/extra/numpy.py
@@ -10,6 +10,7 @@
import importlib
import math
+import types
from typing import (
TYPE_CHECKING,
Any,
@@ -523,6 +524,11 @@ def arrays(
hundreds or more elements, having a fill value is essential if you want
your tests to run in reasonable time.
"""
+ # Our dtype argument might be a union, e.g. `np.float64 | np.complex64`; we handle
+ # that by turning it into a strategy up-front.
+ if type(dtype) in (getattr(types, "UnionType", object()), Union):
+ dtype = st.one_of(*(from_dtype(np.dtype(d)) for d in dtype.__args__)) # type: ignore
+
# We support passing strategies as arguments for convenience, or at least
# for legacy reasons, but don't want to pay the perf cost of a composite
# strategy (i.e. repeated argument handling and validation) when it's not
@@ -1279,7 +1285,7 @@ def _unpack_generic(thing):
def _unpack_dtype(dtype):
dtype_args = getattr(dtype, "__args__", ())
- if dtype_args:
+ if dtype_args and type(dtype) not in (getattr(types, "UnionType", object()), Union):
assert len(dtype_args) == 1
if isinstance(dtype_args[0], TypeVar):
# numpy.dtype[+ScalarType]
@@ -1291,22 +1297,22 @@ def _unpack_dtype(dtype):
return dtype
-def _dtype_and_shape_from_args(args):
+def _dtype_from_args(args):
if len(args) <= 1:
# Zero args: ndarray, _SupportsArray
# One arg: ndarray[type], _SupportsArray[type]
- shape = Any
dtype = _unpack_dtype(args[0]) if args else Any
else:
# Two args: ndarray[shape, type], NDArray[*]
assert len(args) == 2
- shape = args[0]
- assert shape is Any
+ assert args[0] is Any
dtype = _unpack_dtype(args[1])
- return (
- scalar_dtypes() if dtype is Any else np.dtype(dtype),
- array_shapes(max_dims=2) if shape is Any else shape,
- )
+
+ if dtype is Any:
+ return scalar_dtypes()
+ elif type(dtype) in (getattr(types, "UnionType", object()), Union):
+ return dtype
+ return np.dtype(dtype)
def _from_type(thing: Type[Ex]) -> Optional[st.SearchStrategy[Ex]]:
@@ -1394,8 +1400,8 @@ def _from_type(thing: Type[Ex]) -> Optional[st.SearchStrategy[Ex]]:
)
if real_thing in [np.ndarray, _SupportsArray]:
- dtype, shape = _dtype_and_shape_from_args(args)
- return arrays(dtype, shape) # type: ignore[return-value]
+ dtype = _dtype_from_args(args)
+ return arrays(dtype, array_shapes(max_dims=2)) # type: ignore[return-value]
# We didn't find a type to resolve, continue
return None
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/cache.py b/contrib/python/hypothesis/py3/hypothesis/internal/cache.py
index eae61a2578..49c1956867 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/cache.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/cache.py
@@ -12,6 +12,8 @@ import threading
import attr
+from hypothesis.errors import InvalidArgument
+
@attr.s(slots=True)
class Entry:
@@ -37,7 +39,8 @@ class GenericCache:
Defines a dict-like mapping with a maximum size, where as well as mapping
to a value, each key also maps to a score. When a write would cause the
dict to exceed its maximum size, it first evicts the existing key with
- the smallest score, then adds the new key to the map.
+ the smallest score, then adds the new key to the map. If due to pinning
+ no key can be evicted, ValueError is raised.
A key has the following lifecycle:
@@ -45,7 +48,7 @@ class GenericCache:
self.new_entry(key, value)
2. whenever an existing key is read or written, self.on_access(key, value,
score) is called. This returns a new score for the key.
- 3. When a key is evicted, self.on_evict(key, value, score) is called.
+ 3. After a key is evicted, self.on_evict(key, value, score) is called.
The cache will be in a valid state in all of these cases.
@@ -56,6 +59,9 @@ class GenericCache:
__slots__ = ("max_size", "_threadlocal")
def __init__(self, max_size):
+ if max_size <= 0:
+ raise InvalidArgument("Cache size must be at least one.")
+
self.max_size = max_size
# Implementation: We store a binary heap of Entry objects in self.data,
@@ -81,14 +87,6 @@ class GenericCache:
self._threadlocal.data = []
return self._threadlocal.data
- @property
- def __pinned_entry_count(self):
- return getattr(self._threadlocal, "_pinned_entry_count", 0)
-
- @__pinned_entry_count.setter
- def __pinned_entry_count(self, value):
- self._threadlocal._pinned_entry_count = value
-
def __len__(self):
assert len(self.keys_to_indices) == len(self.data)
return len(self.data)
@@ -99,25 +97,21 @@ class GenericCache:
def __getitem__(self, key):
i = self.keys_to_indices[key]
result = self.data[i]
- self.on_access(result.key, result.value, result.score)
- self.__balance(i)
+ self.__entry_was_accessed(i)
return result.value
def __setitem__(self, key, value):
- if self.max_size == 0:
- return
evicted = None
try:
i = self.keys_to_indices[key]
except KeyError:
- if self.max_size == self.__pinned_entry_count:
- raise ValueError(
- "Cannot increase size of cache where all keys have been pinned."
- ) from None
entry = Entry(key, value, self.new_entry(key, value))
if len(self.data) >= self.max_size:
evicted = self.data[0]
- assert evicted.pins == 0
+ if evicted.pins > 0:
+ raise ValueError(
+ "Cannot increase size of cache where all keys have been pinned."
+ ) from None
del self.keys_to_indices[evicted.key]
i = 0
self.data[0] = entry
@@ -125,45 +119,44 @@ class GenericCache:
i = len(self.data)
self.data.append(entry)
self.keys_to_indices[key] = i
+ self.__balance(i)
else:
entry = self.data[i]
assert entry.key == key
entry.value = value
- entry.score = self.on_access(entry.key, entry.value, entry.score)
-
- self.__balance(i)
+ self.__entry_was_accessed(i)
if evicted is not None:
if self.data[0] is not entry:
- assert evicted.score <= self.data[0].score
+ assert evicted.sort_key <= self.data[0].sort_key
self.on_evict(evicted.key, evicted.value, evicted.score)
def __iter__(self):
return iter(self.keys_to_indices)
- def pin(self, key):
- """Mark ``key`` as pinned. That is, it may not be evicted until
- ``unpin(key)`` has been called. The same key may be pinned multiple
- times and will not be unpinned until the same number of calls to
- unpin have been made."""
+ def pin(self, key, value):
+ """Mark ``key`` as pinned (with the given value). That is, it may not
+ be evicted until ``unpin(key)`` has been called. The same key may be
+ pinned multiple times, possibly changing its value, and will not be
+ unpinned until the same number of calls to unpin have been made.
+ """
+ self[key] = value
+
i = self.keys_to_indices[key]
entry = self.data[i]
entry.pins += 1
if entry.pins == 1:
- self.__pinned_entry_count += 1
- assert self.__pinned_entry_count <= self.max_size
self.__balance(i)
def unpin(self, key):
- """Undo one previous call to ``pin(key)``. Once all calls are
- undone this key may be evicted as normal."""
+ """Undo one previous call to ``pin(key)``. The value stays the same.
+ Once all calls are undone this key may be evicted as normal."""
i = self.keys_to_indices[key]
entry = self.data[i]
if entry.pins == 0:
raise ValueError(f"Key {key!r} has not been pinned")
entry.pins -= 1
if entry.pins == 0:
- self.__pinned_entry_count -= 1
self.__balance(i)
def is_pinned(self, key):
@@ -172,10 +165,9 @@ class GenericCache:
return self.data[i].pins > 0
def clear(self):
- """Remove all keys, clearing their pinned status."""
+ """Remove all keys, regardless of their pinned status."""
del self.data[:]
self.keys_to_indices.clear()
- self.__pinned_entry_count = 0
def __repr__(self):
return "{" + ", ".join(f"{e.key!r}: {e.value!r}" for e in self.data) + "}"
@@ -206,11 +198,22 @@ class GenericCache:
Asserts that all of the cache's invariants hold. When everything
is working correctly this should be an expensive no-op.
"""
+ assert len(self.keys_to_indices) == len(self.data)
for i, e in enumerate(self.data):
assert self.keys_to_indices[e.key] == i
for j in [i * 2 + 1, i * 2 + 2]:
if j < len(self.data):
- assert e.score <= self.data[j].score, self.data
+ assert e.sort_key <= self.data[j].sort_key, self.data
+
+ def __entry_was_accessed(self, i):
+ entry = self.data[i]
+ new_score = self.on_access(entry.key, entry.value, entry.score)
+ if new_score != entry.score:
+ entry.score = new_score
+ # changing the score of a pinned entry cannot unbalance the heap, as
+ # we place all pinned entries after unpinned ones, regardless of score.
+ if entry.pins == 0:
+ self.__balance(i)
def __swap(self, i, j):
assert i < j
@@ -220,28 +223,23 @@ class GenericCache:
self.keys_to_indices[self.data[j].key] = j
def __balance(self, i):
- """When we have made a modification to the heap such that means that
+ """When we have made a modification to the heap such that
the heap property has been violated locally around i but previously
held for all other indexes (and no other values have been modified),
this fixes the heap so that the heap property holds everywhere."""
- while i > 0:
- parent = (i - 1) // 2
+ # bubble up (if score is too low for current position)
+ while (parent := (i - 1) // 2) >= 0:
if self.__out_of_order(parent, i):
self.__swap(parent, i)
i = parent
else:
- # This branch is never taken on versions of Python where dicts
- # preserve their insertion order (pypy or cpython >= 3.7)
- break # pragma: no cover
- while True:
- children = [j for j in (2 * i + 1, 2 * i + 2) if j < len(self.data)]
- if len(children) == 2:
- children.sort(key=lambda j: self.data[j].score)
- for j in children:
- if self.__out_of_order(i, j):
- self.__swap(i, j)
- i = j
- break
+ break
+ # or bubble down (if score is too high for current position)
+ while children := [j for j in (2 * i + 1, 2 * i + 2) if j < len(self.data)]:
+ smallest_child = min(children, key=lambda j: self.data[j].sort_key)
+ if self.__out_of_order(i, smallest_child):
+ self.__swap(i, smallest_child)
+ i = smallest_child
else:
break
@@ -258,10 +256,10 @@ class LRUReusedCache(GenericCache):
"""The only concrete implementation of GenericCache we use outside of tests
currently.
- Adopts a modified least-frequently used eviction policy: It evicts the key
+ Adopts a modified least-recently used eviction policy: It evicts the key
that has been used least recently, but it will always preferentially evict
- keys that have only ever been accessed once. Among keys that have been
- accessed more than once, it ignores the number of accesses.
+ keys that have never been accessed after insertion. Among keys that have been
+ accessed, it ignores the number of accesses.
This retains most of the benefits of an LRU cache, but adds an element of
scan-resistance to the process: If we end up scanning through a large
@@ -280,22 +278,7 @@ class LRUReusedCache(GenericCache):
return self.__tick
def new_entry(self, key, value):
- return [1, self.tick()]
+ return (1, self.tick())
def on_access(self, key, value, score):
- score[0] = 2
- score[1] = self.tick()
- return score
-
- def pin(self, key):
- try:
- super().pin(key)
- except KeyError:
- # The whole point of an LRU cache is that it might drop things for you
- assert key not in self.keys_to_indices
-
- def unpin(self, key):
- try:
- super().unpin(key)
- except KeyError:
- assert key not in self.keys_to_indices
+ return (2, self.tick())
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/charmap.py b/contrib/python/hypothesis/py3/hypothesis/internal/charmap.py
index 6f41fbf021..468beeb5e8 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/charmap.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/charmap.py
@@ -19,6 +19,7 @@ from functools import lru_cache
from typing import Dict, Tuple
from hypothesis.configuration import storage_directory
+from hypothesis.control import _current_build_context
from hypothesis.errors import InvalidArgument
from hypothesis.internal.intervalsets import IntervalSet
@@ -214,10 +215,14 @@ def _query_for_key(key):
>>> _query_for_key(('Zl', 'Zp', 'Co'))
((8232, 8233), (57344, 63743), (983040, 1048573), (1048576, 1114109))
"""
- try:
- return category_index_cache[key]
- except KeyError:
- pass
+ context = _current_build_context.value
+ if context is None or not context.data.provider.avoid_realization:
+ try:
+ return category_index_cache[key]
+ except KeyError:
+ pass
+ elif not key: # pragma: no cover # only on alternative backends
+ return ()
assert key
if set(key) == set(categories()):
result = IntervalSet([(0, sys.maxunicode)])
@@ -226,7 +231,8 @@ def _query_for_key(key):
IntervalSet(charmap()[key[-1]])
)
assert isinstance(result, IntervalSet)
- category_index_cache[key] = result.intervals
+ if context is None or not context.data.provider.avoid_realization:
+ category_index_cache[key] = result.intervals
return result.intervals
@@ -268,15 +274,18 @@ def query(
character_intervals.intervals,
exclude_intervals.intervals,
)
- try:
- return limited_category_index_cache[qkey]
- except KeyError:
- pass
+ context = _current_build_context.value
+ if context is None or not context.data.provider.avoid_realization:
+ try:
+ return limited_category_index_cache[qkey]
+ except KeyError:
+ pass
base = _query_for_key(catkey)
result = []
for u, v in base:
if v >= min_codepoint and u <= max_codepoint:
result.append((max(u, min_codepoint), min(v, max_codepoint)))
result = (IntervalSet(result) | character_intervals) - exclude_intervals
- limited_category_index_cache[qkey] = result
+ if context is None or not context.data.provider.avoid_realization:
+ limited_category_index_cache[qkey] = result
return result
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py
index 7d1e010a6e..6c68b441d6 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py
@@ -1072,10 +1072,8 @@ def ir_value_permitted(value, ir_type, kwargs):
if max_value is not None and value > max_value:
return False
- if (max_value is None or min_value is None) and (
- value - shrink_towards
- ).bit_length() >= 128:
- return False
+ if max_value is None or min_value is None:
+ return (value - shrink_towards).bit_length() < 128
return True
elif ir_type == "float":
@@ -1208,19 +1206,35 @@ class PrimitiveProvider(abc.ABC):
# Non-hypothesis providers probably want to set a lifetime of test_function.
lifetime = "test_function"
+ # Solver-based backends such as hypothesis-crosshair use symbolic values
+ # which record operations performed on them in order to discover new paths.
+ # If avoid_realization is set to True, hypothesis will avoid interacting with
+ # ir values (symbolics) returned by the provider in any way that would force the
+ # solver to narrow the range of possible values for that symbolic.
+ #
+ # Setting this to True disables some hypothesis features, such as
+ # DataTree-based deduplication, and some internal optimizations, such as
+ # caching kwargs. Only enable this if it is necessary for your backend.
+ avoid_realization = False
+
def __init__(self, conjecturedata: Optional["ConjectureData"], /) -> None:
self._cd = conjecturedata
- def post_test_case_hook(self, value: IRType) -> IRType:
- # hook for providers to modify values returned by draw_* after a full
- # test case concludes. Originally exposed for crosshair to reify its
- # symbolic values into actual values.
- # I'm not tied to this exact function name or design.
- return value
-
def per_test_case_context_manager(self):
return contextlib.nullcontext()
+ def realize(self, value: T) -> T:
+ """
+ Called whenever hypothesis requires a concrete (non-symbolic) value from
+ a potentially symbolic value. Hypothesis will not check that `value` is
+ symbolic before calling `realize`, so you should handle the case where
+ `value` is non-symbolic.
+
+ The returned value should be non-symbolic.
+ """
+
+ return value
+
@abc.abstractmethod
def draw_boolean(
self,
@@ -1890,6 +1904,14 @@ AVAILABLE_PROVIDERS = {
}
+# eventually we'll want to expose this publicly, but for now it lives as psuedo-internal.
+def realize(value: object) -> object:
+ from hypothesis.control import current_build_context
+
+ context = current_build_context()
+ return context.data.provider.realize(value)
+
+
class ConjectureData:
@classmethod
def for_buffer(
@@ -2251,10 +2273,9 @@ class ConjectureData:
#
# Note that even if we lift this 64 bit restriction in the future, p
# cannot be 0 (1) when forced is True (False).
- if forced is True:
- assert p > 2 ** (-64)
- if forced is False:
- assert p < (1 - 2 ** (-64))
+ eps = 2 ** (-64) if isinstance(self.provider, HypothesisProvider) else 0
+ assert (forced is not True) or (0 + eps) < p
+ assert (forced is not False) or p < (1 - eps)
kwargs: BooleanKWargs = self._pooled_kwargs("boolean", {"p": p})
@@ -2282,6 +2303,10 @@ class ConjectureData:
def _pooled_kwargs(self, ir_type, kwargs):
"""Memoize common dictionary objects to reduce memory pressure."""
+ # caching runs afoul of nondeterminism checks
+ if self.provider.avoid_realization:
+ return kwargs
+
key = []
for k, v in kwargs.items():
if ir_type == "float" and k in ["min_value", "max_value"]:
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py
index 7768d5ec64..ead0157395 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py
@@ -14,7 +14,12 @@ from typing import List, Optional, Union
import attr
-from hypothesis.errors import Flaky, HypothesisException, StopTest
+from hypothesis.errors import (
+ FlakyReplay,
+ FlakyStrategyDefinition,
+ HypothesisException,
+ StopTest,
+)
from hypothesis.internal import floats as flt
from hypothesis.internal.compat import int_to_bytes
from hypothesis.internal.conjecture.data import (
@@ -45,7 +50,7 @@ class PreviouslyUnseenBehaviour(HypothesisException):
def inconsistent_generation():
- raise Flaky(
+ raise FlakyStrategyDefinition(
"Inconsistent data generation! Data generation behaved differently "
"between different runs. Is your data generation depending on external "
"state?"
@@ -469,7 +474,7 @@ class TreeNode:
Splits the tree so that it can incorporate a decision at the draw call
corresponding to the node at position i.
- Raises Flaky if node i was forced.
+ Raises FlakyStrategyDefinition if node i was forced.
"""
if i in self.forced:
@@ -1142,10 +1147,13 @@ class TreeRecordingObserver(DataObserver):
node.transition.status != Status.INTERESTING
or new_transition.status != Status.VALID
):
- raise Flaky(
+ old_origin = node.transition.interesting_origin
+ new_origin = new_transition.interesting_origin
+ raise FlakyReplay(
f"Inconsistent results from replaying a test case!\n"
- f" last: {node.transition.status.name} from {node.transition.interesting_origin}\n"
- f" this: {new_transition.status.name} from {new_transition.interesting_origin}"
+ f" last: {node.transition.status.name} from {old_origin}\n"
+ f" this: {new_transition.status.name} from {new_origin}",
+ (old_origin, new_origin),
)
else:
node.transition = new_transition
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py
index eb326f59a5..71f2ccc0b5 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py
@@ -10,6 +10,7 @@
import importlib
import math
+import textwrap
import time
from collections import defaultdict
from contextlib import contextmanager
@@ -30,6 +31,7 @@ from typing import (
Set,
Tuple,
Union,
+ cast,
overload,
)
@@ -38,7 +40,12 @@ import attr
from hypothesis import HealthCheck, Phase, Verbosity, settings as Settings
from hypothesis._settings import local_settings
from hypothesis.database import ExampleDatabase
-from hypothesis.errors import Flaky, HypothesisException, InvalidArgument, StopTest
+from hypothesis.errors import (
+ FlakyReplay,
+ HypothesisException,
+ InvalidArgument,
+ StopTest,
+)
from hypothesis.internal.cache import LRUReusedCache
from hypothesis.internal.compat import (
NotRequired,
@@ -56,6 +63,7 @@ from hypothesis.internal.conjecture.data import (
Example,
HypothesisProvider,
InterestingOrigin,
+ IRKWargsType,
IRNode,
Overrun,
PrimitiveProvider,
@@ -295,7 +303,7 @@ class ConjectureRunner:
def __stoppable_test_function(self, data: ConjectureData) -> None:
"""Run ``self._test_function``, but convert a ``StopTest`` exception
- into a normal return and avoid raising Flaky for RecursionErrors.
+ into a normal return and avoid raising anything flaky for RecursionErrors.
"""
# We ensure that the test has this much stack space remaining, no
# matter the size of the stack when called, to de-flake RecursionErrors
@@ -455,7 +463,7 @@ class ConjectureRunner:
self.stats_per_test_case.append(call_stats)
if self.settings.backend != "hypothesis":
for node in data.examples.ir_tree_nodes:
- value = data.provider.post_test_case_hook(node.value)
+ value = data.provider.realize(node.value)
expected_type = {
"string": str,
"float": float,
@@ -466,10 +474,19 @@ class ConjectureRunner:
if type(value) is not expected_type:
raise HypothesisException(
f"expected {expected_type} from "
- f"{data.provider.post_test_case_hook.__qualname__}, "
- f"got {type(value)} ({value!r})"
+ f"{data.provider.realize.__qualname__}, "
+ f"got {type(value)}"
)
+
+ kwargs = cast(
+ IRKWargsType,
+ {
+ k: data.provider.realize(v)
+ for k, v in node.kwargs.items()
+ },
+ )
node.value = value
+ node.kwargs = kwargs
self._cache(data)
if data.invalid_at is not None: # pragma: no branch # coverage bug?
@@ -517,18 +534,24 @@ class ConjectureRunner:
# drive the ir tree through the test function to convert it
# to a buffer
initial_origin = data.interesting_origin
+ initial_traceback = data.extra_information._expected_traceback # type: ignore
data = ConjectureData.for_ir_tree(data.examples.ir_tree_nodes)
self.__stoppable_test_function(data)
data.freeze()
- # we'd like to use expected_failure machinery here from
- # StateForActualGivenExecution for better diagnostic reports of eg
- # flaky deadlines, but we're too low down in the engine for that.
- # for now a worse generic flaky error will have to do.
+ # TODO: Convert to FlakyFailure on the way out. Should same-origin
+ # also be checked?
if data.status != Status.INTERESTING:
- raise Flaky(
+ desc_new_status = {
+ data.status.VALID: "passed",
+ data.status.INVALID: "failed filters",
+ data.status.OVERRUN: "overran",
+ }[data.status]
+ wrapped_tb = textwrap.indent(initial_traceback, " | ")
+ raise FlakyReplay(
f"Inconsistent results from replaying a failing test case!\n"
- f" last: {Status.INTERESTING.name} from {initial_origin}\n"
- f" this: {data.status.name}"
+ f"{wrapped_tb}on backend={self.settings.backend!r} but "
+ f"{desc_new_status} under backend='hypothesis'",
+ interesting_origins=[initial_origin],
)
self._cache(data)
@@ -552,7 +575,7 @@ class ConjectureRunner:
if changed:
self.save_buffer(data.buffer)
self.interesting_examples[key] = data.as_result() # type: ignore
- self.__data_cache.pin(data.buffer)
+ self.__data_cache.pin(data.buffer, data.as_result())
self.shrunk_examples.discard(key)
if self.shrinks >= MAX_SHRINKS:
@@ -899,7 +922,9 @@ class ConjectureRunner:
zero_data = self.cached_test_function(bytes(BUFFER_SIZE))
if zero_data.status > Status.OVERRUN:
assert isinstance(zero_data, ConjectureResult)
- self.__data_cache.pin(zero_data.buffer)
+ self.__data_cache.pin(
+ zero_data.buffer, zero_data.as_result()
+ ) # Pin forever
if zero_data.status == Status.OVERRUN or (
zero_data.status == Status.VALID
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/escalation.py b/contrib/python/hypothesis/py3/hypothesis/internal/escalation.py
index b85d9fcdc9..9c242ba0c2 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/escalation.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/escalation.py
@@ -18,13 +18,7 @@ from pathlib import Path
from typing import Dict, NamedTuple, Optional, Type
import hypothesis
-from hypothesis.errors import (
- DeadlineExceeded,
- HypothesisException,
- StopTest,
- UnsatisfiedAssumption,
- _Trimmable,
-)
+from hypothesis.errors import _Trimmable
from hypothesis.internal.compat import BaseExceptionGroup
from hypothesis.utils.dynamicvariables import DynamicVariable
@@ -54,31 +48,11 @@ def belongs_to(package):
return accept
-PREVENT_ESCALATION = os.getenv("HYPOTHESIS_DO_NOT_ESCALATE") == "true"
-
FILE_CACHE: Dict[bytes, bool] = {}
is_hypothesis_file = belongs_to(hypothesis)
-HYPOTHESIS_CONTROL_EXCEPTIONS = (DeadlineExceeded, StopTest, UnsatisfiedAssumption)
-
-
-def escalate_hypothesis_internal_error():
- if PREVENT_ESCALATION:
- return
-
- _, e, tb = sys.exc_info()
-
- if getattr(e, "hypothesis_internal_never_escalate", False):
- return
-
- filepath = None if tb is None else traceback.extract_tb(tb)[-1][0]
- if is_hypothesis_file(filepath) and not isinstance(
- e, (HypothesisException, *HYPOTHESIS_CONTROL_EXCEPTIONS)
- ):
- raise
-
def get_trimmed_traceback(exception=None):
"""Return the current traceback, minus any frames added by Hypothesis."""
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/intervalsets.py b/contrib/python/hypothesis/py3/hypothesis/internal/intervalsets.py
index e48802ee77..47abae66ea 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/intervalsets.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/intervalsets.py
@@ -22,7 +22,7 @@ class IntervalSet:
x = cls((ord(c), ord(c)) for c in sorted(s))
return x.union(x)
- def __init__(self, intervals):
+ def __init__(self, intervals=()):
self.intervals = tuple(intervals)
self.offsets = [0]
for u, v in self.intervals:
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/scrutineer.py b/contrib/python/hypothesis/py3/hypothesis/internal/scrutineer.py
index d99e767c1d..0cd760cf17 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/scrutineer.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/scrutineer.py
@@ -21,6 +21,7 @@ from pathlib import Path
from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple
from hypothesis._settings import Phase, Verbosity
+from hypothesis.internal.compat import PYPY
from hypothesis.internal.escalation import is_hypothesis_file
if TYPE_CHECKING:
@@ -58,6 +59,16 @@ class Tracer:
self.branches: Trace = set()
self._previous_location = None
+ @staticmethod
+ def can_trace():
+ return (
+ (sys.version_info[:2] < (3, 12) and sys.gettrace() is None)
+ or (
+ sys.version_info[:2] >= (3, 12)
+ and sys.monitoring.get_tool(MONITORING_TOOL_ID) is None
+ )
+ ) and not PYPY
+
def trace(self, frame, event, arg):
try:
if event == "call":
@@ -80,8 +91,9 @@ class Tracer:
self._previous_location = current_location
def __enter__(self):
+ assert self.can_trace() # caller checks in core.py
+
if sys.version_info[:2] < (3, 12):
- assert sys.gettrace() is None # caller checks in core.py
sys.settrace(self.trace)
return self
diff --git a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/core.py b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/core.py
index 570645509d..572679d403 100644
--- a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/core.py
+++ b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/core.py
@@ -21,7 +21,7 @@ import warnings
from contextvars import ContextVar
from decimal import Context, Decimal, localcontext
from fractions import Fraction
-from functools import lru_cache, reduce
+from functools import reduce
from inspect import Parameter, Signature, isabstract, isclass
from types import FunctionType
from typing import (
@@ -137,6 +137,7 @@ from hypothesis.strategies._internal.strings import (
BytesStrategy,
OneCharStringStrategy,
TextStrategy,
+ _check_is_single_character,
)
from hypothesis.strategies._internal.utils import (
cacheable,
@@ -789,19 +790,6 @@ characters.__signature__ = (__sig := get_signature(characters)).replace( # type
)
-# Cache size is limited by sys.maxunicode, but passing None makes it slightly faster.
-@lru_cache(maxsize=None)
-def _check_is_single_character(c):
- # In order to mitigate the performance cost of this check, we use a shared cache,
- # even at the cost of showing the culprit strategy in the error message.
- if not isinstance(c, str):
- type_ = get_pretty_function_description(type(c))
- raise InvalidArgument(f"Got non-string {c!r} (type {type_})")
- if len(c) != 1:
- raise InvalidArgument(f"Got {c!r} (length {len(c)} != 1)")
- return c
-
-
@cacheable
@defines_strategy(force_reusable_values=True)
def text(
@@ -924,19 +912,7 @@ def from_regex(
check_type((str, SearchStrategy), alphabet, "alphabet")
if not isinstance(pattern, str):
raise InvalidArgument("alphabet= is not supported for bytestrings")
-
- if isinstance(alphabet, str):
- alphabet = characters(categories=(), include_characters=alphabet)
- char_strategy = unwrap_strategies(alphabet)
- if isinstance(char_strategy, SampledFromStrategy):
- alphabet = characters(
- categories=(),
- include_characters=alphabet.elements, # type: ignore
- )
- elif not isinstance(char_strategy, OneCharStringStrategy):
- raise InvalidArgument(
- f"{alphabet=} must be a sampled_from() or characters() strategy"
- )
+ alphabet = OneCharStringStrategy.from_alphabet(alphabet)
elif isinstance(pattern, str):
alphabet = characters(codec="utf-8")
diff --git a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py
index 8df955e632..b6e6dd8deb 100644
--- a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py
+++ b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py
@@ -17,13 +17,31 @@ from hypothesis.errors import HypothesisWarning, InvalidArgument
from hypothesis.internal import charmap
from hypothesis.internal.filtering import max_len, min_len
from hypothesis.internal.intervalsets import IntervalSet
+from hypothesis.internal.reflection import get_pretty_function_description
from hypothesis.strategies._internal.collections import ListStrategy
from hypothesis.strategies._internal.lazy import unwrap_strategies
from hypothesis.strategies._internal.numbers import IntegersStrategy
-from hypothesis.strategies._internal.strategies import SearchStrategy
+from hypothesis.strategies._internal.strategies import (
+ OneOfStrategy,
+ SampledFromStrategy,
+ SearchStrategy,
+)
from hypothesis.vendor.pretty import pretty
+# Cache size is limited by sys.maxunicode, but passing None makes it slightly faster.
+@lru_cache(maxsize=None)
+def _check_is_single_character(c):
+ # In order to mitigate the performance cost of this check, we use a shared cache,
+ # even at the cost of showing the culprit strategy in the error message.
+ if not isinstance(c, str):
+ type_ = get_pretty_function_description(type(c))
+ raise InvalidArgument(f"Got non-string {c!r} (type {type_})")
+ if len(c) != 1:
+ raise InvalidArgument(f"Got {c!r} (length {len(c)} != 1)")
+ return c
+
+
class OneCharStringStrategy(SearchStrategy):
"""A strategy which generates single character strings of text type."""
@@ -72,6 +90,31 @@ class OneCharStringStrategy(SearchStrategy):
)
return cls(intervals, force_repr=f"characters({_arg_repr})")
+ @classmethod
+ def from_alphabet(cls, alphabet):
+ if isinstance(alphabet, str):
+ return cls.from_characters_args(categories=(), include_characters=alphabet)
+
+ assert isinstance(alphabet, SearchStrategy)
+ char_strategy = unwrap_strategies(alphabet)
+ if isinstance(char_strategy, cls):
+ return char_strategy
+ elif isinstance(char_strategy, SampledFromStrategy):
+ for c in char_strategy.elements:
+ _check_is_single_character(c)
+ return cls.from_characters_args(
+ categories=(),
+ include_characters=char_strategy.elements,
+ )
+ elif isinstance(char_strategy, OneOfStrategy):
+ intervals = IntervalSet()
+ for s in char_strategy.element_strategies:
+ intervals = intervals.union(cls.from_alphabet(s).intervals)
+ return cls(intervals, force_repr=repr(alphabet))
+ raise InvalidArgument(
+ f"{alphabet=} must be a sampled_from() or characters() strategy"
+ )
+
def __repr__(self):
return self._force_repr or f"OneCharStringStrategy({self.intervals!r})"
@@ -189,13 +232,10 @@ def _string_filter_rewrite(self, kind, condition):
):
from hypothesis.strategies._internal.regex import regex_strategy
- print(f"{condition=}")
- print(f"{condition.__name__=}")
-
if condition.__name__ == "match":
# Replace with an easier-to-handle equivalent condition
- caret = "^" if kind is str else b"^"
- pattern = re.compile(caret + pattern.pattern, flags=pattern.flags)
+ caret, close = ("^(?:", ")") if kind is str else (b"^(?:", b")")
+ pattern = re.compile(caret + pattern.pattern + close, flags=pattern.flags)
condition = pattern.search
if condition.__name__ in ("search", "findall", "fullmatch"):
diff --git a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/types.py b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/types.py
index 11e6aa381b..8753bfb784 100644
--- a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/types.py
+++ b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/types.py
@@ -514,8 +514,9 @@ def from_typing_type(thing):
for T in [*union_elems, elem_type]
):
mapping.pop(bytes, None)
- mapping.pop(collections.abc.ByteString, None)
- mapping.pop(typing.ByteString, None)
+ if sys.version_info[:2] <= (3, 13):
+ mapping.pop(collections.abc.ByteString, None)
+ mapping.pop(typing.ByteString, None)
elif (
(not mapping)
and isinstance(thing, typing.ForwardRef)
@@ -699,14 +700,16 @@ if sys.version_info[:2] >= (3, 9):
# which includes this... but we don't actually ever want to build one.
_global_type_lookup[os._Environ] = st.just(os.environ)
+if sys.version_info[:2] <= (3, 13):
+ # Note: while ByteString notionally also represents the bytearray and
+ # memoryview types, it is a subclass of Hashable and those types are not.
+ # We therefore only generate the bytes type. type-ignored due to deprecation.
+ _global_type_lookup[typing.ByteString] = st.binary() # type: ignore
+ _global_type_lookup[collections.abc.ByteString] = st.binary() # type: ignore
+
_global_type_lookup.update(
{
- # Note: while ByteString notionally also represents the bytearray and
- # memoryview types, it is a subclass of Hashable and those types are not.
- # We therefore only generate the bytes type. type-ignored due to deprecation.
- typing.ByteString: st.binary(), # type: ignore
- collections.abc.ByteString: st.binary(), # type: ignore
# TODO: SupportsAbs and SupportsRound should be covariant, ie have functions.
typing.SupportsAbs: st.one_of(
st.booleans(),
diff --git a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/utils.py b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/utils.py
index 066c2b6581..d60eabea9b 100644
--- a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/utils.py
+++ b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/utils.py
@@ -65,10 +65,15 @@ def clear_cache() -> None:
def cacheable(fn: "T") -> "T":
+ from hypothesis.control import _current_build_context
from hypothesis.strategies._internal.strategies import SearchStrategy
@proxies(fn)
def cached_strategy(*args, **kwargs):
+ context = _current_build_context.value
+ if context is not None and context.data.provider.avoid_realization:
+ return fn(*args, **kwargs)
+
try:
kwargs_cache_key = {(k, convert_value(v)) for k, v in kwargs.items()}
except TypeError:
diff --git a/contrib/python/hypothesis/py3/hypothesis/vendor/pretty.py b/contrib/python/hypothesis/py3/hypothesis/vendor/pretty.py
index ceffe3a6aa..6b4718ff79 100644
--- a/contrib/python/hypothesis/py3/hypothesis/vendor/pretty.py
+++ b/contrib/python/hypothesis/py3/hypothesis/vendor/pretty.py
@@ -62,6 +62,7 @@ Inheritance diagram:
:license: BSD License.
"""
+import ast
import datetime
import re
import struct
@@ -69,7 +70,7 @@ import sys
import types
import warnings
from collections import defaultdict, deque
-from contextlib import contextmanager
+from contextlib import contextmanager, suppress
from enum import Flag
from io import StringIO
from math import copysign, isnan
@@ -373,6 +374,29 @@ class RepresentationPrinter:
self.flush()
return self.output.getvalue()
+ def maybe_repr_known_object_as_call(self, obj, cycle, name, args, kwargs):
+ # pprint this object as a call, _unless_ the call would be invalid syntax
+ # and the repr would be valid and there are not comments on arguments.
+ if cycle:
+ return self.text("<...>")
+ # Since we don't yet track comments for sub-argument parts, we omit the
+ # "if no comments" condition here for now. Add it when we revive
+ # https://github.com/HypothesisWorks/hypothesis/pull/3624/
+ with suppress(Exception):
+ # Check whether the repr is valid syntax:
+ ast.parse(repr(obj))
+ # Given that the repr is valid syntax, check the call:
+ p = RepresentationPrinter()
+ p.stack = self.stack.copy()
+ p.known_object_printers = self.known_object_printers
+ p.repr_call(name, args, kwargs)
+ # If the call is not valid syntax, use the repr
+ try:
+ ast.parse(p.getvalue())
+ except Exception:
+ return _repr_pprint(obj, self, cycle)
+ return self.repr_call(name, args, kwargs)
+
def repr_call(
self,
func_name,
@@ -423,6 +447,7 @@ class RepresentationPrinter:
self.text(leading_comment)
self.break_()
else:
+ assert leading_comment is None # only passed by top-level report
self.breakable(" " if i else "")
if k:
self.text(f"{k}=")
diff --git a/contrib/python/hypothesis/py3/hypothesis/vendor/tlds-alpha-by-domain.txt b/contrib/python/hypothesis/py3/hypothesis/vendor/tlds-alpha-by-domain.txt
index 503af0851b..143dcdc680 100644
--- a/contrib/python/hypothesis/py3/hypothesis/vendor/tlds-alpha-by-domain.txt
+++ b/contrib/python/hypothesis/py3/hypothesis/vendor/tlds-alpha-by-domain.txt
@@ -1,4 +1,4 @@
-# Version 2024062300, Last Updated Sun Jun 23 07:07:01 2024 UTC
+# Version 2024071300, Last Updated Sat Jul 13 07:07:01 2024 UTC
AAA
AARP
ABB
@@ -1038,7 +1038,6 @@ SG
SH
SHANGRILA
SHARP
-SHAW
SHELL
SHIA
SHIKSHA
diff --git a/contrib/python/hypothesis/py3/hypothesis/version.py b/contrib/python/hypothesis/py3/hypothesis/version.py
index 5259509771..4858f7fb0c 100644
--- a/contrib/python/hypothesis/py3/hypothesis/version.py
+++ b/contrib/python/hypothesis/py3/hypothesis/version.py
@@ -8,5 +8,5 @@
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/.
-__version_info__ = (6, 104, 2)
+__version_info__ = (6, 108, 2)
__version__ = ".".join(map(str, __version_info__))
diff --git a/contrib/python/hypothesis/py3/ya.make b/contrib/python/hypothesis/py3/ya.make
index 3e32db3afa..63eb354c8e 100644
--- a/contrib/python/hypothesis/py3/ya.make
+++ b/contrib/python/hypothesis/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(6.104.2)
+VERSION(6.108.2)
LICENSE(MPL-2.0)
diff --git a/contrib/python/jsonschema/py2/tests/ya.make b/contrib/python/jsonschema/py2/tests/ya.make
index 198984175b..156dbf093c 100644
--- a/contrib/python/jsonschema/py2/tests/ya.make
+++ b/contrib/python/jsonschema/py2/tests/ya.make
@@ -2,15 +2,10 @@ PY2TEST()
PEERDIR(
contrib/python/jsonschema
+ contrib/python/mock
contrib/python/Twisted
)
-IF (PYTHON2)
- PEERDIR(
- contrib/python/mock
- )
-ENDIF()
-
SRCDIR(contrib/python/jsonschema/py2/jsonschema/tests)
PY_SRCS(
diff --git a/contrib/python/jsonschema/py3/tests/ya.make b/contrib/python/jsonschema/py3/tests/ya.make
index 73af0ff813..ae27842696 100644
--- a/contrib/python/jsonschema/py3/tests/ya.make
+++ b/contrib/python/jsonschema/py3/tests/ya.make
@@ -5,12 +5,6 @@ PEERDIR(
contrib/python/Twisted
)
-IF (PYTHON2)
- PEERDIR(
- contrib/python/mock
- )
-ENDIF()
-
SRCDIR(contrib/python/jsonschema/py3/jsonschema/tests)
PY_SRCS(
diff --git a/contrib/python/prettytable/py3/.dist-info/METADATA b/contrib/python/prettytable/py3/.dist-info/METADATA
index 6b15eb6252..47a7f8e093 100644
--- a/contrib/python/prettytable/py3/.dist-info/METADATA
+++ b/contrib/python/prettytable/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.3
Name: prettytable
-Version: 3.10.0
+Version: 3.10.2
Summary: A simple Python library for easily displaying tabular data in a visually appealing ASCII table format
Project-URL: Changelog, https://github.com/jazzband/prettytable/releases
Project-URL: Homepage, https://github.com/jazzband/prettytable
@@ -497,32 +497,32 @@ whatever you prefer. The `set_style` method just does this automatically for you
The options are:
-| Option | Details |
-| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `border` | A Boolean option (must be `True` or `False`). Controls whether a border is drawn inside and around the table. |
-| `preserve_internal_border` | A Boolean option (must be `True` or `False`). Controls whether borders are still drawn within the table even when `border=False`. |
-| `header` | A Boolean option (must be `True` or `False`). Controls whether the first row of the table is a header showing the names of all the fields. |
-| `hrules` | Controls printing of horizontal rules after rows. Allowed values: `FRAME`, `HEADER`, `ALL`, `NONE`. |
-| `HEADER`, `ALL`, `NONE` | These are variables defined inside the `prettytable` module so make sure you import them or use `prettytable.FRAME` etc. |
-| `vrules` | Controls printing of vertical rules between columns. Allowed values: `FRAME`, `ALL`, `NONE`. |
-| `int_format` | A string which controls the way integer data is printed. This works like: `print("%<int_format>d" % data)`. |
-| `float_format` | A string which controls the way floating point data is printed. This works like: `print("%<float_format>f" % data)`. |
-| `custom_format` | A dictionary of field and callable. This allows you to set any format you want `pf.custom_format["my_col_int"] = ()lambda f, v: f"{v:,}"`. The type of the callable if `callable[[str, Any], str]` |
-| `padding_width` | Number of spaces on either side of column data (only used if left and right paddings are `None`). |
-| `left_padding_width` | Number of spaces on left-hand side of column data. |
-| `right_padding_width` | Number of spaces on right-hand side of column data. |
-| `vertical_char` | Single character string used to draw vertical lines. Default: `\|`. |
-| `horizontal_char` | Single character string used to draw horizontal lines. Default: `-`. |
-| `_horizontal_align_char` | Single character string used to indicate column alignment in horizontal lines. Default: `:` for Markdown, otherwise `None`. |
-| `junction_char` | Single character string used to draw line junctions. Default: `+`. |
-| `top_junction_char` | Single character string used to draw top line junctions. Default: `junction_char`. |
-| `bottom_junction_char` | single character string used to draw bottom line junctions. Default: `junction_char`. |
-| `right_junction_char` | Single character string used to draw right line junctions. Default: `junction_char`. |
-| `left_junction_char` | Single character string used to draw left line junctions. Default: `junction_char`. |
-| `top_right_junction_char` | Single character string used to draw top-right line junctions. Default: `junction_char`. |
-| `top_left_junction_char` | Single character string used to draw top-left line junctions. Default: `junction_char`. |
-| `bottom_right_junction_char` | Single character string used to draw bottom-right line junctions. Default: `junction_char`. |
-| `bottom_left_junction_char` | Single character string used to draw bottom-left line junctions. Default: `junction_char`. |
+| Option | Details |
+| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `border` | A Boolean option (must be `True` or `False`). Controls whether a border is drawn inside and around the table. |
+| `preserve_internal_border` | A Boolean option (must be `True` or `False`). Controls whether borders are still drawn within the table even when `border=False`. |
+| `header` | A Boolean option (must be `True` or `False`). Controls whether the first row of the table is a header showing the names of all the fields. |
+| `hrules` | Controls printing of horizontal rules after rows. Allowed values: `FRAME`, `HEADER`, `ALL`, `NONE`. |
+| `HEADER`, `ALL`, `NONE` | These are variables defined inside the `prettytable` module so make sure you import them or use `prettytable.FRAME` etc. |
+| `vrules` | Controls printing of vertical rules between columns. Allowed values: `FRAME`, `ALL`, `NONE`. |
+| `int_format` | A string which controls the way integer data is printed. This works like: `print("%<int_format>d" % data)`. |
+| `float_format` | A string which controls the way floating point data is printed. This works like: `print("%<float_format>f" % data)`. |
+| `custom_format` | A dictionary of field and callable. This allows you to set any format you want `pf.custom_format["my_col_int"] = lambda f, v: f"{v:,}"`. The type of the callable is `Callable[[str, Any], str]` |
+| `padding_width` | Number of spaces on either side of column data (only used if left and right paddings are `None`). |
+| `left_padding_width` | Number of spaces on left-hand side of column data. |
+| `right_padding_width` | Number of spaces on right-hand side of column data. |
+| `vertical_char` | Single character string used to draw vertical lines. Default: `\|`. |
+| `horizontal_char` | Single character string used to draw horizontal lines. Default: `-`. |
+| `_horizontal_align_char` | Single character string used to indicate column alignment in horizontal lines. Default: `:` for Markdown, otherwise `None`. |
+| `junction_char` | Single character string used to draw line junctions. Default: `+`. |
+| `top_junction_char` | Single character string used to draw top line junctions. Default: `junction_char`. |
+| `bottom_junction_char` | single character string used to draw bottom line junctions. Default: `junction_char`. |
+| `right_junction_char` | Single character string used to draw right line junctions. Default: `junction_char`. |
+| `left_junction_char` | Single character string used to draw left line junctions. Default: `junction_char`. |
+| `top_right_junction_char` | Single character string used to draw top-right line junctions. Default: `junction_char`. |
+| `top_left_junction_char` | Single character string used to draw top-left line junctions. Default: `junction_char`. |
+| `bottom_right_junction_char` | Single character string used to draw bottom-right line junctions. Default: `junction_char`. |
+| `bottom_left_junction_char` | Single character string used to draw bottom-left line junctions. Default: `junction_char`. |
You can set the style options to your own settings in two ways:
diff --git a/contrib/python/prettytable/py3/README.md b/contrib/python/prettytable/py3/README.md
index cc32e6e2e4..aa442709f4 100644
--- a/contrib/python/prettytable/py3/README.md
+++ b/contrib/python/prettytable/py3/README.md
@@ -465,32 +465,32 @@ whatever you prefer. The `set_style` method just does this automatically for you
The options are:
-| Option | Details |
-| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `border` | A Boolean option (must be `True` or `False`). Controls whether a border is drawn inside and around the table. |
-| `preserve_internal_border` | A Boolean option (must be `True` or `False`). Controls whether borders are still drawn within the table even when `border=False`. |
-| `header` | A Boolean option (must be `True` or `False`). Controls whether the first row of the table is a header showing the names of all the fields. |
-| `hrules` | Controls printing of horizontal rules after rows. Allowed values: `FRAME`, `HEADER`, `ALL`, `NONE`. |
-| `HEADER`, `ALL`, `NONE` | These are variables defined inside the `prettytable` module so make sure you import them or use `prettytable.FRAME` etc. |
-| `vrules` | Controls printing of vertical rules between columns. Allowed values: `FRAME`, `ALL`, `NONE`. |
-| `int_format` | A string which controls the way integer data is printed. This works like: `print("%<int_format>d" % data)`. |
-| `float_format` | A string which controls the way floating point data is printed. This works like: `print("%<float_format>f" % data)`. |
-| `custom_format` | A dictionary of field and callable. This allows you to set any format you want `pf.custom_format["my_col_int"] = ()lambda f, v: f"{v:,}"`. The type of the callable if `callable[[str, Any], str]` |
-| `padding_width` | Number of spaces on either side of column data (only used if left and right paddings are `None`). |
-| `left_padding_width` | Number of spaces on left-hand side of column data. |
-| `right_padding_width` | Number of spaces on right-hand side of column data. |
-| `vertical_char` | Single character string used to draw vertical lines. Default: `\|`. |
-| `horizontal_char` | Single character string used to draw horizontal lines. Default: `-`. |
-| `_horizontal_align_char` | Single character string used to indicate column alignment in horizontal lines. Default: `:` for Markdown, otherwise `None`. |
-| `junction_char` | Single character string used to draw line junctions. Default: `+`. |
-| `top_junction_char` | Single character string used to draw top line junctions. Default: `junction_char`. |
-| `bottom_junction_char` | single character string used to draw bottom line junctions. Default: `junction_char`. |
-| `right_junction_char` | Single character string used to draw right line junctions. Default: `junction_char`. |
-| `left_junction_char` | Single character string used to draw left line junctions. Default: `junction_char`. |
-| `top_right_junction_char` | Single character string used to draw top-right line junctions. Default: `junction_char`. |
-| `top_left_junction_char` | Single character string used to draw top-left line junctions. Default: `junction_char`. |
-| `bottom_right_junction_char` | Single character string used to draw bottom-right line junctions. Default: `junction_char`. |
-| `bottom_left_junction_char` | Single character string used to draw bottom-left line junctions. Default: `junction_char`. |
+| Option | Details |
+| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `border` | A Boolean option (must be `True` or `False`). Controls whether a border is drawn inside and around the table. |
+| `preserve_internal_border` | A Boolean option (must be `True` or `False`). Controls whether borders are still drawn within the table even when `border=False`. |
+| `header` | A Boolean option (must be `True` or `False`). Controls whether the first row of the table is a header showing the names of all the fields. |
+| `hrules` | Controls printing of horizontal rules after rows. Allowed values: `FRAME`, `HEADER`, `ALL`, `NONE`. |
+| `HEADER`, `ALL`, `NONE` | These are variables defined inside the `prettytable` module so make sure you import them or use `prettytable.FRAME` etc. |
+| `vrules` | Controls printing of vertical rules between columns. Allowed values: `FRAME`, `ALL`, `NONE`. |
+| `int_format` | A string which controls the way integer data is printed. This works like: `print("%<int_format>d" % data)`. |
+| `float_format` | A string which controls the way floating point data is printed. This works like: `print("%<float_format>f" % data)`. |
+| `custom_format` | A dictionary of field and callable. This allows you to set any format you want `pf.custom_format["my_col_int"] = lambda f, v: f"{v:,}"`. The type of the callable is `Callable[[str, Any], str]` |
+| `padding_width` | Number of spaces on either side of column data (only used if left and right paddings are `None`). |
+| `left_padding_width` | Number of spaces on left-hand side of column data. |
+| `right_padding_width` | Number of spaces on right-hand side of column data. |
+| `vertical_char` | Single character string used to draw vertical lines. Default: `\|`. |
+| `horizontal_char` | Single character string used to draw horizontal lines. Default: `-`. |
+| `_horizontal_align_char` | Single character string used to indicate column alignment in horizontal lines. Default: `:` for Markdown, otherwise `None`. |
+| `junction_char` | Single character string used to draw line junctions. Default: `+`. |
+| `top_junction_char` | Single character string used to draw top line junctions. Default: `junction_char`. |
+| `bottom_junction_char` | single character string used to draw bottom line junctions. Default: `junction_char`. |
+| `right_junction_char` | Single character string used to draw right line junctions. Default: `junction_char`. |
+| `left_junction_char` | Single character string used to draw left line junctions. Default: `junction_char`. |
+| `top_right_junction_char` | Single character string used to draw top-right line junctions. Default: `junction_char`. |
+| `top_left_junction_char` | Single character string used to draw top-left line junctions. Default: `junction_char`. |
+| `bottom_right_junction_char` | Single character string used to draw bottom-right line junctions. Default: `junction_char`. |
+| `bottom_left_junction_char` | Single character string used to draw bottom-left line junctions. Default: `junction_char`. |
You can set the style options to your own settings in two ways:
diff --git a/contrib/python/prettytable/py3/prettytable/prettytable.py b/contrib/python/prettytable/py3/prettytable/prettytable.py
index df1cb86ab3..62a1df1df2 100644
--- a/contrib/python/prettytable/py3/prettytable/prettytable.py
+++ b/contrib/python/prettytable/py3/prettytable/prettytable.py
@@ -135,6 +135,7 @@ class PrettyTable:
self.int_format = {}
self.float_format = {}
self.custom_format = {}
+ self._style = None
if field_names:
self.field_names = field_names
@@ -1270,6 +1271,7 @@ class PrettyTable:
##############################
def set_style(self, style) -> None:
+ self._style = style
if style == DEFAULT:
self._set_default_style()
elif style == MSWORD_FRIENDLY:
@@ -1550,21 +1552,26 @@ class PrettyTable:
def _format_value(self, field, value):
if isinstance(value, int) and field in self._int_format:
- return ("%%%sd" % self._int_format[field]) % value
+ return (f"%{self._int_format[field]}d") % value
elif isinstance(value, float) and field in self._float_format:
- return ("%%%sf" % self._float_format[field]) % value
+ return (f"%{self._float_format[field]}f") % value
formatter = self._custom_format.get(field, (lambda f, v: str(v)))
return formatter(field, value)
def _compute_table_width(self, options):
- table_width = 2 if options["vrules"] in (FRAME, ALL) else 0
+ if options["vrules"] == FRAME:
+ table_width = 2
+ if options["vrules"] == ALL:
+ table_width = 1
+ else:
+ table_width = 0
per_col_padding = sum(self._get_padding_widths(options))
for index, fieldname in enumerate(self.field_names):
if not options["fields"] or (
options["fields"] and fieldname in options["fields"]
):
- table_width += self._widths[index] + per_col_padding
+ table_width += self._widths[index] + per_col_padding + 1
return table_width
def _compute_widths(self, rows, options) -> None:
@@ -1588,23 +1595,33 @@ class PrettyTable:
widths[index] = max(widths[index], _get_size(value)[0])
if fieldname in self.min_width:
widths[index] = max(widths[index], self.min_width[fieldname])
+
+ if self._style == MARKDOWN:
+ # Markdown needs at least one hyphen in the divider
+ if self._align[fieldname] in ("l", "r"):
+ min_width = 1
+ else: # "c"
+ min_width = 3
+ widths[index] = max(min_width, widths[index])
+
self._widths = widths
+ per_col_padding = sum(self._get_padding_widths(options))
# Are we exceeding max_table_width?
if self._max_table_width:
table_width = self._compute_table_width(options)
if table_width > self._max_table_width:
# Shrink widths in proportion
- scale = 1.0 * self._max_table_width / table_width
- widths = [int(w * scale) for w in widths]
- self._widths = widths
+ markup_chars = per_col_padding * len(widths) + len(widths) - 1
+ scale = (self._max_table_width - markup_chars) / (
+ table_width - markup_chars
+ )
+ self._widths = [max(1, int(w * scale)) for w in widths]
# Are we under min_table_width or title width?
if self._min_table_width or options["title"]:
if options["title"]:
- title_width = len(options["title"]) + sum(
- self._get_padding_widths(options)
- )
+ title_width = len(options["title"]) + per_col_padding
if options["vrules"] in (FRAME, ALL):
title_width += 2
else:
@@ -1619,9 +1636,7 @@ class PrettyTable:
borders = 0
# Subtract padding for each column and borders
- min_width -= (
- sum([sum(self._get_padding_widths(options)) for _ in widths]) + borders
- )
+ min_width -= sum([per_col_padding for _ in widths]) + borders
# What is being scaled is content so we sum column widths
content_width = sum(widths) or 1
@@ -1872,7 +1887,10 @@ class PrettyTable:
)
bits.append(endpoint)
title = " " * lpad + title + " " * rpad
- bits.append(self._justify(title, len(self._hrule) - 2, "c"))
+ lpad, rpad = self._get_padding_widths(options)
+ sum_widths = sum([n + lpad + rpad + 1 for n in self._widths])
+
+ bits.append(self._justify(title, sum_widths - 1, "c"))
bits.append(endpoint)
lines.append("".join(bits))
return "\n".join(lines)
@@ -1884,9 +1902,11 @@ class PrettyTable:
if options["hrules"] in (ALL, FRAME):
bits.append(self._stringify_hrule(options, "top_"))
if options["title"] and options["vrules"] in (ALL, FRAME):
+ left_j_len = len(self.left_junction_char)
+ right_j_len = len(self.right_junction_char)
bits[-1] = (
self.left_junction_char
- + bits[-1][1:-1]
+ + bits[-1][left_j_len:-right_j_len]
+ self.right_junction_char
)
bits.append("\n")
@@ -2178,7 +2198,9 @@ class PrettyTable:
if options["fields"] and field not in options["fields"]:
continue
lines.append(
- " <th>%s</th>" % escape(field).replace("\n", linebreak)
+ " <th>{}</th>".format(
+ escape(field).replace("\n", linebreak)
+ )
)
lines.append(" </tr>")
lines.append(" </thead>")
@@ -2193,7 +2215,9 @@ class PrettyTable:
if options["fields"] and field not in options["fields"]:
continue
lines.append(
- " <td>%s</td>" % escape(datum).replace("\n", linebreak)
+ " <td>{}</td>".format(
+ escape(datum).replace("\n", linebreak)
+ )
)
lines.append(" </tr>")
lines.append(" </tbody>")
@@ -2341,7 +2365,7 @@ class PrettyTable:
alignments = "".join([self._align[field] for field in wanted_fields])
- begin_cmd = "\\begin{tabular}{%s}" % alignments
+ begin_cmd = f"\\begin{{tabular}}{{{alignments}}}"
lines.append(begin_cmd)
# Headers
@@ -2383,7 +2407,7 @@ class PrettyTable:
if options["border"] and options["vrules"] in [ALL, FRAME]:
alignment_str = "|" + alignment_str + "|"
- begin_cmd = "\\begin{tabular}{%s}" % alignment_str
+ begin_cmd = f"\\begin{{tabular}}{{{alignment_str}}}"
lines.append(begin_cmd)
if options["border"] and options["hrules"] in [ALL, FRAME]:
lines.append("\\hline")
diff --git a/contrib/python/prettytable/py3/tests/test_colortable.py b/contrib/python/prettytable/py3/tests/test_colortable.py
index 1e057e2afc..4668ed54dd 100644
--- a/contrib/python/prettytable/py3/tests/test_colortable.py
+++ b/contrib/python/prettytable/py3/tests/test_colortable.py
@@ -3,7 +3,7 @@ from __future__ import annotations
import pytest
from prettytable import PrettyTable
-from prettytable.colortable import RESET_CODE, ColorTable, Theme
+from prettytable.colortable import RESET_CODE, ColorTable, Theme, Themes
@pytest.fixture
@@ -94,3 +94,64 @@ class TestFormatCode:
def test_multiple(self) -> None:
assert Theme.format_code("30;42") == "\x1b[30;42m"
assert Theme.format_code("\x1b[30;42m") == "\x1b[30;42m"
+
+
+class TestColorTableRendering:
+ """Tests for the rendering of the color table
+
+ Methods
+ -------
+ test_color_table_rendering
+ Tests the color table rendering using the default alignment (`'c'`)
+ """
+
+ def test_color_table_rendering(self) -> None:
+ """Tests the color table rendering using the default alignment (`'c'`)"""
+ chars = {
+ "+": "\x1b[36m+\x1b[0m\x1b[96m",
+ "-": "\x1b[34m-\x1b[0m\x1b[96m",
+ "|": "\x1b[34m|\x1b[0m\x1b[96m",
+ " ": " ",
+ }
+
+ plus = chars.get("+")
+ minus = chars.get("-")
+ pipe = chars.get("|")
+ space = chars.get(" ")
+
+ # +-----------------------+
+ # | Efforts |
+ # +---+---+---+---+---+---+
+ # | A | B | C | D | E | f |
+ # +---+---+---+---+---+---+
+ # | 1 | 2 | 3 | 4 | 5 | 6 |
+ # +---+---+---+---+---+---+
+
+ header = (
+ plus + minus * 23 + plus,
+ pipe + space * 8 + "Efforts" + space * 8 + pipe,
+ (plus + minus * 3) * 6 + plus,
+ )
+
+ body = (
+ "".join(pipe + space + char + space for char in "ABCDEF") + pipe,
+ (plus + minus * 3) * 6 + plus,
+ "".join(pipe + space + char + space for char in "123456") + pipe,
+ (plus + minus * 3) * 6 + plus,
+ )
+
+ header_str = str("\n".join(header))
+ body_str = str("\n".join(body))
+
+ table = ColorTable(
+ ("A", "B", "C", "D", "E", "F"),
+ theme=Themes.OCEAN,
+ )
+
+ table.title = "Efforts"
+ table.add_row([1, 2, 3, 4, 5, 6])
+
+ expected = header_str + "\n" + body_str + "\x1b[0m"
+ result = str(table)
+
+ assert expected == result
diff --git a/contrib/python/prettytable/py3/tests/test_prettytable.py b/contrib/python/prettytable/py3/tests/test_prettytable.py
index 214c5c084e..9b51e4a2ce 100644
--- a/contrib/python/prettytable/py3/tests/test_prettytable.py
+++ b/contrib/python/prettytable/py3/tests/test_prettytable.py
@@ -41,11 +41,11 @@ def test_version() -> None:
def helper_table(rows: int = 3) -> PrettyTable:
- table = PrettyTable(["Field 1", "Field 2", "Field 3"])
+ table = PrettyTable(["", "Field 1", "Field 2", "Field 3"])
v = 1
for row in range(rows):
# Some have spaces, some not, to help test padding columns of different widths
- table.add_row([f"value {v}", f"value{v+1}", f"value{v+2}"])
+ table.add_row([v, f"value {v}", f"value{v+1}", f"value{v+2}"])
v += 3
return table
@@ -998,21 +998,25 @@ class TestJSONOutput:
== """
[
[
+ "",
"Field 1",
"Field 2",
"Field 3"
],
{
+ "": 1,
"Field 1": "value 1",
"Field 2": "value2",
"Field 3": "value3"
},
{
+ "": 4,
"Field 1": "value 4",
"Field 2": "value5",
"Field 3": "value6"
},
{
+ "": 7,
"Field 1": "value 7",
"Field 2": "value8",
"Field 3": "value9"
@@ -1025,9 +1029,9 @@ class TestJSONOutput:
result = t.get_json_string(header=False, indent=None, separators=(",", ":"))
assert (
result
- == """[{"Field 1":"value 1","Field 2":"value2","Field 3":"value3"},"""
- """{"Field 1":"value 4","Field 2":"value5","Field 3":"value6"},"""
- """{"Field 1":"value 7","Field 2":"value8","Field 3":"value9"}]"""
+ == """[{"":1,"Field 1":"value 1","Field 2":"value2","Field 3":"value3"},"""
+ """{"":4,"Field 1":"value 4","Field 2":"value5","Field 3":"value6"},"""
+ """{"":7,"Field 1":"value 7","Field 2":"value8","Field 3":"value9"}]"""
)
@@ -1041,6 +1045,7 @@ class TestHtmlOutput:
<table>
<thead>
<tr>
+ <th></th>
<th>Field 1</th>
<th>Field 2</th>
<th>Field 3</th>
@@ -1048,16 +1053,19 @@ class TestHtmlOutput:
</thead>
<tbody>
<tr>
+ <td>1</td>
<td>value 1</td>
<td>value2</td>
<td>value3</td>
</tr>
<tr>
+ <td>4</td>
<td>value 4</td>
<td>value5</td>
<td>value6</td>
</tr>
<tr>
+ <td>7</td>
<td>value 7</td>
<td>value8</td>
<td>value9</td>
@@ -1076,6 +1084,7 @@ class TestHtmlOutput:
<table frame="box" rules="cols">
<thead>
<tr>
+ <th style="padding-left: 1em; padding-right: 1em; text-align: center"></th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 1</th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 2</th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 3</th>
@@ -1083,16 +1092,19 @@ class TestHtmlOutput:
</thead>
<tbody>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">1</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 1</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value2</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value3</td>
</tr>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">4</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 4</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value5</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value6</td>
</tr>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">7</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 7</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value8</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value9</td>
@@ -1113,6 +1125,7 @@ class TestHtmlOutput:
<caption>Title &amp; Title</caption>
<thead>
<tr>
+ <th></th>
<th>Field 1</th>
<th>Field 2</th>
<th>Field 3</th>
@@ -1120,16 +1133,19 @@ class TestHtmlOutput:
</thead>
<tbody>
<tr>
+ <td>1</td>
<td>value 1</td>
<td>value2</td>
<td>value3</td>
</tr>
<tr>
+ <td>4</td>
<td>value 4</td>
<td>value5</td>
<td>value6</td>
</tr>
<tr>
+ <td>7</td>
<td>value 7</td>
<td>value8</td>
<td>value9</td>
@@ -1152,6 +1168,7 @@ class TestHtmlOutput:
<caption>Title &amp; Title</caption>
<thead>
<tr>
+ <th style="padding-left: 1em; padding-right: 1em; text-align: center"></th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 1</th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 2</th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 3</th>
@@ -1159,16 +1176,19 @@ class TestHtmlOutput:
</thead>
<tbody>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">1</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 1</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value2</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value3</td>
</tr>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">4</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 4</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value5</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value6</td>
</tr>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">7</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 7</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value8</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value9</td>
@@ -1337,93 +1357,95 @@ class TestStyle:
pytest.param(
DEFAULT,
"""
-+---------+---------+---------+
-| Field 1 | Field 2 | Field 3 |
-+---------+---------+---------+
-| value 1 | value2 | value3 |
-| value 4 | value5 | value6 |
-| value 7 | value8 | value9 |
-+---------+---------+---------+
++---+---------+---------+---------+
+| | Field 1 | Field 2 | Field 3 |
++---+---------+---------+---------+
+| 1 | value 1 | value2 | value3 |
+| 4 | value 4 | value5 | value6 |
+| 7 | value 7 | value8 | value9 |
++---+---------+---------+---------+
""",
id="DEFAULT",
),
pytest.param(
- MARKDOWN,
+ MARKDOWN, # TODO fix
"""
-| Field 1 | Field 2 | Field 3 |
-| :-----: | :-----: | :-----: |
-| value 1 | value2 | value3 |
-| value 4 | value5 | value6 |
-| value 7 | value8 | value9 |
+| | Field 1 | Field 2 | Field 3 |
+| :-: | :-----: | :-----: | :-----: |
+| 1 | value 1 | value2 | value3 |
+| 4 | value 4 | value5 | value6 |
+| 7 | value 7 | value8 | value9 |
""",
id="MARKDOWN",
),
pytest.param(
MSWORD_FRIENDLY,
"""
-| Field 1 | Field 2 | Field 3 |
-| value 1 | value2 | value3 |
-| value 4 | value5 | value6 |
-| value 7 | value8 | value9 |
+| | Field 1 | Field 2 | Field 3 |
+| 1 | value 1 | value2 | value3 |
+| 4 | value 4 | value5 | value6 |
+| 7 | value 7 | value8 | value9 |
""",
id="MSWORD_FRIENDLY",
),
pytest.param(
ORGMODE,
"""
-|---------+---------+---------|
-| Field 1 | Field 2 | Field 3 |
-|---------+---------+---------|
-| value 1 | value2 | value3 |
-| value 4 | value5 | value6 |
-| value 7 | value8 | value9 |
-|---------+---------+---------|
+|---+---------+---------+---------|
+| | Field 1 | Field 2 | Field 3 |
+|---+---------+---------+---------|
+| 1 | value 1 | value2 | value3 |
+| 4 | value 4 | value5 | value6 |
+| 7 | value 7 | value8 | value9 |
+|---+---------+---------+---------|
""",
id="ORGMODE",
),
pytest.param(
PLAIN_COLUMNS,
- "Field 1 Field 2 Field 3 \n"
- "value 1 value2 value3 \n"
- "value 4 value5 value6 \n"
- "value 7 value8 value9",
+ """
+ Field 1 Field 2 Field 3
+1 value 1 value2 value3
+4 value 4 value5 value6
+7 value 7 value8 value9
+""", # noqa: W291
id="PLAIN_COLUMNS",
),
pytest.param(
RANDOM,
"""
-'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
-% value 1% value2% value3%
-'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
-% value 4% value5% value6%
-'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
-% value 7% value8% value9%
-'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
+'^^^^^'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
+% 1% value 1% value2% value3%
+'^^^^^'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
+% 4% value 4% value5% value6%
+'^^^^^'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
+% 7% value 7% value8% value9%
+'^^^^^'^^^^^^^^^^^'^^^^^^^^^^'^^^^^^^^^^'
""",
id="RANDOM",
),
pytest.param(
DOUBLE_BORDER,
"""
-╔═════════╦═════════╦═════════╗
-║ Field 1 ║ Field 2 ║ Field 3 ║
-╠═════════╬═════════╬═════════╣
-║ value 1 ║ value2 ║ value3 ║
-║ value 4 ║ value5 ║ value6 ║
-║ value 7 ║ value8 ║ value9 ║
-╚═════════╩═════════╩═════════╝
+╔═══╦═════════╦═════════╦═════════╗
+║ ║ Field 1 ║ Field 2 ║ Field 3 ║
+╠═══╬═════════╬═════════╬═════════╣
+║ 1 ║ value 1 ║ value2 ║ value3 ║
+║ 4 ║ value 4 ║ value5 ║ value6 ║
+║ 7 ║ value 7 ║ value8 ║ value9 ║
+╚═══╩═════════╩═════════╩═════════╝
""",
),
pytest.param(
SINGLE_BORDER,
"""
-┌─────────┬─────────┬─────────┐
-│ Field 1 │ Field 2 │ Field 3 │
-├─────────┼─────────┼─────────┤
-│ value 1 │ value2 │ value3 │
-│ value 4 │ value5 │ value6 │
-│ value 7 │ value8 │ value9 │
-└─────────┴─────────┴─────────┘
+┌───┬─────────┬─────────┬─────────┐
+│ │ Field 1 │ Field 2 │ Field 3 │
+├───┼─────────┼─────────┼─────────┤
+│ 1 │ value 1 │ value2 │ value3 │
+│ 4 │ value 4 │ value5 │ value6 │
+│ 7 │ value 7 │ value8 │ value9 │
+└───┴─────────┴─────────┴─────────┘
""",
),
],
@@ -1455,11 +1477,11 @@ class TestStyle:
pytest.param(
MARKDOWN,
"""
-| Align left | Align centre | Align right |
-| :----------| :----------: |-----------: |
-| value 1 | value2 | value3 |
-| value 4 | value5 | value6 |
-| value 7 | value8 | value9 |
+| l | c | r | Align left | Align centre | Align right |
+| :-| :-: |-: | :----------| :----------: |-----------: |
+| 1 | 2 | 3 | value 1 | value2 | value3 |
+| 4 | 5 | 6 | value 4 | value5 | value6 |
+| 7 | 8 | 9 | value 7 | value8 | value9 |
""",
id="MARKDOWN",
),
@@ -1467,14 +1489,19 @@ class TestStyle:
)
def test_style_align(self, style, expected) -> None:
# Arrange
- t = helper_table()
- t.field_names = ["Align left", "Align centre", "Align right"]
+ t = PrettyTable(["l", "c", "r", "Align left", "Align centre", "Align right"])
+ v = 1
+ for row in range(3):
+ # Some have spaces, some not, to help test padding columns of
+ # different widths
+ t.add_row([v, v + 1, v + 2, f"value {v}", f"value{v + 1}", f"value{v + 2}"])
+ v += 3
# Act
t.set_style(style)
- t.align["Align left"] = "l"
- t.align["Align centre"] = "c"
- t.align["Align right"] = "r"
+ t.align["l"] = t.align["Align left"] = "l"
+ t.align["c"] = t.align["Align centre"] = "c"
+ t.align["r"] = t.align["Align right"] = "r"
# Assert
result = t.get_string()
@@ -1485,15 +1512,15 @@ class TestCsvOutput:
def test_csv_output(self) -> None:
t = helper_table()
assert t.get_csv_string(delimiter="\t", header=False) == (
- "value 1\tvalue2\tvalue3\r\n"
- "value 4\tvalue5\tvalue6\r\n"
- "value 7\tvalue8\tvalue9\r\n"
+ "1\tvalue 1\tvalue2\tvalue3\r\n"
+ "4\tvalue 4\tvalue5\tvalue6\r\n"
+ "7\tvalue 7\tvalue8\tvalue9\r\n"
)
assert t.get_csv_string() == (
- "Field 1,Field 2,Field 3\r\n"
- "value 1,value2,value3\r\n"
- "value 4,value5,value6\r\n"
- "value 7,value8,value9\r\n"
+ ",Field 1,Field 2,Field 3\r\n"
+ "1,value 1,value2,value3\r\n"
+ "4,value 4,value5,value6\r\n"
+ "7,value 7,value8,value9\r\n"
)
@@ -1501,11 +1528,11 @@ class TestLatexOutput:
def test_latex_output(self) -> None:
t = helper_table()
assert t.get_latex_string() == (
- "\\begin{tabular}{ccc}\r\n"
- "Field 1 & Field 2 & Field 3 \\\\\r\n"
- "value 1 & value2 & value3 \\\\\r\n"
- "value 4 & value5 & value6 \\\\\r\n"
- "value 7 & value8 & value9 \\\\\r\n"
+ "\\begin{tabular}{cccc}\r\n"
+ " & Field 1 & Field 2 & Field 3 \\\\\r\n"
+ "1 & value 1 & value2 & value3 \\\\\r\n"
+ "4 & value 4 & value5 & value6 \\\\\r\n"
+ "7 & value 7 & value8 & value9 \\\\\r\n"
"\\end{tabular}"
)
options = {"fields": ["Field 1", "Field 3"]}
@@ -1521,12 +1548,12 @@ class TestLatexOutput:
def test_latex_output_formatted(self) -> None:
t = helper_table()
assert t.get_latex_string(format=True) == (
- "\\begin{tabular}{|c|c|c|}\r\n"
+ "\\begin{tabular}{|c|c|c|c|}\r\n"
"\\hline\r\n"
- "Field 1 & Field 2 & Field 3 \\\\\r\n"
- "value 1 & value2 & value3 \\\\\r\n"
- "value 4 & value5 & value6 \\\\\r\n"
- "value 7 & value8 & value9 \\\\\r\n"
+ " & Field 1 & Field 2 & Field 3 \\\\\r\n"
+ "1 & value 1 & value2 & value3 \\\\\r\n"
+ "4 & value 4 & value5 & value6 \\\\\r\n"
+ "7 & value 7 & value8 & value9 \\\\\r\n"
"\\hline\r\n"
"\\end{tabular}"
)
@@ -1545,27 +1572,27 @@ class TestLatexOutput:
options = {"vrules": FRAME}
assert t.get_latex_string(format=True, **options) == (
- "\\begin{tabular}{|ccc|}\r\n"
+ "\\begin{tabular}{|cccc|}\r\n"
"\\hline\r\n"
- "Field 1 & Field 2 & Field 3 \\\\\r\n"
- "value 1 & value2 & value3 \\\\\r\n"
- "value 4 & value5 & value6 \\\\\r\n"
- "value 7 & value8 & value9 \\\\\r\n"
+ " & Field 1 & Field 2 & Field 3 \\\\\r\n"
+ "1 & value 1 & value2 & value3 \\\\\r\n"
+ "4 & value 4 & value5 & value6 \\\\\r\n"
+ "7 & value 7 & value8 & value9 \\\\\r\n"
"\\hline\r\n"
"\\end{tabular}"
)
options = {"hrules": ALL}
assert t.get_latex_string(format=True, **options) == (
- "\\begin{tabular}{|c|c|c|}\r\n"
+ "\\begin{tabular}{|c|c|c|c|}\r\n"
"\\hline\r\n"
- "Field 1 & Field 2 & Field 3 \\\\\r\n"
+ " & Field 1 & Field 2 & Field 3 \\\\\r\n"
"\\hline\r\n"
- "value 1 & value2 & value3 \\\\\r\n"
+ "1 & value 1 & value2 & value3 \\\\\r\n"
"\\hline\r\n"
- "value 4 & value5 & value6 \\\\\r\n"
+ "4 & value 4 & value5 & value6 \\\\\r\n"
"\\hline\r\n"
- "value 7 & value8 & value9 \\\\\r\n"
+ "7 & value 7 & value8 & value9 \\\\\r\n"
"\\hline\r\n"
"\\end{tabular}"
)
@@ -1573,12 +1600,12 @@ class TestLatexOutput:
def test_latex_output_header(self) -> None:
t = helper_table()
assert t.get_latex_string(format=True, hrules=HEADER) == (
- "\\begin{tabular}{|c|c|c|}\r\n"
- "Field 1 & Field 2 & Field 3 \\\\\r\n"
+ "\\begin{tabular}{|c|c|c|c|}\r\n"
+ " & Field 1 & Field 2 & Field 3 \\\\\r\n"
"\\hline\r\n"
- "value 1 & value2 & value3 \\\\\r\n"
- "value 4 & value5 & value6 \\\\\r\n"
- "value 7 & value8 & value9 \\\\\r\n"
+ "1 & value 1 & value2 & value3 \\\\\r\n"
+ "4 & value 4 & value5 & value6 \\\\\r\n"
+ "7 & value 7 & value8 & value9 \\\\\r\n"
"\\end{tabular}"
)
@@ -1716,23 +1743,23 @@ def test_paginate() -> None:
# Arrange
t = helper_table(rows=7)
expected_page_1 = """
-+----------+---------+---------+
-| Field 1 | Field 2 | Field 3 |
-+----------+---------+---------+
-| value 1 | value2 | value3 |
-| value 4 | value5 | value6 |
-| value 7 | value8 | value9 |
-| value 10 | value11 | value12 |
-+----------+---------+---------+
++----+----------+---------+---------+
+| | Field 1 | Field 2 | Field 3 |
++----+----------+---------+---------+
+| 1 | value 1 | value2 | value3 |
+| 4 | value 4 | value5 | value6 |
+| 7 | value 7 | value8 | value9 |
+| 10 | value 10 | value11 | value12 |
++----+----------+---------+---------+
""".strip()
expected_page_2 = """
-+----------+---------+---------+
-| Field 1 | Field 2 | Field 3 |
-+----------+---------+---------+
-| value 13 | value14 | value15 |
-| value 16 | value17 | value18 |
-| value 19 | value20 | value21 |
-+----------+---------+---------+
++----+----------+---------+---------+
+| | Field 1 | Field 2 | Field 3 |
++----+----------+---------+---------+
+| 13 | value 13 | value14 | value15 |
+| 16 | value 16 | value17 | value18 |
+| 19 | value 19 | value20 | value21 |
++----+----------+---------+---------+
""".strip()
# Act
@@ -2008,17 +2035,141 @@ class TestMaxTableWidth:
table.max_table_width = 5
table.add_row([0])
+ # FIXME: Table is wider than table.max_table_width
assert (
table.get_string().strip()
== """
-+-----+
-| Fie |
-+-----+
-| 0 |
-+-----+
++----+
+| Fi |
++----+
+| 0 |
++----+
""".strip()
)
+ def test_max_table_width_wide(self) -> None:
+ table = PrettyTable()
+ table.max_table_width = 52
+ table.add_row(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+ "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam "
+ "erat, sed diam voluptua",
+ ]
+ )
+
+ assert (
+ table.get_string().strip()
+ == """
++---+---+---+---+---+------------------------------+
+| F | F | F | F | F | Field 6 |
++---+---+---+---+---+------------------------------+
+| 0 | 0 | 0 | 0 | 0 | Lorem ipsum dolor sit amet, |
+| | | | | | consetetur sadipscing elitr, |
+| | | | | | sed diam nonumy eirmod |
+| | | | | | tempor invidunt ut labore et |
+| | | | | | dolore magna aliquyam erat, |
+| | | | | | sed diam voluptua |
++---+---+---+---+---+------------------------------+""".strip()
+ )
+
+ def test_max_table_width_wide2(self) -> None:
+ table = PrettyTable()
+ table.max_table_width = 70
+ table.add_row(
+ [
+ "Lorem",
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam ",
+ "ipsum",
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam ",
+ "dolor",
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam ",
+ ]
+ )
+
+ assert (
+ table.get_string().strip()
+ == """
++---+-----------------+---+-----------------+---+-----------------+
+| F | Field 2 | F | Field 4 | F | Field 6 |
++---+-----------------+---+-----------------+---+-----------------+
+| L | Lorem ipsum | i | Lorem ipsum | d | Lorem ipsum |
+| o | dolor sit amet, | p | dolor sit amet, | o | dolor sit amet, |
+| r | consetetur | s | consetetur | l | consetetur |
+| e | sadipscing | u | sadipscing | o | sadipscing |
+| m | elitr, sed diam | m | elitr, sed diam | r | elitr, sed diam |
++---+-----------------+---+-----------------+---+-----------------+""".strip()
+ )
+
+ def test_max_table_width_wide_vrules_frame(self) -> None:
+ table = PrettyTable()
+ table.max_table_width = 52
+ table.vrules = FRAME
+ table.add_row(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+ "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam "
+ "erat, sed diam voluptua",
+ ]
+ )
+
+ assert (
+ table.get_string().strip()
+ == """
++--------------------------------------------------+
+| F F F F F Field 6 |
++--------------------------------------------------+
+| 0 0 0 0 0 Lorem ipsum dolor sit amet, |
+| consetetur sadipscing elitr, |
+| sed diam nonumy eirmod |
+| tempor invidunt ut labore et |
+| dolore magna aliquyam erat, |
+| sed diam voluptua |
++--------------------------------------------------+""".strip()
+ )
+
+ def test_max_table_width_wide_vrules_none(self) -> None:
+ table = PrettyTable()
+ table.max_table_width = 52
+ table.vrules = NONE
+ table.add_row(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+ "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam "
+ "erat, sed diam voluptua",
+ ]
+ )
+
+ assert (
+ table.get_string().strip()
+ == """
+----------------------------------------------------
+ F F F F F Field 6
+----------------------------------------------------
+ 0 0 0 0 0 Lorem ipsum dolor sit amet,
+ consetetur sadipscing elitr,
+ sed diam nonumy eirmod
+ tempor invidunt ut labore et
+ dolore magna aliquyam erat,
+ sed diam voluptua
+----------------------------------------------------""".strip() # noqa: W291
+ )
+
class TestRowEndSection:
def test_row_end_section(self) -> None:
@@ -2053,15 +2204,15 @@ class TestRowEndSection:
class TestClearing:
def test_clear_rows(self, row_prettytable: PrettyTable) -> None:
t = helper_table()
- t.add_row(["a", "b", "c"], divider=True)
+ t.add_row([0, "a", "b", "c"], divider=True)
t.clear_rows()
assert t.rows == []
assert t.dividers == []
- assert t.field_names == ["Field 1", "Field 2", "Field 3"]
+ assert t.field_names == ["", "Field 1", "Field 2", "Field 3"]
def test_clear(self, row_prettytable: PrettyTable) -> None:
t = helper_table()
- t.add_row(["a", "b", "c"], divider=True)
+ t.add_row([0, "a", "b", "c"], divider=True)
t.clear()
assert t.rows == []
assert t.dividers == []
@@ -2077,11 +2228,11 @@ class TestPreservingInternalBorders:
assert (
pt.get_string().strip()
== """
- Field 1 | Field 2 | Field 3
----------+---------+---------
- value 1 | value2 | value3
- value 4 | value5 | value6
- value 7 | value8 | value9
+ | Field 1 | Field 2 | Field 3
+---+---------+---------+---------
+ 1 | value 1 | value2 | value3
+ 4 | value 4 | value5 | value6
+ 7 | value 7 | value8 | value9
""".strip() # noqa: W291
)
@@ -2092,11 +2243,11 @@ class TestPreservingInternalBorders:
pt.preserve_internal_border = True
assert pt.get_latex_string().strip() == (
- "\\begin{tabular}{c|c|c}\r\n"
- "Field 1 & Field 2 & Field 3 \\\\\r\n"
- "value 1 & value2 & value3 \\\\\r\n"
- "value 4 & value5 & value6 \\\\\r\n"
- "value 7 & value8 & value9 \\\\\r\n"
+ "\\begin{tabular}{c|c|c|c}\r\n"
+ " & Field 1 & Field 2 & Field 3 \\\\\r\n"
+ "1 & value 1 & value2 & value3 \\\\\r\n"
+ "4 & value 4 & value5 & value6 \\\\\r\n"
+ "7 & value 7 & value8 & value9 \\\\\r\n"
"\\end{tabular}"
)
@@ -2112,6 +2263,7 @@ class TestPreservingInternalBorders:
<table rules="cols">
<thead>
<tr>
+ <th style="padding-left: 1em; padding-right: 1em; text-align: center"></th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 1</th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 2</th>
<th style="padding-left: 1em; padding-right: 1em; text-align: center">Field 3</th>
@@ -2119,16 +2271,19 @@ class TestPreservingInternalBorders:
</thead>
<tbody>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">1</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 1</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value2</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value3</td>
</tr>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">4</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 4</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value5</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value6</td>
</tr>
<tr>
+ <td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">7</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value 7</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value8</td>
<td style="padding-left: 1em; padding-right: 1em; text-align: center; vertical-align: top">value9</td>
diff --git a/contrib/python/prettytable/py3/ya.make b/contrib/python/prettytable/py3/ya.make
index 50b394fc53..c44b0c331b 100644
--- a/contrib/python/prettytable/py3/ya.make
+++ b/contrib/python/prettytable/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(3.10.0)
+VERSION(3.10.2)
LICENSE(BSD-3-Clause)
diff --git a/contrib/python/setuptools/py3/.dist-info/METADATA b/contrib/python/setuptools/py3/.dist-info/METADATA
index 6500c47bd1..90eca520d0 100644
--- a/contrib/python/setuptools/py3/.dist-info/METADATA
+++ b/contrib/python/setuptools/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: setuptools
-Version: 70.2.0
+Version: 70.3.0
Summary: Easily download, build, install, upgrade, and uninstall Python packages
Author-email: Python Packaging Authority <distutils-sig@python.org>
Project-URL: Source, https://github.com/pypa/setuptools
diff --git a/contrib/python/setuptools/py3/_distutils_hack/__init__.py b/contrib/python/setuptools/py3/_distutils_hack/__init__.py
index 4d3f09b0ae..35ab5cad49 100644
--- a/contrib/python/setuptools/py3/_distutils_hack/__init__.py
+++ b/contrib/python/setuptools/py3/_distutils_hack/__init__.py
@@ -3,6 +3,12 @@ import sys
import os
+report_url = (
+ "https://github.com/pypa/setuptools/issues/new?"
+ "template=distutils-deprecation.yml"
+)
+
+
def warn_distutils_present():
if 'distutils' not in sys.modules:
return
@@ -23,7 +29,12 @@ def clear_distutils():
return
import warnings
- warnings.warn("Setuptools is replacing distutils.")
+ warnings.warn(
+ "Setuptools is replacing distutils. Support for replacing "
+ "an already imported distutils is deprecated. In the future, "
+ "this condition will fail. "
+ f"Register concerns at {report_url}"
+ )
mods = [
name
for name in sys.modules
@@ -38,6 +49,16 @@ def enabled():
Allow selection of distutils by environment variable.
"""
which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local')
+ if which == 'stdlib':
+ import warnings
+
+ warnings.warn(
+ "Reliance on distutils from stdlib is deprecated. Users "
+ "must rely on setuptools to provide the distutils module. "
+ "Avoid importing distutils or import setuptools first, "
+ "and avoid setting SETUPTOOLS_USE_DISTUTILS=stdlib. "
+ f"Register concerns at {report_url}"
+ )
return which == 'local'
diff --git a/contrib/python/setuptools/py3/setuptools/_distutils/sysconfig.py b/contrib/python/setuptools/py3/setuptools/_distutils/sysconfig.py
index 4ba0be5602..7ebe67687e 100644
--- a/contrib/python/setuptools/py3/setuptools/_distutils/sysconfig.py
+++ b/contrib/python/setuptools/py3/setuptools/_distutils/sysconfig.py
@@ -293,7 +293,9 @@ def customize_compiler(compiler): # noqa: C901
Mainly needed on Unix, so we can plug in the information that
varies across Unices and is stored in Python's Makefile.
"""
- if compiler.compiler_type in ["unix", "cygwin", "mingw32"]:
+ if compiler.compiler_type in ["unix", "cygwin"] or (
+ compiler.compiler_type == "mingw32" and is_mingw()
+ ):
_customize_macos()
(
diff --git a/contrib/python/setuptools/py3/ya.make b/contrib/python/setuptools/py3/ya.make
index f4b0026586..38047edfe4 100644
--- a/contrib/python/setuptools/py3/ya.make
+++ b/contrib/python/setuptools/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(70.2.0)
+VERSION(70.3.0)
LICENSE(MIT)
diff --git a/contrib/python/zstandard/py3/.dist-info/METADATA b/contrib/python/zstandard/py3/.dist-info/METADATA
index d7be705bd9..e7304ab714 100644
--- a/contrib/python/zstandard/py3/.dist-info/METADATA
+++ b/contrib/python/zstandard/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: zstandard
-Version: 0.22.0
+Version: 0.23.0
Summary: Zstandard bindings for Python
Home-page: https://github.com/indygreg/python-zstandard
Author: Gregory Szorc
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.8
License-File: LICENSE
Requires-Dist: cffi >=1.11 ; platform_python_implementation == "PyPy"
diff --git a/contrib/python/zstandard/py3/c-ext/python-zstandard.h b/contrib/python/zstandard/py3/c-ext/python-zstandard.h
index ffcbdfd101..a16caa54c5 100644
--- a/contrib/python/zstandard/py3/c-ext/python-zstandard.h
+++ b/contrib/python/zstandard/py3/c-ext/python-zstandard.h
@@ -31,7 +31,7 @@
/* Remember to change the string in zstandard/__init__.py, rust-ext/src/lib.rs,
and debian/changelog as well */
-#define PYTHON_ZSTANDARD_VERSION "0.22.0"
+#define PYTHON_ZSTANDARD_VERSION "0.23.0"
typedef enum {
compressorobj_flush_finish,
diff --git a/contrib/python/zstandard/py3/ya.make b/contrib/python/zstandard/py3/ya.make
index d817d61ac9..f86d3adbd1 100644
--- a/contrib/python/zstandard/py3/ya.make
+++ b/contrib/python/zstandard/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(0.22.0)
+VERSION(0.23.0)
LICENSE(BSD-3-Clause)
diff --git a/contrib/python/zstandard/py3/zstandard/__init__.py b/contrib/python/zstandard/py3/zstandard/__init__.py
index 8588729004..8590805af8 100644
--- a/contrib/python/zstandard/py3/zstandard/__init__.py
+++ b/contrib/python/zstandard/py3/zstandard/__init__.py
@@ -80,7 +80,7 @@ else:
)
# Keep this in sync with python-zstandard.h, rust-ext/src/lib.rs, and debian/changelog.
-__version__ = "0.22.0"
+__version__ = "0.23.0"
_MODE_CLOSED = 0
_MODE_READ = 1
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree.hpp
index 747d41cc38..4eda39e699 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree.hpp
@@ -18,7 +18,6 @@
#include <boost/intrusive/detail/minimal_less_equal_header.hpp>
#include <boost/intrusive/detail/minimal_pair_header.hpp>
-#include <boost/static_assert.hpp>
#include <boost/intrusive/avl_set_hook.hpp>
#include <boost/intrusive/detail/avltree_node.hpp>
#include <boost/intrusive/bstree.hpp>
@@ -533,48 +532,48 @@ class avltree
typedef typename Base::const_reverse_iterator const_reverse_iterator;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
- BOOST_INTRUSIVE_FORCEINLINE avltree()
+ inline avltree()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit avltree( const key_compare &cmp, const value_traits &v_traits = value_traits())
+ inline explicit avltree( const key_compare &cmp, const value_traits &v_traits = value_traits())
: Base(cmp, v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE avltree( bool unique, Iterator b, Iterator e
+ inline avltree( bool unique, Iterator b, Iterator e
, const key_compare &cmp = key_compare()
, const value_traits &v_traits = value_traits())
: Base(unique, b, e, cmp, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE avltree(BOOST_RV_REF(avltree) x)
+ inline avltree(BOOST_RV_REF(avltree) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE avltree& operator=(BOOST_RV_REF(avltree) x)
+ inline avltree& operator=(BOOST_RV_REF(avltree) x)
{ return static_cast<avltree &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const avltree &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const avltree &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(avltree) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(avltree) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static avltree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static avltree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<avltree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const avltree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const avltree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const avltree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static avltree &container_from_iterator(iterator it) BOOST_NOEXCEPT
+ inline static avltree &container_from_iterator(iterator it) BOOST_NOEXCEPT
{ return static_cast<avltree &>(Base::container_from_iterator(it)); }
- BOOST_INTRUSIVE_FORCEINLINE static const avltree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
+ inline static const avltree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
{ return static_cast<const avltree &>(Base::container_from_iterator(it)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree_algorithms.hpp
index 0fd158d595..8195490650 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/avltree_algorithms.hpp
@@ -42,7 +42,7 @@ struct avltree_node_cloner
typedef typename NodeTraits::node_ptr node_ptr;
typedef detail::ebo_functor_holder<F> base_t;
- BOOST_INTRUSIVE_FORCEINLINE avltree_node_cloner(F f)
+ inline avltree_node_cloner(F f)
: base_t(f)
{}
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree.hpp
index 51687ebd27..8196d36b3f 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree.hpp
@@ -16,7 +16,6 @@
#include <boost/intrusive/intrusive_fwd.hpp>
#include <boost/intrusive/detail/assert.hpp>
-#include <boost/static_assert.hpp>
#include <boost/intrusive/intrusive_fwd.hpp>
#include <boost/intrusive/bs_set_hook.hpp>
#include <boost/intrusive/detail/tree_node.hpp>
@@ -105,7 +104,7 @@ struct bstbase3
struct holder_t : public ValueTraits
{
- BOOST_INTRUSIVE_FORCEINLINE explicit holder_t(const ValueTraits &vtraits)
+ inline explicit holder_t(const ValueTraits &vtraits)
: ValueTraits(vtraits)
{}
header_holder_type root;
@@ -113,7 +112,7 @@ struct bstbase3
static bstbase3 &get_tree_base_from_end_iterator(const const_iterator &end_iterator)
{
- BOOST_STATIC_ASSERT(has_container_from_iterator);
+ BOOST_INTRUSIVE_STATIC_ASSERT(has_container_from_iterator);
node_ptr p = end_iterator.pointed_node();
header_holder_type* h = header_holder_type::get_holder(p);
holder_t *holder = get_parent_from_member<holder_t, header_holder_type>(h, &holder_t::root);
@@ -121,73 +120,73 @@ struct bstbase3
return *base;
}
- BOOST_INTRUSIVE_FORCEINLINE bstbase3(const ValueTraits &vtraits)
+ inline bstbase3(const ValueTraits &vtraits)
: holder(vtraits)
{
node_algorithms::init_header(this->header_ptr());
}
- BOOST_INTRUSIVE_FORCEINLINE node_ptr header_ptr()
+ inline node_ptr header_ptr()
{ return holder.root.get_node(); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr header_ptr() const
+ inline const_node_ptr header_ptr() const
{ return holder.root.get_node(); }
- BOOST_INTRUSIVE_FORCEINLINE const value_traits &get_value_traits() const
+ inline const value_traits &get_value_traits() const
{ return this->holder; }
- BOOST_INTRUSIVE_FORCEINLINE value_traits &get_value_traits()
+ inline value_traits &get_value_traits()
{ return this->holder; }
typedef typename boost::intrusive::value_traits_pointers
<ValueTraits>::const_value_traits_ptr const_value_traits_ptr;
- BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const
+ inline const_value_traits_ptr priv_value_traits_ptr() const
{ return pointer_traits<const_value_traits_ptr>::pointer_to(this->get_value_traits()); }
- BOOST_INTRUSIVE_FORCEINLINE iterator begin() BOOST_NOEXCEPT
+ inline iterator begin() BOOST_NOEXCEPT
{ return iterator(node_algorithms::begin_node(this->header_ptr()), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const BOOST_NOEXCEPT
+ inline const_iterator begin() const BOOST_NOEXCEPT
{ return cbegin(); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const BOOST_NOEXCEPT
+ inline const_iterator cbegin() const BOOST_NOEXCEPT
{ return const_iterator(node_algorithms::begin_node(this->header_ptr()), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE iterator end() BOOST_NOEXCEPT
+ inline iterator end() BOOST_NOEXCEPT
{ return iterator(node_algorithms::end_node(this->header_ptr()), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const BOOST_NOEXCEPT
+ inline const_iterator end() const BOOST_NOEXCEPT
{ return cend(); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const BOOST_NOEXCEPT
+ inline const_iterator cend() const BOOST_NOEXCEPT
{ return const_iterator(node_algorithms::end_node(this->header_ptr()), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE iterator root()
+ inline iterator root()
{ return iterator(node_algorithms::root_node(this->header_ptr()), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator root() const
+ inline const_iterator root() const
{ return croot(); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator croot() const
+ inline const_iterator croot() const
{ return const_iterator(node_algorithms::root_node(this->header_ptr()), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE reverse_iterator rbegin()
+ inline reverse_iterator rbegin()
{ return reverse_iterator(end()); }
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator rbegin() const
+ inline const_reverse_iterator rbegin() const
{ return const_reverse_iterator(end()); }
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator crbegin() const
+ inline const_reverse_iterator crbegin() const
{ return const_reverse_iterator(end()); }
- BOOST_INTRUSIVE_FORCEINLINE reverse_iterator rend()
+ inline reverse_iterator rend()
{ return reverse_iterator(begin()); }
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator rend() const
+ inline const_reverse_iterator rend() const
{ return const_reverse_iterator(begin()); }
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator crend() const
+ inline const_reverse_iterator crend() const
{ return const_reverse_iterator(begin()); }
void replace_node(iterator replace_this, reference with_this)
@@ -199,7 +198,7 @@ struct bstbase3
node_algorithms::init(replace_this.pointed_node());
}
- BOOST_INTRUSIVE_FORCEINLINE void rebalance() BOOST_NOEXCEPT
+ inline void rebalance() BOOST_NOEXCEPT
{ node_algorithms::rebalance(this->header_ptr()); }
iterator rebalance_subtree(iterator r) BOOST_NOEXCEPT
@@ -207,13 +206,13 @@ struct bstbase3
static iterator s_iterator_to(reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!stateful_value_traits));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!stateful_value_traits));
return iterator (value_traits::to_node_ptr(value), const_value_traits_ptr());
}
static const_iterator s_iterator_to(const_reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!stateful_value_traits));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!stateful_value_traits));
return const_iterator (value_traits::to_node_ptr(*pointer_traits<pointer>::const_cast_from(pointer_traits<const_pointer>::pointer_to(value))), const_value_traits_ptr());
}
@@ -223,7 +222,7 @@ struct bstbase3
const_iterator iterator_to(const_reference value) const BOOST_NOEXCEPT
{ return const_iterator (this->get_value_traits().to_node_ptr(*pointer_traits<pointer>::const_cast_from(pointer_traits<const_pointer>::pointer_to(value))), this->priv_value_traits_ptr()); }
- BOOST_INTRUSIVE_FORCEINLINE static void init_node(reference value)
+ inline static void init_node(reference value)
{ node_algorithms::init(value_traits::to_node_ptr(value)); }
};
@@ -314,17 +313,17 @@ struct bstbase2
typedef BOOST_INTRUSIVE_IMPDEF(typename pointer_traits<const_pointer>::difference_type) difference_type;
typedef typename node_algorithms::insert_commit_data insert_commit_data;
- BOOST_INTRUSIVE_FORCEINLINE value_compare value_comp() const
+ inline value_compare value_comp() const
{ return this->get_comp(); }
- BOOST_INTRUSIVE_FORCEINLINE key_compare key_comp() const
+ inline key_compare key_comp() const
{ return this->get_comp().key_comp(); }
//lower_bound
- BOOST_INTRUSIVE_FORCEINLINE iterator lower_bound(const key_type &key)
+ inline iterator lower_bound(const key_type &key)
{ return this->lower_bound(key, this->key_comp()); }
- BOOST_INTRUSIVE_FORCEINLINE const_iterator lower_bound(const key_type &key) const
+ inline const_iterator lower_bound(const key_type &key) const
{ return this->lower_bound(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -342,7 +341,7 @@ struct bstbase2
}
//upper_bound
- BOOST_INTRUSIVE_FORCEINLINE iterator upper_bound(const key_type &key)
+ inline iterator upper_bound(const key_type &key)
{ return this->upper_bound(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -352,7 +351,7 @@ struct bstbase2
(this->header_ptr(), key, this->key_node_comp(comp)), this->priv_value_traits_ptr());
}
- BOOST_INTRUSIVE_FORCEINLINE const_iterator upper_bound(const key_type &key) const
+ inline const_iterator upper_bound(const key_type &key) const
{ return this->upper_bound(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -367,13 +366,13 @@ struct bstbase2
{ typedef detail::key_nodeptr_comp<KeyTypeKeyCompare, value_traits, key_of_value> type; };
template<class KeyTypeKeyCompare>
- BOOST_INTRUSIVE_FORCEINLINE typename key_node_comp_ret<KeyTypeKeyCompare>::type key_node_comp(KeyTypeKeyCompare comp) const
+ inline typename key_node_comp_ret<KeyTypeKeyCompare>::type key_node_comp(KeyTypeKeyCompare comp) const
{
return detail::key_nodeptr_comp<KeyTypeKeyCompare, value_traits, key_of_value>(comp, &this->get_value_traits());
}
//find
- BOOST_INTRUSIVE_FORCEINLINE iterator find(const key_type &key)
+ inline iterator find(const key_type &key)
{ return this->find(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -383,7 +382,7 @@ struct bstbase2
(node_algorithms::find(this->header_ptr(), key, this->key_node_comp(comp)), this->priv_value_traits_ptr());
}
- BOOST_INTRUSIVE_FORCEINLINE const_iterator find(const key_type &key) const
+ inline const_iterator find(const key_type &key) const
{ return this->find(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -394,7 +393,7 @@ struct bstbase2
}
//equal_range
- BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator,iterator> equal_range(const key_type &key)
+ inline std::pair<iterator,iterator> equal_range(const key_type &key)
{ return this->equal_range(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -406,7 +405,7 @@ struct bstbase2
, iterator(ret.second, this->priv_value_traits_ptr()));
}
- BOOST_INTRUSIVE_FORCEINLINE std::pair<const_iterator, const_iterator>
+ inline std::pair<const_iterator, const_iterator>
equal_range(const key_type &key) const
{ return this->equal_range(key, this->key_comp()); }
@@ -421,7 +420,7 @@ struct bstbase2
}
//lower_bound_range
- BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator,iterator> lower_bound_range(const key_type &key)
+ inline std::pair<iterator,iterator> lower_bound_range(const key_type &key)
{ return this->lower_bound_range(key, this->key_comp()); }
template<class KeyType, class KeyTypeKeyCompare>
@@ -433,7 +432,7 @@ struct bstbase2
, iterator(ret.second, this->priv_value_traits_ptr()));
}
- BOOST_INTRUSIVE_FORCEINLINE std::pair<const_iterator, const_iterator>
+ inline std::pair<const_iterator, const_iterator>
lower_bound_range(const key_type &key) const
{ return this->lower_bound_range(key, this->key_comp()); }
@@ -448,7 +447,7 @@ struct bstbase2
}
//bounded_range
- BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator,iterator> bounded_range
+ inline std::pair<iterator,iterator> bounded_range
(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed)
{ return this->bounded_range(lower_key, upper_key, this->key_comp(), left_closed, right_closed); }
@@ -463,7 +462,7 @@ struct bstbase2
, iterator(ret.second, this->priv_value_traits_ptr()));
}
- BOOST_INTRUSIVE_FORCEINLINE std::pair<const_iterator,const_iterator> bounded_range
+ inline std::pair<const_iterator,const_iterator> bounded_range
(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const
{ return this->bounded_range(lower_key, upper_key, this->key_comp(), left_closed, right_closed); }
@@ -479,11 +478,11 @@ struct bstbase2
}
//insert_unique_check
- BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator, bool> insert_unique_check
+ inline std::pair<iterator, bool> insert_unique_check
(const key_type &key, insert_commit_data &commit_data)
{ return this->insert_unique_check(key, this->key_comp(), commit_data); }
- BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator, bool> insert_unique_check
+ inline std::pair<iterator, bool> insert_unique_check
(const_iterator hint, const key_type &key, insert_commit_data &commit_data)
{ return this->insert_unique_check(hint, key, this->key_comp(), commit_data); }
@@ -528,7 +527,7 @@ struct bstbase_hack
typedef typename get_algo
<AlgoType, node_traits>::type algo_type;
- BOOST_INTRUSIVE_FORCEINLINE bstbase_hack(const key_compare & comp, const ValueTraits &vtraits)
+ inline bstbase_hack(const key_compare & comp, const ValueTraits &vtraits)
: base_type(comp, vtraits)
{
this->sz_traits().set_size(size_type(0));
@@ -536,10 +535,10 @@ struct bstbase_hack
typedef detail::size_holder<ConstantTimeSize, SizeType> size_traits;
- BOOST_INTRUSIVE_FORCEINLINE size_traits &sz_traits()
+ inline size_traits &sz_traits()
{ return static_cast<size_traits &>(*this); }
- BOOST_INTRUSIVE_FORCEINLINE const size_traits &sz_traits() const
+ inline const size_traits &sz_traits() const
{ return static_cast<const size_traits &>(*this); }
};
@@ -551,13 +550,13 @@ struct bstbase_hack<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, false, SizeTyp
typedef bstbase2< ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, AlgoType, HeaderHolder> base_type;
typedef typename base_type::value_compare value_compare;
typedef typename base_type::key_compare key_compare;
- BOOST_INTRUSIVE_FORCEINLINE bstbase_hack(const key_compare & comp, const ValueTraits &vtraits)
+ inline bstbase_hack(const key_compare & comp, const ValueTraits &vtraits)
: base_type(comp, vtraits)
{}
typedef detail::size_holder<false, SizeType> size_traits;
- BOOST_INTRUSIVE_FORCEINLINE size_traits sz_traits() const
+ inline size_traits sz_traits() const
{ return size_traits(); }
};
@@ -579,7 +578,7 @@ struct bstbase
<AlgoType, node_traits>::type node_algorithms;
typedef SizeType size_type;
- BOOST_INTRUSIVE_FORCEINLINE bstbase(const key_compare & comp, const ValueTraits &vtraits)
+ inline bstbase(const key_compare & comp, const ValueTraits &vtraits)
: base_type(comp, vtraits)
{}
@@ -666,7 +665,7 @@ class bstree_impl
static const bool safemode_or_autounlink = is_safe_autounlink<value_traits::link_mode>::value;
//Constant-time size is incompatible with auto-unlink hooks!
- BOOST_STATIC_ASSERT(!(constant_time_size && ((int)value_traits::link_mode == (int)auto_unlink)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(!(constant_time_size && ((int)value_traits::link_mode == (int)auto_unlink)));
protected:
@@ -742,7 +741,7 @@ class bstree_impl
//! <b>Effects</b>: Equivalent to swap
//!
- BOOST_INTRUSIVE_FORCEINLINE bstree_impl& operator=(BOOST_RV_REF(bstree_impl) x)
+ inline bstree_impl& operator=(BOOST_RV_REF(bstree_impl) x)
{ this->swap(x); return *this; }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
@@ -1961,7 +1960,7 @@ class bstree_impl
//! functor a compilation error will be issued.
static void remove_node(reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!constant_time_size));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!constant_time_size));
node_ptr to_remove(value_traits::to_node_ptr(value));
node_algorithms::unlink(to_remove);
BOOST_IF_CONSTEXPR(safemode_or_autounlink)
@@ -2184,48 +2183,48 @@ class bstree
typedef typename Base::const_iterator const_iterator;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
- BOOST_INTRUSIVE_FORCEINLINE bstree()
+ inline bstree()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit bstree( const key_compare &cmp, const value_traits &v_traits = value_traits())
+ inline explicit bstree( const key_compare &cmp, const value_traits &v_traits = value_traits())
: Base(cmp, v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE bstree( bool unique, Iterator b, Iterator e
+ inline bstree( bool unique, Iterator b, Iterator e
, const key_compare &cmp = key_compare()
, const value_traits &v_traits = value_traits())
: Base(unique, b, e, cmp, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE bstree(BOOST_RV_REF(bstree) x)
+ inline bstree(BOOST_RV_REF(bstree) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE bstree& operator=(BOOST_RV_REF(bstree) x)
+ inline bstree& operator=(BOOST_RV_REF(bstree) x)
{ return static_cast<bstree &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const bstree &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const bstree &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(bstree) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(bstree) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static bstree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static bstree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<bstree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const bstree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const bstree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const bstree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static bstree &container_from_iterator(iterator it) BOOST_NOEXCEPT
+ inline static bstree &container_from_iterator(iterator it) BOOST_NOEXCEPT
{ return static_cast<bstree &>(Base::container_from_iterator(it)); }
- BOOST_INTRUSIVE_FORCEINLINE static const bstree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
+ inline static const bstree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
{ return static_cast<const bstree &>(Base::container_from_iterator(it)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree_algorithms.hpp
index 5113a584b8..45e6b18199 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/bstree_algorithms.hpp
@@ -38,7 +38,7 @@ namespace intrusive {
template <class NodePtr>
struct insert_commit_data_t
{
- BOOST_INTRUSIVE_FORCEINLINE insert_commit_data_t()
+ inline insert_commit_data_t()
: link_left(false), node()
{}
bool link_left;
@@ -67,7 +67,7 @@ struct bstree_node_checker
struct return_type
: public base_checker_t::return_type
{
- BOOST_INTRUSIVE_FORCEINLINE return_type()
+ inline return_type()
: min_key_node_ptr(const_node_ptr()), max_key_node_ptr(const_node_ptr()), node_count(0)
{}
@@ -76,7 +76,7 @@ struct bstree_node_checker
size_t node_count;
};
- BOOST_INTRUSIVE_FORCEINLINE bstree_node_checker(const NodePtrCompare& comp, ExtraChecker extra_checker)
+ inline bstree_node_checker(const NodePtrCompare& comp, ExtraChecker extra_checker)
: base_checker_t(extra_checker), comp_(comp)
{}
@@ -186,14 +186,14 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
template<class Disposer>
struct dispose_subtree_disposer
{
- BOOST_INTRUSIVE_FORCEINLINE dispose_subtree_disposer(Disposer &disp, node_ptr subtree)
+ inline dispose_subtree_disposer(Disposer &disp, node_ptr subtree)
: disposer_(&disp), subtree_(subtree)
{}
- BOOST_INTRUSIVE_FORCEINLINE void release()
+ inline void release()
{ disposer_ = 0; }
- BOOST_INTRUSIVE_FORCEINLINE ~dispose_subtree_disposer()
+ inline ~dispose_subtree_disposer()
{
if(disposer_){
dispose_subtree(subtree_, *disposer_);
@@ -213,7 +213,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr begin_node(const_node_ptr header) BOOST_NOEXCEPT
+ inline static node_ptr begin_node(const_node_ptr header) BOOST_NOEXCEPT
{ return node_traits::get_left(header); }
//! <b>Requires</b>: 'header' is the header node of a tree.
@@ -223,7 +223,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr end_node(const_node_ptr header) BOOST_NOEXCEPT
+ inline static node_ptr end_node(const_node_ptr header) BOOST_NOEXCEPT
{ return detail::uncast(header); }
//! <b>Requires</b>: 'header' is the header node of a tree.
@@ -233,7 +233,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr root_node(const_node_ptr header) BOOST_NOEXCEPT
+ inline static node_ptr root_node(const_node_ptr header) BOOST_NOEXCEPT
{
node_ptr p = node_traits::get_parent(header);
return p ? p : detail::uncast(header);
@@ -247,7 +247,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool unique(const_node_ptr n) BOOST_NOEXCEPT
+ inline static bool unique(const_node_ptr n) BOOST_NOEXCEPT
{ return !NodeTraits::get_parent(n); }
#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
@@ -456,7 +456,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! new_node is not equivalent to node_to_be_replaced according to the
//! ordering rules. This function is faster than erasing and inserting
//! the node, since no rebalancing and comparison is needed. Experimental function
- BOOST_INTRUSIVE_FORCEINLINE static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node) BOOST_NOEXCEPT
+ inline static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node) BOOST_NOEXCEPT
{
replace_node(node_to_be_replaced, base_type::get_header(node_to_be_replaced), new_node);
}
@@ -875,7 +875,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//!
//! <b>Throws</b>: If "comp" throws.
template<class KeyType, class KeyNodePtrCompare>
- BOOST_INTRUSIVE_FORCEINLINE static std::pair<node_ptr, node_ptr> equal_range
+ inline static std::pair<node_ptr, node_ptr> equal_range
(const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
{
return bounded_range(header, key, key, comp, true, true);
@@ -919,7 +919,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//!
//! <b>Throws</b>: If "comp" throws.
template<class KeyType, class KeyNodePtrCompare>
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr lower_bound
+ inline static node_ptr lower_bound
(const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
{
return lower_bound_loop(NodeTraits::get_parent(header), detail::uncast(header), key, comp);
@@ -937,7 +937,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//!
//! <b>Throws</b>: If "comp" throws.
template<class KeyType, class KeyNodePtrCompare>
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr upper_bound
+ inline static node_ptr upper_bound
(const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
{
return upper_bound_loop(NodeTraits::get_parent(header), detail::uncast(header), key, comp);
@@ -960,7 +960,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Notes</b>: This function has only sense if a "insert_unique_check" has been
//! previously executed to fill "commit_data". No value should be inserted or
//! erased between the "insert_check" and "insert_commit" calls.
- BOOST_INTRUSIVE_FORCEINLINE static void insert_unique_commit
+ inline static void insert_unique_commit
(node_ptr header, node_ptr new_value, const insert_commit_data &commit_data) BOOST_NOEXCEPT
{ return insert_commit(header, new_value, commit_data); }
@@ -1322,7 +1322,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Amortized constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void erase(node_ptr header, node_ptr z) BOOST_NOEXCEPT
+ inline static void erase(node_ptr header, node_ptr z) BOOST_NOEXCEPT
{
data_for_rebalance ignored;
erase(header, z, ignored);
@@ -1341,7 +1341,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//!
//! <b>Throws</b>: If the comparison throws.
template<class NodePtrCompare>
- BOOST_INTRUSIVE_FORCEINLINE static bool transfer_unique
+ inline static bool transfer_unique
(node_ptr header1, NodePtrCompare comp, node_ptr header2, node_ptr z)
{
data_for_rebalance ignored;
@@ -1358,7 +1358,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//!
//! <b>Throws</b>: If the comparison throws.
template<class NodePtrCompare>
- BOOST_INTRUSIVE_FORCEINLINE static void transfer_equal
+ inline static void transfer_equal
(node_ptr header1, NodePtrCompare comp, node_ptr header2, node_ptr z)
{
data_for_rebalance ignored;
@@ -1635,7 +1635,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Constant.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_left_child(node_ptr p) BOOST_NOEXCEPT
+ inline static bool is_left_child(node_ptr p) BOOST_NOEXCEPT
{ return NodeTraits::get_left(NodeTraits::get_parent(p)) == p; }
//! <b>Requires</b>: p is a node of a tree.
@@ -1645,7 +1645,7 @@ class bstree_algorithms : public bstree_algorithms_base<NodeTraits>
//! <b>Complexity</b>: Constant.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_right_child(node_ptr p) BOOST_NOEXCEPT
+ inline static bool is_right_child(node_ptr p) BOOST_NOEXCEPT
{ return NodeTraits::get_right(NodeTraits::get_parent(p)) == p; }
static void insert_before_check
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_list_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_list_algorithms.hpp
index ab34c7e309..2c99aa051b 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_list_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_list_algorithms.hpp
@@ -80,7 +80,7 @@ class circular_list_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool inited(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool inited(const_node_ptr this_node) BOOST_NOEXCEPT
{ return !NodeTraits::get_next(this_node); }
//! <b>Effects</b>: Constructs an empty list, making this_node the only
@@ -102,7 +102,7 @@ class circular_list_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_empty(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool is_empty(const_node_ptr this_node) BOOST_NOEXCEPT
{
return NodeTraits::get_next(this_node) == this_node;
}
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_slist_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_slist_algorithms.hpp
index 5ce4e8cdba..bc4beaa7e7 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_slist_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/circular_slist_algorithms.hpp
@@ -146,7 +146,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void init_header(node_ptr this_node) BOOST_NOEXCEPT
+ inline static void init_header(node_ptr this_node) BOOST_NOEXCEPT
{ NodeTraits::set_next(this_node, this_node); }
//! <b>Requires</b>: 'p' is the first node of a list.
@@ -156,7 +156,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr end_node(const_node_ptr p) BOOST_NOEXCEPT
+ inline static node_ptr end_node(const_node_ptr p) BOOST_NOEXCEPT
{ return detail::uncast(p); }
//! <b>Effects</b>: Returns true if this_node_points to an empty list.
@@ -164,7 +164,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_empty(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool is_empty(const_node_ptr this_node) BOOST_NOEXCEPT
{ return NodeTraits::get_next(this_node) == this_node; }
//! <b>Effects</b>: Returns true if this_node points to a sentinel node.
@@ -172,7 +172,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_sentinel(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool is_sentinel(const_node_ptr this_node) BOOST_NOEXCEPT
{ return NodeTraits::get_next(this_node) == node_ptr(); }
//! <b>Effects</b>: Marks this node as a "sentinel" node, a special state that is different from "empty",
@@ -181,7 +181,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void set_sentinel(node_ptr this_node) BOOST_NOEXCEPT
+ inline static void set_sentinel(node_ptr this_node) BOOST_NOEXCEPT
{ NodeTraits::set_next(this_node, node_ptr()); }
//! <b>Requires</b>: this_node and prev_init_node must be in the same circular list.
@@ -193,7 +193,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Linear to the number of elements between prev_init_node and this_node.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous_node(node_ptr prev_init_node, node_ptr this_node) BOOST_NOEXCEPT
+ inline static node_ptr get_previous_node(node_ptr prev_init_node, node_ptr this_node) BOOST_NOEXCEPT
{ return base_t::get_previous_node(prev_init_node, this_node); }
//! <b>Requires</b>: this_node must be in a circular list or be an empty circular list.
@@ -203,7 +203,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Linear to the number of elements in the circular list.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous_node(node_ptr this_node) BOOST_NOEXCEPT
+ inline static node_ptr get_previous_node(node_ptr this_node) BOOST_NOEXCEPT
{ return base_t::get_previous_node(this_node, this_node); }
//! <b>Requires</b>: this_node must be in a circular list or be an empty circular list.
@@ -213,7 +213,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Linear to the number of elements in the circular list.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous_previous_node(node_ptr this_node) BOOST_NOEXCEPT
+ inline static node_ptr get_previous_previous_node(node_ptr this_node) BOOST_NOEXCEPT
{ return get_previous_previous_node(this_node, this_node); }
//! <b>Requires</b>: this_node and p must be in the same circular list.
@@ -276,7 +276,7 @@ class circular_slist_algorithms
//! <b>Complexity</b>: Linear to the number of elements in the circular list.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void link_before (node_ptr nxt_node, node_ptr this_node) BOOST_NOEXCEPT
+ inline static void link_before (node_ptr nxt_node, node_ptr this_node) BOOST_NOEXCEPT
{ base_t::link_after(get_previous_node(nxt_node), this_node); }
//! <b>Requires</b>: this_node and other_node must be nodes inserted
@@ -453,7 +453,7 @@ class circular_slist_algorithms
//!
//! <b>Throws</b>: Nothing.
template<class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE static std::size_t detach_and_dispose(node_ptr p, Disposer disposer) BOOST_NOEXCEPT
+ inline static std::size_t detach_and_dispose(node_ptr p, Disposer disposer) BOOST_NOEXCEPT
{ return base_t::unlink_after_and_dispose(p, p, disposer); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/common_slist_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/common_slist_algorithms.hpp
index 8310231e31..0965079ba9 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/common_slist_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/common_slist_algorithms.hpp
@@ -52,7 +52,7 @@ class common_slist_algorithms
return p;
}
- BOOST_INTRUSIVE_FORCEINLINE static void init(node_ptr this_node) BOOST_NOEXCEPT
+ inline static void init(node_ptr this_node) BOOST_NOEXCEPT
{ NodeTraits::set_next(this_node, node_ptr()); }
static bool unique(const_node_ptr this_node) BOOST_NOEXCEPT
@@ -61,16 +61,16 @@ class common_slist_algorithms
return !next || next == this_node;
}
- BOOST_INTRUSIVE_FORCEINLINE static bool inited(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool inited(const_node_ptr this_node) BOOST_NOEXCEPT
{ return !NodeTraits::get_next(this_node); }
- BOOST_INTRUSIVE_FORCEINLINE static void unlink_after(node_ptr prev_node) BOOST_NOEXCEPT
+ inline static void unlink_after(node_ptr prev_node) BOOST_NOEXCEPT
{
const_node_ptr this_node(NodeTraits::get_next(prev_node));
NodeTraits::set_next(prev_node, NodeTraits::get_next(this_node));
}
- BOOST_INTRUSIVE_FORCEINLINE static void unlink_after(node_ptr prev_node, node_ptr last_node) BOOST_NOEXCEPT
+ inline static void unlink_after(node_ptr prev_node, node_ptr last_node) BOOST_NOEXCEPT
{ NodeTraits::set_next(prev_node, last_node); }
static void link_after(node_ptr prev_node, node_ptr this_node) BOOST_NOEXCEPT
@@ -216,7 +216,7 @@ class common_slist_algorithms
//!
//! <b>Throws</b>: Nothing.
template<class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE static void unlink_after_and_dispose(node_ptr bb, Disposer disposer) BOOST_NOEXCEPT
+ inline static void unlink_after_and_dispose(node_ptr bb, Disposer disposer) BOOST_NOEXCEPT
{
node_ptr i = node_traits::get_next(bb);
node_traits::set_next(bb, node_traits::get_next(i));
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/default_header_holder.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/default_header_holder.hpp
index 42f35d2be7..ba665e79ba 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/default_header_holder.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/default_header_holder.hpp
@@ -40,14 +40,14 @@ struct default_header_holder : public NodeTraits::node
default_header_holder() : node() {}
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_node() const
+ inline const_node_ptr get_node() const
{ return pointer_traits< const_node_ptr >::pointer_to(*static_cast< const node* >(this)); }
- BOOST_INTRUSIVE_FORCEINLINE node_ptr get_node()
+ inline node_ptr get_node()
{ return pointer_traits< node_ptr >::pointer_to(*static_cast< node* >(this)); }
// (unsafe) downcast used to implement container-from-iterator
- BOOST_INTRUSIVE_FORCEINLINE static default_header_holder* get_holder(node_ptr p)
+ inline static default_header_holder* get_holder(node_ptr p)
{ return static_cast< default_header_holder* >(boost::movelib::to_raw_pointer(p)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/ebo_functor_holder.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/ebo_functor_holder.hpp
index 8883166783..1213112c74 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/ebo_functor_holder.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/ebo_functor_holder.hpp
@@ -166,57 +166,57 @@ class ebo_functor_holder
public:
typedef T functor_type;
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder()
+ inline ebo_functor_holder()
: t_()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit ebo_functor_holder(const T &t)
+ inline explicit ebo_functor_holder(const T &t)
: t_(t)
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit ebo_functor_holder(BOOST_RV_REF(T) t)
+ inline explicit ebo_functor_holder(BOOST_RV_REF(T) t)
: t_(::boost::move(t))
{}
template<class Arg1, class Arg2>
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder(BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
+ inline ebo_functor_holder(BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
: t_(::boost::forward<Arg1>(arg1), ::boost::forward<Arg2>(arg2))
{}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder(const ebo_functor_holder &x)
+ inline ebo_functor_holder(const ebo_functor_holder &x)
: t_(x.t_)
{}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder(BOOST_RV_REF(ebo_functor_holder) x)
+ inline ebo_functor_holder(BOOST_RV_REF(ebo_functor_holder) x)
: t_(x.t_)
{}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(BOOST_COPY_ASSIGN_REF(ebo_functor_holder) x)
+ inline ebo_functor_holder& operator=(BOOST_COPY_ASSIGN_REF(ebo_functor_holder) x)
{
this->get() = x.get();
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(BOOST_RV_REF(ebo_functor_holder) x)
+ inline ebo_functor_holder& operator=(BOOST_RV_REF(ebo_functor_holder) x)
{
this->get() = ::boost::move(x.get());
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(const T &x)
+ inline ebo_functor_holder& operator=(const T &x)
{
this->get() = x;
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(BOOST_RV_REF(T) x)
+ inline ebo_functor_holder& operator=(BOOST_RV_REF(T) x)
{
this->get() = ::boost::move(x);
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE T& get(){return t_;}
- BOOST_INTRUSIVE_FORCEINLINE const T& get()const{return t_;}
+ inline T& get(){return t_;}
+ inline const T& get()const{return t_;}
private:
T t_;
@@ -231,58 +231,58 @@ class ebo_functor_holder<T, Tag, false>
public:
typedef T functor_type;
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder()
+ inline ebo_functor_holder()
: T()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit ebo_functor_holder(const T &t)
+ inline explicit ebo_functor_holder(const T &t)
: T(t)
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit ebo_functor_holder(BOOST_RV_REF(T) t)
+ inline explicit ebo_functor_holder(BOOST_RV_REF(T) t)
: T(::boost::move(t))
{}
template<class Arg1, class Arg2>
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder(BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
+ inline ebo_functor_holder(BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
: T(::boost::forward<Arg1>(arg1), ::boost::forward<Arg2>(arg2))
{}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder(const ebo_functor_holder &x)
+ inline ebo_functor_holder(const ebo_functor_holder &x)
: T(static_cast<const T&>(x))
{}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder(BOOST_RV_REF(ebo_functor_holder) x)
+ inline ebo_functor_holder(BOOST_RV_REF(ebo_functor_holder) x)
: T(BOOST_MOVE_BASE(T, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(BOOST_COPY_ASSIGN_REF(ebo_functor_holder) x)
+ inline ebo_functor_holder& operator=(BOOST_COPY_ASSIGN_REF(ebo_functor_holder) x)
{
const ebo_functor_holder&r = x;
this->get() = r;
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(BOOST_RV_REF(ebo_functor_holder) x)
+ inline ebo_functor_holder& operator=(BOOST_RV_REF(ebo_functor_holder) x)
{
this->get() = ::boost::move(x.get());
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(const T &x)
+ inline ebo_functor_holder& operator=(const T &x)
{
this->get() = x;
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE ebo_functor_holder& operator=(BOOST_RV_REF(T) x)
+ inline ebo_functor_holder& operator=(BOOST_RV_REF(T) x)
{
this->get() = ::boost::move(x);
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE T& get(){return *this;}
- BOOST_INTRUSIVE_FORCEINLINE const T& get()const{return *this;}
+ inline T& get(){return *this;}
+ inline const T& get()const{return *this;}
};
} //namespace detail {
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/equal_to_value.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/equal_to_value.hpp
index c5d9e5305c..48b1f411c3 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/equal_to_value.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/equal_to_value.hpp
@@ -39,7 +39,7 @@ class equal_to_value
: t_(t)
{}
- BOOST_INTRUSIVE_FORCEINLINE bool operator()(ConstReference t)const
+ inline bool operator()(ConstReference t)const
{ return t_ == t; }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/exception_disposer.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/exception_disposer.hpp
index 0e21faebaa..f76e89172c 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/exception_disposer.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/exception_disposer.hpp
@@ -41,7 +41,7 @@ class exception_disposer
: cont_(&cont), disp_(disp)
{}
- BOOST_INTRUSIVE_FORCEINLINE void release()
+ inline void release()
{ cont_ = 0; }
~exception_disposer()
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/generic_hook.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/generic_hook.hpp
index 6e43f90d9c..e7b62c6500 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/generic_hook.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/generic_hook.hpp
@@ -27,7 +27,6 @@
#include <boost/intrusive/detail/assert.hpp>
#include <boost/intrusive/detail/node_holder.hpp>
#include <boost/intrusive/detail/algo_type.hpp>
-#include <boost/static_assert.hpp>
namespace boost {
namespace intrusive {
@@ -41,7 +40,7 @@ struct link_dispatch
{};
template<class Hook>
-BOOST_INTRUSIVE_FORCEINLINE void destructor_impl(Hook &hook, detail::link_dispatch<safe_link>)
+inline void destructor_impl(Hook &hook, detail::link_dispatch<safe_link>)
{ //If this assertion raises, you might have destroyed an object
//while it was still inserted in a container that is alive.
//If so, remove the object from the container before destroying it.
@@ -49,11 +48,11 @@ BOOST_INTRUSIVE_FORCEINLINE void destructor_impl(Hook &hook, detail::link_dispat
}
template<class Hook>
-BOOST_INTRUSIVE_FORCEINLINE void destructor_impl(Hook &hook, detail::link_dispatch<auto_unlink>)
+inline void destructor_impl(Hook &hook, detail::link_dispatch<auto_unlink>)
{ hook.unlink(); }
template<class Hook>
-BOOST_INTRUSIVE_FORCEINLINE void destructor_impl(Hook &, detail::link_dispatch<normal_link>)
+inline void destructor_impl(Hook &, detail::link_dispatch<normal_link>)
{}
} //namespace detail {
@@ -161,54 +160,54 @@ class generic_hook
< NodeTraits
, Tag, LinkMode, BaseHookType> hooktags;
- BOOST_INTRUSIVE_FORCEINLINE node_ptr this_ptr() BOOST_NOEXCEPT
+ inline node_ptr this_ptr() BOOST_NOEXCEPT
{ return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*this)); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr this_ptr() const BOOST_NOEXCEPT
+ inline const_node_ptr this_ptr() const BOOST_NOEXCEPT
{ return pointer_traits<const_node_ptr>::pointer_to(static_cast<const node&>(*this)); }
public:
/// @endcond
- BOOST_INTRUSIVE_FORCEINLINE generic_hook() BOOST_NOEXCEPT
+ inline generic_hook() BOOST_NOEXCEPT
{
if(hooktags::safemode_or_autounlink){
node_algorithms::init(this->this_ptr());
}
}
- BOOST_INTRUSIVE_FORCEINLINE generic_hook(const generic_hook& ) BOOST_NOEXCEPT
+ inline generic_hook(const generic_hook& ) BOOST_NOEXCEPT
{
if(hooktags::safemode_or_autounlink){
node_algorithms::init(this->this_ptr());
}
}
- BOOST_INTRUSIVE_FORCEINLINE generic_hook& operator=(const generic_hook& ) BOOST_NOEXCEPT
+ inline generic_hook& operator=(const generic_hook& ) BOOST_NOEXCEPT
{ return *this; }
- BOOST_INTRUSIVE_FORCEINLINE ~generic_hook()
+ inline ~generic_hook()
{
destructor_impl
(*this, detail::link_dispatch<hooktags::link_mode>());
}
- BOOST_INTRUSIVE_FORCEINLINE void swap_nodes(generic_hook &other) BOOST_NOEXCEPT
+ inline void swap_nodes(generic_hook &other) BOOST_NOEXCEPT
{
node_algorithms::swap_nodes
(this->this_ptr(), other.this_ptr());
}
- BOOST_INTRUSIVE_FORCEINLINE bool is_linked() const BOOST_NOEXCEPT
+ inline bool is_linked() const BOOST_NOEXCEPT
{
//is_linked() can be only used in safe-mode or auto-unlink
- BOOST_STATIC_ASSERT(( hooktags::safemode_or_autounlink ));
+ BOOST_INTRUSIVE_STATIC_ASSERT(( hooktags::safemode_or_autounlink ));
return !node_algorithms::unique(this->this_ptr());
}
- BOOST_INTRUSIVE_FORCEINLINE void unlink() BOOST_NOEXCEPT
+ inline void unlink() BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT(( (int)hooktags::link_mode == (int)auto_unlink ));
+ BOOST_INTRUSIVE_STATIC_ASSERT(( (int)hooktags::link_mode == (int)auto_unlink ));
node_ptr n(this->this_ptr());
if(!node_algorithms::inited(n)){
node_algorithms::unlink(n);
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/hook_traits.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/hook_traits.hpp
index 06713487fc..c33ede0dcd 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/hook_traits.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/hook_traits.hpp
@@ -28,7 +28,6 @@
#include <boost/intrusive/detail/mpl.hpp>
#include <boost/move/detail/to_raw_pointer.hpp>
#include <boost/intrusive/detail/node_holder.hpp>
-#include <boost/assert.hpp>
namespace boost {
namespace intrusive {
@@ -47,8 +46,6 @@ struct bhtraits_base
template rebind_pointer<T>::type pointer;
typedef typename pointer_traits<node_ptr>::
template rebind_pointer<const T>::type const_pointer;
- //typedef typename pointer_traits<pointer>::reference reference;
- //typedef typename pointer_traits<const_pointer>::reference const_reference;
typedef T & reference;
typedef const T & const_reference;
typedef node_holder_type & node_holder_reference;
@@ -56,35 +53,31 @@ struct bhtraits_base
typedef node& node_reference;
typedef const node & const_node_reference;
- BOOST_INTRUSIVE_FORCEINLINE static pointer to_value_ptr(node_ptr n)
+ inline static pointer to_value_ptr(node_ptr n)
{
pointer p = pointer_traits<pointer>::pointer_to
(static_cast<reference>(static_cast<node_holder_reference>(*n)));
- BOOST_ASSERT(!!p);
return p;
}
- BOOST_INTRUSIVE_FORCEINLINE static const_pointer to_value_ptr(const_node_ptr n)
+ inline static const_pointer to_value_ptr(const_node_ptr n)
{
const_pointer p = pointer_traits<const_pointer>::pointer_to
(static_cast<const_reference>(static_cast<const_node_holder_reference>(*n)));
- BOOST_ASSERT(!!p);
return p;
}
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr(reference value)
+ inline static node_ptr to_node_ptr(reference value)
{
node_ptr p = pointer_traits<node_ptr>::pointer_to
(static_cast<node_reference>(static_cast<node_holder_reference>(value)));
- BOOST_ASSERT(!!p);
return p;
}
- BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr(const_reference value)
+ inline static const_node_ptr to_node_ptr(const_reference value)
{
const_node_ptr p = pointer_traits<const_node_ptr>::pointer_to
(static_cast<const_node_reference>(static_cast<const_node_holder_reference>(value)));
- BOOST_ASSERT(!!p);
return p;
}
};
@@ -121,26 +114,26 @@ struct mhtraits
static const link_mode_type link_mode = Hook::hooktags::link_mode;
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr(reference value)
+ inline static node_ptr to_node_ptr(reference value)
{
return pointer_traits<node_ptr>::pointer_to
(static_cast<node_reference>(static_cast<hook_reference>(value.*P)));
}
- BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr(const_reference value)
+ inline static const_node_ptr to_node_ptr(const_reference value)
{
return pointer_traits<const_node_ptr>::pointer_to
(static_cast<const_node_reference>(static_cast<const_hook_reference>(value.*P)));
}
- BOOST_INTRUSIVE_FORCEINLINE static pointer to_value_ptr(node_ptr n)
+ inline static pointer to_value_ptr(node_ptr n)
{
return pointer_traits<pointer>::pointer_to
(*detail::parent_from_member<T, Hook>
(static_cast<Hook*>(boost::movelib::to_raw_pointer(n)), P));
}
- BOOST_INTRUSIVE_FORCEINLINE static const_pointer to_value_ptr(const_node_ptr n)
+ inline static const_pointer to_value_ptr(const_node_ptr n)
{
return pointer_traits<const_pointer>::pointer_to
(*detail::parent_from_member<T, Hook>
@@ -169,23 +162,23 @@ struct fhtraits
typedef const value_type & const_reference;
static const link_mode_type link_mode = hook_type::hooktags::link_mode;
- static node_ptr to_node_ptr(reference value)
+ inline static node_ptr to_node_ptr(reference value)
{ return static_cast<node*>(boost::movelib::to_raw_pointer(Functor::to_hook_ptr(value))); }
- static const_node_ptr to_node_ptr(const_reference value)
+ inline static const_node_ptr to_node_ptr(const_reference value)
{ return static_cast<const node*>(boost::movelib::to_raw_pointer(Functor::to_hook_ptr(value))); }
- static pointer to_value_ptr(node_ptr n)
+ inline static pointer to_value_ptr(node_ptr n)
{ return Functor::to_value_ptr(to_hook_ptr(n)); }
- static const_pointer to_value_ptr(const_node_ptr n)
+ inline static const_pointer to_value_ptr(const_node_ptr n)
{ return Functor::to_value_ptr(to_hook_ptr(n)); }
private:
- static hook_ptr to_hook_ptr(node_ptr n)
+ inline static hook_ptr to_hook_ptr(node_ptr n)
{ return hook_ptr(&*static_cast<hook_type*>(&*n)); }
- static const_hook_ptr to_hook_ptr(const_node_ptr n)
+ inline static const_hook_ptr to_hook_ptr(const_node_ptr n)
{ return const_hook_ptr(&*static_cast<const hook_type*>(&*n)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iiterator.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iiterator.hpp
index 5ab1de2bb1..75b6d83845 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iiterator.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iiterator.hpp
@@ -84,15 +84,15 @@ template<class NodePtr, class StoredPointer, bool StatefulValueTraits = true>
struct iiterator_members
{
- BOOST_INTRUSIVE_FORCEINLINE iiterator_members()
+ inline iiterator_members()
: nodeptr_()//Value initialization to achieve "null iterators" (N3644)
{}
- BOOST_INTRUSIVE_FORCEINLINE iiterator_members(const NodePtr &n_ptr, const StoredPointer &data)
+ inline iiterator_members(const NodePtr &n_ptr, const StoredPointer &data)
: nodeptr_(n_ptr), ptr_(data)
{}
- BOOST_INTRUSIVE_FORCEINLINE StoredPointer get_ptr() const
+ inline StoredPointer get_ptr() const
{ return ptr_; }
NodePtr nodeptr_;
@@ -102,15 +102,15 @@ struct iiterator_members
template<class NodePtr, class StoredPointer>
struct iiterator_members<NodePtr, StoredPointer, false>
{
- BOOST_INTRUSIVE_FORCEINLINE iiterator_members()
+ inline iiterator_members()
: nodeptr_()//Value initialization to achieve "null iterators" (N3644)
{}
- BOOST_INTRUSIVE_FORCEINLINE iiterator_members(const NodePtr &n_ptr, const StoredPointer &)
+ inline iiterator_members(const NodePtr &n_ptr, const StoredPointer &)
: nodeptr_(n_ptr)
{}
- BOOST_INTRUSIVE_FORCEINLINE StoredPointer get_ptr() const
+ inline StoredPointer get_ptr() const
{ return StoredPointer(); }
NodePtr nodeptr_;
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iterator.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iterator.hpp
index ec91cd4f2c..d0ca41c332 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iterator.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/iterator.hpp
@@ -181,7 +181,7 @@ struct iterator_disable_if_tag_difference_type
////////////////////
template<class InputIt>
-BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag<InputIt, std::input_iterator_tag>::type
+inline typename iterator_enable_if_tag<InputIt, std::input_iterator_tag>::type
iterator_advance(InputIt& it, typename iter_difference<InputIt>::type n)
{
while(n--)
@@ -197,7 +197,7 @@ typename iterator_enable_if_tag<InputIt, std::forward_iterator_tag>::type
}
template<class InputIt>
-BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag<InputIt, std::bidirectional_iterator_tag>::type
+inline typename iterator_enable_if_tag<InputIt, std::bidirectional_iterator_tag>::type
iterator_advance(InputIt& it, typename iter_difference<InputIt>::type n)
{
for (; 0 < n; --n)
@@ -207,14 +207,14 @@ BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag<InputIt, std::bidire
}
template<class InputIt, class Distance>
-BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag<InputIt, std::random_access_iterator_tag>::type
+inline typename iterator_enable_if_tag<InputIt, std::random_access_iterator_tag>::type
iterator_advance(InputIt& it, Distance n)
{
it += n;
}
template<class InputIt, class Distance>
-BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag<InputIt, std::random_access_iterator_tag, InputIt>::type
+inline typename iterator_enable_if_tag<InputIt, std::random_access_iterator_tag, InputIt>::type
make_iterator_advance(InputIt it, Distance n)
{
(iterator_advance)(it, n);
@@ -222,14 +222,14 @@ BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag<InputIt, std::random
}
template<class It>
-BOOST_INTRUSIVE_FORCEINLINE
+inline
void iterator_uadvance(It& it, typename iter_size<It>::type n)
{
(iterator_advance)(it, (typename iterator_traits<It>::difference_type)n);
}
template<class It>
-BOOST_INTRUSIVE_FORCEINLINE
+inline
It make_iterator_uadvance(It it, typename iter_size<It>::type n)
{
(iterator_uadvance)(it, n);
@@ -253,7 +253,7 @@ typename iterator_disable_if_tag_difference_type
}
template<class InputIt>
-BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag_difference_type
+inline typename iterator_enable_if_tag_difference_type
<InputIt, std::random_access_iterator_tag>::type
iterator_distance(InputIt first, InputIt last)
{
@@ -266,7 +266,7 @@ BOOST_INTRUSIVE_FORCEINLINE typename iterator_enable_if_tag_difference_type
////////////////////////////////////////
template<class It>
-BOOST_INTRUSIVE_FORCEINLINE typename iter_size<It>::type
+inline typename iter_size<It>::type
iterator_udistance(It first, It last)
{
return (typename iter_size<It>::type)(iterator_distance)(first, last);
@@ -277,14 +277,14 @@ BOOST_INTRUSIVE_FORCEINLINE typename iter_size<It>::type
////////////////////////////////////////
template<class InputIt>
-BOOST_INTRUSIVE_FORCEINLINE InputIt iterator_next(InputIt it, typename iter_difference<InputIt>::type n)
+inline InputIt iterator_next(InputIt it, typename iter_difference<InputIt>::type n)
{
(iterator_advance)(it, n);
return it;
}
template<class InputIt>
-BOOST_INTRUSIVE_FORCEINLINE InputIt iterator_unext(InputIt it, typename iterator_traits<InputIt>::size_type n)
+inline InputIt iterator_unext(InputIt it, typename iterator_traits<InputIt>::size_type n)
{
(iterator_uadvance)(it, n);
return it;
@@ -295,11 +295,11 @@ BOOST_INTRUSIVE_FORCEINLINE InputIt iterator_unext(InputIt it, typename iterator
////////////////////////////////////////
template<class I>
-BOOST_INTRUSIVE_FORCEINLINE typename iterator_traits<I>::pointer iterator_arrow_result(const I &i)
+inline typename iterator_traits<I>::pointer iterator_arrow_result(const I &i)
{ return i.operator->(); }
template<class T>
-BOOST_INTRUSIVE_FORCEINLINE T * iterator_arrow_result(T *p)
+inline T * iterator_arrow_result(T *p)
{ return p; }
} //namespace intrusive
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/key_nodeptr_comp.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/key_nodeptr_comp.hpp
index 1029a3404a..4e7f7c27da 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/key_nodeptr_comp.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/key_nodeptr_comp.hpp
@@ -78,40 +78,40 @@ public:
static const bool value = same_type || is_convertible<P1, const_node_ptr>::value;
};
- BOOST_INTRUSIVE_FORCEINLINE base_t base() const
+ inline base_t base() const
{ return static_cast<const base_t&>(*this); }
- BOOST_INTRUSIVE_FORCEINLINE key_nodeptr_comp(KeyTypeKeyCompare kcomp, const ValueTraits *traits)
+ inline key_nodeptr_comp(KeyTypeKeyCompare kcomp, const ValueTraits *traits)
: base_t(kcomp), traits_(traits)
{}
//pred(pnode)
template<class T1>
- BOOST_INTRUSIVE_FORCEINLINE bool operator()(const T1 &t1, typename enable_if_c< is_same_or_nodeptr_convertible<T1>::value, sfinae_type* >::type = 0) const
+ inline bool operator()(const T1 &t1, typename enable_if_c< is_same_or_nodeptr_convertible<T1>::value, sfinae_type* >::type = 0) const
{ return base().get()(key_of_value()(*traits_->to_value_ptr(t1))); }
//operator() 2 arg
//pred(pnode, pnode)
template<class T1, class T2>
- BOOST_INTRUSIVE_FORCEINLINE bool operator()
+ inline bool operator()
(const T1 &t1, const T2 &t2, typename enable_if_c< is_same_or_nodeptr_convertible<T1>::value && is_same_or_nodeptr_convertible<T2>::value, sfinae_type* >::type = 0) const
{ return base()(*traits_->to_value_ptr(t1), *traits_->to_value_ptr(t2)); }
//pred(pnode, key)
template<class T1, class T2>
- BOOST_INTRUSIVE_FORCEINLINE bool operator()
+ inline bool operator()
(const T1 &t1, const T2 &t2, typename enable_if_c< is_same_or_nodeptr_convertible<T1>::value && !is_same_or_nodeptr_convertible<T2>::value, sfinae_type* >::type = 0) const
{ return base()(*traits_->to_value_ptr(t1), t2); }
//pred(key, pnode)
template<class T1, class T2>
- BOOST_INTRUSIVE_FORCEINLINE bool operator()
+ inline bool operator()
(const T1 &t1, const T2 &t2, typename enable_if_c< !is_same_or_nodeptr_convertible<T1>::value && is_same_or_nodeptr_convertible<T2>::value, sfinae_type* >::type = 0) const
{ return base()(t1, *traits_->to_value_ptr(t2)); }
//pred(key, key)
template<class T1, class T2>
- BOOST_INTRUSIVE_FORCEINLINE bool operator()
+ inline bool operator()
(const T1 &t1, const T2 &t2, typename enable_if_c< !is_same_or_nodeptr_convertible<T1>::value && !is_same_or_nodeptr_convertible<T2>::value, sfinae_type* >::type = 0) const
{ return base()(t1, t2); }
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/list_iterator.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/list_iterator.hpp
index f301a4b8e7..0a10e84872 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/list_iterator.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/list_iterator.hpp
@@ -60,81 +60,81 @@ class list_iterator
typedef typename types_t::iterator_type::reference reference;
typedef typename types_t::iterator_type::iterator_category iterator_category;
- BOOST_INTRUSIVE_FORCEINLINE list_iterator()
+ inline list_iterator()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit list_iterator(node_ptr nodeptr, const_value_traits_ptr traits_ptr)
+ inline explicit list_iterator(node_ptr nodeptr, const_value_traits_ptr traits_ptr)
: members_(nodeptr, traits_ptr)
{}
- BOOST_INTRUSIVE_FORCEINLINE list_iterator(const list_iterator &other)
+ inline list_iterator(const list_iterator &other)
: members_(other.pointed_node(), other.get_value_traits())
{}
- BOOST_INTRUSIVE_FORCEINLINE list_iterator(const nonconst_iterator &other)
+ inline list_iterator(const nonconst_iterator &other)
: members_(other.pointed_node(), other.get_value_traits())
{}
- BOOST_INTRUSIVE_FORCEINLINE list_iterator &operator=(const list_iterator &other)
+ inline list_iterator &operator=(const list_iterator &other)
{ members_.nodeptr_ = other.members_.nodeptr_; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE node_ptr pointed_node() const
+ inline node_ptr pointed_node() const
{ return members_.nodeptr_; }
- BOOST_INTRUSIVE_FORCEINLINE list_iterator &operator=(node_ptr nodeptr)
+ inline list_iterator &operator=(node_ptr nodeptr)
{ members_.nodeptr_ = nodeptr; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr get_value_traits() const
+ inline const_value_traits_ptr get_value_traits() const
{ return members_.get_ptr(); }
public:
- BOOST_INTRUSIVE_FORCEINLINE list_iterator& operator++()
+ inline list_iterator& operator++()
{
node_ptr p = node_traits::get_next(members_.nodeptr_);
members_.nodeptr_ = p;
return static_cast<list_iterator&> (*this);
}
- BOOST_INTRUSIVE_FORCEINLINE list_iterator operator++(int)
+ inline list_iterator operator++(int)
{
list_iterator result (*this);
members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
return result;
}
- BOOST_INTRUSIVE_FORCEINLINE list_iterator& operator--()
+ inline list_iterator& operator--()
{
members_.nodeptr_ = node_traits::get_previous(members_.nodeptr_);
return static_cast<list_iterator&> (*this);
}
- BOOST_INTRUSIVE_FORCEINLINE list_iterator operator--(int)
+ inline list_iterator operator--(int)
{
list_iterator result (*this);
members_.nodeptr_ = node_traits::get_previous(members_.nodeptr_);
return result;
}
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const list_iterator& l, const list_iterator& r)
+ inline friend bool operator== (const list_iterator& l, const list_iterator& r)
{ return l.pointed_node() == r.pointed_node(); }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const list_iterator& l, const list_iterator& r)
+ inline friend bool operator!= (const list_iterator& l, const list_iterator& r)
{ return !(l == r); }
- BOOST_INTRUSIVE_FORCEINLINE reference operator*() const
+ inline reference operator*() const
{ return *operator->(); }
- BOOST_INTRUSIVE_FORCEINLINE pointer operator->() const
+ inline pointer operator->() const
{ return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
- BOOST_INTRUSIVE_FORCEINLINE list_iterator<ValueTraits, false> unconst() const
+ inline list_iterator<ValueTraits, false> unconst() const
{ return list_iterator<ValueTraits, false>(this->pointed_node(), this->get_value_traits()); }
private:
- BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::false_) const
+ inline pointer operator_arrow(detail::false_) const
{ return ValueTraits::to_value_ptr(members_.nodeptr_); }
- BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::true_) const
+ inline pointer operator_arrow(detail::true_) const
{ return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/mpl.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/mpl.hpp
index d86fa4f3c9..cf6c745578 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/mpl.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/mpl.hpp
@@ -66,6 +66,12 @@ using boost::move_detail::eval_if_c;
using boost::move_detail::eval_if;
using boost::move_detail::unvoid_ref;
using boost::move_detail::add_const_if_c;
+using boost::move_detail::is_integral;
+using boost::move_detail::make_unsigned;
+using boost::move_detail::is_enum;
+using boost::move_detail::is_floating_point;
+using boost::move_detail::is_scalar;
+using boost::move_detail::is_unsigned;
template<std::size_t S>
struct ls_zeros
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/node_cloner_disposer.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/node_cloner_disposer.hpp
index 97e8d15326..a836699f32 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/node_cloner_disposer.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/node_cloner_disposer.hpp
@@ -59,7 +59,7 @@ struct node_cloner
{}
// tree-based containers use this method, which is proxy-reference friendly
- BOOST_INTRUSIVE_FORCEINLINE node_ptr operator()(node_ptr p)
+ inline node_ptr operator()(node_ptr p)
{
reference_type v = *traits_->to_value_ptr(p);
node_ptr n = traits_->to_node_ptr(*base_t::get()(v));
@@ -85,11 +85,11 @@ struct node_disposer
static const bool safemode_or_autounlink =
is_safe_autounlink<value_traits::link_mode>::value;
- BOOST_INTRUSIVE_FORCEINLINE node_disposer(F f, const ValueTraits *cont)
+ inline node_disposer(F f, const ValueTraits *cont)
: base_t(f), traits_(cont)
{}
- BOOST_INTRUSIVE_FORCEINLINE void operator()(node_ptr p)
+ inline void operator()(node_ptr p)
{
BOOST_IF_CONSTEXPR(safemode_or_autounlink)
node_algorithms::init(p);
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/parent_from_member.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/parent_from_member.hpp
index 275229ab47..8f1156e354 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/parent_from_member.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/parent_from_member.hpp
@@ -26,8 +26,7 @@
#if defined(_MSC_VER)
#define BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
- #include <boost/static_assert.hpp>
-#endif
+ #endif
namespace boost {
namespace intrusive {
@@ -49,7 +48,7 @@ BOOST_INTRUSIVE_FORCEINLINE std::ptrdiff_t offset_from_pointer_to_member(const M
//MSVC ABI can use up to 3 int32 to represent pointer to member data
//with virtual base classes, in those cases there is no simple to
//obtain the address of the parent. So static assert to avoid runtime errors
- BOOST_STATIC_ASSERT( sizeof(caster) == sizeof(int) );
+ BOOST_INTRUSIVE_STATIC_ASSERT( sizeof(caster) == sizeof(int) );
caster.ptr_to_member = ptr_to_member;
return std::ptrdiff_t(caster.offset);
@@ -91,25 +90,15 @@ BOOST_INTRUSIVE_FORCEINLINE std::ptrdiff_t offset_from_pointer_to_member(const M
template<class Parent, class Member>
BOOST_INTRUSIVE_FORCEINLINE Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member)
{
- return static_cast<Parent*>
- (
- static_cast<void*>
- (
- static_cast<char*>(static_cast<void*>(member)) - offset_from_pointer_to_member(ptr_to_member)
- )
- );
+ return reinterpret_cast<Parent*>
+ (reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)));
}
template<class Parent, class Member>
BOOST_INTRUSIVE_FORCEINLINE const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member)
{
- return static_cast<const Parent*>
- (
- static_cast<const void*>
- (
- static_cast<const char*>(static_cast<const void*>(member)) - offset_from_pointer_to_member(ptr_to_member)
- )
- );
+ return reinterpret_cast<const Parent*>
+ ( reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)) );
}
} //namespace detail {
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/simple_disposers.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/simple_disposers.hpp
index 6b9bd4bc63..41d2e24788 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/simple_disposers.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/simple_disposers.hpp
@@ -41,7 +41,7 @@ class init_disposer
typedef typename NodeAlgorithms::node_ptr node_ptr;
public:
- BOOST_INTRUSIVE_FORCEINLINE void operator()(node_ptr p)
+ inline void operator()(node_ptr p)
{ NodeAlgorithms::init(p); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/size_holder.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/size_holder.hpp
index bd14dc5049..ba5f418f9d 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/size_holder.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/size_holder.hpp
@@ -33,25 +33,25 @@ struct size_holder
static const bool constant_time_size = ConstantSize;
typedef SizeType size_type;
- BOOST_INTRUSIVE_FORCEINLINE SizeType get_size() const
+ inline SizeType get_size() const
{ return size_; }
- BOOST_INTRUSIVE_FORCEINLINE void set_size(SizeType size)
+ inline void set_size(SizeType size)
{ size_ = size; }
- BOOST_INTRUSIVE_FORCEINLINE void decrement()
+ inline void decrement()
{ --size_; }
- BOOST_INTRUSIVE_FORCEINLINE void increment()
+ inline void increment()
{ ++size_; }
- BOOST_INTRUSIVE_FORCEINLINE void increase(SizeType n)
+ inline void increase(SizeType n)
{ size_ += n; }
- BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType n)
+ inline void decrease(SizeType n)
{ size_ -= n; }
- BOOST_INTRUSIVE_FORCEINLINE void swap(size_holder &other)
+ inline void swap(size_holder &other)
{ SizeType tmp(size_); size_ = other.size_; other.size_ = tmp; }
SizeType size_;
@@ -63,25 +63,25 @@ struct size_holder<false, SizeType, Tag>
static const bool constant_time_size = false;
typedef SizeType size_type;
- BOOST_INTRUSIVE_FORCEINLINE size_type get_size() const
+ inline size_type get_size() const
{ return 0; }
- BOOST_INTRUSIVE_FORCEINLINE void set_size(size_type)
+ inline void set_size(size_type)
{}
- BOOST_INTRUSIVE_FORCEINLINE void decrement()
+ inline void decrement()
{}
- BOOST_INTRUSIVE_FORCEINLINE void increment()
+ inline void increment()
{}
- BOOST_INTRUSIVE_FORCEINLINE void increase(SizeType)
+ inline void increase(SizeType)
{}
- BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType)
+ inline void decrease(SizeType)
{}
- BOOST_INTRUSIVE_FORCEINLINE void swap(size_holder){}
+ inline void swap(size_holder){}
};
} //namespace detail{
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/slist_iterator.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/slist_iterator.hpp
index 9c5ee27470..64387c4a75 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/slist_iterator.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/slist_iterator.hpp
@@ -27,7 +27,6 @@
#include <boost/intrusive/detail/std_fwd.hpp>
#include <boost/intrusive/detail/iiterator.hpp>
#include <boost/intrusive/detail/mpl.hpp>
-#include <boost/static_assert.hpp>
namespace boost {
namespace intrusive {
@@ -63,75 +62,75 @@ class slist_iterator
typedef typename types_t::iterator_type::reference reference;
typedef typename types_t::iterator_type::iterator_category iterator_category;
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator()
+ inline slist_iterator()
{}
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator(node_ptr nodeptr, const_value_traits_ptr traits_ptr)
+ inline slist_iterator(node_ptr nodeptr, const_value_traits_ptr traits_ptr)
: members_(nodeptr, traits_ptr)
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit slist_iterator(node_ptr nodeptr)
+ inline explicit slist_iterator(node_ptr nodeptr)
: members_(nodeptr, const_value_traits_ptr())
- { BOOST_STATIC_ASSERT((stateful_value_traits == false)); }
+ { BOOST_INTRUSIVE_STATIC_ASSERT((stateful_value_traits == false)); }
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator(const slist_iterator &other)
+ inline slist_iterator(const slist_iterator &other)
: members_(other.pointed_node(), other.get_value_traits())
{}
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator(const nonconst_iterator &other)
+ inline slist_iterator(const nonconst_iterator &other)
: members_(other.pointed_node(), other.get_value_traits())
{}
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator &operator=(const slist_iterator &other)
+ inline slist_iterator &operator=(const slist_iterator &other)
{ members_.nodeptr_ = other.members_.nodeptr_; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE node_ptr pointed_node() const
+ inline node_ptr pointed_node() const
{ return members_.nodeptr_; }
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator &operator=(node_ptr n)
+ inline slist_iterator &operator=(node_ptr n)
{ members_.nodeptr_ = n; return static_cast<slist_iterator&>(*this); }
- BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr get_value_traits() const
+ inline const_value_traits_ptr get_value_traits() const
{ return members_.get_ptr(); }
- BOOST_INTRUSIVE_FORCEINLINE bool operator!() const
+ inline bool operator!() const
{ return !members_.nodeptr_; }
public:
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator& operator++()
+ inline slist_iterator& operator++()
{
members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
return static_cast<slist_iterator&> (*this);
}
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator operator++(int)
+ inline slist_iterator operator++(int)
{
slist_iterator result (*this);
members_.nodeptr_ = node_traits::get_next(members_.nodeptr_);
return result;
}
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const slist_iterator& l, const slist_iterator& r)
+ inline friend bool operator== (const slist_iterator& l, const slist_iterator& r)
{ return l.pointed_node() == r.pointed_node(); }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const slist_iterator& l, const slist_iterator& r)
+ inline friend bool operator!= (const slist_iterator& l, const slist_iterator& r)
{ return l.pointed_node() != r.pointed_node(); }
- BOOST_INTRUSIVE_FORCEINLINE reference operator*() const
+ inline reference operator*() const
{ return *operator->(); }
- BOOST_INTRUSIVE_FORCEINLINE pointer operator->() const
+ inline pointer operator->() const
{ return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
- BOOST_INTRUSIVE_FORCEINLINE slist_iterator<ValueTraits, false> unconst() const
+ inline slist_iterator<ValueTraits, false> unconst() const
{ return slist_iterator<ValueTraits, false>(this->pointed_node(), this->get_value_traits()); }
private:
- BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::false_) const
+ inline pointer operator_arrow(detail::false_) const
{ return ValueTraits::to_value_ptr(members_.nodeptr_); }
- BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::true_) const
+ inline pointer operator_arrow(detail::true_) const
{ return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_iterator.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_iterator.hpp
index ba1375f8c8..f97cecb31f 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_iterator.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_iterator.hpp
@@ -68,32 +68,32 @@ class tree_iterator
typedef typename types_t::iterator_type::reference reference;
typedef typename types_t::iterator_type::iterator_category iterator_category;
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator()
+ inline tree_iterator()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit tree_iterator(node_ptr nodeptr, const_value_traits_ptr traits_ptr)
+ inline explicit tree_iterator(node_ptr nodeptr, const_value_traits_ptr traits_ptr)
: members_(nodeptr, traits_ptr)
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator(const tree_iterator &other)
+ inline tree_iterator(const tree_iterator &other)
: members_(other.pointed_node(), other.get_value_traits())
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator(const nonconst_iterator &other)
+ inline tree_iterator(const nonconst_iterator &other)
: members_(other.pointed_node(), other.get_value_traits())
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator &operator=(const tree_iterator &other)
+ inline tree_iterator &operator=(const tree_iterator &other)
{ members_.nodeptr_ = other.members_.nodeptr_; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator &operator=(node_ptr nodeptr)
+ inline tree_iterator &operator=(node_ptr nodeptr)
{ members_.nodeptr_ = nodeptr; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE node_ptr pointed_node() const
+ inline node_ptr pointed_node() const
{ return members_.nodeptr_; }
public:
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator& operator++()
+ inline tree_iterator& operator++()
{
members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
return *this;
@@ -106,7 +106,7 @@ class tree_iterator
return result;
}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator& operator--()
+ inline tree_iterator& operator--()
{
members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
return *this;
@@ -119,43 +119,43 @@ class tree_iterator
return result;
}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator& go_left()
+ inline tree_iterator& go_left()
{
members_.nodeptr_ = node_traits::get_left(members_.nodeptr_);
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator& go_right()
+ inline tree_iterator& go_right()
{
members_.nodeptr_ = node_traits::get_right(members_.nodeptr_);
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE tree_iterator& go_parent()
+ inline tree_iterator& go_parent()
{
members_.nodeptr_ = node_traits::get_parent(members_.nodeptr_);
return *this;
}
- BOOST_INTRUSIVE_FORCEINLINE operator unspecified_bool_type() const
+ inline operator unspecified_bool_type() const
{ return members_.nodeptr_ ? &tree_iterator::unspecified_bool_type_func : 0; }
- BOOST_INTRUSIVE_FORCEINLINE bool operator! () const
+ inline bool operator! () const
{ return !members_.nodeptr_; }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const tree_iterator& l, const tree_iterator& r)
+ inline friend bool operator== (const tree_iterator& l, const tree_iterator& r)
{ return l.pointed_node() == r.pointed_node(); }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
+ inline friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
{ return !(l == r); }
- BOOST_INTRUSIVE_FORCEINLINE reference operator*() const
+ inline reference operator*() const
{ return *operator->(); }
- BOOST_INTRUSIVE_FORCEINLINE pointer operator->() const
+ inline pointer operator->() const
{ return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
- BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr get_value_traits() const
+ inline const_value_traits_ptr get_value_traits() const
{ return members_.get_ptr(); }
tree_iterator end_iterator_from_it() const
@@ -167,10 +167,10 @@ class tree_iterator
{ return tree_iterator<value_traits, false>(this->pointed_node(), this->get_value_traits()); }
private:
- BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::false_) const
+ inline pointer operator_arrow(detail::false_) const
{ return ValueTraits::to_value_ptr(members_.nodeptr_); }
- BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::true_) const
+ inline pointer operator_arrow(detail::true_) const
{ return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_value_compare.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_value_compare.hpp
index c78da0acd6..d8b88f62de 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_value_compare.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/tree_value_compare.hpp
@@ -59,67 +59,67 @@ struct tree_value_compare
typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t;
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare()
+ inline tree_value_compare()
: base_t()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit tree_value_compare(const key_compare &kcomp)
+ inline explicit tree_value_compare(const key_compare &kcomp)
: base_t(kcomp)
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare (const tree_value_compare &x)
+ inline tree_value_compare (const tree_value_compare &x)
: base_t(x.base_t::get())
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const tree_value_compare &x)
+ inline tree_value_compare &operator=(const tree_value_compare &x)
{ this->base_t::get() = x.base_t::get(); return *this; }
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const key_compare &x)
+ inline tree_value_compare &operator=(const key_compare &x)
{ this->base_t::get() = x; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE const key_compare &key_comp() const
+ inline const key_compare &key_comp() const
{ return static_cast<const key_compare &>(*this); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const key_type &key) const
+ inline Ret operator()(const key_type &key) const
{ return this->key_comp()(key); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const value_type &value) const
+ inline Ret operator()(const value_type &value) const
{ return this->key_comp()(KeyOfValue()(value)); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const U &nonkey
+ inline Ret operator()( const U &nonkey
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(nonkey); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const key_type &key1, const key_type &key2) const
+ inline Ret operator()(const key_type &key1, const key_type &key2) const
{ return this->key_comp()(key1, key2); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const value_type &value1, const value_type &value2) const
+ inline Ret operator()(const value_type &value1, const value_type &value2) const
{ return this->key_comp()(KeyOfValue()(value1), KeyOfValue()(value2)); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const key_type &key1, const value_type &value2) const
+ inline Ret operator()(const key_type &key1, const value_type &value2) const
{ return this->key_comp()(key1, KeyOfValue()(value2)); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const value_type &value1, const key_type &key2) const
+ inline Ret operator()(const value_type &value1, const key_type &key2) const
{ return this->key_comp()(KeyOfValue()(value1), key2); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const key_type &key1, const U &nonkey2
+ inline Ret operator()( const key_type &key1, const U &nonkey2
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(key1, nonkey2); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const U &nonkey1, const key_type &key2
+ inline Ret operator()( const U &nonkey1, const key_type &key2
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(nonkey1, key2); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const value_type &value1, const U &nonvalue2
+ inline Ret operator()( const value_type &value1, const U &nonvalue2
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(KeyOfValue()(value1), nonvalue2); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const U &nonvalue1, const value_type &value2
+ inline Ret operator()( const U &nonvalue1, const value_type &value2
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(nonvalue1, KeyOfValue()(value2)); }
};
@@ -137,45 +137,45 @@ struct tree_value_compare<ValuePtr, KeyCompare, KeyOfValue, Ret, true>
typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t;
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare()
+ inline tree_value_compare()
: base_t()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit tree_value_compare(const key_compare &kcomp)
+ inline explicit tree_value_compare(const key_compare &kcomp)
: base_t(kcomp)
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare (const tree_value_compare &x)
+ inline tree_value_compare (const tree_value_compare &x)
: base_t(x.base_t::get())
{}
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const tree_value_compare &x)
+ inline tree_value_compare &operator=(const tree_value_compare &x)
{ this->base_t::get() = x.base_t::get(); return *this; }
- BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const key_compare &x)
+ inline tree_value_compare &operator=(const key_compare &x)
{ this->base_t::get() = x; return *this; }
- BOOST_INTRUSIVE_FORCEINLINE const key_compare &key_comp() const
+ inline const key_compare &key_comp() const
{ return static_cast<const key_compare &>(*this); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const key_type &key) const
+ inline Ret operator()(const key_type &key) const
{ return this->key_comp()(key); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const U &nonkey
+ inline Ret operator()( const U &nonkey
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(nonkey); }
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const key_type &key1, const key_type &key2) const
+ inline Ret operator()(const key_type &key1, const key_type &key2) const
{ return this->key_comp()(key1, key2); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()( const key_type &key1, const U &nonkey2
+ inline Ret operator()( const key_type &key1, const U &nonkey2
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(key1, nonkey2); }
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE Ret operator()(const U &nonkey1, const key_type &key2
+ inline Ret operator()(const U &nonkey1, const key_type &key2
, typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
{ return this->key_comp()(nonkey1, key2); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/workaround.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/workaround.hpp
index 0011fb5bfb..f925a87a8b 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/workaround.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/detail/workaround.hpp
@@ -48,8 +48,11 @@
#elif defined(BOOST_MSVC) && (_MSC_VER < 1900 || defined(_DEBUG))
//"__forceinline" and MSVC seems to have some bugs in old versions and in debug mode
#define BOOST_INTRUSIVE_FORCEINLINE inline
-#elif defined(BOOST_GCC) && ((__GNUC__ <= 5) || defined(__MINGW32__))
+#elif defined(BOOST_CLANG) || (defined(BOOST_GCC) && ((__GNUC__ <= 5) || defined(__MINGW32__)))
//Older GCCs have problems with forceinline
+ //Clang can have code bloat issues with forceinline, see
+ //https://lists.boost.org/boost-users/2023/04/91445.php and
+ //https://github.com/llvm/llvm-project/issues/62202
#define BOOST_INTRUSIVE_FORCEINLINE inline
#else
#define BOOST_INTRUSIVE_FORCEINLINE BOOST_FORCEINLINE
@@ -81,4 +84,32 @@
# define BOOST_INTRUSIVE_CATCH_END }
#endif
+#ifndef BOOST_NO_CXX11_STATIC_ASSERT
+# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
+# define BOOST_INTRUSIVE_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)
+# else
+# define BOOST_INTRUSIVE_STATIC_ASSERT( B ) static_assert(B, #B)
+# endif
+#else
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<bool B>
+struct STATIC_ASSERTION_FAILURE;
+
+template<>
+struct STATIC_ASSERTION_FAILURE<true>{};
+
+template<unsigned> struct static_assert_test {};
+
+}}}
+
+#define BOOST_INTRUSIVE_STATIC_ASSERT(B) \
+ typedef ::boost::intrusive::detail::static_assert_test<\
+ (unsigned)sizeof(::boost::intrusive::detail::STATIC_ASSERTION_FAILURE<bool(B)>)>\
+ BOOST_JOIN(boost_intrusive_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
+
+#endif
+
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/linear_slist_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/linear_slist_algorithms.hpp
index a616d7ed71..0574f82481 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/linear_slist_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/linear_slist_algorithms.hpp
@@ -151,8 +151,8 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void init_header(node_ptr this_node) BOOST_NOEXCEPT
- { NodeTraits::set_next(this_node, node_ptr ()); }
+ inline static void init_header(node_ptr this_node) BOOST_NOEXCEPT
+ { NodeTraits::set_next(this_node, node_ptr()); }
//! <b>Requires</b>: 'p' is the first node of a list.
//!
@@ -161,7 +161,7 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Constant time.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr end_node(const_node_ptr) BOOST_NOEXCEPT
+ inline static node_ptr end_node(const_node_ptr) BOOST_NOEXCEPT
{ return node_ptr(); }
//! <b>Effects</b>: Returns true if this_node_points to an empty list.
@@ -169,7 +169,7 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_empty(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool is_empty(const_node_ptr this_node) BOOST_NOEXCEPT
{ return !NodeTraits::get_next(this_node); }
//! <b>Effects</b>: Returns true if this_node points to a sentinel node.
@@ -177,7 +177,7 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static bool is_sentinel(const_node_ptr this_node) BOOST_NOEXCEPT
+ inline static bool is_sentinel(const_node_ptr this_node) BOOST_NOEXCEPT
{ return NodeTraits::get_next(this_node) == this_node; }
//! <b>Effects</b>: Marks this node as a "sentinel" node, a special state that is different from "empty",
@@ -186,7 +186,7 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void set_sentinel(node_ptr this_node) BOOST_NOEXCEPT
+ inline static void set_sentinel(node_ptr this_node) BOOST_NOEXCEPT
{ NodeTraits::set_next(this_node, this_node); }
//! <b>Requires</b>: this_node and prev_init_node must be in the same linear list.
@@ -198,7 +198,7 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Linear to the number of elements between prev_init_node and this_node.
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr
+ inline static node_ptr
get_previous_node(node_ptr prev_init_node, node_ptr this_node) BOOST_NOEXCEPT
{ return base_t::get_previous_node(prev_init_node, this_node); }
@@ -230,7 +230,7 @@ class linear_slist_algorithms
//! <b>Complexity</b>: Constant
//!
//! <b>Throws</b>: Nothing.
- BOOST_INTRUSIVE_FORCEINLINE static void swap_trailing_nodes(node_ptr this_node, node_ptr other_node) BOOST_NOEXCEPT
+ inline static void swap_trailing_nodes(node_ptr this_node, node_ptr other_node) BOOST_NOEXCEPT
{
node_ptr this_nxt = NodeTraits::get_next(this_node);
node_ptr other_nxt = NodeTraits::get_next(other_node);
@@ -400,7 +400,7 @@ class linear_slist_algorithms
//!
//! <b>Throws</b>: Nothing.
template<class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE static std::size_t detach_and_dispose(node_ptr p, Disposer disposer) BOOST_NOEXCEPT
+ inline static std::size_t detach_and_dispose(node_ptr p, Disposer disposer) BOOST_NOEXCEPT
{ return base_t::unlink_after_and_dispose(p, node_ptr(), disposer); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/list.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/list.hpp
index 62291b4809..9871d97394 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/list.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/list.hpp
@@ -37,7 +37,6 @@
#include <boost/intrusive/detail/algorithm.hpp>
#include <boost/move/utility_core.hpp>
-#include <boost/static_assert.hpp>
#include <boost/intrusive/detail/value_functors.hpp>
#include <cstddef> //std::size_t, etc.
@@ -123,14 +122,14 @@ class list_impl
static const bool safemode_or_autounlink = is_safe_autounlink<value_traits::link_mode>::value;
//Constant-time size is incompatible with auto-unlink hooks!
- BOOST_STATIC_ASSERT(!(constant_time_size &&
+ BOOST_INTRUSIVE_STATIC_ASSERT(!(constant_time_size &&
((int)value_traits::link_mode == (int)auto_unlink)
));
- BOOST_INTRUSIVE_FORCEINLINE node_ptr get_root_node()
+ inline node_ptr get_root_node()
{ return data_.root_plus_size_.m_header.get_node(); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_root_node() const
+ inline const_node_ptr get_root_node() const
{ return data_.root_plus_size_.m_header.get_node(); }
struct root_plus_size : public size_traits
@@ -141,29 +140,29 @@ class list_impl
struct data_t : public value_traits
{
typedef typename list_impl::value_traits value_traits;
- BOOST_INTRUSIVE_FORCEINLINE explicit data_t(const value_traits &val_traits)
+ inline explicit data_t(const value_traits &val_traits)
: value_traits(val_traits)
{}
root_plus_size root_plus_size_;
} data_;
- BOOST_INTRUSIVE_FORCEINLINE size_traits &priv_size_traits() BOOST_NOEXCEPT
+ inline size_traits &priv_size_traits() BOOST_NOEXCEPT
{ return data_.root_plus_size_; }
- BOOST_INTRUSIVE_FORCEINLINE const size_traits &priv_size_traits() const BOOST_NOEXCEPT
+ inline const size_traits &priv_size_traits() const BOOST_NOEXCEPT
{ return data_.root_plus_size_; }
- BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const BOOST_NOEXCEPT
+ inline const value_traits &priv_value_traits() const BOOST_NOEXCEPT
{ return data_; }
- BOOST_INTRUSIVE_FORCEINLINE value_traits &priv_value_traits() BOOST_NOEXCEPT
+ inline value_traits &priv_value_traits() BOOST_NOEXCEPT
{ return data_; }
typedef typename boost::intrusive::value_traits_pointers
<ValueTraits>::const_value_traits_ptr const_value_traits_ptr;
- BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const BOOST_NOEXCEPT
+ inline const_value_traits_ptr priv_value_traits_ptr() const BOOST_NOEXCEPT
{ return pointer_traits<const_value_traits_ptr>::pointer_to(this->priv_value_traits()); }
/// @endcond
@@ -364,7 +363,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE reference front() BOOST_NOEXCEPT
+ inline reference front() BOOST_NOEXCEPT
{ return *priv_value_traits().to_value_ptr(node_traits::get_next(this->get_root_node())); }
//! <b>Effects</b>: Returns a const_reference to the first element of the list.
@@ -372,7 +371,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reference front() const BOOST_NOEXCEPT
+ inline const_reference front() const BOOST_NOEXCEPT
{ return *priv_value_traits().to_value_ptr(node_traits::get_next(this->get_root_node())); }
//! <b>Effects</b>: Returns a reference to the last element of the list.
@@ -380,7 +379,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE reference back() BOOST_NOEXCEPT
+ inline reference back() BOOST_NOEXCEPT
{ return *priv_value_traits().to_value_ptr(node_traits::get_previous(this->get_root_node())); }
//! <b>Effects</b>: Returns a const_reference to the last element of the list.
@@ -388,7 +387,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reference back() const BOOST_NOEXCEPT
+ inline const_reference back() const BOOST_NOEXCEPT
{ return *priv_value_traits().to_value_ptr(detail::uncast(node_traits::get_previous(this->get_root_node()))); }
//! <b>Effects</b>: Returns an iterator to the first element contained in the list.
@@ -396,7 +395,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE iterator begin() BOOST_NOEXCEPT
+ inline iterator begin() BOOST_NOEXCEPT
{ return iterator(node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
@@ -404,7 +403,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const BOOST_NOEXCEPT
+ inline const_iterator begin() const BOOST_NOEXCEPT
{ return this->cbegin(); }
//! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
@@ -412,7 +411,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const BOOST_NOEXCEPT
+ inline const_iterator cbegin() const BOOST_NOEXCEPT
{ return const_iterator(node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns an iterator to the end of the list.
@@ -420,7 +419,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE iterator end() BOOST_NOEXCEPT
+ inline iterator end() BOOST_NOEXCEPT
{ return iterator(this->get_root_node(), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a const_iterator to the end of the list.
@@ -428,7 +427,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const BOOST_NOEXCEPT
+ inline const_iterator end() const BOOST_NOEXCEPT
{ return this->cend(); }
//! <b>Effects</b>: Returns a constant iterator to the end of the list.
@@ -436,7 +435,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const BOOST_NOEXCEPT
+ inline const_iterator cend() const BOOST_NOEXCEPT
{ return const_iterator(detail::uncast(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning
@@ -445,7 +444,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE reverse_iterator rbegin() BOOST_NOEXCEPT
+ inline reverse_iterator rbegin() BOOST_NOEXCEPT
{ return reverse_iterator(this->end()); }
//! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
@@ -454,7 +453,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator rbegin() const BOOST_NOEXCEPT
+ inline const_reverse_iterator rbegin() const BOOST_NOEXCEPT
{ return this->crbegin(); }
//! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
@@ -463,7 +462,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator crbegin() const BOOST_NOEXCEPT
+ inline const_reverse_iterator crbegin() const BOOST_NOEXCEPT
{ return const_reverse_iterator(end()); }
//! <b>Effects</b>: Returns a reverse_iterator pointing to the end
@@ -472,7 +471,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE reverse_iterator rend() BOOST_NOEXCEPT
+ inline reverse_iterator rend() BOOST_NOEXCEPT
{ return reverse_iterator(begin()); }
//! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
@@ -481,7 +480,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator rend() const BOOST_NOEXCEPT
+ inline const_reverse_iterator rend() const BOOST_NOEXCEPT
{ return this->crend(); }
//! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
@@ -490,7 +489,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reverse_iterator crend() const BOOST_NOEXCEPT
+ inline const_reverse_iterator crend() const BOOST_NOEXCEPT
{ return const_reverse_iterator(this->begin()); }
//! <b>Precondition</b>: end_iterator must be a valid end iterator
@@ -501,7 +500,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE static list_impl &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static list_impl &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return list_impl::priv_container_from_end_iterator(end_iterator); }
//! <b>Precondition</b>: end_iterator must be a valid end const_iterator
@@ -512,7 +511,7 @@ class list_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE static const list_impl &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const list_impl &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return list_impl::priv_container_from_end_iterator(end_iterator); }
//! <b>Effects</b>: Returns the number of the elements contained in the list.
@@ -523,7 +522,7 @@ class list_impl
//! if constant-time size option is disabled. Constant time otherwise.
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
- BOOST_INTRUSIVE_FORCEINLINE size_type size() const BOOST_NOEXCEPT
+ inline size_type size() const BOOST_NOEXCEPT
{
BOOST_IF_CONSTEXPR(constant_time_size)
return this->priv_size_traits().get_size();
@@ -538,7 +537,7 @@ class list_impl
//! <b>Complexity</b>: Constant.
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
- BOOST_INTRUSIVE_FORCEINLINE bool empty() const BOOST_NOEXCEPT
+ inline bool empty() const BOOST_NOEXCEPT
{ return node_algorithms::unique(this->get_root_node()); }
//! <b>Effects</b>: Swaps the elements of x and *this.
@@ -563,7 +562,7 @@ class list_impl
//! <b>Complexity</b>: Linear to the number of shifts.
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
- BOOST_INTRUSIVE_FORCEINLINE void shift_backwards(size_type n = 1) BOOST_NOEXCEPT
+ inline void shift_backwards(size_type n = 1) BOOST_NOEXCEPT
{ node_algorithms::move_forward(this->get_root_node(), n); }
//! <b>Effects</b>: Moves forward all the elements, so that the second
@@ -575,7 +574,7 @@ class list_impl
//! <b>Complexity</b>: Linear to the number of shifts.
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
- BOOST_INTRUSIVE_FORCEINLINE void shift_forward(size_type n = 1) BOOST_NOEXCEPT
+ inline void shift_forward(size_type n = 1) BOOST_NOEXCEPT
{ node_algorithms::move_backwards(this->get_root_node(), n); }
//! <b>Effects</b>: Erases the element pointed by i of the list.
@@ -590,7 +589,7 @@ class list_impl
//!
//! <b>Note</b>: Invalidates the iterators (but not the references) to the
//! erased element.
- BOOST_INTRUSIVE_FORCEINLINE iterator erase(const_iterator i) BOOST_NOEXCEPT
+ inline iterator erase(const_iterator i) BOOST_NOEXCEPT
{ return this->erase_and_dispose(i, detail::null_disposer()); }
//! <b>Requires</b>: b and e must be valid iterators to elements in *this.
@@ -608,7 +607,7 @@ class list_impl
//!
//! <b>Note</b>: Invalidates the iterators (but not the references) to the
//! erased elements.
- BOOST_INTRUSIVE_FORCEINLINE iterator erase(const_iterator b, const_iterator e) BOOST_NOEXCEPT
+ inline iterator erase(const_iterator b, const_iterator e) BOOST_NOEXCEPT
{
BOOST_IF_CONSTEXPR(safemode_or_autounlink || constant_time_size){
return this->erase_and_dispose(b, e, detail::null_disposer());
@@ -1187,14 +1186,14 @@ class list_impl
//! <b>Effects</b>: Removes adjacent duplicate elements or adjacent
//! elements that are equal from the list. No destructors are called.
//!
- //! <b>Throws</b>: If std::equal_to<value_type throws. Basic guarantee.
+ //! <b>Throws</b>: If the comparison operator throws. Basic guarantee.
//!
//! <b>Complexity</b>: Linear time (size()-1 comparisons calls to pred()).
//!
//! <b>Note</b>: The relative order of elements that are not removed is unchanged,
//! and iterators to elements that are not removed remain valid.
void unique()
- { this->unique_and_dispose(std::equal_to<value_type>(), detail::null_disposer()); }
+ { this->unique_and_dispose(value_equal<value_type>(), detail::null_disposer()); }
//! <b>Effects</b>: Removes adjacent duplicate elements or adjacent
//! elements that satisfy some binary predicate from the list.
@@ -1216,7 +1215,7 @@ class list_impl
//! elements that are equal from the list.
//! Disposer::operator()(pointer) is called for every removed element.
//!
- //! <b>Throws</b>: If std::equal_to<value_type throws. Basic guarantee.
+ //! <b>Throws</b>: If the equality operator throws. Basic guarantee.
//!
//! <b>Complexity</b>: Linear time (size()-1) comparisons equality comparisons.
//!
@@ -1224,7 +1223,7 @@ class list_impl
//! and iterators to elements that are not removed remain valid.
template<class Disposer>
void unique_and_dispose(Disposer disposer)
- { this->unique_and_dispose(std::equal_to<value_type>(), disposer); }
+ { this->unique_and_dispose(value_equal<value_type>(), disposer); }
//! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
//!
@@ -1272,7 +1271,7 @@ class list_impl
//! is stateless.
static iterator s_iterator_to(reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!stateful_value_traits));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!stateful_value_traits));
BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(value_traits::to_node_ptr(value)));
return iterator(value_traits::to_node_ptr(value), const_value_traits_ptr());
}
@@ -1290,7 +1289,7 @@ class list_impl
//! is stateless.
static const_iterator s_iterator_to(const_reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!stateful_value_traits));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!stateful_value_traits));
reference r =*detail::uncast(pointer_traits<const_pointer>::pointer_to(value));
BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(value_traits::to_node_ptr(r)));
return const_iterator(value_traits::to_node_ptr(r), const_value_traits_ptr());
@@ -1371,22 +1370,22 @@ class list_impl
return ::boost::intrusive::algo_equal(x.cbegin(), x.cend(), y.cbegin(), y.cend());
}
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator!=(const list_impl &x, const list_impl &y)
+ inline friend bool operator!=(const list_impl &x, const list_impl &y)
{ return !(x == y); }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator<(const list_impl &x, const list_impl &y)
+ inline friend bool operator<(const list_impl &x, const list_impl &y)
{ return ::boost::intrusive::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator>(const list_impl &x, const list_impl &y)
+ inline friend bool operator>(const list_impl &x, const list_impl &y)
{ return y < x; }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator<=(const list_impl &x, const list_impl &y)
+ inline friend bool operator<=(const list_impl &x, const list_impl &y)
{ return !(y < x); }
- BOOST_INTRUSIVE_FORCEINLINE friend bool operator>=(const list_impl &x, const list_impl &y)
+ inline friend bool operator>=(const list_impl &x, const list_impl &y)
{ return !(x < y); }
- BOOST_INTRUSIVE_FORCEINLINE friend void swap(list_impl &x, list_impl &y) BOOST_NOEXCEPT
+ inline friend void swap(list_impl &x, list_impl &y) BOOST_NOEXCEPT
{ x.swap(y); }
/// @cond
@@ -1394,7 +1393,7 @@ class list_impl
private:
static list_impl &priv_container_from_end_iterator(const const_iterator &end_iterator) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((has_container_from_iterator));
+ BOOST_INTRUSIVE_STATIC_ASSERT((has_container_from_iterator));
node_ptr p = end_iterator.pointed_node();
header_holder_type* h = header_holder_type::get_holder(p);
root_plus_size* r = detail::parent_from_member
@@ -1466,7 +1465,7 @@ class list
#endif
>::type Base;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename Base::value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename Base::value_traits::value_type, T>::value));
BOOST_MOVABLE_BUT_NOT_COPYABLE(list)
public:
@@ -1474,38 +1473,38 @@ class list
typedef typename Base::iterator iterator;
typedef typename Base::const_iterator const_iterator;
- BOOST_INTRUSIVE_FORCEINLINE list()
+ inline list()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit list(const value_traits &v_traits)
+ inline explicit list(const value_traits &v_traits)
: Base(v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE list(Iterator b, Iterator e, const value_traits &v_traits = value_traits())
+ inline list(Iterator b, Iterator e, const value_traits &v_traits = value_traits())
: Base(b, e, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE list(BOOST_RV_REF(list) x)
+ inline list(BOOST_RV_REF(list) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE list& operator=(BOOST_RV_REF(list) x)
+ inline list& operator=(BOOST_RV_REF(list) x)
{ return static_cast<list &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const list &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const list &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(list) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(list) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static list &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static list &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<list &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const list &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const list &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const list &>(Base::container_from_end_iterator(end_iterator)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/pack_options.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/pack_options.hpp
index 66761d7625..20e093e947 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/pack_options.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/pack_options.hpp
@@ -14,7 +14,7 @@
#define BOOST_INTRUSIVE_PACK_OPTIONS_HPP
#include <boost/intrusive/detail/config_begin.hpp>
-
+#include <boost/intrusive/detail/workaround.hpp>
#if defined(BOOST_HAS_PRAGMA_ONCE)
# pragma once
#endif
@@ -338,7 +338,7 @@ struct pack_options
//!
//! typedef pack_options< empty_default, typename my_pointer<void*> >::type::my_pointer_type type;
//!
-//! BOOST_STATIC_ASSERT(( boost::is_same<type, void>::value ));
+//! BOOST_INTRUSIVE_STATIC_ASSERT(( boost::is_same<type, void>::value ));
//!
//! \endcode
#define BOOST_INTRUSIVE_OPTION_TYPE(OPTION_NAME, TYPE, TYPEDEF_EXPR, TYPEDEF_NAME)
@@ -368,7 +368,7 @@ struct pack_options
//!
//! const bool is_incremental = pack_options< empty_default, incremental<true> >::type::is_incremental;
//!
-//! BOOST_STATIC_ASSERT(( is_incremental == true ));
+//! BOOST_INTRUSIVE_STATIC_ASSERT(( is_incremental == true ));
//!
//! \endcode
#define BOOST_INTRUSIVE_OPTION_CONSTANT(OPTION_NAME, TYPE, VALUE, CONSTANT_NAME)
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/pointer_traits.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/pointer_traits.hpp
index 1b2ed05763..48d984eef6 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/pointer_traits.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/pointer_traits.hpp
@@ -130,7 +130,7 @@ struct pointer_traits
//!
//! <b>Note</b>: For non-conforming compilers only the existence of a member function called
//! <code>pointer_to</code> is checked.
- BOOST_INTRUSIVE_FORCEINLINE static pointer pointer_to(reference r) BOOST_NOEXCEPT
+ inline static pointer pointer_to(reference r) BOOST_NOEXCEPT
{
//Non-standard extension, it does not require Ptr::pointer_to. If not present
//tries to converts &r to pointer.
@@ -150,7 +150,7 @@ struct pointer_traits
//! <b>Note</b>: For non-conforming compilers only the existence of a member function called
//! <code>static_cast_from</code> is checked.
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer static_cast_from(const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer static_cast_from(const UPtr &uptr) BOOST_NOEXCEPT
{
typedef const UPtr &RefArg;
const bool value = boost::intrusive::detail::
@@ -171,7 +171,7 @@ struct pointer_traits
//! <b>Note</b>: For non-conforming compilers only the existence of a member function called
//! <code>const_cast_from</code> is checked.
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer const_cast_from(const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer const_cast_from(const UPtr &uptr) BOOST_NOEXCEPT
{
typedef const UPtr &RefArg;
const bool value = boost::intrusive::detail::
@@ -192,7 +192,7 @@ struct pointer_traits
//! <b>Note</b>: For non-conforming compilers only the existence of a member function called
//! <code>dynamic_cast_from</code> is checked.
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer dynamic_cast_from(const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer dynamic_cast_from(const UPtr &uptr) BOOST_NOEXCEPT
{
typedef const UPtr &RefArg;
const bool value = boost::intrusive::detail::
@@ -208,46 +208,46 @@ struct pointer_traits
private:
//priv_to_raw_pointer
template <class T>
- BOOST_INTRUSIVE_FORCEINLINE static T* to_raw_pointer(T* p) BOOST_NOEXCEPT
+ inline static T* to_raw_pointer(T* p) BOOST_NOEXCEPT
{ return p; }
template <class Pointer>
- BOOST_INTRUSIVE_FORCEINLINE static typename pointer_traits<Pointer>::element_type*
+ inline static typename pointer_traits<Pointer>::element_type*
to_raw_pointer(const Pointer &p) BOOST_NOEXCEPT
{ return pointer_traits::to_raw_pointer(p.operator->()); }
//priv_pointer_to
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_pointer_to(boost::intrusive::detail::true_, reference r) BOOST_NOEXCEPT
+ inline static pointer priv_pointer_to(boost::intrusive::detail::true_, reference r) BOOST_NOEXCEPT
{ return Ptr::pointer_to(r); }
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_pointer_to(boost::intrusive::detail::false_, reference r) BOOST_NOEXCEPT
+ inline static pointer priv_pointer_to(boost::intrusive::detail::false_, reference r) BOOST_NOEXCEPT
{ return pointer(boost::intrusive::detail::addressof(r)); }
//priv_static_cast_from
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_static_cast_from(boost::intrusive::detail::true_, const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer priv_static_cast_from(boost::intrusive::detail::true_, const UPtr &uptr) BOOST_NOEXCEPT
{ return Ptr::static_cast_from(uptr); }
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_static_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer priv_static_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) BOOST_NOEXCEPT
{ return uptr ? pointer_to(*static_cast<element_type*>(to_raw_pointer(uptr))) : pointer(); }
//priv_const_cast_from
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_const_cast_from(boost::intrusive::detail::true_, const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer priv_const_cast_from(boost::intrusive::detail::true_, const UPtr &uptr) BOOST_NOEXCEPT
{ return Ptr::const_cast_from(uptr); }
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_const_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer priv_const_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) BOOST_NOEXCEPT
{ return uptr ? pointer_to(const_cast<element_type&>(*uptr)) : pointer(); }
//priv_dynamic_cast_from
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_dynamic_cast_from(boost::intrusive::detail::true_, const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer priv_dynamic_cast_from(boost::intrusive::detail::true_, const UPtr &uptr) BOOST_NOEXCEPT
{ return Ptr::dynamic_cast_from(uptr); }
template<class UPtr>
- BOOST_INTRUSIVE_FORCEINLINE static pointer priv_dynamic_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) BOOST_NOEXCEPT
+ inline static pointer priv_dynamic_cast_from(boost::intrusive::detail::false_, const UPtr &uptr) BOOST_NOEXCEPT
{ return uptr ? pointer_to(dynamic_cast<element_type&>(*uptr)) : pointer(); }
///@endcond
};
@@ -296,25 +296,25 @@ struct pointer_traits<T*>
//! <b>Returns</b>: addressof(r)
//!
- BOOST_INTRUSIVE_FORCEINLINE static pointer pointer_to(reference r) BOOST_NOEXCEPT
+ inline static pointer pointer_to(reference r) BOOST_NOEXCEPT
{ return boost::intrusive::detail::addressof(r); }
//! <b>Returns</b>: static_cast<pointer>(uptr)
//!
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE static pointer static_cast_from(U *uptr) BOOST_NOEXCEPT
+ inline static pointer static_cast_from(U *uptr) BOOST_NOEXCEPT
{ return static_cast<pointer>(uptr); }
//! <b>Returns</b>: const_cast<pointer>(uptr)
//!
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE static pointer const_cast_from(U *uptr) BOOST_NOEXCEPT
+ inline static pointer const_cast_from(U *uptr) BOOST_NOEXCEPT
{ return const_cast<pointer>(uptr); }
//! <b>Returns</b>: dynamic_cast<pointer>(uptr)
//!
template<class U>
- BOOST_INTRUSIVE_FORCEINLINE static pointer dynamic_cast_from(U *uptr) BOOST_NOEXCEPT
+ inline static pointer dynamic_cast_from(U *uptr) BOOST_NOEXCEPT
{ return dynamic_cast<pointer>(uptr); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/rbtree.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/rbtree.hpp
index 922fce51b0..04fce1eecf 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/rbtree.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/rbtree.hpp
@@ -29,7 +29,6 @@
#include <boost/intrusive/link_mode.hpp>
#include <boost/move/utility_core.hpp>
-#include <boost/static_assert.hpp>
#if defined(BOOST_HAS_PRAGMA_ONCE)
# pragma once
@@ -536,48 +535,48 @@ class rbtree
typedef typename Base::const_reverse_iterator const_reverse_iterator;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
- BOOST_INTRUSIVE_FORCEINLINE rbtree()
+ inline rbtree()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit rbtree( const key_compare &cmp, const value_traits &v_traits = value_traits())
+ inline explicit rbtree( const key_compare &cmp, const value_traits &v_traits = value_traits())
: Base(cmp, v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE rbtree( bool unique, Iterator b, Iterator e
+ inline rbtree( bool unique, Iterator b, Iterator e
, const key_compare &cmp = key_compare()
, const value_traits &v_traits = value_traits())
: Base(unique, b, e, cmp, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE rbtree(BOOST_RV_REF(rbtree) x)
+ inline rbtree(BOOST_RV_REF(rbtree) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE rbtree& operator=(BOOST_RV_REF(rbtree) x)
+ inline rbtree& operator=(BOOST_RV_REF(rbtree) x)
{ return static_cast<rbtree &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const rbtree &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const rbtree &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(rbtree) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(rbtree) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static rbtree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static rbtree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<rbtree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const rbtree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const rbtree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const rbtree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static rbtree &container_from_iterator(iterator it) BOOST_NOEXCEPT
+ inline static rbtree &container_from_iterator(iterator it) BOOST_NOEXCEPT
{ return static_cast<rbtree &>(Base::container_from_iterator(it)); }
- BOOST_INTRUSIVE_FORCEINLINE static const rbtree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
+ inline static const rbtree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
{ return static_cast<const rbtree &>(Base::container_from_iterator(it)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree.hpp
index 9e687da10f..aaee1651c1 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree.hpp
@@ -21,7 +21,6 @@
#include <boost/intrusive/detail/config_begin.hpp>
#include <boost/intrusive/intrusive_fwd.hpp>
#include <boost/intrusive/detail/assert.hpp>
-#include <boost/static_assert.hpp>
#include <boost/intrusive/bs_set_hook.hpp>
#include <boost/intrusive/bstree.hpp>
#include <boost/intrusive/detail/tree_node.hpp>
@@ -275,7 +274,7 @@ class sgtree_impl
typedef typename alpha_traits::multiply_by_alpha_t multiply_by_alpha_t;
BOOST_MOVABLE_BUT_NOT_COPYABLE(sgtree_impl)
- BOOST_STATIC_ASSERT(((int)value_traits::link_mode != (int)auto_unlink));
+ BOOST_INTRUSIVE_STATIC_ASSERT(((int)value_traits::link_mode != (int)auto_unlink));
enum { safemode_or_autounlink =
(int)value_traits::link_mode == (int)auto_unlink ||
@@ -914,7 +913,7 @@ class sgtree_impl
{
//The alpha factor CAN't be changed if the fixed, floating operation-less
//1/sqrt(2) alpha factor option is activated
- BOOST_STATIC_ASSERT((floating_point));
+ BOOST_INTRUSIVE_STATIC_ASSERT((floating_point));
BOOST_INTRUSIVE_INVARIANT_ASSERT((new_alpha > 0.5f && new_alpha < 1.0f));
if(new_alpha >= 0.5f && new_alpha < 1.0f){
float old_alpha = this->get_alpha_traits().get_alpha();
@@ -1018,48 +1017,48 @@ class sgtree
typedef typename Base::const_reverse_iterator const_reverse_iterator;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
- BOOST_INTRUSIVE_FORCEINLINE sgtree()
+ inline sgtree()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit sgtree(const key_compare &cmp, const value_traits &v_traits = value_traits())
+ inline explicit sgtree(const key_compare &cmp, const value_traits &v_traits = value_traits())
: Base(cmp, v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE sgtree( bool unique, Iterator b, Iterator e
+ inline sgtree( bool unique, Iterator b, Iterator e
, const key_compare &cmp = key_compare()
, const value_traits &v_traits = value_traits())
: Base(unique, b, e, cmp, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE sgtree(BOOST_RV_REF(sgtree) x)
+ inline sgtree(BOOST_RV_REF(sgtree) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE sgtree& operator=(BOOST_RV_REF(sgtree) x)
+ inline sgtree& operator=(BOOST_RV_REF(sgtree) x)
{ return static_cast<sgtree &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const sgtree &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const sgtree &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(sgtree) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(sgtree) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static sgtree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static sgtree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<sgtree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const sgtree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const sgtree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const sgtree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static sgtree &container_from_iterator(iterator it) BOOST_NOEXCEPT
+ inline static sgtree &container_from_iterator(iterator it) BOOST_NOEXCEPT
{ return static_cast<sgtree &>(Base::container_from_iterator(it)); }
- BOOST_INTRUSIVE_FORCEINLINE static const sgtree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
+ inline static const sgtree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
{ return static_cast<const sgtree &>(Base::container_from_iterator(it)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree_algorithms.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree_algorithms.hpp
index 726dbb9970..ea0d2c54bd 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree_algorithms.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/sgtree_algorithms.hpp
@@ -287,7 +287,7 @@ class sgtree_algorithms
//! @copydoc ::boost::intrusive::bstree_algorithms::insert_unique_commit(node_ptr,node_ptr,const insert_commit_data&)
template<class H_Alpha>
- BOOST_INTRUSIVE_FORCEINLINE static void insert_unique_commit
+ inline static void insert_unique_commit
(node_ptr header, node_ptr new_value, const insert_commit_data &commit_data
,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
{ return insert_commit(header, new_value, commit_data, tree_size, h_alpha, max_tree_size); }
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/slist.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/slist.hpp
index 7319bf3132..f39e7dfc2c 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/slist.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/slist.hpp
@@ -41,7 +41,6 @@
#include <boost/intrusive/detail/node_cloner_disposer.hpp>
#include <boost/move/utility_core.hpp>
-#include <boost/static_assert.hpp>
#include <cstddef> //std::size_t
@@ -166,53 +165,53 @@ class slist_impl
static const bool safemode_or_autounlink = is_safe_autounlink<value_traits::link_mode>::value;
//Constant-time size is incompatible with auto-unlink hooks!
- BOOST_STATIC_ASSERT(!(constant_time_size && ((int)value_traits::link_mode == (int)auto_unlink)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(!(constant_time_size && ((int)value_traits::link_mode == (int)auto_unlink)));
//Linear singly linked lists are incompatible with auto-unlink hooks!
- BOOST_STATIC_ASSERT(!(linear && ((int)value_traits::link_mode == (int)auto_unlink)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(!(linear && ((int)value_traits::link_mode == (int)auto_unlink)));
//A list with cached last node is incompatible with auto-unlink hooks!
- BOOST_STATIC_ASSERT(!(cache_last && ((int)value_traits::link_mode == (int)auto_unlink)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(!(cache_last && ((int)value_traits::link_mode == (int)auto_unlink)));
- BOOST_INTRUSIVE_FORCEINLINE node_ptr get_end_node()
+ inline node_ptr get_end_node()
{ return node_algorithms::end_node(this->get_root_node()); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_end_node() const
+ inline const_node_ptr get_end_node() const
{ return node_algorithms::end_node(this->get_root_node()); }
- BOOST_INTRUSIVE_FORCEINLINE node_ptr get_root_node()
+ inline node_ptr get_root_node()
{ return data_.root_plus_size_.header_holder_.get_node(); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_root_node() const
+ inline const_node_ptr get_root_node() const
{ return data_.root_plus_size_.header_holder_.get_node(); }
- BOOST_INTRUSIVE_FORCEINLINE node_ptr get_last_node()
+ inline node_ptr get_last_node()
{ return this->get_last_node(detail::bool_<cache_last>()); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_last_node() const
+ inline const_node_ptr get_last_node() const
{ return this->get_last_node(detail::bool_<cache_last>()); }
- BOOST_INTRUSIVE_FORCEINLINE void set_last_node(node_ptr n)
+ inline void set_last_node(node_ptr n)
{ return this->set_last_node(n, detail::bool_<cache_last>()); }
- BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_node(detail::bool_<false>)
+ inline static node_ptr get_last_node(detail::bool_<false>)
{
//This function shall not be used if cache_last is not true
BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last);
return node_ptr();
}
- BOOST_INTRUSIVE_FORCEINLINE static void set_last_node(node_ptr , detail::bool_<false>)
+ inline static void set_last_node(node_ptr , detail::bool_<false>)
{
//This function shall not be used if cache_last is not true
BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last);
}
- BOOST_INTRUSIVE_FORCEINLINE node_ptr get_last_node(detail::bool_<true>)
+ inline node_ptr get_last_node(detail::bool_<true>)
{ return node_ptr(data_.root_plus_size_.last_); }
- BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_last_node(detail::bool_<true>) const
+ inline const_node_ptr get_last_node(detail::bool_<true>) const
{ return const_node_ptr(data_.root_plus_size_.last_); }
- BOOST_INTRUSIVE_FORCEINLINE void set_last_node(node_ptr n, detail::bool_<true>)
+ inline void set_last_node(node_ptr n, detail::bool_<true>)
{ data_.root_plus_size_.last_ = n; }
void set_default_constructed_state()
@@ -241,22 +240,22 @@ class slist_impl
root_plus_size root_plus_size_;
} data_;
- BOOST_INTRUSIVE_FORCEINLINE size_traits &priv_size_traits()
+ inline size_traits &priv_size_traits()
{ return data_.root_plus_size_; }
- BOOST_INTRUSIVE_FORCEINLINE const size_traits &priv_size_traits() const
+ inline const size_traits &priv_size_traits() const
{ return data_.root_plus_size_; }
- BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const
+ inline const value_traits &priv_value_traits() const
{ return data_; }
- BOOST_INTRUSIVE_FORCEINLINE value_traits &priv_value_traits()
+ inline value_traits &priv_value_traits()
{ return data_; }
typedef typename boost::intrusive::value_traits_pointers
<ValueTraits>::const_value_traits_ptr const_value_traits_ptr;
- BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const
+ inline const_value_traits_ptr priv_value_traits_ptr() const
{ return pointer_traits<const_value_traits_ptr>::pointer_to(this->priv_value_traits()); }
/// @endcond
@@ -449,7 +448,7 @@ class slist_impl
//! This function is only available is cache_last<> is true.
void push_back(reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((cache_last));
+ BOOST_INTRUSIVE_STATIC_ASSERT((cache_last));
node_ptr n = priv_value_traits().to_node_ptr(value);
BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::inited(n));
node_algorithms::link_after(this->get_last_node(), n);
@@ -501,7 +500,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE reference front() BOOST_NOEXCEPT
+ inline reference front() BOOST_NOEXCEPT
{ return *this->priv_value_traits().to_value_ptr(node_traits::get_next(this->get_root_node())); }
//! <b>Effects</b>: Returns a const_reference to the first element of the list.
@@ -509,7 +508,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_reference front() const BOOST_NOEXCEPT
+ inline const_reference front() const BOOST_NOEXCEPT
{ return *this->priv_value_traits().to_value_ptr(detail::uncast(node_traits::get_next(this->get_root_node()))); }
//! <b>Effects</b>: Returns a reference to the last element of the list.
@@ -522,7 +521,7 @@ class slist_impl
//! This function is only available is cache_last<> is true.
reference back() BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((cache_last));
+ BOOST_INTRUSIVE_STATIC_ASSERT((cache_last));
return *this->priv_value_traits().to_value_ptr(this->get_last_node());
}
@@ -534,9 +533,9 @@ class slist_impl
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
//! This function is only available is cache_last<> is true.
- BOOST_INTRUSIVE_FORCEINLINE const_reference back() const BOOST_NOEXCEPT
+ inline const_reference back() const BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((cache_last));
+ BOOST_INTRUSIVE_STATIC_ASSERT((cache_last));
return *this->priv_value_traits().to_value_ptr(this->get_last_node());
}
@@ -545,7 +544,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE iterator begin() BOOST_NOEXCEPT
+ inline iterator begin() BOOST_NOEXCEPT
{ return iterator (node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
@@ -553,7 +552,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const BOOST_NOEXCEPT
+ inline const_iterator begin() const BOOST_NOEXCEPT
{ return const_iterator (node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
@@ -561,7 +560,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const BOOST_NOEXCEPT
+ inline const_iterator cbegin() const BOOST_NOEXCEPT
{ return const_iterator(node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns an iterator to the end of the list.
@@ -569,7 +568,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE iterator end() BOOST_NOEXCEPT
+ inline iterator end() BOOST_NOEXCEPT
{ return iterator(this->get_end_node(), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a const_iterator to the end of the list.
@@ -577,7 +576,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const BOOST_NOEXCEPT
+ inline const_iterator end() const BOOST_NOEXCEPT
{ return const_iterator(detail::uncast(this->get_end_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns a const_iterator to the end of the list.
@@ -585,7 +584,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const BOOST_NOEXCEPT
+ inline const_iterator cend() const BOOST_NOEXCEPT
{ return this->end(); }
//! <b>Effects</b>: Returns an iterator that points to a position
@@ -594,7 +593,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE iterator before_begin() BOOST_NOEXCEPT
+ inline iterator before_begin() BOOST_NOEXCEPT
{ return iterator(this->get_root_node(), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns an iterator that points to a position
@@ -603,7 +602,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator before_begin() const BOOST_NOEXCEPT
+ inline const_iterator before_begin() const BOOST_NOEXCEPT
{ return const_iterator(detail::uncast(this->get_root_node()), this->priv_value_traits_ptr()); }
//! <b>Effects</b>: Returns an iterator that points to a position
@@ -612,7 +611,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator cbefore_begin() const BOOST_NOEXCEPT
+ inline const_iterator cbefore_begin() const BOOST_NOEXCEPT
{ return this->before_begin(); }
//! <b>Effects</b>: Returns an iterator to the last element contained in the list.
@@ -622,7 +621,7 @@ class slist_impl
//! <b>Complexity</b>: Constant.
//!
//! <b>Note</b>: This function is present only if cached_last<> option is true.
- BOOST_INTRUSIVE_FORCEINLINE iterator last() BOOST_NOEXCEPT
+ inline iterator last() BOOST_NOEXCEPT
{
//This function shall not be used if cache_last is not true
BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last);
@@ -636,7 +635,7 @@ class slist_impl
//! <b>Complexity</b>: Constant.
//!
//! <b>Note</b>: This function is present only if cached_last<> option is true.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator last() const BOOST_NOEXCEPT
+ inline const_iterator last() const BOOST_NOEXCEPT
{
//This function shall not be used if cache_last is not true
BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last);
@@ -650,7 +649,7 @@ class slist_impl
//! <b>Complexity</b>: Constant.
//!
//! <b>Note</b>: This function is present only if cached_last<> option is true.
- BOOST_INTRUSIVE_FORCEINLINE const_iterator clast() const BOOST_NOEXCEPT
+ inline const_iterator clast() const BOOST_NOEXCEPT
{ return const_iterator(this->get_last_node(), this->priv_value_traits_ptr()); }
//! <b>Precondition</b>: end_iterator must be a valid end iterator
@@ -661,7 +660,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE static slist_impl &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static slist_impl &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return slist_impl::priv_container_from_end_iterator(end_iterator); }
//! <b>Precondition</b>: end_iterator must be a valid end const_iterator
@@ -672,7 +671,7 @@ class slist_impl
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant.
- BOOST_INTRUSIVE_FORCEINLINE static const slist_impl &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const slist_impl &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return slist_impl::priv_container_from_end_iterator(end_iterator); }
//! <b>Effects</b>: Returns the number of the elements contained in the list.
@@ -683,7 +682,7 @@ class slist_impl
//! if constant_time_size is false. Constant time otherwise.
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
- BOOST_INTRUSIVE_FORCEINLINE size_type size() const BOOST_NOEXCEPT
+ inline size_type size() const BOOST_NOEXCEPT
{
BOOST_IF_CONSTEXPR(constant_time_size)
return this->priv_size_traits().get_size();
@@ -698,7 +697,7 @@ class slist_impl
//! <b>Complexity</b>: Constant.
//!
//! <b>Note</b>: Does not affect the validity of iterators and references.
- BOOST_INTRUSIVE_FORCEINLINE bool empty() const BOOST_NOEXCEPT
+ inline bool empty() const BOOST_NOEXCEPT
{ return node_algorithms::is_empty(this->get_root_node()); }
//! <b>Effects</b>: Swaps the elements of x and *this.
@@ -1061,7 +1060,7 @@ class slist_impl
static iterator s_insert_after(const_iterator const prev_p, reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT(((!cache_last)&&(!constant_time_size)&&(!stateful_value_traits)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(((!cache_last)&&(!constant_time_size)&&(!stateful_value_traits)));
node_ptr const n = value_traits::to_node_ptr(value);
BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::inited(n));
node_algorithms::link_after(prev_p.pointed_node(), n);
@@ -1071,7 +1070,7 @@ class slist_impl
template<class Disposer>
static iterator s_erase_after_and_dispose(const_iterator prev, Disposer disposer) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT(((!cache_last)&&(!constant_time_size)&&(!stateful_value_traits)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(((!cache_last)&&(!constant_time_size)&&(!stateful_value_traits)));
const_iterator it(prev);
++it;
node_ptr to_erase(it.pointed_node());
@@ -1087,7 +1086,7 @@ class slist_impl
template<class Disposer>
static iterator s_erase_after_and_dispose(const_iterator before_f, const_iterator l, Disposer disposer) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT(((!cache_last)&&(!constant_time_size)&&(!stateful_value_traits)));
+ BOOST_INTRUSIVE_STATIC_ASSERT(((!cache_last)&&(!constant_time_size)&&(!stateful_value_traits)));
node_ptr bfp(before_f.pointed_node()), lp(l.pointed_node());
node_ptr fp(node_traits::get_next(bfp));
node_algorithms::unlink_after(bfp, lp);
@@ -1754,7 +1753,7 @@ class slist_impl
//! is stateless.
static iterator s_iterator_to(reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!stateful_value_traits));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!stateful_value_traits));
return iterator (value_traits::to_node_ptr(value), const_value_traits_ptr());
}
@@ -1771,7 +1770,7 @@ class slist_impl
//! is stateless.
static const_iterator s_iterator_to(const_reference value) BOOST_NOEXCEPT
{
- BOOST_STATIC_ASSERT((!stateful_value_traits));
+ BOOST_INTRUSIVE_STATIC_ASSERT((!stateful_value_traits));
reference r =*detail::uncast(pointer_traits<const_pointer>::pointer_to(value));
return const_iterator(value_traits::to_node_ptr(r), const_value_traits_ptr());
}
@@ -2112,8 +2111,8 @@ class slist_impl
{
//Obtaining the container from the end iterator is not possible with linear
//singly linked lists (because "end" is represented by the null pointer)
- BOOST_STATIC_ASSERT(!linear);
- BOOST_STATIC_ASSERT((has_container_from_iterator));
+ BOOST_INTRUSIVE_STATIC_ASSERT(!linear);
+ BOOST_INTRUSIVE_STATIC_ASSERT((has_container_from_iterator));
node_ptr p = end_iterator.pointed_node();
header_holder_type* h = header_holder_type::get_holder(p);
header_holder_plus_last_t* hpl = detail::parent_from_member< header_holder_plus_last_t, header_holder_type>
@@ -2185,7 +2184,7 @@ class slist
#endif
>::type Base;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename Base::value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename Base::value_traits::value_type, T>::value));
BOOST_MOVABLE_BUT_NOT_COPYABLE(slist)
public:
@@ -2195,45 +2194,45 @@ class slist
typedef typename Base::size_type size_type;
typedef typename Base::node_ptr node_ptr;
- BOOST_INTRUSIVE_FORCEINLINE slist()
+ inline slist()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit slist(const value_traits &v_traits)
+ inline explicit slist(const value_traits &v_traits)
: Base(v_traits)
{}
struct incorporate_t{};
- BOOST_INTRUSIVE_FORCEINLINE slist( node_ptr f, node_ptr before_l
+ inline slist( node_ptr f, node_ptr before_l
, size_type n, const value_traits &v_traits = value_traits())
: Base(f, before_l, n, v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE slist(Iterator b, Iterator e, const value_traits &v_traits = value_traits())
+ inline slist(Iterator b, Iterator e, const value_traits &v_traits = value_traits())
: Base(b, e, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE slist(BOOST_RV_REF(slist) x)
+ inline slist(BOOST_RV_REF(slist) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE slist& operator=(BOOST_RV_REF(slist) x)
+ inline slist& operator=(BOOST_RV_REF(slist) x)
{ return static_cast<slist &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const slist &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const slist &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(slist) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(slist) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static slist &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static slist &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<slist &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const slist &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const slist &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const slist &>(Base::container_from_end_iterator(end_iterator)); }
};
diff --git a/contrib/restricted/boost/intrusive/include/boost/intrusive/splaytree.hpp b/contrib/restricted/boost/intrusive/include/boost/intrusive/splaytree.hpp
index 44e5c78670..e25647c6ab 100644
--- a/contrib/restricted/boost/intrusive/include/boost/intrusive/splaytree.hpp
+++ b/contrib/restricted/boost/intrusive/include/boost/intrusive/splaytree.hpp
@@ -18,7 +18,6 @@
#include <boost/intrusive/detail/minimal_less_equal_header.hpp>
#include <boost/intrusive/detail/minimal_pair_header.hpp> //std::pair
-#include <boost/static_assert.hpp>
#include <boost/intrusive/bstree.hpp>
#include <boost/intrusive/detail/tree_node.hpp>
#include <boost/intrusive/detail/mpl.hpp>
@@ -611,48 +610,48 @@ class splaytree
typedef typename Base::const_reverse_iterator const_reverse_iterator;
//Assert if passed value traits are compatible with the type
- BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+ BOOST_INTRUSIVE_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
- BOOST_INTRUSIVE_FORCEINLINE splaytree()
+ inline splaytree()
: Base()
{}
- BOOST_INTRUSIVE_FORCEINLINE explicit splaytree( const key_compare &cmp, const value_traits &v_traits = value_traits())
+ inline explicit splaytree( const key_compare &cmp, const value_traits &v_traits = value_traits())
: Base(cmp, v_traits)
{}
template<class Iterator>
- BOOST_INTRUSIVE_FORCEINLINE splaytree( bool unique, Iterator b, Iterator e
+ inline splaytree( bool unique, Iterator b, Iterator e
, const key_compare &cmp = key_compare()
, const value_traits &v_traits = value_traits())
: Base(unique, b, e, cmp, v_traits)
{}
- BOOST_INTRUSIVE_FORCEINLINE splaytree(BOOST_RV_REF(splaytree) x)
+ inline splaytree(BOOST_RV_REF(splaytree) x)
: Base(BOOST_MOVE_BASE(Base, x))
{}
- BOOST_INTRUSIVE_FORCEINLINE splaytree& operator=(BOOST_RV_REF(splaytree) x)
+ inline splaytree& operator=(BOOST_RV_REF(splaytree) x)
{ return static_cast<splaytree &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(const splaytree &src, Cloner cloner, Disposer disposer)
+ inline void clone_from(const splaytree &src, Cloner cloner, Disposer disposer)
{ Base::clone_from(src, cloner, disposer); }
template <class Cloner, class Disposer>
- BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(splaytree) src, Cloner cloner, Disposer disposer)
+ inline void clone_from(BOOST_RV_REF(splaytree) src, Cloner cloner, Disposer disposer)
{ Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
- BOOST_INTRUSIVE_FORCEINLINE static splaytree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
+ inline static splaytree &container_from_end_iterator(iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<splaytree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static const splaytree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
+ inline static const splaytree &container_from_end_iterator(const_iterator end_iterator) BOOST_NOEXCEPT
{ return static_cast<const splaytree &>(Base::container_from_end_iterator(end_iterator)); }
- BOOST_INTRUSIVE_FORCEINLINE static splaytree &container_from_iterator(iterator it) BOOST_NOEXCEPT
+ inline static splaytree &container_from_iterator(iterator it) BOOST_NOEXCEPT
{ return static_cast<splaytree &>(Base::container_from_iterator(it)); }
- BOOST_INTRUSIVE_FORCEINLINE static const splaytree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
+ inline static const splaytree &container_from_iterator(const_iterator it) BOOST_NOEXCEPT
{ return static_cast<const splaytree &>(Base::container_from_iterator(it)); }
};
diff --git a/contrib/restricted/boost/intrusive/ya.make b/contrib/restricted/boost/intrusive/ya.make
index 0643da6a39..df73bcb529 100644
--- a/contrib/restricted/boost/intrusive/ya.make
+++ b/contrib/restricted/boost/intrusive/ya.make
@@ -9,16 +9,14 @@ LICENSE(
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-VERSION(1.84.0)
+VERSION(1.85.0)
-ORIGINAL_SOURCE(https://github.com/boostorg/intrusive/archive/boost-1.84.0.tar.gz)
+ORIGINAL_SOURCE(https://github.com/boostorg/intrusive/archive/boost-1.85.0.tar.gz)
PEERDIR(
contrib/restricted/boost/assert
contrib/restricted/boost/config
- contrib/restricted/boost/container_hash
contrib/restricted/boost/move
- contrib/restricted/boost/static_assert
)
ADDINCL(
diff --git a/contrib/restricted/google/benchmark/README.md b/contrib/restricted/google/benchmark/README.md
index a5e5d392d8..8e5428f995 100644
--- a/contrib/restricted/google/benchmark/README.md
+++ b/contrib/restricted/google/benchmark/README.md
@@ -50,15 +50,13 @@ IRC channels:
## Requirements
-The library can be used with C++03. However, it requires C++11 to build,
+The library can be used with C++03. However, it requires C++14 to build,
including compiler and standard library support.
-The following minimum versions are required to build the library:
+_See [dependencies.md](docs/dependencies.md) for more details regarding supported
+compilers and standards._
-* GCC 4.8
-* Clang 3.4
-* Visual Studio 14 2015
-* Intel 2015 Update 1
+If you have need for a particular compiler to be supported, patches are very welcome.
See [Platform-Specific Build Instructions](docs/platform_specific_build_instructions.md).
diff --git a/contrib/restricted/google/benchmark/include/benchmark/benchmark.h b/contrib/restricted/google/benchmark/include/benchmark/benchmark.h
index 869b32e378..c80105df55 100644
--- a/contrib/restricted/google/benchmark/include/benchmark/benchmark.h
+++ b/contrib/restricted/google/benchmark/include/benchmark/benchmark.h
@@ -416,6 +416,26 @@ class MemoryManager {
BENCHMARK_EXPORT
void RegisterMemoryManager(MemoryManager* memory_manager);
+// If a ProfilerManager is registered (via RegisterProfilerManager()), the
+// benchmark will be run an additional time under the profiler to collect and
+// report profile metrics for the run of the benchmark.
+class ProfilerManager {
+ public:
+ virtual ~ProfilerManager() {}
+
+ // This is called after `Setup()` code and right before the benchmark is run.
+ virtual void AfterSetupStart() = 0;
+
+ // This is called before `Teardown()` code and right after the benchmark
+ // completes.
+ virtual void BeforeTeardownStop() = 0;
+};
+
+// Register a ProfilerManager instance that will be used to collect and report
+// profile measurements for benchmark runs.
+BENCHMARK_EXPORT
+void RegisterProfilerManager(ProfilerManager* profiler_manager);
+
// Add a key-value pair to output as part of the context stanza in the report.
BENCHMARK_EXPORT
void AddCustomContext(const std::string& key, const std::string& value);
diff --git a/contrib/restricted/google/benchmark/src/benchmark.cc b/contrib/restricted/google/benchmark/src/benchmark.cc
index 337bb3faa7..374c5141c9 100644
--- a/contrib/restricted/google/benchmark/src/benchmark.cc
+++ b/contrib/restricted/google/benchmark/src/benchmark.cc
@@ -656,6 +656,10 @@ void RegisterMemoryManager(MemoryManager* manager) {
internal::memory_manager = manager;
}
+void RegisterProfilerManager(ProfilerManager* manager) {
+ internal::profiler_manager = manager;
+}
+
void AddCustomContext(const std::string& key, const std::string& value) {
if (internal::global_context == nullptr) {
internal::global_context = new std::map<std::string, std::string>();
diff --git a/contrib/restricted/google/benchmark/src/benchmark_runner.cc b/contrib/restricted/google/benchmark/src/benchmark_runner.cc
index 5714587196..f5032e94dd 100644
--- a/contrib/restricted/google/benchmark/src/benchmark_runner.cc
+++ b/contrib/restricted/google/benchmark/src/benchmark_runner.cc
@@ -62,6 +62,8 @@ namespace internal {
MemoryManager* memory_manager = nullptr;
+ProfilerManager* profiler_manager = nullptr;
+
namespace {
static constexpr IterationCount kMaxIterations = 1000000000000;
@@ -403,6 +405,41 @@ void BenchmarkRunner::RunWarmUp() {
}
}
+MemoryManager::Result* BenchmarkRunner::RunMemoryManager(
+ IterationCount memory_iterations) {
+ // TODO(vyng): Consider making BenchmarkReporter::Run::memory_result an
+ // optional so we don't have to own the Result here.
+ // Can't do it now due to cxx03.
+ memory_results.push_back(MemoryManager::Result());
+ MemoryManager::Result* memory_result = &memory_results.back();
+ memory_manager->Start();
+ std::unique_ptr<internal::ThreadManager> manager;
+ manager.reset(new internal::ThreadManager(1));
+ b.Setup();
+ RunInThread(&b, memory_iterations, 0, manager.get(),
+ perf_counters_measurement_ptr);
+ manager->WaitForAllThreads();
+ manager.reset();
+ b.Teardown();
+ memory_manager->Stop(*memory_result);
+ return memory_result;
+}
+
+void BenchmarkRunner::RunProfilerManager() {
+ // TODO: Provide a way to specify the number of iterations.
+ IterationCount profile_iterations = 1;
+ std::unique_ptr<internal::ThreadManager> manager;
+ manager.reset(new internal::ThreadManager(1));
+ b.Setup();
+ profiler_manager->AfterSetupStart();
+ RunInThread(&b, profile_iterations, 0, manager.get(),
+ /*perf_counters_measurement_ptr=*/nullptr);
+ manager->WaitForAllThreads();
+ profiler_manager->BeforeTeardownStop();
+ manager.reset();
+ b.Teardown();
+}
+
void BenchmarkRunner::DoOneRepetition() {
assert(HasRepeatsRemaining() && "Already done all repetitions?");
@@ -447,28 +484,18 @@ void BenchmarkRunner::DoOneRepetition() {
"then we should have accepted the current iteration run.");
}
- // Oh, one last thing, we need to also produce the 'memory measurements'..
+ // Produce memory measurements if requested.
MemoryManager::Result* memory_result = nullptr;
IterationCount memory_iterations = 0;
if (memory_manager != nullptr) {
- // TODO(vyng): Consider making BenchmarkReporter::Run::memory_result an
- // optional so we don't have to own the Result here.
- // Can't do it now due to cxx03.
- memory_results.push_back(MemoryManager::Result());
- memory_result = &memory_results.back();
// Only run a few iterations to reduce the impact of one-time
// allocations in benchmarks that are not properly managed.
memory_iterations = std::min<IterationCount>(16, iters);
- memory_manager->Start();
- std::unique_ptr<internal::ThreadManager> manager;
- manager.reset(new internal::ThreadManager(1));
- b.Setup();
- RunInThread(&b, memory_iterations, 0, manager.get(),
- perf_counters_measurement_ptr);
- manager->WaitForAllThreads();
- manager.reset();
- b.Teardown();
- memory_manager->Stop(*memory_result);
+ memory_result = RunMemoryManager(memory_iterations);
+ }
+
+ if (profiler_manager != nullptr) {
+ RunProfilerManager();
}
// Ok, now actually report.
diff --git a/contrib/restricted/google/benchmark/src/benchmark_runner.h b/contrib/restricted/google/benchmark/src/benchmark_runner.h
index db2fa04396..cd34d2d5bb 100644
--- a/contrib/restricted/google/benchmark/src/benchmark_runner.h
+++ b/contrib/restricted/google/benchmark/src/benchmark_runner.h
@@ -35,6 +35,7 @@ BM_DECLARE_string(benchmark_perf_counters);
namespace internal {
extern MemoryManager* memory_manager;
+extern ProfilerManager* profiler_manager;
struct RunResults {
std::vector<BenchmarkReporter::Run> non_aggregates;
@@ -113,6 +114,10 @@ class BenchmarkRunner {
};
IterationResults DoNIterations();
+ MemoryManager::Result* RunMemoryManager(IterationCount memory_iterations);
+
+ void RunProfilerManager();
+
IterationCount PredictNumItersNeeded(const IterationResults& i) const;
bool ShouldReportIterationResults(const IterationResults& i) const;
diff --git a/contrib/restricted/google/benchmark/src/cycleclock.h b/contrib/restricted/google/benchmark/src/cycleclock.h
index 36aa8e3c76..0c7f0408a4 100644
--- a/contrib/restricted/google/benchmark/src/cycleclock.h
+++ b/contrib/restricted/google/benchmark/src/cycleclock.h
@@ -205,11 +205,12 @@ inline BENCHMARK_ALWAYS_INLINE int64_t Now() {
"sub %0, zero, %0\n"
"and %1, %1, %0\n"
: "=r"(cycles_hi0), "=r"(cycles_lo), "=r"(cycles_hi1));
- return (static_cast<uint64_t>(cycles_hi1) << 32) | cycles_lo;
+ return static_cast<int64_t>((static_cast<uint64_t>(cycles_hi1) << 32) |
+ cycles_lo);
#else
uint64_t cycles;
asm volatile("rdtime %0" : "=r"(cycles));
- return cycles;
+ return static_cast<int64_t>(cycles);
#endif
#elif defined(__e2k__) || defined(__elbrus__)
struct timeval tv;
diff --git a/contrib/restricted/google/benchmark/src/perf_counters.cc b/contrib/restricted/google/benchmark/src/perf_counters.cc
index 3b204fd1cd..17f7c3200f 100644
--- a/contrib/restricted/google/benchmark/src/perf_counters.cc
+++ b/contrib/restricted/google/benchmark/src/perf_counters.cc
@@ -157,7 +157,8 @@ PerfCounters PerfCounters::Create(
attr.exclude_hv = true;
// Read all counters in a group in one read.
- attr.read_format = PERF_FORMAT_GROUP;
+ attr.read_format = PERF_FORMAT_GROUP; //| PERF_FORMAT_TOTAL_TIME_ENABLED |
+ // PERF_FORMAT_TOTAL_TIME_RUNNING;
int id = -1;
while (id < 0) {
diff --git a/contrib/restricted/google/benchmark/src/sysinfo.cc b/contrib/restricted/google/benchmark/src/sysinfo.cc
index 17746e124f..617d276e47 100644
--- a/contrib/restricted/google/benchmark/src/sysinfo.cc
+++ b/contrib/restricted/google/benchmark/src/sysinfo.cc
@@ -508,7 +508,8 @@ int GetNumCPUsImpl() {
int max_id = -1;
std::ifstream f("/proc/cpuinfo");
if (!f.is_open()) {
- PrintErrorAndDie("Failed to open /proc/cpuinfo");
+ std::cerr << "Failed to open /proc/cpuinfo\n";
+ return -1;
}
#if defined(__alpha__)
const std::string Key = "cpus detected";
@@ -557,9 +558,8 @@ int GetNumCPUsImpl() {
int GetNumCPUs() {
const int num_cpus = GetNumCPUsImpl();
if (num_cpus < 1) {
- PrintErrorAndDie(
- "Unable to extract number of CPUs. If your platform uses "
- "/proc/cpuinfo, custom support may need to be added.");
+ std::cerr << "Unable to extract number of CPUs. If your platform uses "
+ "/proc/cpuinfo, custom support may need to be added.\n";
}
return num_cpus;
}
diff --git a/contrib/restricted/google/benchmark/src/timers.cc b/contrib/restricted/google/benchmark/src/timers.cc
index c392649715..a0543fe3d1 100644
--- a/contrib/restricted/google/benchmark/src/timers.cc
+++ b/contrib/restricted/google/benchmark/src/timers.cc
@@ -126,8 +126,12 @@ double ProcessCPUUsage() {
return MakeTime(kernel_time, user_time);
DiagnoseAndExit("GetProccessTimes() failed");
#elif defined(BENCHMARK_OS_QURT)
+ // Note that qurt_timer_get_ticks() is no longer documented as of SDK 5.3.0,
+ // and doesn't appear to work on at least some devices (eg Samsung S22),
+ // so let's use the actually-documented and apparently-equivalent
+ // qurt_sysclock_get_hw_ticks() call instead.
return static_cast<double>(
- qurt_timer_timetick_to_us(qurt_timer_get_ticks())) *
+ qurt_timer_timetick_to_us(qurt_sysclock_get_hw_ticks())) *
1.0e-6;
#elif defined(BENCHMARK_OS_EMSCRIPTEN)
// clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...) returns 0 on Emscripten.
@@ -160,8 +164,12 @@ double ThreadCPUUsage() {
&user_time);
return MakeTime(kernel_time, user_time);
#elif defined(BENCHMARK_OS_QURT)
+ // Note that qurt_timer_get_ticks() is no longer documented as of SDK 5.3.0,
+ // and doesn't appear to work on at least some devices (eg Samsung S22),
+ // so let's use the actually-documented and apparently-equivalent
+ // qurt_sysclock_get_hw_ticks() call instead.
return static_cast<double>(
- qurt_timer_timetick_to_us(qurt_timer_get_ticks())) *
+ qurt_timer_timetick_to_us(qurt_sysclock_get_hw_ticks())) *
1.0e-6;
#elif defined(BENCHMARK_OS_MACOSX)
// FIXME We want to use clock_gettime, but its not available in MacOS 10.11.
diff --git a/contrib/restricted/google/benchmark/src/timers.h b/contrib/restricted/google/benchmark/src/timers.h
index 65606ccd93..690086b36c 100644
--- a/contrib/restricted/google/benchmark/src/timers.h
+++ b/contrib/restricted/google/benchmark/src/timers.h
@@ -15,6 +15,29 @@ double ChildrenCPUUsage();
// Return the CPU usage of the current thread
double ThreadCPUUsage();
+#if defined(BENCHMARK_OS_QURT)
+
+// std::chrono::now() can return 0 on some Hexagon devices;
+// this reads the value of a 56-bit, 19.2MHz hardware counter
+// and converts it to seconds. Unlike std::chrono, this doesn't
+// return an absolute time, but since ChronoClockNow() is only used
+// to compute elapsed time, this shouldn't matter.
+struct QuRTClock {
+ typedef uint64_t rep;
+ typedef std::ratio<1, 19200000> period;
+ typedef std::chrono::duration<rep, period> duration;
+ typedef std::chrono::time_point<QuRTClock> time_point;
+ static const bool is_steady = false;
+
+ static time_point now() {
+ unsigned long long count;
+ asm volatile(" %0 = c31:30 " : "=r"(count));
+ return time_point(static_cast<duration>(count));
+ }
+};
+
+#else
+
#if defined(HAVE_STEADY_CLOCK)
template <bool HighResIsSteady = std::chrono::high_resolution_clock::is_steady>
struct ChooseSteadyClock {
@@ -25,10 +48,14 @@ template <>
struct ChooseSteadyClock<false> {
typedef std::chrono::steady_clock type;
};
+#endif // HAVE_STEADY_CLOCK
+
#endif
struct ChooseClockType {
-#if defined(HAVE_STEADY_CLOCK)
+#if defined(BENCHMARK_OS_QURT)
+ typedef QuRTClock type;
+#elif defined(HAVE_STEADY_CLOCK)
typedef ChooseSteadyClock<>::type type;
#else
typedef std::chrono::high_resolution_clock type;
diff --git a/contrib/restricted/google/benchmark/tools/compare/ya.make b/contrib/restricted/google/benchmark/tools/compare/ya.make
index d1005f244d..74e7cb446f 100644
--- a/contrib/restricted/google/benchmark/tools/compare/ya.make
+++ b/contrib/restricted/google/benchmark/tools/compare/ya.make
@@ -4,9 +4,9 @@ PY3_PROGRAM()
WITHOUT_LICENSE_TEXTS()
-VERSION(1.8.4)
+VERSION(1.8.5)
-ORIGINAL_SOURCE(https://github.com/google/benchmark/archive/v1.8.4.tar.gz)
+ORIGINAL_SOURCE(https://github.com/google/benchmark/archive/v1.8.5.tar.gz)
LICENSE(Apache-2.0)
diff --git a/contrib/restricted/google/benchmark/ya.make b/contrib/restricted/google/benchmark/ya.make
index 2ab39c9b34..1293df88d3 100644
--- a/contrib/restricted/google/benchmark/ya.make
+++ b/contrib/restricted/google/benchmark/ya.make
@@ -2,9 +2,9 @@
LIBRARY()
-VERSION(1.8.4)
+VERSION(1.8.5)
-ORIGINAL_SOURCE(https://github.com/google/benchmark/archive/v1.8.4.tar.gz)
+ORIGINAL_SOURCE(https://github.com/google/benchmark/archive/v1.8.5.tar.gz)
LICENSE(Apache-2.0)
@@ -21,7 +21,7 @@ NO_UTIL()
CFLAGS(
GLOBAL -DBENCHMARK_STATIC_DEFINE
- -DBENCHMARK_VERSION=\"v0.0.0\"
+ -DBENCHMARK_VERSION=\"v1.8.5\"
-DHAVE_POSIX_REGEX
-DHAVE_PTHREAD_AFFINITY
-DHAVE_STD_REGEX
diff --git a/library/cpp/accurate_accumulate/benchmark/metrics/ya.make b/library/cpp/accurate_accumulate/benchmark/metrics/ya.make
index 5c7ccf9197..b8334316e7 100644
--- a/library/cpp/accurate_accumulate/benchmark/metrics/ya.make
+++ b/library/cpp/accurate_accumulate/benchmark/metrics/ya.make
@@ -1,3 +1,4 @@
+
PY2TEST()
SIZE(LARGE)
diff --git a/library/cpp/accurate_accumulate/benchmark/ya.make b/library/cpp/accurate_accumulate/benchmark/ya.make
index 3dc032e7ee..614332bafa 100644
--- a/library/cpp/accurate_accumulate/benchmark/ya.make
+++ b/library/cpp/accurate_accumulate/benchmark/ya.make
@@ -1,3 +1,4 @@
+
Y_BENCHMARK()
BENCHMARK_OPTS(--budget=10)
diff --git a/library/cpp/accurate_accumulate/ya.make b/library/cpp/accurate_accumulate/ya.make
index b4bca26958..9e69d8ba13 100644
--- a/library/cpp/accurate_accumulate/ya.make
+++ b/library/cpp/accurate_accumulate/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
accurate_accumulate.h
accurate_accumulate.cpp
diff --git a/library/cpp/balloc/setup/ya.make b/library/cpp/balloc/setup/ya.make
index 90bb97ea28..6666ca00e6 100644
--- a/library/cpp/balloc/setup/ya.make
+++ b/library/cpp/balloc/setup/ya.make
@@ -2,6 +2,7 @@ LIBRARY()
NO_UTIL()
+
IF ("${YMAKE}" MATCHES "devtools")
CFLAGS(-DYMAKE=1)
ENDIF()
diff --git a/library/cpp/binsaver/ut/ya.make b/library/cpp/binsaver/ut/ya.make
index de198b31a4..9a207536b4 100644
--- a/library/cpp/binsaver/ut/ya.make
+++ b/library/cpp/binsaver/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/binsaver)
+
SRCS(
binsaver_ut.cpp
)
diff --git a/library/cpp/binsaver/ut_util/ya.make b/library/cpp/binsaver/ut_util/ya.make
index 39b6c955b2..c83bc69730 100644
--- a/library/cpp/binsaver/ut_util/ya.make
+++ b/library/cpp/binsaver/ut_util/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
ut_util.cpp
)
diff --git a/library/cpp/binsaver/ya.make b/library/cpp/binsaver/ya.make
index ae26fa93c1..4c8344575d 100644
--- a/library/cpp/binsaver/ya.make
+++ b/library/cpp/binsaver/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
class_factory.h
bin_saver.cpp
diff --git a/library/cpp/bucket_quoter/ya.make b/library/cpp/bucket_quoter/ya.make
index d74141e39d..2ab24a0284 100644
--- a/library/cpp/bucket_quoter/ya.make
+++ b/library/cpp/bucket_quoter/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
bucket_quoter.cpp
)
diff --git a/library/cpp/case_insensitive_string/ut/ya.make b/library/cpp/case_insensitive_string/ut/ya.make
index 85db6ec468..1a3cfdc974 100644
--- a/library/cpp/case_insensitive_string/ut/ya.make
+++ b/library/cpp/case_insensitive_string/ut/ya.make
@@ -1,3 +1,4 @@
+
UNITTEST_FOR(library/cpp/case_insensitive_string)
SRCS(
diff --git a/library/cpp/case_insensitive_string/ya.make b/library/cpp/case_insensitive_string/ya.make
index b05f167118..c953de0fea 100644
--- a/library/cpp/case_insensitive_string/ya.make
+++ b/library/cpp/case_insensitive_string/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
SRCS(
diff --git a/library/cpp/codecs/float_huffman_bench/ya.make b/library/cpp/codecs/float_huffman_bench/ya.make
index cc1bf1c779..f6b0c3d27a 100644
--- a/library/cpp/codecs/float_huffman_bench/ya.make
+++ b/library/cpp/codecs/float_huffman_bench/ya.make
@@ -1,3 +1,4 @@
+
G_BENCHMARK()
SRCS(
diff --git a/library/cpp/codecs/greedy_dict/ut/ya.make b/library/cpp/codecs/greedy_dict/ut/ya.make
index acb110d061..f9e85e4703 100644
--- a/library/cpp/codecs/greedy_dict/ut/ya.make
+++ b/library/cpp/codecs/greedy_dict/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/codecs/greedy_dict)
+
SRCS(
greedy_dict_ut.cpp
)
diff --git a/library/cpp/codecs/greedy_dict/ya.make b/library/cpp/codecs/greedy_dict/ya.make
index f4b2714f41..be290ca36b 100644
--- a/library/cpp/codecs/greedy_dict/ya.make
+++ b/library/cpp/codecs/greedy_dict/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
SRCS(
diff --git a/library/cpp/compproto/ut/ya.make b/library/cpp/compproto/ut/ya.make
index 2686f5b480..fee3fb6e4f 100644
--- a/library/cpp/compproto/ut/ya.make
+++ b/library/cpp/compproto/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
ADDINCL library/cpp/compproto
)
diff --git a/library/cpp/compproto/ya.make b/library/cpp/compproto/ya.make
index dc9ad86f03..dd8fdcaae8 100644
--- a/library/cpp/compproto/ya.make
+++ b/library/cpp/compproto/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
bit.h
compressor.h
diff --git a/library/cpp/comptable/usage/ya.make b/library/cpp/comptable/usage/ya.make
index e622cc106e..b56ae6736f 100644
--- a/library/cpp/comptable/usage/ya.make
+++ b/library/cpp/comptable/usage/ya.make
@@ -1,5 +1,6 @@
PROGRAM()
+
SRCS(
usage.cpp
)
diff --git a/library/cpp/comptable/ut/ya.make b/library/cpp/comptable/ut/ya.make
index d98ecad7b6..71966923e4 100644
--- a/library/cpp/comptable/ut/ya.make
+++ b/library/cpp/comptable/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/comptable)
+
SRCS(
comptable_ut.cpp
)
diff --git a/library/cpp/comptable/ya.make b/library/cpp/comptable/ya.make
index a4e6e286d2..38ec34d6c1 100644
--- a/library/cpp/comptable/ya.make
+++ b/library/cpp/comptable/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
comptable.cpp
)
diff --git a/library/cpp/containers/2d_array/ya.make b/library/cpp/containers/2d_array/ya.make
index 50aa2a5f8b..05d030ff1c 100644
--- a/library/cpp/containers/2d_array/ya.make
+++ b/library/cpp/containers/2d_array/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
2d_array.cpp
)
diff --git a/library/cpp/containers/compact_vector/ut/ya.make b/library/cpp/containers/compact_vector/ut/ya.make
index 1a84894570..9b8de05381 100644
--- a/library/cpp/containers/compact_vector/ut/ya.make
+++ b/library/cpp/containers/compact_vector/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
SRCDIR(library/cpp/containers/compact_vector)
SRCS(
diff --git a/library/cpp/containers/compact_vector/ya.make b/library/cpp/containers/compact_vector/ya.make
index b7d97b1353..0084e68830 100644
--- a/library/cpp/containers/compact_vector/ya.make
+++ b/library/cpp/containers/compact_vector/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
compact_vector.cpp
)
diff --git a/library/cpp/containers/comptrie/benchmark/ya.make b/library/cpp/containers/comptrie/benchmark/ya.make
index 1fded11a94..27bb87a40e 100644
--- a/library/cpp/containers/comptrie/benchmark/ya.make
+++ b/library/cpp/containers/comptrie/benchmark/ya.make
@@ -2,6 +2,7 @@ Y_BENCHMARK()
TAG(ya:not_autocheck)
+
SRCS(
main.cpp
)
diff --git a/library/cpp/containers/comptrie/ya.make b/library/cpp/containers/comptrie/ya.make
index 8931bfb383..875ce79d17 100644
--- a/library/cpp/containers/comptrie/ya.make
+++ b/library/cpp/containers/comptrie/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
array_with_size.h
chunked_helpers_trie.h
diff --git a/library/cpp/containers/disjoint_interval_tree/ut/ya.make b/library/cpp/containers/disjoint_interval_tree/ut/ya.make
index b4ccc41917..b06f26bd30 100644
--- a/library/cpp/containers/disjoint_interval_tree/ut/ya.make
+++ b/library/cpp/containers/disjoint_interval_tree/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/containers/disjoint_interval_tree)
+
SRCS(
disjoint_interval_tree_ut.cpp
)
diff --git a/library/cpp/containers/disjoint_interval_tree/ya.make b/library/cpp/containers/disjoint_interval_tree/ya.make
index 688a415c0f..61bd04e2ca 100644
--- a/library/cpp/containers/disjoint_interval_tree/ya.make
+++ b/library/cpp/containers/disjoint_interval_tree/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
SRCS(disjoint_interval_tree.cpp)
diff --git a/library/cpp/containers/paged_vector/ut/ya.make b/library/cpp/containers/paged_vector/ut/ya.make
index d0ffac4d79..d0abb26730 100644
--- a/library/cpp/containers/paged_vector/ut/ya.make
+++ b/library/cpp/containers/paged_vector/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
library/cpp/containers/paged_vector
)
diff --git a/library/cpp/containers/paged_vector/ya.make b/library/cpp/containers/paged_vector/ya.make
index b03a0a2ded..9cd3571419 100644
--- a/library/cpp/containers/paged_vector/ya.make
+++ b/library/cpp/containers/paged_vector/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
paged_vector.cpp
)
diff --git a/library/cpp/containers/ring_buffer/ya.make b/library/cpp/containers/ring_buffer/ya.make
index c9220b578a..7867ea0ffb 100644
--- a/library/cpp/containers/ring_buffer/ya.make
+++ b/library/cpp/containers/ring_buffer/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
SRCS(
diff --git a/library/cpp/deprecated/accessors/ut/ya.make b/library/cpp/deprecated/accessors/ut/ya.make
index 5e79af5efd..e73ce78c3d 100644
--- a/library/cpp/deprecated/accessors/ut/ya.make
+++ b/library/cpp/deprecated/accessors/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/deprecated/accessors)
+
SRCS(
accessors_ut.cpp
)
diff --git a/library/cpp/deprecated/accessors/ya.make b/library/cpp/deprecated/accessors/ya.make
index 0aa8fcfa9b..53f3d78501 100644
--- a/library/cpp/deprecated/accessors/ya.make
+++ b/library/cpp/deprecated/accessors/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
accessors.cpp
accessors_impl.cpp
diff --git a/library/cpp/deprecated/enum_codegen/ya.make b/library/cpp/deprecated/enum_codegen/ya.make
index 9ff9997c84..b720fd7597 100644
--- a/library/cpp/deprecated/enum_codegen/ya.make
+++ b/library/cpp/deprecated/enum_codegen/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
enum_codegen.cpp
)
diff --git a/library/cpp/deprecated/split/ya.make b/library/cpp/deprecated/split/ya.make
index 8b6897fa28..4a3d21835a 100644
--- a/library/cpp/deprecated/split/ya.make
+++ b/library/cpp/deprecated/split/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
delim_string_iter.cpp
split_iterator.cpp
diff --git a/library/cpp/diff/ut/ya.make b/library/cpp/diff/ut/ya.make
index c0a091aa86..965ba0db68 100644
--- a/library/cpp/diff/ut/ya.make
+++ b/library/cpp/diff/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
SRCDIR(library/cpp/diff)
PEERDIR(
diff --git a/library/cpp/diff/ya.make b/library/cpp/diff/ya.make
index c975ced7aa..57bfbf683b 100644
--- a/library/cpp/diff/ya.make
+++ b/library/cpp/diff/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
PEERDIR(
library/cpp/lcs
library/cpp/containers/stack_array
diff --git a/library/cpp/disjoint_sets/ya.make b/library/cpp/disjoint_sets/ya.make
index 2104298baa..5342bfcf4e 100644
--- a/library/cpp/disjoint_sets/ya.make
+++ b/library/cpp/disjoint_sets/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
SRCS(
diff --git a/library/cpp/dwarf_backtrace/ut/ya.make b/library/cpp/dwarf_backtrace/ut/ya.make
index 9f23256483..6f86dd6c92 100644
--- a/library/cpp/dwarf_backtrace/ut/ya.make
+++ b/library/cpp/dwarf_backtrace/ut/ya.make
@@ -1,3 +1,4 @@
+
GTEST()
PEERDIR(
diff --git a/library/cpp/dwarf_backtrace/ya.make b/library/cpp/dwarf_backtrace/ya.make
index e955f9aa92..6260d3f89a 100644
--- a/library/cpp/dwarf_backtrace/ya.make
+++ b/library/cpp/dwarf_backtrace/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
NO_WSHADOW()
diff --git a/library/cpp/getopt/last_getopt_demo/ya.make b/library/cpp/getopt/last_getopt_demo/ya.make
index bbc01016d6..a25392e26e 100644
--- a/library/cpp/getopt/last_getopt_demo/ya.make
+++ b/library/cpp/getopt/last_getopt_demo/ya.make
@@ -1,5 +1,6 @@
PROGRAM(last_getopt_demo)
+
PEERDIR(
library/cpp/getopt
)
diff --git a/library/cpp/histogram/adaptive/ya.make b/library/cpp/histogram/adaptive/ya.make
index 43d0525b4e..a787203d75 100644
--- a/library/cpp/histogram/adaptive/ya.make
+++ b/library/cpp/histogram/adaptive/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
common.cpp
adaptive_histogram.cpp
diff --git a/library/cpp/html/entity/ya.make b/library/cpp/html/entity/ya.make
index 827e9c6b6d..bb8a9ec242 100644
--- a/library/cpp/html/entity/ya.make
+++ b/library/cpp/html/entity/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
htmlentity.cpp
decoder.rl6
diff --git a/library/cpp/html/escape/ut/ya.make b/library/cpp/html/escape/ut/ya.make
index 605e99d2fd..e3744c5b6f 100644
--- a/library/cpp/html/escape/ut/ya.make
+++ b/library/cpp/html/escape/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
SRCS(
escape_ut.cpp
)
diff --git a/library/cpp/html/escape/ya.make b/library/cpp/html/escape/ya.make
index b5de3c9a77..5a57686abf 100644
--- a/library/cpp/html/escape/ya.make
+++ b/library/cpp/html/escape/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
escape.cpp
)
diff --git a/library/cpp/html/pcdata/ut/ya.make b/library/cpp/html/pcdata/ut/ya.make
index 6d7f95627c..f7ef7e26ae 100644
--- a/library/cpp/html/pcdata/ut/ya.make
+++ b/library/cpp/html/pcdata/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/html/pcdata)
+
SRCS(
pcdata_ut.cpp
)
diff --git a/library/cpp/html/pcdata/ya.make b/library/cpp/html/pcdata/ya.make
index 2710d6728b..e4cac1892e 100644
--- a/library/cpp/html/pcdata/ya.make
+++ b/library/cpp/html/pcdata/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
pcdata.cpp
pcdata.h
diff --git a/library/cpp/int128/bench/ya.make b/library/cpp/int128/bench/ya.make
index 0dbc45e21f..14d189c576 100644
--- a/library/cpp/int128/bench/ya.make
+++ b/library/cpp/int128/bench/ya.make
@@ -1,3 +1,4 @@
+
Y_BENCHMARK()
SRCS(
diff --git a/library/cpp/int128/ut/ya.make b/library/cpp/int128/ut/ya.make
index 22ef97d566..27b4b4dc88 100644
--- a/library/cpp/int128/ut/ya.make
+++ b/library/cpp/int128/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/int128)
+
SRCS(
int128_ut_helpers.cpp
int128_ut_helpers.h
diff --git a/library/cpp/json/ut/ya.make b/library/cpp/json/ut/ya.make
index 1f14dd8f6f..2ed6ccb9f0 100644
--- a/library/cpp/json/ut/ya.make
+++ b/library/cpp/json/ut/ya.make
@@ -1,3 +1,4 @@
+
UNITTEST_FOR(library/cpp/json)
PEERDIR(
diff --git a/library/cpp/json/writer/ut/ya.make b/library/cpp/json/writer/ut/ya.make
index 256b950a6e..18e286e821 100644
--- a/library/cpp/json/writer/ut/ya.make
+++ b/library/cpp/json/writer/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
ADDINCL library/cpp/json/writer
)
diff --git a/library/cpp/l1_distance/ya.make b/library/cpp/l1_distance/ya.make
index 9345cb99af..4406d6828a 100644
--- a/library/cpp/l1_distance/ya.make
+++ b/library/cpp/l1_distance/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
l1_distance.h
)
diff --git a/library/cpp/l2_distance/ya.make b/library/cpp/l2_distance/ya.make
index 919e77ae4a..5375c34b72 100644
--- a/library/cpp/l2_distance/ya.make
+++ b/library/cpp/l2_distance/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
l2_distance.h
l2_distance.cpp
diff --git a/library/cpp/lcs/ut/ya.make b/library/cpp/lcs/ut/ya.make
index e893bc9527..ffc8aa61f3 100644
--- a/library/cpp/lcs/ut/ya.make
+++ b/library/cpp/lcs/ut/ya.make
@@ -1,3 +1,4 @@
+
UNITTEST()
PEERDIR(
diff --git a/library/cpp/lcs/ya.make b/library/cpp/lcs/ya.make
index 8c63b44e79..1ae7a5c3cd 100644
--- a/library/cpp/lcs/ya.make
+++ b/library/cpp/lcs/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
PEERDIR(
library/cpp/containers/paged_vector
)
diff --git a/library/cpp/lfalloc/dbg/ya.make b/library/cpp/lfalloc/dbg/ya.make
index 39f3fb9456..bc14ae2aa6 100644
--- a/library/cpp/lfalloc/dbg/ya.make
+++ b/library/cpp/lfalloc/dbg/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
ALLOCATOR_IMPL()
NO_UTIL()
diff --git a/library/cpp/lfalloc/dbg_info/ya.make b/library/cpp/lfalloc/dbg_info/ya.make
index 47b7a59f95..ada70f39c1 100644
--- a/library/cpp/lfalloc/dbg_info/ya.make
+++ b/library/cpp/lfalloc/dbg_info/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
PEERDIR(
library/cpp/malloc/api
)
diff --git a/library/cpp/lfalloc/ya.make b/library/cpp/lfalloc/ya.make
index 6b3b74c7e3..3d632f705d 100644
--- a/library/cpp/lfalloc/ya.make
+++ b/library/cpp/lfalloc/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
BUILD_ONLY_IF(WARNING FATAL_ERROR ARCH_TYPE_64)
ALLOCATOR_IMPL()
diff --git a/library/cpp/linear_regression/benchmark/ya.make b/library/cpp/linear_regression/benchmark/ya.make
index 5a2f1ebb5d..6d3a6be004 100644
--- a/library/cpp/linear_regression/benchmark/ya.make
+++ b/library/cpp/linear_regression/benchmark/ya.make
@@ -1,5 +1,6 @@
PROGRAM(linear_regression_benchmark)
+
SRCS(
pool.h
pool.cpp
diff --git a/library/cpp/linear_regression/ut/ya.make b/library/cpp/linear_regression/ut/ya.make
index 18e8e5eff0..33f40fabad 100644
--- a/library/cpp/linear_regression/ut/ya.make
+++ b/library/cpp/linear_regression/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
ADDINCL library/cpp/linear_regression
)
diff --git a/library/cpp/linear_regression/ya.make b/library/cpp/linear_regression/ya.make
index 504de7ee6e..1a763bcceb 100644
--- a/library/cpp/linear_regression/ya.make
+++ b/library/cpp/linear_regression/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
linear_regression.cpp
unimodal.cpp
diff --git a/library/cpp/logger/global/ut/ya.make b/library/cpp/logger/global/ut/ya.make
index df11609b6c..9c404c4b5d 100644
--- a/library/cpp/logger/global/ut/ya.make
+++ b/library/cpp/logger/global/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
library/cpp/logger/global
)
diff --git a/library/cpp/malloc/api/ut/ya.make b/library/cpp/malloc/api/ut/ya.make
index 5580da99d7..7b46871fbf 100644
--- a/library/cpp/malloc/api/ut/ya.make
+++ b/library/cpp/malloc/api/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
library/cpp/malloc/api/helpers
)
diff --git a/library/cpp/malloc/api/ya.make b/library/cpp/malloc/api/ya.make
index 499792ba19..b249c49653 100644
--- a/library/cpp/malloc/api/ya.make
+++ b/library/cpp/malloc/api/ya.make
@@ -2,6 +2,7 @@ LIBRARY()
NO_UTIL()
+
SRCS(
malloc.cpp
)
diff --git a/library/cpp/malloc/jemalloc/ya.make b/library/cpp/malloc/jemalloc/ya.make
index 035133b0f5..25c78d73d1 100644
--- a/library/cpp/malloc/jemalloc/ya.make
+++ b/library/cpp/malloc/jemalloc/ya.make
@@ -3,6 +3,7 @@ LIBRARY()
NO_UTIL()
ALLOCATOR_IMPL()
+
IF (OS_ANDROID)
PEERDIR(
library/cpp/malloc/system
diff --git a/library/cpp/malloc/system/ya.make b/library/cpp/malloc/system/ya.make
index e8454480c3..93862fff70 100644
--- a/library/cpp/malloc/system/ya.make
+++ b/library/cpp/malloc/system/ya.make
@@ -6,6 +6,7 @@ ALLOCATOR_IMPL()
NO_UTIL()
+
PEERDIR(
library/cpp/malloc/api
)
diff --git a/library/cpp/monlib/dynamic_counters/ut/ya.make b/library/cpp/monlib/dynamic_counters/ut/ya.make
index 9c272eaea1..b836e4d4a8 100644
--- a/library/cpp/monlib/dynamic_counters/ut/ya.make
+++ b/library/cpp/monlib/dynamic_counters/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/monlib/dynamic_counters)
+
SRCS(
contention_ut.cpp
counters_ut.cpp
diff --git a/library/cpp/monlib/service/pages/resources/ya.make b/library/cpp/monlib/service/pages/resources/ya.make
index 64322df0c0..b68c455b7d 100644
--- a/library/cpp/monlib/service/pages/resources/ya.make
+++ b/library/cpp/monlib/service/pages/resources/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
css_mon_page.h
fonts_mon_page.h
diff --git a/library/cpp/packers/ut/ya.make b/library/cpp/packers/ut/ya.make
index 0aae24a72f..6b3c2325bb 100644
--- a/library/cpp/packers/ut/ya.make
+++ b/library/cpp/packers/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/packers)
+
SRCS(
packers_ut.cpp
proto_packer_ut.cpp
diff --git a/library/cpp/packers/ya.make b/library/cpp/packers/ya.make
index 87a90c822c..d35ecd7271 100644
--- a/library/cpp/packers/ya.make
+++ b/library/cpp/packers/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
packers.cpp
proto_packer.cpp
diff --git a/library/cpp/protobuf/dynamic_prototype/ya.make b/library/cpp/protobuf/dynamic_prototype/ya.make
index 3fd883b6a2..ab5727d5d3 100644
--- a/library/cpp/protobuf/dynamic_prototype/ya.make
+++ b/library/cpp/protobuf/dynamic_prototype/ya.make
@@ -6,7 +6,7 @@ SRCS(
)
PEERDIR(
- contrib/libs/protobuf
+ library/cpp/protobuf/runtime
)
END()
diff --git a/library/cpp/protobuf/json/proto/ya.make b/library/cpp/protobuf/json/proto/ya.make
index 072afd2d43..cfe84f5bb6 100644
--- a/library/cpp/protobuf/json/proto/ya.make
+++ b/library/cpp/protobuf/json/proto/ya.make
@@ -1,5 +1,6 @@
PROTO_LIBRARY()
+
SRCS(
enum_options.proto
)
diff --git a/library/cpp/protobuf/json/ya.make b/library/cpp/protobuf/json/ya.make
index 9309e341ef..b7b3d27a75 100644
--- a/library/cpp/protobuf/json/ya.make
+++ b/library/cpp/protobuf/json/ya.make
@@ -14,8 +14,8 @@ SRCS(
)
PEERDIR(
- contrib/libs/protobuf
library/cpp/json
+ library/cpp/protobuf/runtime
library/cpp/protobuf/util
library/cpp/protobuf/json/proto
library/cpp/string_utils/relaxed_escaper
diff --git a/library/cpp/protobuf/runtime/ya.make b/library/cpp/protobuf/runtime/ya.make
new file mode 100644
index 0000000000..4ddfe0f8ed
--- /dev/null
+++ b/library/cpp/protobuf/runtime/ya.make
@@ -0,0 +1,9 @@
+LIBRARY()
+
+IF (USE_VANILLA_PROTOC)
+ PEERDIR(contrib/libs/protobuf_std)
+ELSE()
+ PEERDIR(contrib/libs/protobuf)
+ENDIF()
+
+END()
diff --git a/library/cpp/protobuf/util/proto/ya.make b/library/cpp/protobuf/util/proto/ya.make
index f3fedf54cd..f2fa1d0e36 100644
--- a/library/cpp/protobuf/util/proto/ya.make
+++ b/library/cpp/protobuf/util/proto/ya.make
@@ -1,5 +1,6 @@
PROTO_LIBRARY()
+
SRCS(
merge.proto
)
diff --git a/library/cpp/protobuf/util/ut/ya.make b/library/cpp/protobuf/util/ut/ya.make
index 1f321085b1..ca47bdb00d 100644
--- a/library/cpp/protobuf/util/ut/ya.make
+++ b/library/cpp/protobuf/util/ut/ya.make
@@ -1,3 +1,4 @@
+
UNITTEST_FOR(library/cpp/protobuf/util)
SRCS(
diff --git a/library/cpp/protobuf/util/ya.make b/library/cpp/protobuf/util/ya.make
index 98c6a0306d..f451b33739 100644
--- a/library/cpp/protobuf/util/ya.make
+++ b/library/cpp/protobuf/util/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
PEERDIR(
contrib/libs/protobuf
library/cpp/binsaver
diff --git a/library/cpp/protobuf/yql/ya.make b/library/cpp/protobuf/yql/ya.make
index 088890befc..070fd399b6 100644
--- a/library/cpp/protobuf/yql/ya.make
+++ b/library/cpp/protobuf/yql/ya.make
@@ -1,14 +1,15 @@
LIBRARY()
+
SRCS(
descriptor.cpp
)
PEERDIR(
- contrib/libs/protobuf
library/cpp/json
library/cpp/protobuf/dynamic_prototype
library/cpp/protobuf/json
+ library/cpp/protobuf/runtime
library/cpp/string_utils/base64
)
diff --git a/library/cpp/scheme/tests/fuzz_ops/ut/ya.make b/library/cpp/scheme/tests/fuzz_ops/ut/ya.make
index 042a103867..8a46527c00 100644
--- a/library/cpp/scheme/tests/fuzz_ops/ut/ya.make
+++ b/library/cpp/scheme/tests/fuzz_ops/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
library/cpp/testing/unittest
library/cpp/scheme
diff --git a/library/cpp/scheme/tests/ut/ya.make b/library/cpp/scheme/tests/ut/ya.make
index ceea46500f..cadf8364d0 100644
--- a/library/cpp/scheme/tests/ut/ya.make
+++ b/library/cpp/scheme/tests/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
library/cpp/protobuf/util
library/cpp/scheme/tests/fuzz_ops/lib
diff --git a/library/cpp/scheme/ut_utils/ya.make b/library/cpp/scheme/ut_utils/ya.make
index 15200afca3..02924d4bc2 100644
--- a/library/cpp/scheme/ut_utils/ya.make
+++ b/library/cpp/scheme/ut_utils/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
scheme_ut_utils.cpp
)
diff --git a/library/cpp/scheme/ya.make b/library/cpp/scheme/ya.make
index 2b6c79a2e0..890b272123 100644
--- a/library/cpp/scheme/ya.make
+++ b/library/cpp/scheme/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
scheme.cpp
scheme_cast.h
diff --git a/library/cpp/sse/ut/ya.make b/library/cpp/sse/ut/ya.make
index bdcbac1d69..849ea86c21 100644
--- a/library/cpp/sse/ut/ya.make
+++ b/library/cpp/sse/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/sse)
+
SRCS(
test.cpp
)
diff --git a/library/cpp/string_utils/csv/ya.make b/library/cpp/string_utils/csv/ya.make
index 16682d40e5..b259940b5f 100644
--- a/library/cpp/string_utils/csv/ya.make
+++ b/library/cpp/string_utils/csv/ya.make
@@ -1,3 +1,4 @@
+
LIBRARY()
SRCS(
diff --git a/library/cpp/string_utils/indent_text/ya.make b/library/cpp/string_utils/indent_text/ya.make
index 28a5e77cfe..19873981d8 100644
--- a/library/cpp/string_utils/indent_text/ya.make
+++ b/library/cpp/string_utils/indent_text/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
indent_text.cpp
)
diff --git a/library/cpp/string_utils/levenshtein_diff/ut/ya.make b/library/cpp/string_utils/levenshtein_diff/ut/ya.make
index 30ff29f97b..8cf18d53f7 100644
--- a/library/cpp/string_utils/levenshtein_diff/ut/ya.make
+++ b/library/cpp/string_utils/levenshtein_diff/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/string_utils/levenshtein_diff)
+
SRCS(
levenshtein_diff_ut.cpp
)
diff --git a/library/cpp/string_utils/quote/ut/ya.make b/library/cpp/string_utils/quote/ut/ya.make
index ad951b1ed1..1aea753bc6 100644
--- a/library/cpp/string_utils/quote/ut/ya.make
+++ b/library/cpp/string_utils/quote/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/string_utils/quote)
+
SRCS(
quote_ut.cpp
)
diff --git a/library/cpp/string_utils/relaxed_escaper/ut/ya.make b/library/cpp/string_utils/relaxed_escaper/ut/ya.make
index d437907e5b..77d2035b59 100644
--- a/library/cpp/string_utils/relaxed_escaper/ut/ya.make
+++ b/library/cpp/string_utils/relaxed_escaper/ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST_FOR(library/cpp/string_utils/relaxed_escaper)
+
SRCS(
relaxed_escaper_ut.cpp
)
diff --git a/library/cpp/string_utils/relaxed_escaper/ya.make b/library/cpp/string_utils/relaxed_escaper/ya.make
index 2f9e92a578..6de0e81d7b 100644
--- a/library/cpp/string_utils/relaxed_escaper/ya.make
+++ b/library/cpp/string_utils/relaxed_escaper/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
relaxed_escaper.cpp
)
diff --git a/library/cpp/string_utils/url/url.cpp b/library/cpp/string_utils/url/url.cpp
index c850afa5a7..4db902cf65 100644
--- a/library/cpp/string_utils/url/url.cpp
+++ b/library/cpp/string_utils/url/url.cpp
@@ -71,6 +71,40 @@ namespace NUrl {
return {host, path};
}
+ bool HasLowerHost(const TStringBuf &url) {
+ for (size_t n = 0; n < url.length(); ++n) {
+ if (url[n] == '/')
+ break;
+ if (isupper(url[n]))
+ return false;
+ }
+ return true;
+ }
+
+ TStringBuf CutHttpWwwPrefixes(const TStringBuf &url) {
+ TStringBuf urlCut = CutWWWPrefix(CutHttpPrefix(url));
+ if (!urlCut.empty() && urlCut.back() == '/')
+ urlCut = urlCut.substr(0, urlCut.length() - 1);
+ return urlCut;
+ }
+
+ TString MakeLowerHost(const TStringBuf &url, size_t shift) {
+ TString urlFixed(url);
+ for (char *c = urlFixed.begin() + shift; *c && (*c != '/'); ++c) {
+ *c = tolower(*c);
+ }
+
+ return urlFixed;
+ }
+
+ TString MakeNormalized(const TStringBuf &url) {
+ TStringBuf urlCut = CutHttpWwwPrefixes(url);
+ if (HasLowerHost(urlCut)) {
+ return ToString(urlCut);
+ }
+ return MakeLowerHost(urlCut);
+ }
+
} // namespace NUrl
size_t GetHttpPrefixSize(const char* url, bool ignorehttps) noexcept {
diff --git a/library/cpp/string_utils/url/url.h b/library/cpp/string_utils/url/url.h
index 68fa23d64c..9b73233078 100644
--- a/library/cpp/string_utils/url/url.h
+++ b/library/cpp/string_utils/url/url.h
@@ -21,6 +21,11 @@ namespace NUrl {
Y_PURE_FUNCTION
TSplitUrlToHostAndPathResult SplitUrlToHostAndPath(const TStringBuf url);
+ bool HasLowerHost(const TStringBuf &url);
+ TStringBuf CutHttpWwwPrefixes(const TStringBuf &url);
+ TString MakeLowerHost(const TStringBuf &url, size_t shift = 0);
+ TString MakeNormalized(const TStringBuf &url);
+
} // namespace NUrl
Y_PURE_FUNCTION
@@ -170,4 +175,3 @@ TStringBuf RemoveFinalSlash(TStringBuf str) noexcept;
TStringBuf CutUrlPrefixes(TStringBuf url) noexcept;
bool DoesUrlPathStartWithToken(TStringBuf url, const TStringBuf& token) noexcept;
-
diff --git a/library/cpp/string_utils/ztstrbuf/ya.make b/library/cpp/string_utils/ztstrbuf/ya.make
index 019d9e890b..9d8d3b7110 100644
--- a/library/cpp/string_utils/ztstrbuf/ya.make
+++ b/library/cpp/string_utils/ztstrbuf/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
ztstrbuf.cpp
)
diff --git a/library/cpp/tdigest/ya.make b/library/cpp/tdigest/ya.make
index 2546443726..37d4e13a27 100644
--- a/library/cpp/tdigest/ya.make
+++ b/library/cpp/tdigest/ya.make
@@ -6,7 +6,7 @@ SRCS(
)
PEERDIR(
- contrib/libs/protobuf
+ library/cpp/protobuf/runtime
)
END()
diff --git a/library/cpp/terminate_handler/sample/exception/ya.make b/library/cpp/terminate_handler/sample/exception/ya.make
index c43de8348e..444cc48c3b 100644
--- a/library/cpp/terminate_handler/sample/exception/ya.make
+++ b/library/cpp/terminate_handler/sample/exception/ya.make
@@ -1,5 +1,6 @@
PROGRAM(exception_sample)
+
SRCS(
main.cpp
)
diff --git a/library/cpp/terminate_handler/sample/pure-virtual/ya.make b/library/cpp/terminate_handler/sample/pure-virtual/ya.make
index ae4a907f40..e7fcbd8f40 100644
--- a/library/cpp/terminate_handler/sample/pure-virtual/ya.make
+++ b/library/cpp/terminate_handler/sample/pure-virtual/ya.make
@@ -1,5 +1,6 @@
PROGRAM()
+
SRCS(
main.cpp
)
diff --git a/library/cpp/terminate_handler/sample/rethrow/ya.make b/library/cpp/terminate_handler/sample/rethrow/ya.make
index ae4a907f40..e7fcbd8f40 100644
--- a/library/cpp/terminate_handler/sample/rethrow/ya.make
+++ b/library/cpp/terminate_handler/sample/rethrow/ya.make
@@ -1,5 +1,6 @@
PROGRAM()
+
SRCS(
main.cpp
)
diff --git a/library/cpp/terminate_handler/sample/segv/ya.make b/library/cpp/terminate_handler/sample/segv/ya.make
index ae4a907f40..e7fcbd8f40 100644
--- a/library/cpp/terminate_handler/sample/segv/ya.make
+++ b/library/cpp/terminate_handler/sample/segv/ya.make
@@ -1,5 +1,6 @@
PROGRAM()
+
SRCS(
main.cpp
)
diff --git a/library/cpp/testing/gmock_in_unittest/example_ut/ya.make b/library/cpp/testing/gmock_in_unittest/example_ut/ya.make
index 38d3aae811..f96934e796 100644
--- a/library/cpp/testing/gmock_in_unittest/example_ut/ya.make
+++ b/library/cpp/testing/gmock_in_unittest/example_ut/ya.make
@@ -1,5 +1,6 @@
UNITTEST()
+
PEERDIR(
library/cpp/testing/gmock_in_unittest
)
diff --git a/library/cpp/testing/gmock_in_unittest/ya.make b/library/cpp/testing/gmock_in_unittest/ya.make
index cd2fa65b48..3bca6c3a3a 100644
--- a/library/cpp/testing/gmock_in_unittest/ya.make
+++ b/library/cpp/testing/gmock_in_unittest/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
PEERDIR(
contrib/restricted/googletest/googlemock
contrib/restricted/googletest/googletest
diff --git a/library/cpp/testing/gtest/matchers.h b/library/cpp/testing/gtest/matchers.h
index 0db0597304..4c0154e914 100644
--- a/library/cpp/testing/gtest/matchers.h
+++ b/library/cpp/testing/gtest/matchers.h
@@ -32,7 +32,7 @@ namespace NGTest {
{
if (!NDetail::MatchOrUpdateGolden(std::string_view(arg.data(), arg.size()), TString(filename))) {
*result_listener
- << "\nCall `ya m -rA --test-param GTEST_UPDATE_GOLDEN=1` to update the golden file";
+ << "\nCall `ya test --test-param GTEST_UPDATE_GOLDEN=1` to update the golden file";
return false;
}
return true;
diff --git a/library/cpp/threading/future/README.md b/library/cpp/threading/future/README.md
new file mode 100644
index 0000000000..9b9929c822
--- /dev/null
+++ b/library/cpp/threading/future/README.md
@@ -0,0 +1,2 @@
+See:
+https://docs.yandex-team.ru/arcadia-cpp/cookbook/concurrency
diff --git a/library/cpp/threading/future/benchmark/coroutine_traits.cpp b/library/cpp/threading/future/benchmark/coroutine_traits.cpp
new file mode 100644
index 0000000000..93528bfac0
--- /dev/null
+++ b/library/cpp/threading/future/benchmark/coroutine_traits.cpp
@@ -0,0 +1,82 @@
+#include <library/cpp/threading/future/future.h>
+#include <library/cpp/threading/future/core/coroutine_traits.h>
+
+#include <benchmark/benchmark.h>
+
+class TContext {
+public:
+ TContext()
+ : NextInputPromise_(NThreading::NewPromise<bool>())
+ {}
+ ~TContext() {
+ UpdateNextInput(false);
+ }
+
+ NThreading::TFuture<bool> NextInput() {
+ return NextInputPromise_.GetFuture();
+ }
+
+ void UpdateNextInput(bool hasInput = true) {
+ auto prevNextInputPromise = NextInputPromise_;
+ NextInputPromise_ = NThreading::NewPromise<bool>();
+ prevNextInputPromise.SetValue(hasInput);
+ }
+
+private:
+ NThreading::TPromise<bool> NextInputPromise_;
+};
+
+static void TestPureFutureChainSubscribe(benchmark::State& state) {
+ TContext context;
+ size_t cnt = 0;
+ std::function<void(const NThreading::TFuture<bool>&)> processInput = [&context, &cnt, &processInput](const NThreading::TFuture<bool>& hasInput) {
+ if (hasInput.GetValue()) {
+ benchmark::DoNotOptimize(++cnt);
+ context.NextInput().Subscribe(processInput);
+ }
+ };
+
+ processInput(NThreading::MakeFuture<bool>(true));
+ for (auto _ : state) {
+ context.UpdateNextInput();
+ }
+ context.UpdateNextInput(false);
+}
+
+static void TestPureFutureChainApply(benchmark::State& state) {
+ TContext context;
+ size_t cnt = 0;
+ std::function<void(const NThreading::TFuture<bool>&)> processInput = [&context, &cnt, &processInput](const NThreading::TFuture<bool>& hasInput) {
+ if (hasInput.GetValue()) {
+ benchmark::DoNotOptimize(++cnt);
+ context.NextInput().Apply(processInput);
+ }
+ };
+
+ processInput(NThreading::MakeFuture<bool>(true));
+ for (auto _ : state) {
+ context.UpdateNextInput();
+ }
+ context.UpdateNextInput(false);
+}
+
+static void TestCoroFutureChain(benchmark::State& state) {
+ TContext context;
+ size_t cnt = 0;
+ auto coroutine = [&context, &cnt]() -> NThreading::TFuture<void> {
+ while (co_await context.NextInput()) {
+ benchmark::DoNotOptimize(++cnt);
+ }
+ };
+
+ auto coroutineFuture = coroutine();
+ for (auto _ : state) {
+ context.UpdateNextInput();
+ }
+ context.UpdateNextInput(false);
+ coroutineFuture.GetValueSync();
+}
+
+BENCHMARK(TestPureFutureChainSubscribe);
+BENCHMARK(TestPureFutureChainApply);
+BENCHMARK(TestCoroFutureChain);
diff --git a/library/cpp/threading/future/benchmark/ya.make b/library/cpp/threading/future/benchmark/ya.make
new file mode 100644
index 0000000000..f71f52acbb
--- /dev/null
+++ b/library/cpp/threading/future/benchmark/ya.make
@@ -0,0 +1,11 @@
+G_BENCHMARK()
+
+PEERDIR(
+ library/cpp/threading/future
+)
+
+SRCS(
+ coroutine_traits.cpp
+)
+
+END()
diff --git a/library/cpp/threading/future/core/coroutine_traits.h b/library/cpp/threading/future/core/coroutine_traits.h
new file mode 100644
index 0000000000..5871e22a35
--- /dev/null
+++ b/library/cpp/threading/future/core/coroutine_traits.h
@@ -0,0 +1,99 @@
+#pragma once
+
+#include <library/cpp/threading/future/future.h>
+
+#include <coroutine>
+
+template<typename... Args>
+struct std::coroutine_traits<NThreading::TFuture<void>, Args...> {
+ struct promise_type {
+
+ NThreading::TFuture<void> get_return_object() {
+ return Promise_.GetFuture();
+ }
+
+ std::suspend_never initial_suspend() { return {}; }
+ std::suspend_never final_suspend() noexcept { return {}; }
+
+ void unhandled_exception() {
+ Promise_.SetException(std::current_exception());
+ }
+
+ void return_void() {
+ Promise_.SetValue();
+ }
+
+ private:
+ NThreading::TPromise<void> Promise_ = NThreading::NewPromise();
+ };
+};
+
+template<typename T, typename... Args>
+struct std::coroutine_traits<NThreading::TFuture<T>, Args...> {
+ struct promise_type {
+ NThreading::TFuture<T> get_return_object() {
+ return Promise_.GetFuture();
+ }
+
+ std::suspend_never initial_suspend() { return {}; }
+ std::suspend_never final_suspend() noexcept { return {}; }
+
+ void unhandled_exception() {
+ Promise_.SetException(std::current_exception());
+ }
+
+ void return_value(auto&& val) {
+ Promise_.SetValue(std::forward<decltype(val)>(val));
+ }
+
+ private:
+ NThreading::TPromise<T> Promise_ = NThreading::NewPromise<T>();
+ };
+};
+
+template<typename T>
+struct TFutureAwaitable {
+ NThreading::TFuture<T> Future;
+
+ TFutureAwaitable(NThreading::TFuture<T> future)
+ : Future{future}
+ {
+ }
+
+ bool await_ready() const noexcept {
+ return Future.HasValue() || Future.HasException();
+ }
+
+ void await_suspend(auto h) noexcept {
+ /*
+ * This library assumes that resume never throws an exception.
+ * This assumption is made due to the fact that the users of these library in most cases do not need to write their own coroutine handlers,
+ * and all coroutine handlers provided by the library do not throw exception from resume.
+ *
+ * WARNING: do not change subscribe to apply or something other here, creating an extra future state degrades performance.
+ */
+ Future.NoexceptSubscribe(
+ [h](auto) mutable noexcept {
+ h();
+ }
+ );
+ }
+
+ decltype(auto) await_resume() {
+ return Future.GetValue();
+ }
+};
+
+template<typename T>
+auto operator co_await(const NThreading::TFuture<T>& future) {
+ return TFutureAwaitable{future};
+}
+
+namespace NThreading {
+
+ template<typename T>
+ auto AsAwaitable(const NThreading::TFuture<T>& fut) {
+ return operator co_await(fut);
+ }
+
+} // namespace NThreading
diff --git a/library/cpp/threading/future/core/future-inl.h b/library/cpp/threading/future/core/future-inl.h
index df6b7c21b2..142ea92567 100644
--- a/library/cpp/threading/future/core/future-inl.h
+++ b/library/cpp/threading/future/core/future-inl.h
@@ -116,6 +116,9 @@ namespace NThreading {
bool HasException() const {
return AtomicGet(State) == ExceptionSet;
}
+ bool IsReady() const {
+ return AtomicGet(State) != NotReady;
+ }
const T& GetValue(TDuration timeout = TDuration::Zero()) const {
AccessValue(timeout, ValueRead);
@@ -297,6 +300,9 @@ namespace NThreading {
bool HasException() const {
return AtomicGet(State) == ExceptionSet;
}
+ bool IsReady() const {
+ return AtomicGet(State) != NotReady;
+ }
void GetValue(TDuration timeout = TDuration::Zero()) const {
TAtomicBase state = AtomicGet(State);
@@ -583,6 +589,10 @@ namespace NThreading {
inline bool TFuture<T>::HasException() const {
return State && State->HasException();
}
+ template <typename T>
+ inline bool TFuture<T>::IsReady() const {
+ return State && State->IsReady();
+ }
template <typename T>
inline void TFuture<T>::Wait() const {
@@ -688,6 +698,9 @@ namespace NThreading {
inline bool TFuture<void>::HasException() const {
return State && State->HasException();
}
+ inline bool TFuture<void>::IsReady() const {
+ return State && State->IsReady();
+ }
inline void TFuture<void>::Wait() const {
EnsureInitialized();
@@ -824,6 +837,11 @@ namespace NThreading {
}
template <typename T>
+ inline bool TPromise<T>::IsReady() const {
+ return State && State->IsReady();
+ }
+
+ template <typename T>
inline void TPromise<T>::SetException(const TString& e) {
EnsureInitialized();
State->SetException(std::make_exception_ptr(yexception() << e));
@@ -904,6 +922,10 @@ namespace NThreading {
return State && State->HasException();
}
+ inline bool TPromise<void>::IsReady() const {
+ return State && State->IsReady();
+ }
+
inline void TPromise<void>::SetException(const TString& e) {
EnsureInitialized();
State->SetException(std::make_exception_ptr(yexception() << e));
diff --git a/library/cpp/threading/future/core/future.h b/library/cpp/threading/future/core/future.h
index 598336282a..1e76a04d3f 100644
--- a/library/cpp/threading/future/core/future.h
+++ b/library/cpp/threading/future/core/future.h
@@ -98,6 +98,12 @@ namespace NThreading {
void TryRethrow() const;
bool HasException() const;
+ // returns true if exception or value was set.
+ // allows to check readiness without locking cheker-thread
+ // NOTE: returns true even if value was extracted from promise
+ // good replace for HasValue() || HasException()
+ bool IsReady() const;
+
void Wait() const;
bool Wait(TDuration timeout) const;
bool Wait(TInstant deadline) const;
@@ -153,6 +159,11 @@ namespace NThreading {
void TryRethrow() const;
bool HasException() const;
+ // returns true if exception or value was set.
+ // allows to check readiness without locking cheker-thread
+ // good replace for HasValue() || HasException()
+ bool IsReady() const;
+
void Wait() const;
bool Wait(TDuration timeout) const;
bool Wait(TInstant deadline) const;
@@ -216,6 +227,12 @@ namespace NThreading {
void TryRethrow() const;
bool HasException() const;
+
+ // returns true if exception or value was set.
+ // allows to check readiness without locking cheker-thread
+ // NOTE: returns true even if value was extracted from promise
+ // good replace for HasValue() || HasException()
+ bool IsReady() const;
void SetException(const TString& e);
void SetException(std::exception_ptr e);
bool TrySetException(std::exception_ptr e);
@@ -256,6 +273,11 @@ namespace NThreading {
void TryRethrow() const;
bool HasException() const;
+
+ // returns true if exception or value was set.
+ // allows to check readiness without locking cheker-thread
+ // good replace for HasValue() || HasException()
+ bool IsReady() const;
void SetException(const TString& e);
void SetException(std::exception_ptr e);
bool TrySetException(std::exception_ptr e);
diff --git a/library/cpp/threading/future/future_ut.cpp b/library/cpp/threading/future/future_ut.cpp
index 26f8fa9e9c..ceb07cae93 100644
--- a/library/cpp/threading/future/future_ut.cpp
+++ b/library/cpp/threading/future/future_ut.cpp
@@ -105,6 +105,7 @@ namespace {
future = MakeFuture(345);
UNIT_ASSERT(future.HasValue());
+ UNIT_ASSERT(future.IsReady());
UNIT_ASSERT_EQUAL(future.GetValue(), 345);
}
@@ -115,6 +116,7 @@ namespace {
TFuture<void> future = promise.GetFuture();
UNIT_ASSERT(future.HasValue());
+ UNIT_ASSERT(future.IsReady());
future = MakeFuture();
UNIT_ASSERT(future.HasValue());
@@ -523,6 +525,7 @@ namespace {
{
auto future1 = MakeErrorFuture<void>(std::make_exception_ptr(TFutureException()));
UNIT_ASSERT(future1.HasException());
+ UNIT_ASSERT(future1.IsReady());
UNIT_CHECK_GENERATED_EXCEPTION(future1.GetValue(), TFutureException);
auto future2 = MakeErrorFuture<int>(std::make_exception_ptr(TFutureException()));
@@ -563,6 +566,7 @@ namespace {
promise2.SetException("foo-exception");
wait.Wait();
UNIT_ASSERT(future2.HasException());
+ UNIT_ASSERT(!future1.IsReady());
UNIT_ASSERT(!future1.HasValue() && !future1.HasException());
}
diff --git a/library/cpp/threading/future/ya.make b/library/cpp/threading/future/ya.make
index bc52ca5c18..1d98569906 100644
--- a/library/cpp/threading/future/ya.make
+++ b/library/cpp/threading/future/ya.make
@@ -15,6 +15,7 @@ SRCS(
END()
RECURSE(
+ benchmark
mt_ut
perf
ut
diff --git a/library/cpp/threading/hot_swap/ya.make b/library/cpp/threading/hot_swap/ya.make
index 82eb6490a4..73cc169411 100644
--- a/library/cpp/threading/hot_swap/ya.make
+++ b/library/cpp/threading/hot_swap/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
hot_swap.cpp
)
diff --git a/library/cpp/threading/poor_man_openmp/ya.make b/library/cpp/threading/poor_man_openmp/ya.make
index 976b2b6b3c..5d2d1317c5 100644
--- a/library/cpp/threading/poor_man_openmp/ya.make
+++ b/library/cpp/threading/poor_man_openmp/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
SRCS(
thread_helper.cpp
)
diff --git a/library/cpp/tld/tlds-alpha-by-domain.txt b/library/cpp/tld/tlds-alpha-by-domain.txt
index fcf3c4ec29..b20e2da24d 100644
--- a/library/cpp/tld/tlds-alpha-by-domain.txt
+++ b/library/cpp/tld/tlds-alpha-by-domain.txt
@@ -1,4 +1,4 @@
-# Version 2024071000, Last Updated Wed Jul 10 07:07:01 2024 UTC
+# Version 2024072500, Last Updated Thu Jul 25 07:07:01 2024 UTC
AAA
AARP
ABB
diff --git a/library/cpp/yt/memory/range.h b/library/cpp/yt/memory/range.h
index 10f2ea43ec..7a9c0bcd79 100644
--- a/library/cpp/yt/memory/range.h
+++ b/library/cpp/yt/memory/range.h
@@ -87,7 +87,7 @@ public:
//! Constructs a TRange from an std::vector.
template <class A>
TRange(const std::vector<T, A>& elements)
- : Data_(elements.empty() ? nullptr : elements.data())
+ : Data_(elements.data())
, Length_(elements.size())
{ }
diff --git a/library/python/cyson/cyson/helpers.cpp b/library/python/cyson/cyson/helpers.cpp
index ae4a5dd2fa..ffcaa97322 100644
--- a/library/python/cyson/cyson/helpers.cpp
+++ b/library/python/cyson/cyson/helpers.cpp
@@ -125,7 +125,7 @@ namespace NCYson {
}
#if PY_MAJOR_VERSION >= 3
- PyObject* tmp = _PyLong_Format(obj, 10);
+ PyObject* tmp = PyNumber_ToBase(obj, 10);
if (!tmp) {
return nullptr;
}
@@ -161,7 +161,11 @@ namespace NCYson {
}
TPyObjectPtr::~TPyObjectPtr() {
-#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7
+#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 13
+ if (Py_IsFinalizing()) {
+ return;
+ }
+#elif PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7
if (_Py_IsFinalizing()) {
return;
}
diff --git a/library/python/cyson/cyson/unsigned_long.cpp b/library/python/cyson/cyson/unsigned_long.cpp
index bbc25bef9c..d6fbcf1956 100644
--- a/library/python/cyson/cyson/unsigned_long.cpp
+++ b/library/python/cyson/cyson/unsigned_long.cpp
@@ -308,5 +308,8 @@ namespace NCYson {
#if PY_VERSION_HEX >= 0x030c0000
0, /*tp_watched*/
#endif
+#if PY_VERSION_HEX >= 0x030D00A4
+ 0, /*tp_versions_used*/
+#endif
};
}
diff --git a/library/python/monlib/encoder.pyx b/library/python/monlib/encoder.pyx
index 05cf4fec9a..5387d40a88 100644
--- a/library/python/monlib/encoder.pyx
+++ b/library/python/monlib/encoder.pyx
@@ -8,6 +8,13 @@ import sys
from datetime import datetime
from os import dup
+if sys.version_info.major >= 3:
+ from datetime import timezone
+ EPOCH_AWARE = datetime.fromtimestamp(0, tz=timezone.utc)
+ EPOCH_NAIVE = EPOCH_AWARE.replace(tzinfo=None)
+else:
+ EPOCH_NAIVE = datetime.utcfromtimestamp(0)
+
cdef extern from "util/stream/fwd.h" nogil:
cdef cppclass TAdaptivelyBuffered[T]:
@@ -138,7 +145,7 @@ def dump(registry, fp, format='spack', **kwargs):
elif format == 'json':
indent = int(kwargs.get('indent', 0))
encoder = Encoder.create_json(fp, indent)
- timestamp = kwargs.get('timestamp', datetime.utcfromtimestamp(0))
+ timestamp = kwargs.get('timestamp', EPOCH_NAIVE)
registry.accept(timestamp, encoder)
encoder.close()
@@ -166,7 +173,7 @@ def dumps(registry, format='spack', **kwargs):
elif format == 'json':
indent = int(kwargs.get('indent', 0))
encoder = Encoder.create_json(None, indent)
- timestamp = kwargs.get('timestamp', datetime.utcfromtimestamp(0))
+ timestamp = kwargs.get('timestamp', EPOCH_NAIVE)
registry.accept(timestamp, encoder)
encoder.close()
diff --git a/library/python/protobuf/runtime/ya.make b/library/python/protobuf/runtime/ya.make
new file mode 100644
index 0000000000..0bb52fffe6
--- /dev/null
+++ b/library/python/protobuf/runtime/ya.make
@@ -0,0 +1,13 @@
+PY23_LIBRARY()
+
+IF (USE_VANILLA_PROTOC AND NOT PYTHON2)
+ PEERDIR(
+ contrib/python/protobuf_std
+ )
+ELSE()
+ PEERDIR(
+ contrib/python/protobuf
+ )
+ENDIF()
+
+END()
diff --git a/library/python/retry/tests/ya.make b/library/python/retry/tests/ya.make
index 5e14cd2093..733f0b0990 100644
--- a/library/python/retry/tests/ya.make
+++ b/library/python/retry/tests/ya.make
@@ -1,3 +1,4 @@
+
PY23_TEST()
STYLE_PYTHON()
diff --git a/library/python/retry/ya.make b/library/python/retry/ya.make
index dcbf5567cd..1e1789d129 100644
--- a/library/python/retry/ya.make
+++ b/library/python/retry/ya.make
@@ -1,3 +1,4 @@
+
PY23_LIBRARY()
STYLE_PYTHON()
diff --git a/library/python/symbols/python/ut/py2/ya.make b/library/python/symbols/python/ut/py2/ya.make
index 991cbedf65..302bd156d5 100644
--- a/library/python/symbols/python/ut/py2/ya.make
+++ b/library/python/symbols/python/ut/py2/ya.make
@@ -1,5 +1,6 @@
PY2TEST()
+
PEERDIR(
library/python/symbols/python/ut
)
diff --git a/library/python/symbols/python/ut/py3/ya.make b/library/python/symbols/python/ut/py3/ya.make
index e5542a6c4e..536f5d41b5 100644
--- a/library/python/symbols/python/ut/py3/ya.make
+++ b/library/python/symbols/python/ut/py3/ya.make
@@ -1,5 +1,6 @@
PY3TEST()
+
PEERDIR(
library/python/symbols/python/ut
)
diff --git a/library/python/symbols/python/ut/ya.make b/library/python/symbols/python/ut/ya.make
index 933c81781f..e74ef30728 100644
--- a/library/python/symbols/python/ut/ya.make
+++ b/library/python/symbols/python/ut/ya.make
@@ -1,5 +1,6 @@
PY23_LIBRARY()
+
TEST_SRCS(test_ctypes.py)
PEERDIR(
diff --git a/library/python/symbols/python/ya.make b/library/python/symbols/python/ya.make
index e19c591608..20028a44ef 100644
--- a/library/python/symbols/python/ya.make
+++ b/library/python/symbols/python/ya.make
@@ -1,5 +1,6 @@
LIBRARY()
+
PEERDIR(
library/python/symbols/registry
)
diff --git a/library/python/testing/swag/lib/ya.make b/library/python/testing/swag/lib/ya.make
index 0567288a62..c1f486f7fa 100644
--- a/library/python/testing/swag/lib/ya.make
+++ b/library/python/testing/swag/lib/ya.make
@@ -2,7 +2,7 @@ PY23_LIBRARY()
PEERDIR(
contrib/python/six
- contrib/python/protobuf
+ library/python/protobuf/runtime
library/python/testing/yatest_common
)
diff --git a/util/generic/strbase.h b/util/generic/strbase.h
index 86e5c0f2f2..c451dd752f 100644
--- a/util/generic/strbase.h
+++ b/util/generic/strbase.h
@@ -552,3 +552,21 @@ private:
return toCopy;
}
};
+
+/**
+ * @def Y_STRING_LIFETIME_BOUND
+ *
+ * The attribute on a string-like function parameter can be used to tell the compiler
+ * that function return value may refer that parameter.
+ * this macro differs from the Y_LIFETIME_BOUND in that it does not check
+ * the lifetime of copy-on-write strings if that implementation is used.
+ */
+#if defined(TSTRING_IS_STD_STRING)
+ #define Y_STRING_LIFETIME_BOUND Y_LIFETIME_BOUND
+#else
+ // It is difficult to determine the lifetime of a copy-on-write
+ // string using static analysis, as some copies of the string may
+ // extend the buffer's lifetime.
+ // Therefore, checking the lifetime of such strings has not yet been implemented.
+ #define Y_STRING_LIFETIME_BOUND
+#endif
diff --git a/util/generic/strbuf.h b/util/generic/strbuf.h
index 77644a2f6c..fa11e39cf1 100644
--- a/util/generic/strbuf.h
+++ b/util/generic/strbuf.h
@@ -5,6 +5,8 @@
#include "utility.h"
#include "typetraits.h"
+#include <util/system/compiler.h>
+
#include <string_view>
using namespace std::string_view_literals;
@@ -97,12 +99,12 @@ public:
*/
constexpr inline TBasicStringBuf(std::nullptr_t begin, size_t size) = delete;
- constexpr inline TBasicStringBuf(const TCharType* data, size_t size) noexcept
+ constexpr inline TBasicStringBuf(const TCharType* data Y_LIFETIME_BOUND, size_t size) noexcept
: TStringView(data, size)
{
}
- constexpr TBasicStringBuf(const TCharType* data) noexcept
+ constexpr TBasicStringBuf(const TCharType* data Y_LIFETIME_BOUND) noexcept
/*
* WARN: TBase::StrLen properly handles nullptr,
* while std::string_view (using std::char_traits) will abort in such case
@@ -111,7 +113,7 @@ public:
{
}
- constexpr inline TBasicStringBuf(const TCharType* beg, const TCharType* end) noexcept
+ constexpr inline TBasicStringBuf(const TCharType* beg Y_LIFETIME_BOUND, const TCharType* end Y_LIFETIME_BOUND) noexcept
: TStringView(beg, end - beg)
{
}
@@ -122,8 +124,14 @@ public:
{
}
+ template <typename T>
+ inline TBasicStringBuf(const TBasicString<TCharType, T>& str Y_STRING_LIFETIME_BOUND) noexcept
+ : TStringView(str.data(), str.size())
+ {
+ }
+
template <typename T, typename A>
- inline TBasicStringBuf(const std::basic_string<TCharType, T, A>& str) noexcept
+ inline TBasicStringBuf(const std::basic_string<TCharType, T, A>& str Y_LIFETIME_BOUND) noexcept
: TStringView(str)
{
}
diff --git a/util/string/strip.h b/util/string/strip.h
index 666300e0e7..809a047cd8 100644
--- a/util/string/strip.h
+++ b/util/string/strip.h
@@ -88,9 +88,9 @@ struct TStripImpl {
if (StripRange(b, e, criterion)) {
if constexpr (::TIsTemplateBaseOf<std::basic_string_view, T>::value) {
- to = T(b, e - b);
+ to = T(b, e);
} else {
- to.assign(b, e - b);
+ to.assign(b, e);
}
return true;
diff --git a/util/system/src_root.h b/util/system/src_root.h
index 4f2d9f5ee6..d595de7d8f 100644
--- a/util/system/src_root.h
+++ b/util/system/src_root.h
@@ -36,6 +36,13 @@ namespace NPrivate {
if (prefix.Len < string.Len) {
for (unsigned i = prefix.Len; i-- > 0;) {
if (prefix.Data[i] != string.Data[i]) {
+#if defined(_MSC_VER) && !defined(__clang__)
+ // cl.exe uses back slashes for __FILE__ but ARCADIA_ROOT, ARCADIA_BUILD_ROOT are
+ // defined with forward slashes
+ if ((prefix.Data[i] == '/') && (string.Data[i] == '\\')) {
+ continue;
+ }
+#endif
return false;
}
}
diff --git a/util/ya.make b/util/ya.make
index 5564e65eb0..87eb5c7180 100644
--- a/util/ya.make
+++ b/util/ya.make
@@ -249,6 +249,10 @@ IF (TSTRING_IS_STD_STRING)
CFLAGS(GLOBAL -DTSTRING_IS_STD_STRING)
ENDIF()
+IF (NO_CUSTOM_CHAR_PTR_STD_COMPARATOR)
+ CFLAGS(GLOBAL -DNO_CUSTOM_CHAR_PTR_STD_COMPARATOR)
+ENDIF()
+
JOIN_SRCS(
all_system_1.cpp
system/atexit.cpp
diff --git a/ya b/ya
index 7f121a1c8b..57b5ea81ab 100755
--- a/ya
+++ b/ya
@@ -39,33 +39,33 @@ REGISTRY_ENDPOINT = os.environ.get("YA_REGISTRY_ENDPOINT", "https://devtools-reg
PLATFORM_MAP = {
"data": {
"darwin": {
- "md5": "d420bc063436296fd06fa0158c0be0b7",
+ "md5": "0fde66aa3d2eedca282b89f27dc498fb",
"urls": [
- f"{REGISTRY_ENDPOINT}/6696808122"
+ f"{REGISTRY_ENDPOINT}/6761606505"
]
},
"darwin-arm64": {
- "md5": "eb5fff4c54ad6985367c388958c21247",
+ "md5": "d87f182ed40f1be37c1c3b271c83669c",
"urls": [
- f"{REGISTRY_ENDPOINT}/6696805876"
+ f"{REGISTRY_ENDPOINT}/6761606258"
]
},
"linux-aarch64": {
- "md5": "49713957225950bc8eae702d6fad7010",
+ "md5": "e3555221b30ffb2f992012fb0dd21587",
"urls": [
- f"{REGISTRY_ENDPOINT}/6696803880"
+ f"{REGISTRY_ENDPOINT}/6761606102"
]
},
"win32-clang-cl": {
- "md5": "7e7fcf04fb4832bc843f1c283abf029c",
+ "md5": "0dc634d2325ed6edc9d79f4daf61bca8",
"urls": [
- f"{REGISTRY_ENDPOINT}/6696810344"
+ f"{REGISTRY_ENDPOINT}/6761606645"
]
},
"linux": {
- "md5": "192e1539014e8d702396045fa863d47c",
+ "md5": "a1f742755f8fb41fe2dcc521bff6fe95",
"urls": [
- f"{REGISTRY_ENDPOINT}/6696814224"
+ f"{REGISTRY_ENDPOINT}/6761606901"
]
}
}
diff --git a/yt/cpp/mapreduce/interface/ut/ya.make b/yt/cpp/mapreduce/interface/ut/ya.make
index 9e92931b5d..cfc55acccf 100644
--- a/yt/cpp/mapreduce/interface/ut/ya.make
+++ b/yt/cpp/mapreduce/interface/ut/ya.make
@@ -17,7 +17,6 @@ SRCS(
)
PEERDIR(
- contrib/libs/protobuf
library/cpp/testing/gtest
yt/yt_proto/yt/formats
yt/cpp/mapreduce/interface
diff --git a/yt/cpp/mapreduce/interface/ya.make b/yt/cpp/mapreduce/interface/ya.make
index a4cbd8951a..5d9a61a1cd 100644
--- a/yt/cpp/mapreduce/interface/ya.make
+++ b/yt/cpp/mapreduce/interface/ya.make
@@ -23,7 +23,7 @@ SRCS(
)
PEERDIR(
- contrib/libs/protobuf
+ library/cpp/protobuf/runtime
library/cpp/type_info
library/cpp/threading/future
library/cpp/yson/node
diff --git a/yt/cpp/mapreduce/io/ya.make b/yt/cpp/mapreduce/io/ya.make
index 18a0cac464..179fc40df1 100644
--- a/yt/cpp/mapreduce/io/ya.make
+++ b/yt/cpp/mapreduce/io/ya.make
@@ -20,7 +20,7 @@ SRCS(
)
PEERDIR(
- contrib/libs/protobuf
+ library/cpp/protobuf/runtime
library/cpp/yson
library/cpp/yson/node
yt/cpp/mapreduce/common
diff --git a/yt/yt/client/api/queue_client.h b/yt/yt/client/api/queue_client.h
index a50cd9da1b..ad489e547a 100644
--- a/yt/yt/client/api/queue_client.h
+++ b/yt/yt/client/api/queue_client.h
@@ -27,6 +27,8 @@ struct TPullRowsOptions
NChaosClient::TReplicationProgress ReplicationProgress;
NTransactionClient::TTimestamp UpperTimestamp = NTransactionClient::NullTimestamp;
NTableClient::TTableSchemaPtr TableSchema;
+ i64 MaxDataWeight = 1_GB;
+ IReservingMemoryUsageTrackerPtr MemoryTracker;
};
struct TPullRowsResult
diff --git a/yt/yt/client/chunk_client/chunk_replica-inl.h b/yt/yt/client/chunk_client/chunk_replica-inl.h
index 38871e8dfa..473f6bab15 100644
--- a/yt/yt/client/chunk_client/chunk_replica-inl.h
+++ b/yt/yt/client/chunk_client/chunk_replica-inl.h
@@ -6,6 +6,10 @@
#include <yt/yt/client/object_client/helpers.h>
+#include <library/cpp/yt/logging/logger.h>
+
+#include "private.h"
+
namespace NYT::NChunkClient {
////////////////////////////////////////////////////////////////////////////////
@@ -213,60 +217,128 @@ inline bool IsPhysicalChunkId(TChunkId id)
return IsPhysicalChunkType(NObjectClient::TypeFromId(id));
}
-inline bool IsJournalChunkType(NObjectClient::EObjectType type)
+inline bool IsJournalChunkTypeImpl(NObjectClient::EObjectType type)
{
return
type == NObjectClient::EObjectType::JournalChunk ||
type == NObjectClient::EObjectType::ErasureJournalChunk;
}
+inline bool IsJournalChunkType(NObjectClient::EObjectType type)
+{
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsJournalChunkType (Type: %v)",
+ type);
+ return IsJournalChunkTypeImpl(type);
+}
+
inline bool IsJournalChunkId(TChunkId id)
{
- return IsJournalChunkType(NObjectClient::TypeFromId(id));
+ auto type = NObjectClient::TypeFromId(id);
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsJournalChunkId (ChunkId: %v)",
+ id);
+ return IsJournalChunkTypeImpl(type);
}
-inline bool IsBlobChunkType(NObjectClient::EObjectType type)
+inline bool IsBlobChunkTypeImpl(NObjectClient::EObjectType type)
{
return
type == NObjectClient::EObjectType::Chunk ||
type == NObjectClient::EObjectType::ErasureChunk;
}
+inline bool IsBlobChunkType(NObjectClient::EObjectType type)
+{
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsBlobChunkType (Type: %v)",
+ type);
+ return IsBlobChunkTypeImpl(type);
+}
+
inline bool IsBlobChunkId(TChunkId id)
{
- return IsBlobChunkType(NObjectClient::TypeFromId(id));
+ auto type = NObjectClient::TypeFromId(id);
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsBlobChunkId (ChunkId: %v)",
+ id);
+ return IsBlobChunkTypeImpl(type);
}
-inline bool IsErasureChunkType(NObjectClient::EObjectType type)
+inline bool IsErasureChunkTypeImpl(NObjectClient::EObjectType type)
{
return
type == NObjectClient::EObjectType::ErasureChunk ||
type == NObjectClient::EObjectType::ErasureJournalChunk;
}
-inline bool IsErasureChunkId(TChunkId id)
+inline bool IsErasureChunkType(NObjectClient::EObjectType type)
{
- return IsErasureChunkType(NObjectClient::TypeFromId(id));
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsErasureChunkType (Type: %v)",
+ type);
+ return IsErasureChunkTypeImpl(type);
}
-inline bool IsErasureChunkPartId(TChunkId id)
+inline bool IsErasureChunkId(TChunkId id)
{
auto type = NObjectClient::TypeFromId(id);
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsErasureChunkId (ChunkId: %v)",
+ id);
+ return IsErasureChunkTypeImpl(type);
+}
+
+inline bool IsErasureChunkPartType(NObjectClient::EObjectType type)
+{
return
type >= NObjectClient::MinErasureChunkPartType && type <= NObjectClient::MaxErasureChunkPartType ||
type >= NObjectClient::MinErasureJournalChunkPartType && type <= NObjectClient::MaxErasureJournalChunkPartType;
}
-inline bool IsRegularChunkType(NObjectClient::EObjectType type)
+inline bool IsErasureChunkPartId(TChunkId id)
+{
+ return IsErasureChunkPartType(NObjectClient::TypeFromId(id));
+}
+
+inline bool IsRegularChunkTypeImpl(NObjectClient::EObjectType type)
{
return
type == NObjectClient::EObjectType::Chunk ||
type == NObjectClient::EObjectType::JournalChunk;
}
+inline bool IsRegularChunkType(NObjectClient::EObjectType type)
+{
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsRegularChunkType (Type: %v)",
+ type);
+ return IsRegularChunkTypeImpl(type);
+}
+
inline bool IsRegularChunkId(TChunkId id)
{
- return IsRegularChunkType(NObjectClient::TypeFromId(id));
+ auto type = NObjectClient::TypeFromId(id);
+ constexpr auto& Logger = ChunkClientLogger;
+ YT_LOG_ALERT_IF(
+ IsErasureChunkPartType(type),
+ "Erasure chunk part type passed to IsRegularChunkId (ChunkId: %v)",
+ id);
+ return IsRegularChunkTypeImpl(type);
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/client/chunk_client/chunk_replica.h b/yt/yt/client/chunk_client/chunk_replica.h
index e11a7b23e8..bc61c40be3 100644
--- a/yt/yt/client/chunk_client/chunk_replica.h
+++ b/yt/yt/client/chunk_client/chunk_replica.h
@@ -200,6 +200,9 @@ bool IsErasureChunkType(NObjectClient::EObjectType type);
bool IsErasureChunkId(TChunkId id);
//! Returns |true| iff this is an erasure chunk part.
+bool IsErasureChunkPartType(NObjectClient::EObjectType type);
+
+//! Returns |true| iff this is an erasure chunk part.
bool IsErasureChunkPartId(TChunkId id);
//! Returns |true| iff this is a regular (not erasure) chunk.
diff --git a/yt/yt/client/chunk_client/private.h b/yt/yt/client/chunk_client/private.h
new file mode 100644
index 0000000000..94046385ff
--- /dev/null
+++ b/yt/yt/client/chunk_client/private.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "public.h"
+
+#include <yt/yt/core/logging/log.h>
+
+namespace NYT::NChunkClient {
+
+////////////////////////////////////////////////////////////////////////////////
+
+YT_DEFINE_GLOBAL(const NLogging::TLogger, ChunkClientLogger, "ChunkClient");
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NChunkClient
+
diff --git a/yt/yt/client/complex_types/check_type_compatibility.cpp b/yt/yt/client/complex_types/check_type_compatibility.cpp
index bcfe503860..5d5ecf70b2 100644
--- a/yt/yt/client/complex_types/check_type_compatibility.cpp
+++ b/yt/yt/client/complex_types/check_type_compatibility.cpp
@@ -352,10 +352,7 @@ TCompatibilityPair CheckDecimalTypeCompatibility(
}
}
-// Returns pair:
-// 1. Inner element that is neither optional nor tagged.
-// 2. How many times this element is wrapped into Optional type.
-static std::pair<TComplexTypeFieldDescriptor, int> UnwrapOptionalAndTagged(const TComplexTypeFieldDescriptor& descriptor)
+std::pair<TComplexTypeFieldDescriptor, int> UnwrapOptionalAndTagged(const TComplexTypeFieldDescriptor& descriptor)
{
int nesting = 0;
auto current = descriptor;
diff --git a/yt/yt/client/complex_types/check_type_compatibility.h b/yt/yt/client/complex_types/check_type_compatibility.h
index 086f1d9134..2895cbc779 100644
--- a/yt/yt/client/complex_types/check_type_compatibility.h
+++ b/yt/yt/client/complex_types/check_type_compatibility.h
@@ -8,12 +8,18 @@ namespace NYT::NComplexTypes {
////////////////////////////////////////////////////////////////////////////////
+// Returns pair:
+// 1. Inner element that is neither optional nor tagged.
+// 2. How many times this element is wrapped into Optional type.
+std::pair<NTableClient::TComplexTypeFieldDescriptor, int> UnwrapOptionalAndTagged(
+ const NTableClient::TComplexTypeFieldDescriptor& descriptor);
+
// Returned value is pair with elements
// 1. Compatibility of types.
// 2. If types are NOT FullyCompatible, error contains description of incompatibility.
std::pair<NTableClient::ESchemaCompatibility, TError> CheckTypeCompatibility(
- const NYT::NTableClient::TLogicalTypePtr& oldType,
- const NYT::NTableClient::TLogicalTypePtr& newType);
+ const NTableClient::TLogicalTypePtr& oldType,
+ const NTableClient::TLogicalTypePtr& newType);
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/client/complex_types/merge_complex_types.cpp b/yt/yt/client/complex_types/merge_complex_types.cpp
new file mode 100644
index 0000000000..032a0ff569
--- /dev/null
+++ b/yt/yt/client/complex_types/merge_complex_types.cpp
@@ -0,0 +1,333 @@
+#include "merge_complex_types.h"
+
+#include "check_type_compatibility.h"
+
+#include <yt/yt/client/table_client/logical_type.h>
+
+namespace NYT::NComplexTypes {
+
+using namespace NYT::NTableClient;
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace {
+
+std::vector<TLogicalTypePtr> MergeTupleTypes(
+ const TComplexTypeFieldDescriptor& firstDescriptor,
+ const TComplexTypeFieldDescriptor& secondDescriptor)
+{
+ YT_VERIFY(firstDescriptor.GetType()->GetMetatype() == ELogicalMetatype::Tuple
+ || firstDescriptor.GetType()->GetMetatype() == ELogicalMetatype::VariantTuple);
+
+ YT_VERIFY(firstDescriptor.GetType()->GetMetatype() == secondDescriptor.GetType()->GetMetatype());
+
+ auto allowNewElements = firstDescriptor.GetType()->GetMetatype() == ELogicalMetatype::VariantTuple;
+
+ auto firstSize = std::ssize(firstDescriptor.GetType()->GetElements());
+ auto secondSize = std::ssize(secondDescriptor.GetType()->GetElements());
+
+ if (firstSize > secondSize) {
+ return MergeTupleTypes(
+ secondDescriptor,
+ firstDescriptor);
+ }
+
+ if (!allowNewElements && firstSize != secondSize) {
+ THROW_ERROR_EXCEPTION(
+ "Tuple type of fields %Qv and %Qv of different size cannot be merged",
+ firstDescriptor.GetDescription(),
+ secondDescriptor.GetDescription());
+ }
+
+ std::vector<TLogicalTypePtr> resultElements;
+ resultElements.reserve(secondSize);
+
+ int elementIndex = 0;
+ for (; elementIndex < firstSize; ++elementIndex) {
+ auto mergedType = MergeTypes(
+ firstDescriptor.Element(elementIndex).GetType(),
+ secondDescriptor.Element(elementIndex).GetType());
+
+ resultElements.push_back(std::move(mergedType));
+ }
+ for (; elementIndex < secondSize; ++elementIndex) {
+ resultElements.push_back(secondDescriptor.Element(elementIndex).GetType());
+ }
+ return resultElements;
+}
+
+std::vector<TStructField> MergeStructTypes(
+ const TComplexTypeFieldDescriptor& firstDescriptor,
+ const TComplexTypeFieldDescriptor& secondDescriptor)
+{
+ YT_VERIFY(firstDescriptor.GetType()->GetMetatype() == ELogicalMetatype::Struct
+ || firstDescriptor.GetType()->GetMetatype() == ELogicalMetatype::VariantStruct);
+
+ YT_VERIFY(firstDescriptor.GetType()->GetMetatype() == secondDescriptor.GetType()->GetMetatype());
+
+ auto firstFields = firstDescriptor.GetType()->GetFields();
+ auto secondFields = secondDescriptor.GetType()->GetFields();
+
+ auto firstSize = std::ssize(firstFields);
+ auto secondSize = std::ssize(secondFields);
+
+ if (firstSize > secondSize) {
+ return MergeStructTypes(secondDescriptor, firstDescriptor);
+ }
+
+ auto makeNullability = firstDescriptor.GetType()->GetMetatype() == ELogicalMetatype::Struct;
+
+ std::vector<TStructField> resultFields;
+ resultFields.reserve(secondSize);
+
+ ssize_t fieldIndex = 0;
+ for (; fieldIndex < firstSize; ++fieldIndex) {
+ const auto& firstName = firstFields[fieldIndex].Name;
+ const auto& secondName = secondFields[fieldIndex].Name;
+ if (firstName != secondName) {
+ THROW_ERROR_EXCEPTION(
+ "Struct member name mismatch in %Qv",
+ firstDescriptor.GetDescription())
+ << TErrorAttribute("first_name", firstName)
+ << TErrorAttribute("second_name", secondName);
+ }
+ const auto& firstFieldDescriptor = firstDescriptor.Field(fieldIndex);
+ const auto& secondFieldDescriptor = secondDescriptor.Field(fieldIndex);
+ try {
+ auto mergedField = MergeTypes(
+ firstFieldDescriptor.GetType(),
+ secondFieldDescriptor.GetType());
+ resultFields.push_back(TStructField{
+ .Name = firstName,
+ .Type = std::move(mergedField),
+ });
+ } catch (const std::exception& ex) {
+ THROW_ERROR_EXCEPTION(
+ "Struct member type mismatch in %Qv",
+ firstDescriptor.GetDescription())
+ << ex;
+ }
+ }
+
+ for (; fieldIndex < secondSize; ++fieldIndex) {
+ const auto& secondFieldDescriptor = secondDescriptor.Field(fieldIndex);
+ if (!secondFieldDescriptor.GetType()->IsNullable() && makeNullability) {
+ resultFields.push_back(TStructField{
+ .Name = secondFields[fieldIndex].Name,
+ .Type = New<TOptionalLogicalType>(secondFieldDescriptor.GetType()),
+ });
+ } else {
+ resultFields.push_back(secondFields[fieldIndex]);
+ }
+ }
+
+ return resultFields;
+}
+
+TLogicalTypePtr MergeDictTypes(
+ const TComplexTypeFieldDescriptor& firstDescriptor,
+ const TComplexTypeFieldDescriptor& secondDescriptor)
+{
+ auto mergedKey = MergeTypes(
+ firstDescriptor.DictKey().GetType(),
+ secondDescriptor.DictKey().GetType());
+
+ auto mergedValue = MergeTypes(
+ firstDescriptor.DictValue().GetType(),
+ secondDescriptor.DictValue().GetType());
+
+ return New<TDictLogicalType>(std::move(mergedKey), std::move(mergedValue));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TLogicalTypePtr UnwrapOptionalType(const TLogicalTypePtr& type)
+{
+ if (type->GetMetatype() == ELogicalMetatype::Optional) {
+ auto descriptor = TComplexTypeFieldDescriptor(type);
+ return descriptor.OptionalElement().GetType();
+ }
+ return type;
+}
+
+TLogicalTypePtr UnwrapTaggedType(const TLogicalTypePtr& type)
+{
+ if (type->GetMetatype() == ELogicalMetatype::Tagged) {
+ auto descriptor = TComplexTypeFieldDescriptor(type);
+ return descriptor.TaggedElement().GetType();
+ }
+ return type;
+}
+
+TString GetTag(const TLogicalTypePtr& type)
+{
+ return type->AsTaggedTypeRef().GetTag();
+}
+
+TString ExtractTagFromOneOfTypes(
+ const TLogicalTypePtr& firstType,
+ const TLogicalTypePtr& secondType)
+{
+ if (firstType->GetMetatype() == ELogicalMetatype::Tagged) {
+ return GetTag(firstType);
+ } else if (secondType->GetMetatype() == ELogicalMetatype::Tagged) {
+ return GetTag(secondType);
+ }
+ YT_ABORT();
+}
+
+} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+
+TLogicalTypePtr MergeTypes(
+ const TLogicalTypePtr& firstType,
+ const TLogicalTypePtr& secondType)
+{
+ auto firstDescriptor = TComplexTypeFieldDescriptor(firstType);
+ auto secondDescriptor = TComplexTypeFieldDescriptor(secondType);
+
+ const auto firstMetatype = firstDescriptor.GetType()->GetMetatype();
+ const auto secondMetatype = secondDescriptor.GetType()->GetMetatype();
+
+ // It needs to handle tag before optional.
+ if (firstMetatype == ELogicalMetatype::Tagged
+ || secondMetatype == ELogicalMetatype::Tagged)
+ {
+ if (firstMetatype == ELogicalMetatype::Tagged
+ && secondMetatype == ELogicalMetatype::Tagged
+ && GetTag(firstType) != GetTag(secondType))
+ {
+ THROW_ERROR_EXCEPTION(
+ "The type tags do not match: first tag %Qv and second tag %Qv in %Qv",
+ GetTag(firstType),
+ GetTag(secondType),
+ firstDescriptor.GetDescription());
+ }
+ auto mergedType = MergeTypes(
+ UnwrapTaggedType(firstType),
+ UnwrapTaggedType(secondType));
+
+ return New<TTaggedLogicalType>(
+ ExtractTagFromOneOfTypes(firstType, secondType),
+ std::move(mergedType));
+ }
+
+ if (firstMetatype == ELogicalMetatype::Optional
+ || secondMetatype == ELogicalMetatype::Optional)
+ {
+ int firstLayerCount = UnwrapOptionalAndTagged(firstDescriptor).second;
+ int secondLayerCount = UnwrapOptionalAndTagged(secondDescriptor).second;
+
+ if (firstLayerCount != secondLayerCount && (firstLayerCount > 1 || secondLayerCount > 1)) {
+ THROW_ERROR_EXCEPTION(
+ "Type of fields %Qv and %Qv cannot be merged",
+ firstDescriptor.GetDescription(),
+ secondDescriptor.GetDescription())
+ << TErrorAttribute("first_type", ToString(*firstDescriptor.GetType()))
+ << TErrorAttribute("second_type", ToString(*secondDescriptor.GetType()));
+ }
+
+ auto mergedType = MergeTypes(
+ UnwrapOptionalType(firstType),
+ UnwrapOptionalType(secondType));
+
+ return New<TOptionalLogicalType>(std::move(mergedType));
+ }
+
+ if (firstMetatype != secondMetatype) {
+ THROW_ERROR_EXCEPTION(
+ "Type of %Qv field cannot be merged: metatypes are incompatible",
+ firstDescriptor.GetDescription())
+ << TErrorAttribute("first_type", ToString(*firstDescriptor.GetType()))
+ << TErrorAttribute("second_type", ToString(*secondDescriptor.GetType()));
+ }
+
+ switch (firstMetatype) {
+ case ELogicalMetatype::Simple:
+ {
+ if (CheckTypeCompatibility(firstType, secondType).first == ESchemaCompatibility::FullyCompatible) {
+ return secondType;
+ }
+ if (CheckTypeCompatibility(secondType, firstType).first == ESchemaCompatibility::FullyCompatible) {
+ return firstType;
+ }
+ THROW_ERROR_EXCEPTION(
+ "Type of fields %Qv and %Qv cannot be merged",
+ firstDescriptor.GetDescription(),
+ secondDescriptor.GetDescription())
+ << TErrorAttribute("first_type", ToString(*firstDescriptor.GetType()))
+ << TErrorAttribute("second_type", ToString(*secondDescriptor.GetType()));
+
+ }
+ case ELogicalMetatype::List:
+ {
+ auto mergedType = MergeTypes(
+ firstType->AsListTypeRef().GetElement(),
+ secondType->AsListTypeRef().GetElement());
+
+ return New<TListLogicalType>(mergedType);
+ }
+ case ELogicalMetatype::VariantStruct:
+ {
+ auto mergedFields = MergeStructTypes(
+ firstDescriptor,
+ secondDescriptor);
+
+ return New<TVariantStructLogicalType>(mergedFields);
+ }
+
+ case ELogicalMetatype::Struct:
+ {
+ auto mergedFields = MergeStructTypes(
+ firstDescriptor,
+ secondDescriptor);
+
+ return New<TStructLogicalType>(mergedFields);
+ }
+
+ case ELogicalMetatype::Tuple:
+ {
+ auto mergedElements = MergeTupleTypes(
+ firstDescriptor,
+ secondDescriptor);
+
+ return New<TTupleLogicalType>(mergedElements);
+ }
+
+ case ELogicalMetatype::VariantTuple:
+ {
+ auto mergedElements = MergeTupleTypes(
+ firstDescriptor,
+ secondDescriptor);
+
+ return New<TVariantTupleLogicalType>(mergedElements);
+ }
+
+ case ELogicalMetatype::Dict:
+ return MergeDictTypes(firstDescriptor, secondDescriptor);
+
+ case ELogicalMetatype::Decimal:
+ {
+ if (*firstDescriptor.GetType() == *secondDescriptor.GetType()) {
+ return firstType;
+ } else {
+ THROW_ERROR_EXCEPTION(
+ "Type of fields %Qv and %Qv cannot be merged",
+ firstDescriptor.GetDescription(),
+ secondDescriptor.GetDescription())
+ << TErrorAttribute("first_type", ToString(*firstDescriptor.GetType()))
+ << TErrorAttribute("second_type", ToString(*secondDescriptor.GetType()));
+ }
+ }
+
+ case ELogicalMetatype::Optional:
+ case ELogicalMetatype::Tagged:
+ // Optional and Tagged cases were checked earlier in this function.
+ YT_ABORT();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NComplexTypes
diff --git a/yt/yt/client/complex_types/merge_complex_types.h b/yt/yt/client/complex_types/merge_complex_types.h
new file mode 100644
index 0000000000..7f891b5e94
--- /dev/null
+++ b/yt/yt/client/complex_types/merge_complex_types.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <yt/yt/client/table_client/public.h>
+
+namespace NYT::NComplexTypes {
+
+////////////////////////////////////////////////////////////////////////////////
+
+NTableClient::TLogicalTypePtr MergeTypes(
+ const NTableClient::TLogicalTypePtr& firstType,
+ const NTableClient::TLogicalTypePtr& secondType);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NComplexTypes
diff --git a/yt/yt/client/object_client/helpers.h b/yt/yt/client/object_client/helpers.h
index 997d6fc337..f590b095d0 100644
--- a/yt/yt/client/object_client/helpers.h
+++ b/yt/yt/client/object_client/helpers.h
@@ -10,7 +10,6 @@
#include <yt/yt/core/rpc/public.h>
-
namespace NYT::NObjectClient {
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/client/table_client/config.cpp b/yt/yt/client/table_client/config.cpp
index 9cd233a43a..e704705cf2 100644
--- a/yt/yt/client/table_client/config.cpp
+++ b/yt/yt/client/table_client/config.cpp
@@ -459,6 +459,8 @@ void TChunkWriterOptions::Register(TRegistrar registrar)
.Default(true);
registrar.Parameter("enable_segment_meta_in_blocks", &TThis::EnableSegmentMetaInBlocks)
.Default(false);
+ registrar.Parameter("enable_column_meta_in_chunk_meta", &TThis::EnableColumnMetaInChunkMeta)
+ .Default(true);
registrar.Parameter("schema_modification", &TThis::SchemaModification)
.Default(ETableSchemaModification::None);
@@ -502,6 +504,9 @@ void TChunkWriterOptions::Register(TRegistrar registrar)
if (config->ChunkFormat) {
ValidateTableChunkFormatAndOptimizeFor(*config->ChunkFormat, config->OptimizeFor);
}
+
+ THROW_ERROR_EXCEPTION_IF(!config->EnableColumnMetaInChunkMeta && !config->EnableSegmentMetaInBlocks,
+ "At least one of \"enable_column_meta_in_chunk_meta\" or \"enable_segment_meta_in_blocks\" must be true");
});
}
diff --git a/yt/yt/client/table_client/config.h b/yt/yt/client/table_client/config.h
index 9423012fa4..95f5900851 100644
--- a/yt/yt/client/table_client/config.h
+++ b/yt/yt/client/table_client/config.h
@@ -425,6 +425,7 @@ public:
bool EnableColumnarValueStatistics;
bool EnableRowCountInColumnarStatistics;
bool EnableSegmentMetaInBlocks;
+ bool EnableColumnMetaInChunkMeta;
NYTree::INodePtr CastAnyToCompositeNode;
diff --git a/yt/yt/client/table_client/merge_table_schemas.cpp b/yt/yt/client/table_client/merge_table_schemas.cpp
new file mode 100644
index 0000000000..40b55bb519
--- /dev/null
+++ b/yt/yt/client/table_client/merge_table_schemas.cpp
@@ -0,0 +1,132 @@
+#include "merge_table_schemas.h"
+
+#include "check_schema_compatibility.h"
+#include "comparator.h"
+#include "logical_type.h"
+#include "schema.h"
+
+#include <yt/yt/client/complex_types/check_type_compatibility.h>
+#include <yt/yt/client/complex_types/merge_complex_types.h>
+
+#include <yt/yt/core/ytree/convert.h>
+
+namespace NYT::NTableClient {
+
+using namespace NComplexTypes;
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace {
+
+TColumnSchema MakeOptionalSchema(const TColumnSchema& columnSchema)
+{
+ if (columnSchema.LogicalType()->GetMetatype() == ELogicalMetatype::Optional) {
+ return columnSchema;
+ }
+ auto optionalType = New<TOptionalLogicalType>(columnSchema.LogicalType());
+ auto resultSchema = TColumnSchema(
+ columnSchema.Name(),
+ optionalType,
+ columnSchema.SortOrder());
+ resultSchema.SetStableName(columnSchema.StableName());
+ return resultSchema;
+}
+
+} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+
+TTableSchemaPtr MergeTableSchemas(
+ const TTableSchemaPtr& firstSchema,
+ const TTableSchemaPtr& secondSchema)
+{
+ std::vector<TColumnSchema> resultColumns;
+ resultColumns.reserve(std::max(secondSchema->Columns().size(), firstSchema->Columns().size()));
+
+ for (const auto& secondSchemaColumn : secondSchema->Columns()) {
+ const auto* firstSchemaColumn = firstSchema->FindColumn(secondSchemaColumn.Name());
+
+ if (firstSchemaColumn) {
+ if (firstSchemaColumn->StableName() != secondSchemaColumn.StableName()) {
+ THROW_ERROR_EXCEPTION("Mismatching stable names in column %Qv: %Qv and %Qv",
+ firstSchemaColumn->Name(),
+ firstSchemaColumn->StableName(),
+ secondSchemaColumn.StableName());
+ }
+ if (firstSchemaColumn->SortOrder() != secondSchemaColumn.SortOrder()) {
+ THROW_ERROR_EXCEPTION("Mismatching sort orders in column %Qv: %Qv and %Qv",
+ firstSchemaColumn->Name());
+ }
+
+ try {
+ auto mergedType = MergeTypes(
+ firstSchemaColumn->LogicalType(),
+ secondSchemaColumn.LogicalType());
+
+ auto resultSchema = TColumnSchema(
+ firstSchemaColumn->Name(),
+ mergedType,
+ firstSchemaColumn->SortOrder());
+
+ resultSchema.SetStableName(firstSchemaColumn->StableName());
+ resultColumns.push_back(std::move(resultSchema));
+
+ } catch(const std::exception& ex) {
+ THROW_ERROR_EXCEPTION(
+ "Column %v first schema type is incompatible with second schema type",
+ firstSchemaColumn->GetDiagnosticNameString())
+ << ex;
+ }
+
+ } else if (!firstSchema->GetStrict()) {
+ THROW_ERROR_EXCEPTION("Column %v is present in second schema and is missing in non-strict first schema",
+ secondSchemaColumn.GetDiagnosticNameString());
+ } else {
+ resultColumns.push_back(MakeOptionalSchema(secondSchemaColumn));
+ }
+ }
+
+ for (const auto& firstSchemaColumn : firstSchema->Columns()) {
+ if (!secondSchema->FindColumn(firstSchemaColumn.Name())) {
+ if (!secondSchema->GetStrict()) {
+ THROW_ERROR_EXCEPTION("Column %v is present in first schema and is missing in non-strict second schema",
+ firstSchemaColumn.GetDiagnosticNameString());
+ }
+ resultColumns.push_back(MakeOptionalSchema(firstSchemaColumn));
+ }
+ }
+
+ auto getDeletedColumnsStableNames = [] (const std::vector<TDeletedColumn>& deletedColumns) {
+ THashSet<TColumnStableName> stableNames;
+ for (const auto& column: deletedColumns) {
+ stableNames.insert(column.StableName());
+ }
+ return stableNames;
+ };
+
+ auto firstDeletedStableNames = getDeletedColumnsStableNames(firstSchema->DeletedColumns());
+ auto secondDeletedStableNames = getDeletedColumnsStableNames(secondSchema->DeletedColumns());
+
+ if (firstDeletedStableNames == secondDeletedStableNames) {
+ // If the deleted columns completely match, then the table can be teleported.
+ return {
+ New<TTableSchema>(
+ resultColumns,
+ /*strict*/ firstSchema->GetStrict() && secondSchema->GetStrict(),
+ firstSchema->GetUniqueKeys() && secondSchema->GetUniqueKeys(),
+ ETableSchemaModification::None,
+ firstSchema->DeletedColumns())
+ };
+ } else {
+ return {
+ New<TTableSchema>(
+ resultColumns,
+ /*strict*/ firstSchema->GetStrict() && secondSchema->GetStrict(),
+ firstSchema->GetUniqueKeys() && secondSchema->GetUniqueKeys())
+ };
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NTableClient
diff --git a/yt/yt/client/table_client/merge_table_schemas.h b/yt/yt/client/table_client/merge_table_schemas.h
new file mode 100644
index 0000000000..af2f37553f
--- /dev/null
+++ b/yt/yt/client/table_client/merge_table_schemas.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "public.h"
+
+namespace NYT::NTableClient {
+
+////////////////////////////////////////////////////////////////////////////////
+
+// Create schema that match both two schemas.
+TTableSchemaPtr MergeTableSchemas(
+ const TTableSchemaPtr& firstSchema,
+ const TTableSchemaPtr& secondSchema);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NTableClient
diff --git a/yt/yt/client/table_client/schema.cpp b/yt/yt/client/table_client/schema.cpp
index 747ce5feb1..bc4838f069 100644
--- a/yt/yt/client/table_client/schema.cpp
+++ b/yt/yt/client/table_client/schema.cpp
@@ -751,7 +751,14 @@ bool TTableSchema::IsEmpty() const
bool TTableSchema::IsCGComparatorApplicable() const
{
- return GetKeyColumnCount() <= MaxKeyColumnCountInDynamicTable;
+ if (GetKeyColumnCount() > MaxKeyColumnCountInDynamicTable) {
+ return false;
+ }
+
+ auto keyTypes = GetKeyColumnTypes();
+ return std::none_of(keyTypes.begin(), keyTypes.end(), [] (auto type) {
+ return type == EValueType::Any;
+ });
}
std::optional<int> TTableSchema::GetTtlColumnIndex() const
diff --git a/yt/yt/client/tablet_client/public.h b/yt/yt/client/tablet_client/public.h
index 971ac916bc..332a877a6d 100644
--- a/yt/yt/client/tablet_client/public.h
+++ b/yt/yt/client/tablet_client/public.h
@@ -227,6 +227,7 @@ DEFINE_ENUM(ESecondaryIndexKind,
DEFINE_ENUM(ERowMergerType,
((Legacy) (0))
((Watermark) (1))
+ ((New) (2))
);
extern const TString CustomRuntimeDataWatermarkKey;
diff --git a/yt/yt/client/unittests/mock/table_reader.cpp b/yt/yt/client/unittests/mock/table_reader.cpp
new file mode 100644
index 0000000000..364381127c
--- /dev/null
+++ b/yt/yt/client/unittests/mock/table_reader.cpp
@@ -0,0 +1,27 @@
+#include "table_reader.h"
+
+#include <yt/yt/client/table_client/name_table.h>
+#include <yt/yt/client/table_client/schema.h>
+
+namespace NYT::NApi {
+
+////////////////////////////////////////////////////////////////////////////////
+
+TMockTableReader::TMockTableReader(const NTableClient::TTableSchemaPtr& schema)
+ : Schema_(schema)
+ , NameTable_(NTableClient::TNameTable::FromSchema(*Schema_))
+{}
+
+const NTableClient::TNameTablePtr& TMockTableReader::GetNameTable() const
+{
+ return NameTable_;
+}
+
+const NTableClient::TTableSchemaPtr& TMockTableReader::GetTableSchema() const
+{
+ return Schema_;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NApi
diff --git a/yt/yt/client/unittests/mock/table_reader.h b/yt/yt/client/unittests/mock/table_reader.h
new file mode 100644
index 0000000000..7a8cf9825c
--- /dev/null
+++ b/yt/yt/client/unittests/mock/table_reader.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <library/cpp/testing/gtest_extensions/gtest_extensions.h>
+
+#include <yt/yt/client/api/table_reader.h>
+
+namespace NYT::NApi {
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TMockTableReader
+ : public ITableReader
+{
+public:
+ TMockTableReader(const NTableClient::TTableSchemaPtr& schema);
+
+ MOCK_METHOD(i64, GetStartRowIndex, (), (const, override));
+
+ MOCK_METHOD(i64, GetTotalRowCount, (), (const, override));
+
+ MOCK_METHOD(NChunkClient::NProto::TDataStatistics, GetDataStatistics, (), (const, override));
+
+ MOCK_METHOD(TFuture<void>, GetReadyEvent, (), (override));
+
+ MOCK_METHOD(NTableClient::IUnversionedRowBatchPtr, Read, (const NTableClient::TRowBatchReadOptions& options), (override));
+
+ MOCK_METHOD(const std::vector<TString>&, GetOmittedInaccessibleColumns, (), (const, override));
+
+ const NTableClient::TNameTablePtr& GetNameTable() const override;
+
+ const NTableClient::TTableSchemaPtr& GetTableSchema() const override;
+
+private:
+ NTableClient::TTableSchemaPtr Schema_;
+ NTableClient::TNameTablePtr NameTable_;
+};
+
+DEFINE_REFCOUNTED_TYPE(TMockTableReader);
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NApi
diff --git a/yt/yt/client/unittests/mock/ya.make b/yt/yt/client/unittests/mock/ya.make
index bcc6df7a0c..9fa88a6aa5 100644
--- a/yt/yt/client/unittests/mock/ya.make
+++ b/yt/yt/client/unittests/mock/ya.make
@@ -4,6 +4,7 @@ INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
SRCS(
client.cpp
+ table_reader.cpp
)
PEERDIR(
diff --git a/yt/yt/client/ya.make b/yt/yt/client/ya.make
index ebb3eefbaf..1886973025 100644
--- a/yt/yt/client/ya.make
+++ b/yt/yt/client/ya.make
@@ -124,6 +124,7 @@ SRCS(
table_client/schemaless_dynamic_table_writer.cpp
table_client/serialize.cpp
table_client/logical_type.cpp
+ table_client/merge_table_schemas.cpp
table_client/name_table.cpp
table_client/wire_protocol.cpp
table_client/columnar_statistics.cpp
@@ -177,9 +178,10 @@ SRCS(
complex_types/check_yson_token.cpp
complex_types/check_type_compatibility.cpp
complex_types/infinite_entity.cpp
- complex_types/yson_format_conversion.cpp
- complex_types/uuid_text.cpp
+ complex_types/merge_complex_types.cpp
complex_types/time_text.cpp
+ complex_types/uuid_text.cpp
+ complex_types/yson_format_conversion.cpp
zookeeper/packet.cpp
zookeeper/protocol.cpp
diff --git a/yt/yt/core/concurrency/async_looper.cpp b/yt/yt/core/concurrency/async_looper.cpp
index 05ad633c1d..9c1b5df73a 100644
--- a/yt/yt/core/concurrency/async_looper.cpp
+++ b/yt/yt/core/concurrency/async_looper.cpp
@@ -12,12 +12,11 @@ TAsyncLooper::TAsyncLooper(
IInvokerPtr invoker,
TCallback<TFuture<void>(bool)> asyncStart,
TCallback<void(bool)> syncFinish,
- TString name,
const NLogging::TLogger& logger)
: Invoker_(std::move(invoker))
, AsyncStart_(std::move(asyncStart))
, SyncFinish_(std::move(syncFinish))
- , Logger(logger.WithTag("Looper: %v", name))
+ , Logger(logger)
{
YT_VERIFY(Invoker_);
YT_VERIFY(Invoker_ != GetSyncInvoker());
@@ -29,7 +28,7 @@ void TAsyncLooper::Start()
{
auto traceContext = NTracing::GetOrCreateTraceContext("LooperStart");
auto traceGuard = NTracing::TCurrentTraceContextGuard(traceContext);
- YT_LOG_DEBUG("Requesting AsyncLooper to start");
+ YT_LOG_DEBUG("Requesting looper to start");
Invoker_->Invoke(
BIND(&TAsyncLooper::DoStart, MakeStrong(this)));
@@ -73,7 +72,7 @@ void TAsyncLooper::DoStart()
// will bail out due to epoch mismatch -> we are free to
// ignore this case on our side.
State_ = EState::Running;
- YT_LOG_DEBUG("Starting the looper");
+ YT_LOG_DEBUG("Starting looper");
StartLoop(/*cleanStart*/ true, guard);
break;
@@ -108,6 +107,9 @@ void TAsyncLooper::StartLoop(bool cleanStart, const TGuard& guard)
// We got canceled -- this is normal.
throw;
} catch (const std::exception& ex) {
+ if (TError(ex).GetCode() == NYT::EErrorCode::Canceled) {
+ throw;
+ }
YT_LOG_FATAL(ex, "Unexpected error encountered during the async step");
} catch (...) {
YT_LOG_FATAL("Unexpected error encountered during the async step");
@@ -220,6 +222,9 @@ void TAsyncLooper::DoStep(bool cleanStart, bool wasRestarted)
// We got canceled -- this is normal.
throw;
} catch (const std::exception& ex) {
+ if (TError(ex).GetCode() == NYT::EErrorCode::Canceled) {
+ throw;
+ }
YT_LOG_FATAL(ex, "Unexpected error encountered during the sync step");
} catch (...) {
YT_LOG_FATAL("Unexpected error encountered during the sync step");
@@ -271,40 +276,45 @@ void TAsyncLooper::FinishStep(bool wasRestarted)
void TAsyncLooper::Stop()
{
- auto guard = Guard(StateLock_);
+ TFuture<void> future;
- if (State_ == EState::NotRunning) {
- // Already stopping
- // -> bail out.
- YT_LOG_DEBUG("Trying to stop looper that is already stopped");
- return;
- }
+ {
+ auto guard = Guard(StateLock_);
- State_ = EState::NotRunning;
- ++EpochNumber_;
- YT_LOG_DEBUG("Stopping the looper");
-
- // We could be in one of three possible situations (for each stage):
- // 1. EStage::AsyncBusy -- |StartLoop| caller will observe
- // state |NotRunning| eventually and will cancel the future for us
- // (or there will be a restart which is also handled by caller above).
- // 2. EStage::Idle -- intermission between async and sync parts
- // -- if there is not restart, sync part will just bail out
- // if there is a restart, sync part will observe a different epoch
- // and bail out as well.
- // 3. EStage::Busy -- sync part is running and will simply not
- // continue the chain once it observes NotRunning state.
-
- if (!Future_) {
- // If there was a null future produced for async part
- // or simply while Stage_ == EStage::AsyncBusy.
- return;
+ if (State_ == EState::NotRunning) {
+ // Already stopping
+ // -> bail out.
+ YT_LOG_DEBUG("Trying to stop looper that is already stopped");
+ return;
+ }
+
+ State_ = EState::NotRunning;
+ ++EpochNumber_;
+ YT_LOG_DEBUG("Stopping the looper");
+
+ // We could be in one of three possible situations (for each stage):
+ // 1. EStage::AsyncBusy -- |StartLoop| caller will observe
+ // state |NotRunning| eventually and will cancel the future for us
+ // (or there will be a restart which is also handled by caller above).
+ // 2. EStage::Idle -- intermission between async and sync parts
+ // -- if there is not restart, sync part will just bail out
+ // if there is a restart, sync part will observe a different epoch
+ // and bail out as well.
+ // 3. EStage::Busy -- sync part is running and will simply not
+ // continue the chain once it observes NotRunning state.
+
+ if (!Future_) {
+ // If there was a null future produced for async part
+ // or simply while Stage_ == EStage::AsyncBusy.
+ return;
+ }
+
+ future = std::exchange(Future_, TFuture<void>());
}
- Future_.Cancel(TError("Looper stopped"));
- Future_.Reset();
+ future.Cancel(TError("Looper stopped"));
}
////////////////////////////////////////////////////////////////////////////////
-} // NYT::NConcurrency
+} // namespace NYT::NConcurrency
diff --git a/yt/yt/core/concurrency/async_looper.h b/yt/yt/core/concurrency/async_looper.h
index 3f356d267b..93b31a7dc8 100644
--- a/yt/yt/core/concurrency/async_looper.h
+++ b/yt/yt/core/concurrency/async_looper.h
@@ -10,11 +10,9 @@ namespace NYT::NConcurrency {
////////////////////////////////////////////////////////////////////////////////
-// Class which indefenetely runs
-// two tasks:
+// Class which indefenetely runs two tasks:
// 1. Async start which creates async action.
-// 2. Sync finish which is called after async action
-// is finished.
+// 2. Sync finish which is called after async action is finished.
// Both are ran in Invoker_.
// Both |Start| and |Stop| are completely
// thread-safe, can be executed in any order and any number of times.
@@ -27,8 +25,7 @@ public:
IInvokerPtr invoker,
TCallback<TFuture<void>(bool cleanStart)> asyncStart,
TCallback<void(bool cleanStart)> syncFinish,
- TString name,
- const NLogging::TLogger& logger = NLogging::TLogger("Looper logger"));
+ const NLogging::TLogger& logger = NLogging::TLogger("AsyncLooper"));
// Starts polling.
// First loop will have cleanStart == true
@@ -41,8 +38,9 @@ public:
private:
const IInvokerPtr Invoker_;
- TCallback<TFuture<void>(bool)> AsyncStart_;
- TCallback<void(bool)> SyncFinish_;
+ const TCallback<TFuture<void>(bool)> AsyncStart_;
+ const TCallback<void(bool)> SyncFinish_;
+ const NLogging::TLogger Logger;
YT_DECLARE_SPIN_LOCK(NYT::NThreading::TSpinLock, StateLock_);
using TGuard = TGuard<NYT::NThreading::TSpinLock>;
@@ -75,8 +73,6 @@ private:
ui64 EpochNumber_ = 0;
TFuture<void> Future_;
- const NLogging::TLogger Logger;
-
void DoStart();
void StartLoop(bool cleanStart, const TGuard& guard);
@@ -89,4 +85,4 @@ DEFINE_REFCOUNTED_TYPE(TAsyncLooper);
////////////////////////////////////////////////////////////////////////////////
-} // NYT::NConcurrency
+} // namespace NYT::NConcurrency
diff --git a/yt/yt/core/concurrency/unittests/async_looper_ut.cpp b/yt/yt/core/concurrency/unittests/async_looper_ut.cpp
index 0b48079a90..ca9d9fe2d1 100644
--- a/yt/yt/core/concurrency/unittests/async_looper_ut.cpp
+++ b/yt/yt/core/concurrency/unittests/async_looper_ut.cpp
@@ -7,13 +7,13 @@
#include <library/cpp/yt/threading/event_count.h>
+#include <thread>
+
namespace NYT::NConcurrency {
namespace {
////////////////////////////////////////////////////////////////////////////////
-const TString LooperName = "TestLooper";
-
// TODO(arkady-e1ppa): Add ManualInvoker which only runs callbacks when
// manually requested. Add test when Stop/Restart occurs during the
// intermission between Async and Sync steps.
@@ -22,13 +22,13 @@ TEST(TAsyncLooperTest, JustWorks)
{
auto queue = New<TActionQueue>();
- TCallback asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
VERIFY_INVOKER_AFFINITY(invoker);
return BIND([] {}).AsyncVia(invoker).Run();
});
auto progress = std::make_shared<std::atomic<int>>(0);
- TCallback syncFinish = BIND([progress, invoker = queue->GetInvoker()] (bool) {
+ auto syncFinish = BIND([progress, invoker = queue->GetInvoker()] (bool) {
VERIFY_INVOKER_AFFINITY(invoker);
progress->fetch_add(1);
});
@@ -38,19 +38,22 @@ TEST(TAsyncLooperTest, JustWorks)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
Sleep(TDuration::Seconds(1));
EXPECT_EQ(currentProgress, progress->load());
looper->Start();
- while (currentProgress == progress->load());
+ while (currentProgress == progress->load()) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
currentProgress = progress->load();
- while (currentProgress == progress->load());
+ while (currentProgress == progress->load()) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
@@ -59,12 +62,12 @@ TEST(TAsyncLooperTest, Restart)
{
auto queue = New<TActionQueue>();
- TCallback asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
return BIND([] {}).AsyncVia(invoker).Run();
});
auto cleanStarts = std::make_shared<std::atomic<int>>(0);
- TCallback syncFinish = BIND([cleanStarts] (bool cleanStart) {
+ auto syncFinish = BIND([cleanStarts] (bool cleanStart) {
if (cleanStart) {
cleanStarts->fetch_add(1);
}
@@ -73,12 +76,13 @@ TEST(TAsyncLooperTest, Restart)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
- while (cleanStarts->load() == 0);
+ while (cleanStarts->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
EXPECT_EQ(cleanStarts->load(), 1);
@@ -90,7 +94,9 @@ TEST(TAsyncLooperTest, Restart)
looper->Start();
- while (cleanStarts->load() == 1);
+ while (cleanStarts->load() == 1) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
EXPECT_EQ(cleanStarts->load(), 2);
@@ -104,7 +110,7 @@ TEST(TAsyncLooperTest, CancelAsyncStep)
NThreading::TEvent started;
auto promise = NewPromise<void>();
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), promise, &started] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), promise, &started] (bool) {
return BIND([promise, &started] {
started.NotifyAll();
WaitFor(promise.ToFuture())
@@ -112,14 +118,13 @@ TEST(TAsyncLooperTest, CancelAsyncStep)
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([] (bool) {
+ auto syncFinish = BIND([] (bool) {
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -137,12 +142,12 @@ TEST(TAsyncLooperTest, CancelSyncStep)
NThreading::TEvent started;
auto promise = NewPromise<void>();
- TCallback asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
return BIND([] {
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([promise, &started] (bool) {
+ auto syncFinish = BIND([promise, &started] (bool) {
started.NotifyAll();
WaitFor(promise.ToFuture())
.ThrowOnError();
@@ -151,8 +156,7 @@ TEST(TAsyncLooperTest, CancelSyncStep)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -172,7 +176,7 @@ TEST(TAsyncLooperTest, StopDuringAsyncStep)
NThreading::TEvent releaseAsync;
NThreading::TEvent started;
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &started] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &started] (bool) {
return BIND([&releaseAsync, &started] {
started.NotifyAll();
releaseAsync.Wait();
@@ -180,15 +184,14 @@ TEST(TAsyncLooperTest, StopDuringAsyncStep)
});
auto mustBeFalse = std::make_shared<std::atomic<bool>>(false);
- TCallback syncFinish = BIND([mustBeFalse] (bool) {
+ auto syncFinish = BIND([mustBeFalse] (bool) {
mustBeFalse->store(true);
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -215,7 +218,7 @@ TEST(TAsyncLooperTest, StopDuringAsyncStepWaitFor)
auto releaseAsync = NewPromise<void>();
NThreading::TEvent started;
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), &started, releaseAsync] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), &started, releaseAsync] (bool) {
return BIND([releaseAsync, &started] {
started.NotifyAll();
WaitFor(releaseAsync.ToFuture())
@@ -224,15 +227,14 @@ TEST(TAsyncLooperTest, StopDuringAsyncStepWaitFor)
});
auto mustBeFalse = std::make_shared<std::atomic<bool>>(false);
- TCallback syncFinish = BIND([mustBeFalse] (bool) {
+ auto syncFinish = BIND([mustBeFalse] (bool) {
mustBeFalse->store(true);
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -260,36 +262,39 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStep)
// ignore cancelation in this test.
NThreading::TEvent releaseAsync;
- auto asyncRunsCount = std::make_shared<std::atomic<int>>(0);
+ auto asyncRunCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, asyncRunsCount] (bool) {
- return BIND([&releaseAsync, asyncRunsCount] {
- asyncRunsCount->fetch_add(1);
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, asyncRunCount] (bool) {
+ return BIND([&releaseAsync, asyncRunCount] {
+ asyncRunCount->fetch_add(1);
releaseAsync.Wait();
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([] (bool) {
+ auto syncFinish = BIND([] (bool) {
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
- while (asyncRunsCount->load() == 0);
+ while (asyncRunCount->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
- EXPECT_EQ(asyncRunsCount->load(), 1);
+ EXPECT_EQ(asyncRunCount->load(), 1);
looper->Stop();
looper->Start();
releaseAsync.NotifyAll();
- while (asyncRunsCount->load() == 1);
+ while (asyncRunCount->load() == 1) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
@@ -300,37 +305,40 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepWaitFor)
auto releaseAsync = NewPromise<void>();
- auto asyncRunsCount = std::make_shared<std::atomic<int>>(0);
+ auto asyncRunCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), releaseAsync, asyncRunsCount] (bool) {
- return BIND([releaseAsync, asyncRunsCount] {
- asyncRunsCount->fetch_add(1);
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), releaseAsync, asyncRunCount] (bool) {
+ return BIND([releaseAsync, asyncRunCount] {
+ asyncRunCount->fetch_add(1);
WaitFor(releaseAsync.ToFuture())
.ThrowOnError();
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([] (bool) {
+ auto syncFinish = BIND([] (bool) {
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
- while (asyncRunsCount->load() == 0);
+ while (asyncRunCount->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
- EXPECT_EQ(asyncRunsCount->load(), 1);
+ EXPECT_EQ(asyncRunCount->load(), 1);
looper->Stop();
looper->Start();
releaseAsync.Set();
- while (asyncRunsCount->load() == 1);
+ while (asyncRunCount->load() == 1) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
@@ -345,7 +353,7 @@ TEST(TAsyncLooperTest, StopDuringAsyncStepPreparation)
NThreading::TEvent started;
auto mustBeFalse = std::make_shared<std::atomic<bool>>(false);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &started, mustBeFalse] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &started, mustBeFalse] (bool) {
started.NotifyAll();
releaseAsync.Wait();
@@ -358,14 +366,13 @@ TEST(TAsyncLooperTest, StopDuringAsyncStepPreparation)
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([] (bool) {
+ auto syncFinish = BIND([] (bool) {
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
queue->GetInvoker()->Invoke(BIND([looper] {
looper->Start();
@@ -396,24 +403,23 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepPreparation1)
NThreading::TEvent releaseAsync;
NThreading::TEvent started;
- auto asyncRunsCount = std::make_shared<std::atomic<int>>(0);
+ auto asyncRunCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &started, asyncRunsCount] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &started, asyncRunCount] (bool) {
started.NotifyAll();
releaseAsync.Wait();
- return BIND([asyncRunsCount] {
- asyncRunsCount->fetch_add(1);
+ return BIND([asyncRunCount] {
+ asyncRunCount->fetch_add(1);
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([] (bool) {
+ auto syncFinish = BIND([] (bool) {
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -424,7 +430,9 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepPreparation1)
releaseAsync.NotifyAll();
- while (asyncRunsCount->load() == 0);
+ while (asyncRunCount->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
@@ -441,7 +449,7 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepPreparation2)
auto asyncCleanStarts = std::make_shared<std::atomic<int>>(0);
auto syncCleanStarts = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &secondIterationStarted, asyncCleanStarts, syncCleanStarts] (bool cleanStart) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), &releaseAsync, &secondIterationStarted, asyncCleanStarts, syncCleanStarts] (bool cleanStart) {
if (cleanStart) {
asyncCleanStarts->fetch_add(1);
}
@@ -456,7 +464,7 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepPreparation2)
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([syncCleanStarts] (bool cleanStart) {
+ auto syncFinish = BIND([syncCleanStarts] (bool cleanStart) {
if (cleanStart) {
syncCleanStarts->fetch_add(1);
}
@@ -465,8 +473,7 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepPreparation2)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -480,7 +487,9 @@ TEST(TAsyncLooperTest, RestartDuringAsyncStepPreparation2)
releaseAsync.NotifyAll();
- while (syncCleanStarts->load() == 1);
+ while (syncCleanStarts->load() == 1) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
EXPECT_EQ(asyncCleanStarts->load(), 2);
EXPECT_EQ(syncCleanStarts->load(), 2);
@@ -497,14 +506,14 @@ TEST(TAsyncLooperTest, StopDuringSyncStep)
NThreading::TEvent releaseAsync;
NThreading::TEvent started;
- auto asyncRunsCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), asyncRunsCount] (bool) {
- return BIND([asyncRunsCount] {
- asyncRunsCount->fetch_add(1);
+ auto asyncRunCount = std::make_shared<std::atomic<int>>(0);
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), asyncRunCount] (bool) {
+ return BIND([asyncRunCount] {
+ asyncRunCount->fetch_add(1);
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([&releaseAsync, &started] (bool) {
+ auto syncFinish = BIND([&releaseAsync, &started] (bool) {
started.NotifyAll();
releaseAsync.Wait();
});
@@ -512,8 +521,7 @@ TEST(TAsyncLooperTest, StopDuringSyncStep)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -530,7 +538,7 @@ TEST(TAsyncLooperTest, StopDuringSyncStep)
// Ensure queue is empty
queue->Shutdown(/*graceful*/ true);
- EXPECT_EQ(asyncRunsCount->load(), 1);
+ EXPECT_EQ(asyncRunCount->load(), 1);
}
TEST(TAsyncLooperTest, StopDuringSyncStepWaitFor)
@@ -542,14 +550,14 @@ TEST(TAsyncLooperTest, StopDuringSyncStepWaitFor)
auto releaseAsync = NewPromise<void>();
NThreading::TEvent started;
- auto asyncRunsCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), asyncRunsCount] (bool) {
- return BIND([asyncRunsCount] {
- asyncRunsCount->fetch_add(1);
+ auto asyncRunCount = std::make_shared<std::atomic<int>>(0);
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), asyncRunCount] (bool) {
+ return BIND([asyncRunCount] {
+ asyncRunCount->fetch_add(1);
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([releaseAsync, &started] (bool) {
+ auto syncFinish = BIND([releaseAsync, &started] (bool) {
started.NotifyAll();
WaitFor(releaseAsync.ToFuture())
.ThrowOnError();
@@ -558,8 +566,7 @@ TEST(TAsyncLooperTest, StopDuringSyncStepWaitFor)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
@@ -576,7 +583,7 @@ TEST(TAsyncLooperTest, StopDuringSyncStepWaitFor)
// Ensure queue is empty
queue->Shutdown(/*graceful*/ true);
- EXPECT_EQ(asyncRunsCount->load(), 1);
+ EXPECT_EQ(asyncRunCount->load(), 1);
}
TEST(TAsyncLooperTest, RestartDuringSyncStep)
@@ -587,36 +594,39 @@ TEST(TAsyncLooperTest, RestartDuringSyncStep)
// ignore cancelation in this test.
NThreading::TEvent releaseAsync;
- auto syncRunsCount = std::make_shared<std::atomic<int>>(0);
+ auto syncRunCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
return BIND([] {
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([&releaseAsync, syncRunsCount] (bool) {
- syncRunsCount->fetch_add(1);
+ auto syncFinish = BIND([&releaseAsync, syncRunCount] (bool) {
+ syncRunCount->fetch_add(1);
releaseAsync.Wait();
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
- while (syncRunsCount->load() == 0);
+ while (syncRunCount->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
- EXPECT_EQ(syncRunsCount->load(), 1);
+ EXPECT_EQ(syncRunCount->load(), 1);
looper->Stop();
looper->Start();
releaseAsync.NotifyAll();
- while (syncRunsCount->load() == 1);
+ while (syncRunCount->load() == 1) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
@@ -627,15 +637,15 @@ TEST(TAsyncLooperTest, RestartDuringSyncStepWaitFor)
auto releaseAsync = NewPromise<void>();
- auto syncRunsCount = std::make_shared<std::atomic<int>>(0);
+ auto syncRunCount = std::make_shared<std::atomic<int>>(0);
- TCallback asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker()] (bool) {
return BIND([] {
}).AsyncVia(invoker).Run();
});
- TCallback syncFinish = BIND([releaseAsync, syncRunsCount] (bool) {
- syncRunsCount->fetch_add(1);
+ auto syncFinish = BIND([releaseAsync, syncRunCount] (bool) {
+ syncRunCount->fetch_add(1);
WaitFor(releaseAsync.ToFuture())
.ThrowOnError();
});
@@ -643,21 +653,24 @@ TEST(TAsyncLooperTest, RestartDuringSyncStepWaitFor)
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
- while (syncRunsCount->load() == 0);
+ while (syncRunCount->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
- EXPECT_EQ(syncRunsCount->load(), 1);
+ EXPECT_EQ(syncRunCount->load(), 1);
looper->Stop();
looper->Start();
releaseAsync.Set();
- while (syncRunsCount->load() == 1);
+ while (syncRunCount->load() == 1) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
@@ -669,7 +682,7 @@ TEST(TAsyncLooperTest, NullFuture)
auto switcher = std::make_shared<std::atomic<bool>>(false);
NThreading::TEvent loopBroken;
- TCallback asyncStart = BIND([invoker = queue->GetInvoker(), switcher, &loopBroken] (bool) {
+ auto asyncStart = BIND([invoker = queue->GetInvoker(), switcher, &loopBroken] (bool) {
if (!switcher->load()) {
loopBroken.NotifyAll();
return TFuture<void>();
@@ -678,28 +691,29 @@ TEST(TAsyncLooperTest, NullFuture)
return BIND([] {}).AsyncVia(invoker).Run();
});
- auto syncRunsCount = std::make_shared<std::atomic<int>>(0);
- TCallback syncFinish = BIND([syncRunsCount] (bool) {
- syncRunsCount->fetch_add(1);
+ auto syncRunCount = std::make_shared<std::atomic<int>>(0);
+ auto syncFinish = BIND([syncRunCount] (bool) {
+ syncRunCount->fetch_add(1);
});
auto looper = New<TAsyncLooper>(
queue->GetInvoker(),
asyncStart,
- syncFinish,
- LooperName);
+ syncFinish);
looper->Start();
loopBroken.Wait();
- EXPECT_EQ(syncRunsCount->load(), 0);
+ EXPECT_EQ(syncRunCount->load(), 0);
switcher->store(true);
looper->Stop();
looper->Start();
- while (syncRunsCount->load() == 0);
+ while (syncRunCount->load() == 0) {
+ Sleep(TDuration::MilliSeconds(1));
+ }
looper->Stop();
}
diff --git a/yt/yt/core/misc/memory_usage_tracker.cpp b/yt/yt/core/misc/memory_usage_tracker.cpp
index e81a120a6f..269632e4fe 100644
--- a/yt/yt/core/misc/memory_usage_tracker.cpp
+++ b/yt/yt/core/misc/memory_usage_tracker.cpp
@@ -369,7 +369,7 @@ TErrorOr<TSharedRef> TryTrackMemory(
if (!tracker || !reference) {
return reference;
}
- return tracker->TryTrack(reference, keepExistingTracking);
+ return tracker->TryTrack(std::move(reference), keepExistingTracking);
}
TSharedRef TrackMemory(
@@ -380,7 +380,7 @@ TSharedRef TrackMemory(
if (!tracker || !reference) {
return reference;
}
- return tracker->Track(reference, keepExistingTracking);
+ return tracker->Track(std::move(reference), keepExistingTracking);
}
TSharedRefArray TrackMemory(
diff --git a/yt/yt/core/misc/memory_usage_tracker.h b/yt/yt/core/misc/memory_usage_tracker.h
index 00d93cb30f..bcd132e8ed 100644
--- a/yt/yt/core/misc/memory_usage_tracker.h
+++ b/yt/yt/core/misc/memory_usage_tracker.h
@@ -41,6 +41,17 @@ struct IMemoryUsageTracker
DEFINE_REFCOUNTED_TYPE(IMemoryUsageTracker)
+/////////////////////////////////////////////////////////////////////////////
+
+struct IReservingMemoryUsageTracker
+ : public IMemoryUsageTracker
+{
+ virtual void ReleaseUnusedReservation() = 0;
+ virtual TError TryReserve(i64 size) = 0;
+};
+
+DEFINE_REFCOUNTED_TYPE(IReservingMemoryUsageTracker)
+
////////////////////////////////////////////////////////////////////////////////
IMemoryUsageTrackerPtr GetNullMemoryUsageTracker();
diff --git a/yt/yt/core/misc/public.h b/yt/yt/core/misc/public.h
index 77464ae366..9cff9ba2cd 100644
--- a/yt/yt/core/misc/public.h
+++ b/yt/yt/core/misc/public.h
@@ -140,6 +140,14 @@ using TInternedObjectDataPtr = TIntrusivePtr<TInternedObjectData<T>>;
template <class T>
class TInternedObject;
+namespace NStatisticPath {
+
+class TStatisticPathLiteral;
+class TStatisticPath;
+struct TStatisticPathSerializer;
+
+} // namespace NStatisticPath
+
class TStatistics;
class TSummary;
@@ -173,6 +181,7 @@ DEFINE_ENUM(EProcessErrorCode,
////////////////////////////////////////////////////////////////////////////////
DECLARE_REFCOUNTED_STRUCT(IMemoryUsageTracker)
+DECLARE_REFCOUNTED_STRUCT(IReservingMemoryUsageTracker)
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/core/misc/statistic_path-inl.h b/yt/yt/core/misc/statistic_path-inl.h
new file mode 100644
index 0000000000..d9821066a3
--- /dev/null
+++ b/yt/yt/core/misc/statistic_path-inl.h
@@ -0,0 +1,29 @@
+#ifndef STATISTIC_PATH_INL_H_
+ #error "Direct inclusion of this file is not allowed, include format.h"
+ // For the sake of sane code completion.
+ #include "statistic_path.h"
+#endif
+
+#include "serialize.h"
+
+namespace NYT {
+
+////////////////////////////////////////////////////////////////////////////////
+
+template <typename C>
+void NStatisticPath::TStatisticPathSerializer::Save(C& context, const NStatisticPath::TStatisticPath& path)
+{
+ NYT::Save(context, path.Path());
+}
+
+template <typename C>
+void NStatisticPath::TStatisticPathSerializer::Load(C& context, NStatisticPath::TStatisticPath& path)
+{
+ NStatisticPath::TStatisticPathType tmp;
+ NYT::Load(context, tmp);
+ path = TStatisticPath(std::move(tmp));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
diff --git a/yt/yt/core/misc/statistic_path.cpp b/yt/yt/core/misc/statistic_path.cpp
new file mode 100644
index 0000000000..19f478d9f9
--- /dev/null
+++ b/yt/yt/core/misc/statistic_path.cpp
@@ -0,0 +1,323 @@
+#include "statistic_path.h"
+
+#include "error.h"
+
+#include <yt/yt/core/yson/format.h>
+
+namespace NYT::NStatisticPath {
+
+////////////////////////////////////////////////////////////////////////////////
+
+TError CheckStatisticPathLiteral(const TStatisticPathType& literal)
+{
+ if (literal.Empty()) {
+ return TError("Empty statistic path literal");
+ }
+ constexpr static TChar invalidCharacters[2]{Delimiter, 0};
+ constexpr static TBasicStringBuf<TChar> invalidCharacterBuf(invalidCharacters, 2);
+ if (auto invalidPos = literal.find_first_of(invalidCharacterBuf);
+ invalidPos != TStatisticPathType::npos) {
+ return TError("Invalid character found in a statistic path literal")
+ << TErrorAttribute("literal", literal)
+ << TErrorAttribute("invalid_character", static_cast<ui8>(literal[invalidPos]));
+ }
+ return {};
+}
+
+TErrorOr<TStatisticPathLiteral> ParseStatisticPathLiteral(const TStatisticPathType& literal)
+{
+ if (auto error = CheckStatisticPathLiteral(literal); !error.IsOK()) {
+ return error;
+ }
+ return TStatisticPathLiteral(literal, false);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPathLiteral::TStatisticPathLiteral(const TStatisticPathType& literal, bool /*tag*/) noexcept
+ : Literal_(literal)
+{ }
+
+TStatisticPathLiteral::TStatisticPathLiteral(const TStatisticPathType& literal)
+ : TStatisticPathLiteral(ParseStatisticPathLiteral(literal).ValueOrThrow())
+{ }
+
+const TStatisticPathType& TStatisticPathLiteral::Literal() const noexcept
+{
+ return Literal_;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPath::TStatisticPath(const TStatisticPathType& path)
+ : Path_(path)
+{ }
+
+TStatisticPath::TStatisticPath(TStatisticPathType&& path) noexcept
+ : Path_(std::move(path))
+{ }
+
+TStatisticPath::TStatisticPath(const TStatisticPathLiteral& literal)
+ : Path_(TStatisticPathType(Delimiter) + literal.Literal())
+{ }
+
+////////////////////////////////////////////////////////////////////////////////
+
+TError CheckStatisticPath(const TStatisticPathType& path)
+{
+ constexpr static TChar twoDelimiters[2]{Delimiter, Delimiter};
+ constexpr static TBasicStringBuf<TChar> adjacentDelimiters(twoDelimiters, 2);
+
+ TError error;
+ if (path.empty()) {
+ return {};
+ }
+
+ if (path.front() != Delimiter) {
+ error = TError("Statistic path must start with a delimiter");
+ } else if (path.back() == Delimiter) {
+ error = TError("Statistic path must not end with a delimiter");
+ } else if (path.Contains(0)) {
+ error = TError("Statistic path must not contain a null character");
+ } else if (path.Contains(adjacentDelimiters)) {
+ error = TError("Statistic path must not contain adjacent delimiters");
+ }
+
+ if (!error.IsOK()) {
+ return error
+ << TErrorAttribute("path", path);
+ }
+ return {};
+}
+
+TErrorOr<TStatisticPath> ParseStatisticPath(const TStatisticPathType& path)
+{
+ if (auto error = CheckStatisticPath(path); !error.IsOK()) {
+ return error;
+ }
+ return TStatisticPath(path);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+const TStatisticPathType& TStatisticPath::Path() const noexcept
+{
+ return Path_;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+bool TStatisticPath::Empty() const noexcept
+{
+ return Path_.empty();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TStatisticPath::Swap(TStatisticPath& other) noexcept
+{
+ Path_.swap(other.Path_);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPath& TStatisticPath::Append(const TStatisticPathLiteral& literal)
+{
+ return Append(TStatisticPath(literal));
+}
+
+TStatisticPath& TStatisticPath::Append(const TStatisticPath& other)
+{
+ Path_.append(other.Path_);
+ return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPath::const_iterator::value_type TStatisticPath::Front() const noexcept
+{
+ YT_VERIFY(!Empty());
+ return *begin();
+}
+
+TStatisticPath::const_iterator::value_type TStatisticPath::Back() const noexcept
+{
+ YT_VERIFY(!Empty());
+ return *(--end());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TStatisticPath::PopBack()
+{
+ YT_VERIFY(!Empty());
+ Path_.resize(Path_.size() - Back().Size() - 1);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+bool TStatisticPath::StartsWith(const TStatisticPath& prefix) const
+{
+ // TODO(pavook) std::ranges::starts_with(*this, prefix) when C++23 arrives.
+ auto [selfIt, prefixIt] = std::ranges::mismatch(*this, prefix);
+ return prefixIt == prefix.end();
+}
+
+bool TStatisticPath::EndsWith(const TStatisticPath& suffix) const
+{
+ // TODO(pavook) std::ranges::ends_with(*this, suffix) when C++23 arrives.
+ auto [selfIt, suffixIt] = std::mismatch(rbegin(), rend(), suffix.rbegin(), suffix.rend());
+ return suffixIt == suffix.rend();
+}
+
+TStatisticPath operator/(const TStatisticPath& lhs, const TStatisticPathLiteral& rhs)
+{
+ return TStatisticPath(lhs).Append(rhs);
+}
+
+TStatisticPath operator/(const TStatisticPath& lhs, const TStatisticPath& rhs)
+{
+ return TStatisticPath(lhs).Append(rhs);
+}
+
+TStatisticPath operator/(TStatisticPath&& lhs, const TStatisticPathLiteral& rhs)
+{
+ return TStatisticPath(std::move(lhs)).Append(rhs);
+}
+
+TStatisticPath operator/(TStatisticPath&& lhs, const TStatisticPath& rhs)
+{
+ return TStatisticPath(std::move(lhs)).Append(rhs);
+}
+
+TStatisticPath operator/(const TStatisticPathLiteral& lhs, const TStatisticPathLiteral& rhs)
+{
+ return TStatisticPath(lhs).Append(rhs);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+bool operator==(const TStatisticPath& lhs, const TStatisticPath& rhs) noexcept
+{
+ return lhs.Path() == rhs.Path();
+}
+
+std::strong_ordering operator<=>(const TStatisticPath& lhs, const TStatisticPath& rhs) noexcept
+{
+ return lhs.Path().compare(rhs.Path()) <=> 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NStatisticPathLiterals {
+
+TStatisticPathLiteral operator""_L(const char* str, size_t len)
+{
+ return TStatisticPathLiteral(TStatisticPathType(str, len));
+}
+
+} // namespace NStatisticPathLiterals
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPath::TIterator::TIterator(const TStatisticPath& path, TStatisticPath::TIterator::TBeginIteratorTag) noexcept
+ : Path_(path.Path())
+ , Entry_(Path_.begin(), Path_.begin())
+{
+ Advance();
+}
+
+TStatisticPath::TIterator::TIterator(const TStatisticPath& path, TStatisticPath::TIterator::TEndIteratorTag) noexcept
+ : Path_(path.Path())
+ , Entry_()
+{ }
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPath::TIterator::reference TStatisticPath::TIterator::operator*() const noexcept
+{
+ return Entry_;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TStatisticPath::TIterator& TStatisticPath::TIterator::operator++() noexcept
+{
+ Advance();
+ return *this;
+}
+
+TStatisticPath::TIterator TStatisticPath::TIterator::operator++(int) noexcept
+{
+ TIterator result = *this;
+ Advance();
+ return result;
+}
+
+TStatisticPath::TIterator& TStatisticPath::TIterator::operator--() noexcept
+{
+ Retreat();
+ return *this;
+}
+
+TStatisticPath::TIterator TStatisticPath::TIterator::operator--(int) noexcept
+{
+ TIterator result = *this;
+ Retreat();
+ return result;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+void TStatisticPath::TIterator::Advance() noexcept
+{
+ if (Entry_.end() == Path_.end()) {
+ Entry_ = value_type();
+ } else {
+ Entry_ = value_type(std::next(Entry_.end()), Path_.end()).NextTok(Delimiter);
+ }
+}
+
+void TStatisticPath::TIterator::Retreat() noexcept
+{
+ if (!Entry_) {
+ Entry_ = value_type(Path_.begin(), Path_.end()).RNextTok(Delimiter);
+ } else {
+ Entry_ = value_type(Path_.begin(), std::prev(Entry_.begin())).RNextTok(Delimiter);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+bool operator==(const TStatisticPath::TIterator& lhs, const TStatisticPath::TIterator& rhs) noexcept
+{
+ // TODO(pavook) should we compare sizes?
+ return lhs.Entry_.data() == rhs.Entry_.data();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+// TODO(pavook) make it constant-time to comply with ranges::range semantic requirements?
+TStatisticPath::const_iterator TStatisticPath::begin() const noexcept
+{
+ return {*this, TStatisticPath::TIterator::TBeginIteratorTag{}};
+}
+
+TStatisticPath::const_iterator TStatisticPath::end() const noexcept
+{
+ return {*this, TStatisticPath::TIterator::TEndIteratorTag{}};
+}
+
+TStatisticPath::const_reverse_iterator TStatisticPath::rbegin() const noexcept
+{
+ return std::make_reverse_iterator(end());
+}
+
+TStatisticPath::const_reverse_iterator TStatisticPath::rend() const noexcept
+{
+ return std::make_reverse_iterator(begin());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT::NStatisticPath
diff --git a/yt/yt/core/misc/statistic_path.h b/yt/yt/core/misc/statistic_path.h
new file mode 100644
index 0000000000..8908e13089
--- /dev/null
+++ b/yt/yt/core/misc/statistic_path.h
@@ -0,0 +1,258 @@
+#pragma once
+
+#include "public.h"
+
+#include <yt/yt/core/yson/public.h>
+#include <yt/yt/core/ytree/public.h>
+
+#include <util/generic/strbuf.h>
+#include <util/generic/string.h>
+
+namespace NYT {
+
+namespace NStatisticPath {
+
+////////////////////////////////////////////////////////////////////////////////
+
+//! A type to store paths and literals as.
+using TStatisticPathType = TString;
+
+using TChar = TStatisticPathType::TChar;
+
+//! Delimiter character to use instead of `/`. We want it to compare "less" than any other character.
+//! See YT-22118 for motivation.
+static constexpr TChar Delimiter = '\x01';
+
+////////////////////////////////////////////////////////////////////////////////
+
+//! Checks that `literal` is a valid statistic path literal, i.e. `literal` isn't empty,
+//! doesn't contain `Delimiter` and doesn't contain `\0`.
+TError CheckStatisticPathLiteral(const TStatisticPathType& literal);
+
+class TStatisticPathLiteral
+{
+private:
+ TStatisticPathLiteral(const TStatisticPathType& literal, bool /*tag*/) noexcept;
+
+ friend TErrorOr<TStatisticPathLiteral> ParseStatisticPathLiteral(const TStatisticPathType& literal);
+
+public:
+ //! Can throw an exception in case `literal` is invalid (see `CheckStatisticPathLiteral`).
+ explicit TStatisticPathLiteral(const TStatisticPathType& literal);
+
+ friend class TStatisticPath;
+
+ [[nodiscard]] bool operator==(const TStatisticPathLiteral& other) const noexcept = default;
+
+ //! Returns the underlying string.
+ [[nodiscard]] const TStatisticPathType& Literal() const noexcept;
+
+private:
+ TStatisticPathType Literal_;
+};
+
+//! Checks that `literal` is a valid statistic path literal (see `CheckStatisticPathLiteral`) and
+//! returns TStatisticPathLiteral if it is. Returns an error with explanation otherwise.
+TErrorOr<TStatisticPathLiteral> ParseStatisticPathLiteral(const TStatisticPathType& literal);
+
+////////////////////////////////////////////////////////////////////////////////
+
+//! Checks that `path` is a valid statistic path (it can be constructed as a sequence of literals).
+//! Returns an error with explanation otherwise.
+TError CheckStatisticPath(const TStatisticPathType& path);
+
+//! Checks that `path` is a valid statistic path (it can be constructed as a sequence of literals),
+//! and returns a `TStatisticPath` built from it if it is. Returns an error with explanation otherwise.
+TErrorOr<TStatisticPath> ParseStatisticPath(const TStatisticPathType& path);
+
+// TODO(pavook) constexpr when constexpr std::string arrives.
+class TStatisticPath
+{
+private:
+ class TIterator
+ {
+ public:
+ using iterator_category = std::bidirectional_iterator_tag;
+ using value_type = TBasicStringBuf<TChar>;
+ using difference_type = value_type::difference_type;
+ using pointer = void;
+
+ // This is needed for iterator sanity as we store the value inside the iterator.
+ // This is allowed, as since C++20 ForwardIterator::reference doesn't have to be an actual reference.
+ using reference = const value_type;
+
+ reference operator*() const noexcept;
+
+ TIterator& operator++() noexcept;
+
+ TIterator operator++(int) noexcept;
+
+ TIterator& operator--() noexcept;
+
+ TIterator operator--(int) noexcept;
+
+ friend bool operator==(const TIterator& lhs, const TIterator& rhs) noexcept;
+
+ TIterator() noexcept = default;
+
+ TIterator(const TIterator& other) noexcept = default;
+
+ TIterator& operator=(const TIterator& other) noexcept = default;
+
+ private:
+ value_type Path_;
+ value_type Entry_;
+
+ struct TBeginIteratorTag
+ { };
+
+ struct TEndIteratorTag
+ { };
+
+ TIterator(const TStatisticPath& path, TBeginIteratorTag) noexcept;
+
+ TIterator(const TStatisticPath& path, TEndIteratorTag) noexcept;
+
+ void Advance() noexcept;
+
+ void Retreat() noexcept;
+
+ friend class TStatisticPath;
+ };
+
+ friend bool operator==(const TIterator& lhs, const TIterator& rhs) noexcept;
+
+public:
+ using iterator = TIterator;
+ using const_iterator = iterator;
+ using reverse_iterator = std::reverse_iterator<TIterator>;
+ using const_reverse_iterator = reverse_iterator;
+
+ //! Constructs an empty path. The underlying string will be empty.
+ TStatisticPath() noexcept = default;
+
+ //! Constructs a path from an existing literal. The literal will be prepended with a Delimiter.
+ TStatisticPath(const TStatisticPathLiteral& literal);
+
+ TStatisticPath(const TStatisticPath& other) = default;
+
+ TStatisticPath(TStatisticPath&& other) noexcept = default;
+
+ TStatisticPath& operator=(const TStatisticPath& other) = default;
+
+ TStatisticPath& operator=(TStatisticPath&& other) noexcept = default;
+
+ ~TStatisticPath() noexcept = default;
+
+ void Swap(TStatisticPath& other) noexcept;
+
+ //! Returns `true` if the path is empty.
+ [[nodiscard]] bool Empty() const noexcept;
+
+ //! Returns the underlying path string.
+ [[nodiscard]] const TStatisticPathType& Path() const noexcept;
+
+ //! Appends a literal to the end of the path, adding a Delimiter between them.
+ TStatisticPath& Append(const TStatisticPathLiteral& literal);
+
+ //! Appends another path to the end of the current path. Essentially concatenates the underlying strings.
+ TStatisticPath& Append(const TStatisticPath& other);
+
+ [[nodiscard]] const_iterator begin() const noexcept;
+
+ [[nodiscard]] const_iterator end() const noexcept;
+
+ [[nodiscard]] const_reverse_iterator rbegin() const noexcept;
+
+ [[nodiscard]] const_reverse_iterator rend() const noexcept;
+
+ //! Returns the first literal of the path. Verifies that the path is not empty.
+ [[nodiscard]] const_iterator::value_type Front() const noexcept;
+
+ //! Returns the last literal of the path. Verifies that the path is not empty.
+ [[nodiscard]] const_iterator::value_type Back() const noexcept;
+
+ //! Removes the last literal from the path. Verifies that the path is not empty.
+ void PopBack();
+
+ //! Returns `true` if `path` is a prefix of the current path.
+ [[nodiscard]] bool StartsWith(const TStatisticPath& path) const;
+
+ //! Returns `true` if `path` is a suffix of the current path.
+ [[nodiscard]] bool EndsWith(const TStatisticPath& path) const;
+
+private:
+ TStatisticPathType Path_;
+
+ TStatisticPath& AppendStr(const TStatisticPathType& path);
+
+ //! Private, build the path from literals instead.
+ explicit TStatisticPath(const TStatisticPathType& path);
+
+ //! Private, build the path from literals instead.
+ explicit TStatisticPath(TStatisticPathType&& path) noexcept;
+
+ friend struct TStatisticPathSerializer;
+
+ friend TErrorOr<TStatisticPath> ParseStatisticPath(const TStatisticPathType& path);
+};
+
+// TODO(pavook) `= default` when it stops crashing the compiler.
+[[nodiscard]] bool operator==(const TStatisticPath& lhs, const TStatisticPath& rhs) noexcept;
+
+[[nodiscard]] std::strong_ordering operator<=>(const TStatisticPath& lhs, const TStatisticPath& rhs) noexcept;
+
+////////////////////////////////////////////////////////////////////////////////
+
+//! Appends `rhs` to `lhs`. See `TStatisticPath::Append`.
+[[nodiscard]] TStatisticPath operator/(const TStatisticPath& lhs, const TStatisticPathLiteral& rhs);
+
+//! Appends `rhs` to `lhs`. See `TStatisticPath::Append`.
+[[nodiscard]] TStatisticPath operator/(const TStatisticPath& lhs, const TStatisticPath& rhs);
+
+//! Appends `rhs` to `lhs`. See `TStatisticPath::Append`.
+[[nodiscard]] TStatisticPath operator/(TStatisticPath&& lhs, const TStatisticPathLiteral& rhs);
+
+//! Appends `rhs` to `lhs`. See `TStatisticPath::Append`.
+[[nodiscard]] TStatisticPath operator/(TStatisticPath&& lhs, const TStatisticPath& rhs);
+
+//! Appends `rhs` to `lhs`. See `TStatisticPath::Append`.
+[[nodiscard]] TStatisticPath operator/(const TStatisticPathLiteral& lhs, const TStatisticPathLiteral& rhs);
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace NStatisticPathLiterals {
+
+[[nodiscard]] TStatisticPathLiteral operator""_L(const char* str, size_t len);
+
+} // namespace NStatisticPathLiterals
+
+////////////////////////////////////////////////////////////////////////////////
+
+struct TStatisticPathSerializer
+{
+ template <class C>
+ static void Save(C& context, const NStatisticPath::TStatisticPath& path);
+
+ template <class C>
+ static void Load(C& context, NStatisticPath::TStatisticPath& path);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NStatisticPath
+
+template <class C>
+struct TSerializerTraits<NStatisticPath::TStatisticPath, C, void>
+{
+ using TSerializer = NStatisticPath::TStatisticPathSerializer;
+ using TComparer = TValueBoundComparer;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace NYT
+
+#define STATISTIC_PATH_INL_H_
+#include "statistic_path-inl.h"
+#undef STATISTIC_PATH_INL_H_
diff --git a/yt/yt/core/misc/unittests/statistic_path_ut.cpp b/yt/yt/core/misc/unittests/statistic_path_ut.cpp
new file mode 100644
index 0000000000..e92d73c452
--- /dev/null
+++ b/yt/yt/core/misc/unittests/statistic_path_ut.cpp
@@ -0,0 +1,216 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/core/misc/error.h>
+#include <yt/yt/core/misc/statistic_path.h>
+
+namespace NYT {
+namespace {
+
+using namespace NStatisticPath;
+using namespace NStatisticPathLiterals;
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Literal)
+{
+ EXPECT_EQ("ABC"_L.Literal(), "ABC");
+
+ EXPECT_TRUE(CheckStatisticPathLiteral("$a/b.c").IsOK());
+ EXPECT_FALSE(CheckStatisticPathLiteral(TString(Delimiter)).IsOK());
+ EXPECT_FALSE(CheckStatisticPathLiteral("\0").IsOK());
+ EXPECT_FALSE(CheckStatisticPathLiteral("").IsOK());
+
+ EXPECT_THROW(TStatisticPathLiteral("\0"), TErrorException);
+ EXPECT_THROW(TStatisticPathLiteral(TString(Delimiter)), TErrorException);
+ EXPECT_THROW(TStatisticPathLiteral(""), TErrorException);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Append)
+{
+ EXPECT_EQ(("A"_L / "BB"_L / "CCC"_L).Path(),
+ TString(Delimiter) + "A" + Delimiter + "BB" + Delimiter + "CCC");
+
+ EXPECT_EQ(("A"_L / "B"_L) / "C"_L, "A"_L / ("B"_L / "C"_L));
+
+ EXPECT_EQ("A"_L / TStatisticPath(), "A"_L);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Iterator)
+{
+ EXPECT_TRUE(std::bidirectional_iterator<TStatisticPath::const_iterator>);
+ EXPECT_TRUE(std::bidirectional_iterator<TStatisticPath::const_reverse_iterator>);
+ EXPECT_TRUE(std::ranges::range<TStatisticPath>);
+
+ TStatisticPath path = "A"_L / "BB"_L / "CCC"_L;
+
+ std::vector<TString> expected{"A", "BB", "CCC"};
+
+ {
+ std::vector<TString> actual(path.begin(), path.end());
+ EXPECT_EQ(actual, expected);
+ }
+
+ {
+ std::reverse(expected.begin(), expected.end());
+ std::vector<TString> actual(path.rbegin(), path.rend());
+ EXPECT_EQ(actual, expected);
+ }
+
+ {
+ // Post-increment, post-decrement validity test.
+ auto it = path.begin();
+ EXPECT_EQ(*(it++), "A");
+ EXPECT_EQ(*it, "BB");
+ EXPECT_EQ(*(it--), "BB");
+ EXPECT_EQ(*it, "A");
+ }
+
+ // Sanity check.
+ auto it = path.begin();
+ const auto& value = *it;
+ ++it;
+ EXPECT_NE(value, *it);
+
+ TStatisticPath emptyPath;
+ EXPECT_EQ(emptyPath.begin(), emptyPath.end());
+ EXPECT_TRUE(emptyPath.Empty());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Compare)
+{
+ EXPECT_EQ("A"_L / "B"_L, "A"_L / "B"_L);
+
+ EXPECT_LT("A"_L / "B"_L, "A"_L / "B"_L / "C"_L);
+
+ EXPECT_LT("A"_L / "B"_L, "A"_L / "C"_L);
+ EXPECT_LT("A"_L / "B"_L, "B"_L);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+// We want a statistic path and it's "path prefix" to be adjacent according to
+// path comparison. See YT-22118 for motivation.
+TEST(TStatisticPathTest, Adjacent)
+{
+ for (TChar c = std::numeric_limits<TChar>::min();; ++c) {
+ auto literal = ParseStatisticPathLiteral(TString("A") + c + "B");
+ if (literal.IsOK()) {
+ EXPECT_LT("A"_L / "B"_L, TStatisticPath(literal.Value()));
+ }
+ if (c == std::numeric_limits<TChar>::max()) {
+ break;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Parse)
+{
+ EXPECT_EQ(ParseStatisticPath(TString(Delimiter) + "ABC" + Delimiter + "DEF").ValueOrThrow(), "ABC"_L / "DEF"_L);
+ EXPECT_EQ(ParseStatisticPath("").ValueOrThrow(), TStatisticPath());
+
+ EXPECT_FALSE(ParseStatisticPath(TString(Delimiter) + "A\0B"_sb).IsOK());
+ EXPECT_FALSE(ParseStatisticPath(TString(Delimiter) + "AB" + Delimiter).IsOK());
+ EXPECT_FALSE(ParseStatisticPath(TString(Delimiter) + "A" + Delimiter + Delimiter + "B").IsOK());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Constructor)
+{
+ EXPECT_EQ(TStatisticPath("abc"_L).Path(), TString(Delimiter) + "abc");
+
+ TStatisticPath defaultConstructed;
+ EXPECT_EQ(defaultConstructed.Path(), TString());
+ EXPECT_TRUE(defaultConstructed.Empty());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, StartsWith)
+{
+ // Simple prefix.
+ EXPECT_TRUE(("A"_L / "BB"_L / "CCC"_L).StartsWith("A"_L / "BB"_L));
+ // Equal paths.
+ EXPECT_TRUE(("A"_L / "BB"_L).StartsWith("A"_L / "BB"_L));
+ // Empty prefix.
+ EXPECT_TRUE(("A"_L / "B"_L).StartsWith({}));
+
+ // Reverse prefix.
+ EXPECT_FALSE(("A"_L / "BB"_L).StartsWith("A"_L / "BB"_L / "CCC"_L));
+ // There are string prefixes that are not path prefixes.
+ EXPECT_FALSE(("A"_L / "BB"_L / "CCC"_L).StartsWith("A"_L / "BB"_L / "C"_L));
+ // Sanity check.
+ EXPECT_FALSE(("A"_L / "B"_L).StartsWith("B"_L));
+}
+
+TEST(TStatisticPathTest, EndsWith)
+{
+ // Simple suffix.
+ EXPECT_TRUE(("A"_L / "BB"_L / "CCC"_L).EndsWith("BB"_L / "CCC"_L));
+ // Equal paths.
+ EXPECT_TRUE(("A"_L / "BB"_L).EndsWith("A"_L / "BB"_L));
+ // Empty prefix.
+ EXPECT_TRUE(("A"_L / "B"_L).EndsWith({}));
+
+ // Reverse suffix.
+ EXPECT_FALSE(("A"_L / "BB"_L).EndsWith("CCC"_L / "A"_L / "BB"_L));
+ // There are string suffixes that are not path suffixes.
+ EXPECT_FALSE(("CCC"_L / "A"_L / "BB"_L).EndsWith("C"_L / "A"_L / "BB"_L));
+ // Sanity check.
+ EXPECT_FALSE(("A"_L / "B"_L).EndsWith("A"_L));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, FrontBack)
+{
+ EXPECT_EQ(("A"_L / "BB"_L / "CCC"_L).Front(), "A");
+ EXPECT_EQ(("A"_L / "BB"_L / "CCC"_L).Back(), "CCC");
+ EXPECT_EQ(TStatisticPath("A"_L).Front(), "A");
+ EXPECT_EQ(TStatisticPath("A"_L).Back(), "A");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, PopBack)
+{
+ TStatisticPath path = "A"_L / "BB"_L / "CCC"_L;
+ EXPECT_EQ(path.Back(), "CCC");
+ path.PopBack();
+ EXPECT_EQ(path.Back(), "BB");
+ path.PopBack();
+ EXPECT_EQ(path.Back(), "A");
+ path.PopBack();
+ EXPECT_TRUE(path.Empty());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TStatisticPathTest, Swap)
+{
+ TStatisticPath a = "A"_L / "BB"_L;
+ TStatisticPath b = "B"_L / "AA"_L;
+ TStatisticPath originalA = a;
+ TStatisticPath originalB = b;
+
+ a.Swap(b);
+ EXPECT_EQ(a, originalB);
+ EXPECT_EQ(b, originalA);
+
+ a.Swap(b);
+ EXPECT_EQ(a, originalA);
+ EXPECT_EQ(b, originalB);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT
diff --git a/yt/yt/core/misc/unittests/ya.make b/yt/yt/core/misc/unittests/ya.make
index 7f8396c752..25a32157ec 100644
--- a/yt/yt/core/misc/unittests/ya.make
+++ b/yt/yt/core/misc/unittests/ya.make
@@ -65,6 +65,7 @@ SRCS(
sliding_window_ut.cpp
sync_cache_ut.cpp
spsc_queue_ut.cpp
+ statistic_path_ut.cpp
statistics_ut.cpp
string_ut.cpp
sync_expiring_cache_ut.cpp
diff --git a/yt/yt/core/rpc/bus/channel.cpp b/yt/yt/core/rpc/bus/channel.cpp
index e62e8d3404..c3a83ec520 100644
--- a/yt/yt/core/rpc/bus/channel.cpp
+++ b/yt/yt/core/rpc/bus/channel.cpp
@@ -150,7 +150,7 @@ public:
return requestCount;
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
return MemoryUsageTracker_;
}
@@ -377,10 +377,11 @@ private:
}
if (auto readyFuture = GetBusReadyFuture()) {
- YT_LOG_DEBUG("Waiting for bus to become ready (RequestId: %v, Method: %v.%v)",
+ YT_LOG_DEBUG("Waiting for bus to become ready (RequestId: %v, Method: %v.%v, Endpoint: %v)",
requestControl->GetRequestId(),
requestControl->GetService(),
- requestControl->GetMethod());
+ requestControl->GetMethod(),
+ Bus_->GetEndpointDescription());
readyFuture.Subscribe(BIND(
[
diff --git a/yt/yt/core/rpc/channel.h b/yt/yt/core/rpc/channel.h
index 8affb32b47..f3ebd37636 100644
--- a/yt/yt/core/rpc/channel.h
+++ b/yt/yt/core/rpc/channel.h
@@ -124,7 +124,7 @@ struct IChannel
virtual int GetInflightRequestCount() = 0;
- virtual IMemoryUsageTrackerPtr GetChannelMemoryTracker() = 0;
+ virtual const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() = 0;
};
DEFINE_REFCOUNTED_TYPE(IChannel)
diff --git a/yt/yt/core/rpc/channel_detail.cpp b/yt/yt/core/rpc/channel_detail.cpp
index fd4233826f..8b68f3d754 100644
--- a/yt/yt/core/rpc/channel_detail.cpp
+++ b/yt/yt/core/rpc/channel_detail.cpp
@@ -62,7 +62,7 @@ int TChannelWrapper::GetInflightRequestCount()
return UnderlyingChannel_->GetInflightRequestCount();
}
-IMemoryUsageTrackerPtr TChannelWrapper::GetChannelMemoryTracker()
+const IMemoryUsageTrackerPtr& TChannelWrapper::GetChannelMemoryTracker()
{
return UnderlyingChannel_->GetChannelMemoryTracker();
}
diff --git a/yt/yt/core/rpc/channel_detail.h b/yt/yt/core/rpc/channel_detail.h
index e01579f361..a601ab19c2 100644
--- a/yt/yt/core/rpc/channel_detail.h
+++ b/yt/yt/core/rpc/channel_detail.h
@@ -29,7 +29,7 @@ public:
int GetInflightRequestCount() override;
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override;
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override;
protected:
const IChannelPtr UnderlyingChannel_;
diff --git a/yt/yt/core/rpc/grpc/channel.cpp b/yt/yt/core/rpc/grpc/channel.cpp
index 0c0ed1fc88..48aeea0d8b 100644
--- a/yt/yt/core/rpc/grpc/channel.cpp
+++ b/yt/yt/core/rpc/grpc/channel.cpp
@@ -216,15 +216,16 @@ public:
YT_UNIMPLEMENTED();
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
private:
const TChannelConfigPtr Config_;
const TString EndpointAddress_;
const IAttributeDictionaryPtr EndpointAttributes_;
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
TSingleShotCallbackList<void(const TError&)> Terminated_;
diff --git a/yt/yt/core/rpc/hedging_channel.cpp b/yt/yt/core/rpc/hedging_channel.cpp
index b24e797b4e..85b095ee0e 100644
--- a/yt/yt/core/rpc/hedging_channel.cpp
+++ b/yt/yt/core/rpc/hedging_channel.cpp
@@ -392,7 +392,7 @@ public:
YT_UNIMPLEMENTED();
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
return PrimaryChannel_->GetChannelMemoryTracker();
}
diff --git a/yt/yt/core/rpc/http/channel.cpp b/yt/yt/core/rpc/http/channel.cpp
index fc58a04b76..4df4d37cb8 100644
--- a/yt/yt/core/rpc/http/channel.cpp
+++ b/yt/yt/core/rpc/http/channel.cpp
@@ -121,9 +121,9 @@ public:
YT_UNIMPLEMENTED();
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
private:
@@ -133,6 +133,8 @@ private:
const TString EndpointAddress_;
const IAttributeDictionaryPtr EndpointAttributes_;
const NConcurrency::IPollerPtr Poller_;
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
+
bool IsHttps_;
NHttps::TClientCredentialsConfigPtr Credentials_;
diff --git a/yt/yt/core/rpc/local_channel.cpp b/yt/yt/core/rpc/local_channel.cpp
index 6c83590794..11b7392836 100644
--- a/yt/yt/core/rpc/local_channel.cpp
+++ b/yt/yt/core/rpc/local_channel.cpp
@@ -133,9 +133,9 @@ public:
return 0;
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
private:
@@ -143,6 +143,7 @@ private:
using TSessionPtr = TIntrusivePtr<TSession>;
const IServerPtr Server_;
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
TSingleShotCallbackList<void(const TError&)> Terminated_;
diff --git a/yt/yt/core/rpc/null_channel.cpp b/yt/yt/core/rpc/null_channel.cpp
index a0b391dd74..41a1593d83 100644
--- a/yt/yt/core/rpc/null_channel.cpp
+++ b/yt/yt/core/rpc/null_channel.cpp
@@ -49,13 +49,14 @@ public:
return 0;
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
private:
const TString Address_;
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
};
IChannelPtr CreateNullChannel(TString address)
diff --git a/yt/yt/core/rpc/roaming_channel.cpp b/yt/yt/core/rpc/roaming_channel.cpp
index af4e689061..f0c011cc15 100644
--- a/yt/yt/core/rpc/roaming_channel.cpp
+++ b/yt/yt/core/rpc/roaming_channel.cpp
@@ -183,13 +183,14 @@ public:
return 0;
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
private:
const IRoamingChannelProviderPtr Provider_;
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
};
IChannelPtr CreateRoamingChannel(IRoamingChannelProviderPtr provider)
diff --git a/yt/yt/core/rpc/service_detail.cpp b/yt/yt/core/rpc/service_detail.cpp
index 46bdf7ad27..285fd3b8f5 100644
--- a/yt/yt/core/rpc/service_detail.cpp
+++ b/yt/yt/core/rpc/service_detail.cpp
@@ -745,7 +745,7 @@ private:
auto userAgent = RequestHeader_->has_user_agent()
? TStringBuf(RequestHeader_->user_agent())
: UnknownUserAgent;
- PerformanceCounters_->IncrementRequestsPerUserAgent(userAgent);
+ PerformanceCounters_->IncrementRequestsPerUserAgent(userAgent.SubString(0, 200));
MethodPerformanceCounters_->RequestCounter.Increment();
MethodPerformanceCounters_->RequestMessageBodySizeCounter.Increment(
diff --git a/yt/yt/core/rpc/unittests/viable_peer_registry_ut.cpp b/yt/yt/core/rpc/unittests/viable_peer_registry_ut.cpp
index 8096c20e08..382d8f142d 100644
--- a/yt/yt/core/rpc/unittests/viable_peer_registry_ut.cpp
+++ b/yt/yt/core/rpc/unittests/viable_peer_registry_ut.cpp
@@ -129,13 +129,15 @@ public:
return 0;
}
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
DEFINE_SIGNAL_OVERRIDE(void(const TError&), Terminated);
private:
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
+
TString Address_;
THashSet<TString>* ChannelRegistry_;
};
diff --git a/yt/yt/core/test_framework/test_memory_tracker.cpp b/yt/yt/core/test_framework/test_memory_tracker.cpp
index c491fd3e1c..3ab4c8d627 100644
--- a/yt/yt/core/test_framework/test_memory_tracker.cpp
+++ b/yt/yt/core/test_framework/test_memory_tracker.cpp
@@ -131,7 +131,7 @@ TErrorOr<TSharedRef> TTestNodeMemoryTracker::TryTrack(
TSharedRef reference,
bool keepHolder)
{
- return Track(reference, keepHolder);
+ return Track(std::move(reference), keepHolder);
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/core/test_framework/test_memory_tracker.h b/yt/yt/core/test_framework/test_memory_tracker.h
index 7308eb2a9d..b654ef300f 100644
--- a/yt/yt/core/test_framework/test_memory_tracker.h
+++ b/yt/yt/core/test_framework/test_memory_tracker.h
@@ -37,6 +37,7 @@ public:
TErrorOr<TSharedRef> TryTrack(
TSharedRef reference,
bool keepHolder = false) override;
+
private:
class TTestTrackedReferenceHolder
diff --git a/yt/yt/core/test_framework/test_proxy_service.cpp b/yt/yt/core/test_framework/test_proxy_service.cpp
index 8eb5b8da3d..692ebb65a8 100644
--- a/yt/yt/core/test_framework/test_proxy_service.cpp
+++ b/yt/yt/core/test_framework/test_proxy_service.cpp
@@ -167,9 +167,9 @@ int TTestChannel::GetInflightRequestCount()
return 0;
}
-IMemoryUsageTrackerPtr TTestChannel::GetChannelMemoryTracker()
+const IMemoryUsageTrackerPtr& TTestChannel::GetChannelMemoryTracker()
{
- return GetNullMemoryUsageTracker();
+ return MemoryUsageTracker_;
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/core/test_framework/test_proxy_service.h b/yt/yt/core/test_framework/test_proxy_service.h
index 389d1eb344..c3dce7f78a 100644
--- a/yt/yt/core/test_framework/test_proxy_service.h
+++ b/yt/yt/core/test_framework/test_proxy_service.h
@@ -110,7 +110,7 @@ public:
int GetInflightRequestCount() override;
- IMemoryUsageTrackerPtr GetChannelMemoryTracker() override;
+ const IMemoryUsageTrackerPtr& GetChannelMemoryTracker() override;
void SubscribeTerminated(const TCallback<void(const TError&)>& callback) override;
@@ -121,6 +121,7 @@ private:
const TRealmIdServiceMap DefaultServices_;
const TString Address_;
const NYTree::IAttributeDictionaryPtr Attributes_;
+ const IMemoryUsageTrackerPtr MemoryUsageTracker_ = GetNullMemoryUsageTracker();
TSingleShotCallbackList<void(const TError&)> Terminated_;
diff --git a/yt/yt/core/ya.make b/yt/yt/core/ya.make
index 9ce00aca5b..d4a54b2ad7 100644
--- a/yt/yt/core/ya.make
+++ b/yt/yt/core/ya.make
@@ -152,6 +152,7 @@ SRCS(
misc/shutdown.cpp
misc/signal_registry.cpp
misc/slab_allocator.cpp
+ misc/statistic_path.cpp
misc/statistics.cpp
misc/string_helpers.cpp
misc/cache_config.cpp
diff --git a/yt/yt/core/ypath/stack.h b/yt/yt/core/ypath/stack.h
index e5b40f2be7..fd09310d1d 100644
--- a/yt/yt/core/ypath/stack.h
+++ b/yt/yt/core/ypath/stack.h
@@ -33,7 +33,7 @@ public:
private:
std::vector<size_t> PreviousPathLengths_;
- TString Path_;
+ TYPath Path_;
static TString ToString(const TEntry& entry);
};
diff --git a/yt/yt/core/ypath/tokenizer.cpp b/yt/yt/core/ypath/tokenizer.cpp
index 6079747cfb..0b64f82761 100644
--- a/yt/yt/core/ypath/tokenizer.cpp
+++ b/yt/yt/core/ypath/tokenizer.cpp
@@ -274,7 +274,7 @@ TTokenizer::TCheckpoint::~TCheckpoint()
////////////////////////////////////////////////////////////////////////////////
-bool HasPrefix(const TYPath& fullPath, const TYPath& prefixPath)
+bool HasPrefix(TYPathBuf fullPath, TYPathBuf prefixPath)
{
TTokenizer fullTokenizer(fullPath);
TTokenizer prefixTokenizer(prefixPath);
diff --git a/yt/yt/core/ypath/tokenizer.h b/yt/yt/core/ypath/tokenizer.h
index 57b714a580..6485d2565a 100644
--- a/yt/yt/core/ypath/tokenizer.h
+++ b/yt/yt/core/ypath/tokenizer.h
@@ -24,11 +24,11 @@ public:
ETokenType GetType() const;
ETokenType GetPreviousType() const;
TStringBuf GetToken() const;
- TStringBuf GetPrefix() const;
- TStringBuf GetPrefixPlusToken() const;
+ TYPathBuf GetPrefix() const;
+ TYPathBuf GetPrefixPlusToken() const;
TStringBuf GetSuffix() const;
TStringBuf GetInput() const;
- TStringBuf GetPath() const;
+ TYPathBuf GetPath() const;
const TString& GetLiteralValue() const;
void Expect(ETokenType expectedType) const;
@@ -71,7 +71,7 @@ private:
////////////////////////////////////////////////////////////////////////////////
-bool HasPrefix(const TYPath& fullPath, const TYPath& prefixPath);
+bool HasPrefix(TYPathBuf fullPath, TYPathBuf prefixPath);
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/core/yson/protobuf_interop.cpp b/yt/yt/core/yson/protobuf_interop.cpp
index 5900fe24d2..59f6291587 100644
--- a/yt/yt/core/yson/protobuf_interop.cpp
+++ b/yt/yt/core/yson/protobuf_interop.cpp
@@ -132,14 +132,15 @@ bool IsMapKeyType(FieldDescriptor::Type type)
TString ToUnderscoreCase(const TString& protobufName)
{
TStringBuilder builder;
- for (auto ch : protobufName) {
- if (isupper(ch)) {
- if (builder.GetLength() > 0 && builder.GetBuffer()[builder.GetLength() - 1] != '_') {
+ for (size_t i = 0; i < protobufName.size(); ++i) {
+ if (isupper(protobufName[i])) {
+ size_t length = builder.GetLength();
+ if (length && builder.GetBuffer()[length - 1] != '_' && !isupper(protobufName[i - 1])) {
builder.AppendChar('_');
}
- builder.AppendChar(tolower(ch));
+ builder.AppendChar(tolower(protobufName[i]));
} else {
- builder.AppendChar(ch);
+ builder.AppendChar(protobufName[i]);
}
}
return builder.Flush();
diff --git a/yt/yt/core/yson/pull_parser.cpp b/yt/yt/core/yson/pull_parser.cpp
index f79b81b2e6..ed2ffd78d9 100644
--- a/yt/yt/core/yson/pull_parser.cpp
+++ b/yt/yt/core/yson/pull_parser.cpp
@@ -498,7 +498,6 @@ void TYsonPullParser::TransferComplexValue(IYsonConsumer* consumer, const TYsonI
/*stopAfterAttributes*/ false);
}
-
void TYsonPullParser::SkipAttributes(const TYsonItem& previousItem)
{
EnsureYsonToken("attributes", *this, previousItem, EYsonItemType::BeginAttributes);
diff --git a/yt/yt/core/yson/pull_parser_deserialize-inl.h b/yt/yt/core/yson/pull_parser_deserialize-inl.h
index 9d45eec2a7..b0f6b9d8ca 100644
--- a/yt/yt/core/yson/pull_parser_deserialize-inl.h
+++ b/yt/yt/core/yson/pull_parser_deserialize-inl.h
@@ -4,11 +4,6 @@
#include "pull_parser_deserialize.h"
#endif
-#include "public.h"
-
-#include "pull_parser.h"
-#include "pull_parser_deserialize.h"
-
#include <yt/yt/core/misc/error.h>
#include <yt/yt/core/yson/token_writer.h>
@@ -360,6 +355,19 @@ void Deserialize(TStrongTypedef<T, TTag>& value, TYsonPullParserCursor* cursor)
Deserialize(value.Underlying(), cursor);
}
+template <class T>
+ requires std::derived_from<T, google::protobuf::Message>
+void Deserialize(
+ T& message,
+ NYson::TYsonPullParserCursor* cursor)
+{
+ NYson::TProtobufWriterOptions options;
+ options.UnknownYsonFieldModeResolver = NYson::TProtobufWriterOptions::CreateConstantUnknownYsonFieldModeResolver(
+ NYson::EUnknownYsonFieldsMode::Keep);
+
+ DeserializeProtobufMessage(message, NYson::ReflectProtobufMessageType<T>(), cursor, options);
+}
+
////////////////////////////////////////////////////////////////////////////////
template <typename TTo>
diff --git a/yt/yt/core/yson/pull_parser_deserialize.cpp b/yt/yt/core/yson/pull_parser_deserialize.cpp
index 0ccc9cdc42..3659fd29fb 100644
--- a/yt/yt/core/yson/pull_parser_deserialize.cpp
+++ b/yt/yt/core/yson/pull_parser_deserialize.cpp
@@ -1,5 +1,11 @@
#include "pull_parser_deserialize.h"
+#include "protobuf_interop.h"
+
+#include <yt/yt/core/misc/protobuf_helpers.h>
+
+#include <library/cpp/yt/yson/consumer.h>
+
#include <library/cpp/yt/misc/cast.h>
namespace NYT::NYson {
@@ -237,6 +243,24 @@ void Deserialize(TGuid& value, TYsonPullParserCursor* cursor)
cursor->Next();
}
+void DeserializeProtobufMessage(
+ google::protobuf::Message& message,
+ const TProtobufMessageType* type,
+ NYson::TYsonPullParserCursor* cursor,
+ const NYson::TProtobufWriterOptions& options)
+{
+ TProtobufString wireBytes;
+ google::protobuf::io::StringOutputStream outputStream(&wireBytes);
+ auto protobufWriter = CreateProtobufWriter(&outputStream, type, options);
+
+ cursor->TransferComplexValue(protobufWriter.get());
+
+ if (!message.ParseFromArray(wireBytes.data(), wireBytes.size())) {
+ THROW_ERROR_EXCEPTION("Error parsing %v from wire bytes",
+ message.GetTypeName());
+ }
+}
+
////////////////////////////////////////////////////////////////////////////////
} // namespace NYT::NYson
diff --git a/yt/yt/core/yson/pull_parser_deserialize.h b/yt/yt/core/yson/pull_parser_deserialize.h
index 93af8deb78..9d10f5f47c 100644
--- a/yt/yt/core/yson/pull_parser_deserialize.h
+++ b/yt/yt/core/yson/pull_parser_deserialize.h
@@ -3,6 +3,7 @@
#include "public.h"
#include "pull_parser.h"
+#include "protobuf_interop.h"
#include <library/cpp/yt/containers/enum_indexed_array.h>
@@ -160,6 +161,18 @@ void Deserialize(std::unique_ptr<T>& value, TYsonPullParserCursor* cursor);
template <class T, class TTag>
void Deserialize(TStrongTypedef<T, TTag>& value, TYsonPullParserCursor* cursor);
+void DeserializeProtobufMessage(
+ google::protobuf::Message& message,
+ const NYson::TProtobufMessageType* type,
+ NYson::TYsonPullParserCursor* cursor,
+ const NYson::TProtobufWriterOptions& options = {});
+
+template <class T>
+ requires std::derived_from<T, google::protobuf::Message>
+void Deserialize(
+ T& message,
+ NYson::TYsonPullParserCursor* cursor);
+
////////////////////////////////////////////////////////////////////////////////
template <typename TTo>
diff --git a/yt/yt/core/yson/unittests/proto/protobuf_yson_casing_ut.proto b/yt/yt/core/yson/unittests/proto/protobuf_yson_casing_ut.proto
index 627d6e23ad..65fea7bc69 100644
--- a/yt/yt/core/yson/unittests/proto/protobuf_yson_casing_ut.proto
+++ b/yt/yt/core/yson/unittests/proto/protobuf_yson_casing_ut.proto
@@ -6,7 +6,14 @@ option (NYT.NYson.NProto.derive_underscore_case_names) = true;
message TCamelCaseStyleMessage
{
+ enum EEnum
+ {
+ VALUE_NONE = 0;
+ VALUE_FIRST = 1;
+ }
+
optional int32 SomeField = 1;
optional int32 AnotherField123 = 2;
optional int32 Crazy_Field = 3;
+ optional EEnum EnumField = 4;
}
diff --git a/yt/yt/core/yson/unittests/protobuf_yson_ut.cpp b/yt/yt/core/yson/unittests/protobuf_yson_ut.cpp
index ebc8afc360..d6d97d6c1f 100644
--- a/yt/yt/core/yson/unittests/protobuf_yson_ut.cpp
+++ b/yt/yt/core/yson/unittests/protobuf_yson_ut.cpp
@@ -1822,6 +1822,7 @@ TEST(TProtobufToYsonTest, Casing)
message.set_somefield(1);
message.set_anotherfield123(2);
message.set_crazy_field(3);
+ message.set_enumfield(NYT::NYson::NProto::TCamelCaseStyleMessage::VALUE_FIRST);
TEST_PROLOGUE()
Y_PROTOBUF_SUPPRESS_NODISCARD message.SerializeToCodedStream(&codedStream);
@@ -1833,6 +1834,7 @@ TEST(TProtobufToYsonTest, Casing)
.Item("some_field").Value(1)
.Item("another_field123").Value(2)
.Item("crazy_field").Value(3)
+ .Item("enum_field").Value("value_first")
.EndMap();
EXPECT_TRUE(AreNodesEqual(writtenNode, expectedNode));
}
diff --git a/yt/yt/core/ytree/serialize-inl.h b/yt/yt/core/ytree/serialize-inl.h
index 59d18ee68d..6d846e42dd 100644
--- a/yt/yt/core/ytree/serialize-inl.h
+++ b/yt/yt/core/ytree/serialize-inl.h
@@ -625,10 +625,10 @@ void DeserializeProtobufMessage(
const NYson::TProtobufWriterOptions& options = {});
template <class T>
+ requires std::derived_from<T, google::protobuf::Message>
void Deserialize(
T& message,
- const INodePtr& node,
- typename std::enable_if<std::is_convertible<T*, google::protobuf::Message*>::value, void>::type*)
+ const INodePtr& node)
{
NYson::TProtobufWriterOptions options;
options.UnknownYsonFieldModeResolver = NYson::TProtobufWriterOptions::CreateConstantUnknownYsonFieldModeResolver(
@@ -636,15 +636,6 @@ void Deserialize(
DeserializeProtobufMessage(message, NYson::ReflectProtobufMessageType<T>(), node, options);
}
-template <class T>
-void Deserialize(
- T& message,
- NYson::TYsonPullParserCursor* cursor,
- typename std::enable_if<std::is_convertible<T*, google::protobuf::Message*>::value, void>::type*)
-{
- Deserialize(message, NYson::ExtractTo<NYTree::INodePtr>(cursor));
-}
-
template <class T, class TTag>
void Deserialize(TStrongTypedef<T, TTag>& value, INodePtr node)
{
diff --git a/yt/yt/core/ytree/serialize.cpp b/yt/yt/core/ytree/serialize.cpp
index f6a1b23ca6..8476a92b7e 100644
--- a/yt/yt/core/ytree/serialize.cpp
+++ b/yt/yt/core/ytree/serialize.cpp
@@ -167,6 +167,12 @@ void Serialize(IInputStream& input, IYsonConsumer* consumer)
Serialize(TYsonInput(&input), consumer);
}
+// TStatisticPath.
+void Serialize(const NStatisticPath::TStatisticPath& path, IYsonConsumer* consumer)
+{
+ consumer->OnStringScalar(path.Path());
+}
+
// Subtypes of google::protobuf::Message
void SerializeProtobufMessage(
const Message& message,
@@ -342,6 +348,12 @@ void Deserialize(TGuid& value, INodePtr node)
value = TGuid::FromString(node->AsString()->GetValue());
}
+// TStatisticPath.
+void Deserialize(NStatisticPath::TStatisticPath& value, INodePtr node)
+{
+ value = NStatisticPath::ParseStatisticPath(node->AsString()->GetValue()).ValueOrThrow();
+}
+
// Subtypes of google::protobuf::Message
void DeserializeProtobufMessage(
Message& message,
diff --git a/yt/yt/core/ytree/serialize.h b/yt/yt/core/ytree/serialize.h
index 5791c2e16f..633507dce5 100644
--- a/yt/yt/core/ytree/serialize.h
+++ b/yt/yt/core/ytree/serialize.h
@@ -6,6 +6,7 @@
#include <yt/yt/core/misc/guid.h>
#include <yt/yt/core/misc/mpl.h>
+#include <yt/yt/core/misc/statistic_path.h>
#include <yt/yt/core/yson/writer.h>
@@ -161,6 +162,8 @@ void Serialize(
template <class T, class TTag>
void Serialize(const TStrongTypedef<T, TTag>& value, NYson::IYsonConsumer* consumer);
+void Serialize(const NStatisticPath::TStatisticPath& path, NYson::IYsonConsumer* consumer);
+
////////////////////////////////////////////////////////////////////////////////
template <class T>
@@ -252,20 +255,16 @@ void Deserialize(TEnumIndexedArray<E, T, Min, Max>& vector, INodePtr node);
// Subtypes of google::protobuf::Message
template <class T>
+ requires std::derived_from<T, google::protobuf::Message>
void Deserialize(
T& message,
- const INodePtr& node,
- typename std::enable_if<std::is_convertible<T*, google::protobuf::Message*>::value, void>::type* = nullptr);
-
-template <class T>
-void Deserialize(
- T& message,
- NYson::TYsonPullParserCursor* cursor,
- typename std::enable_if<std::is_convertible<T*, google::protobuf::Message*>::value, void>::type* = nullptr);
+ const INodePtr& node);
template <class T, class TTag>
void Deserialize(TStrongTypedef<T, TTag>& value, INodePtr node);
+void Deserialize(NStatisticPath::TStatisticPath& path, INodePtr node);
+
////////////////////////////////////////////////////////////////////////////////
template <class T, class... TExtraArgs>
diff --git a/yt/yt/library/formats/arrow_parser.cpp b/yt/yt/library/formats/arrow_parser.cpp
index b178ad030a..217ddedf21 100644
--- a/yt/yt/library/formats/arrow_parser.cpp
+++ b/yt/yt/library/formats/arrow_parser.cpp
@@ -802,7 +802,7 @@ void PrepareArrayForComplexType(
} else {
for (int rowIndex = 0; rowIndex < std::ssize(rowsValues[columnIndex]); rowIndex++) {
if (column->IsNull(rowIndex)) {
- rowsValues[rowIndex][columnIndex] = MakeUnversionedNullValue(columnId);
+ rowsValues[columnIndex][rowIndex] = MakeUnversionedNullValue(columnId);
} else {
TBuffer valueBuffer;
TBufferOutput out(valueBuffer);
diff --git a/yt/yt/library/oom/oom.cpp b/yt/yt/library/oom/oom.cpp
index 648485c77b..10b3e64e7b 100644
--- a/yt/yt/library/oom/oom.cpp
+++ b/yt/yt/library/oom/oom.cpp
@@ -21,7 +21,9 @@
namespace NYT {
-static NYT::NLogging::TLogger Logger{"OOM"};
+////////////////////////////////////////////////////////////////////////////////
+
+YT_DEFINE_GLOBAL(const NYT::NLogging::TLogger, Logger, "OOM");
////////////////////////////////////////////////////////////////////////////////
@@ -45,10 +47,10 @@ static const char* TCMallocStats[] = {
"tcmalloc.transfer_cache_free",
"tcmalloc.hard_usage_limit_bytes",
"tcmalloc.desired_usage_limit_bytes",
- "tcmalloc.required_bytes"
+ "tcmalloc.required_bytes",
};
-void OOMWatchdog(TOOMOptions options)
+void OomWatchdog(TOomWatchdogOptions options)
{
while (true) {
auto rss = GetProcessMemoryUsage().Rss;
@@ -124,12 +126,12 @@ void OOMWatchdog(TOOMOptions options)
}
}
-void EnableEarlyOOMWatchdog(TOOMOptions options)
+void EnableEarlyOomWatchdog(TOomWatchdogOptions options)
{
static std::once_flag onceFlag;
std::call_once(onceFlag, [options] {
- std::thread(OOMWatchdog, options).detach();
+ std::thread(OomWatchdog, options).detach();
});
}
diff --git a/yt/yt/library/oom/oom.h b/yt/yt/library/oom/oom.h
index aa85cc678b..11edd7ca02 100644
--- a/yt/yt/library/oom/oom.h
+++ b/yt/yt/library/oom/oom.h
@@ -10,20 +10,20 @@ namespace NYT {
////////////////////////////////////////////////////////////////////////////////
-struct TOOMOptions
+struct TOomWatchdogOptions
{
std::optional<i64> MemoryLimit;
TString HeapDumpPath = "oom.pb.gz";
};
-void EnableEarlyOOMWatchdog(TOOMOptions options);
+void EnableEarlyOomWatchdog(TOomWatchdogOptions options);
////////////////////////////////////////////////////////////////////////////////
struct TTCMallocLimitHandlerOptions
{
TString HeapDumpDirectory;
- TDuration Timeout = TDuration::Seconds(300);
+ TDuration Timeout = TDuration::Minutes(5);
};
void EnableTCMallocLimitHandler(TTCMallocLimitHandlerOptions options);
diff --git a/yt/yt/library/oom/tcmalloc_memory_limit_handler.cpp b/yt/yt/library/oom/tcmalloc_memory_limit_handler.cpp
index 48520bd873..ef63f60b83 100644
--- a/yt/yt/library/oom/tcmalloc_memory_limit_handler.cpp
+++ b/yt/yt/library/oom/tcmalloc_memory_limit_handler.cpp
@@ -93,6 +93,7 @@ public:
private:
const TTCMallocLimitHandlerOptions Options_;
+
bool Fired_ = false;
bool NeedToHandle_ = false;
std::mutex Mutex_;
@@ -123,12 +124,12 @@ private:
SetupMemoryProfileTimeout(Options_.Timeout.Seconds());
CollectAndDumpMemoryProfile(heapDumpPath);
- Cerr << "TTCMallocLimitHandler: Heap profile written." << Endl;
+ Cerr << "TTCMallocLimitHandler: Heap profile written" << Endl;
::_exit(0);
}
if (childPid < 0) {
- Cerr << "TTCMallocLimitHandler: fork failed with code:" << LastSystemErrorText() << Endl;
+ Cerr << "TTCMallocLimitHandler: Fork failed: " << LastSystemErrorText() << Endl;
::_exit(1);
}
@@ -180,26 +181,28 @@ void SetSoftMemoryLimitHandler(THandler handler)
////////////////////////////////////////////////////////////////////////////////
-static TAtomicIntrusivePtr<TTCMallocLimitHandler> LimitHandler_;
+namespace {
-////////////////////////////////////////////////////////////////////////////////
+YT_DEFINE_GLOBAL(TAtomicIntrusivePtr<TTCMallocLimitHandler>, LimitHandler);
void HandleTCMallocLimit()
{
- if (auto handler = LimitHandler_.Acquire()) {
+ if (auto handler = LimitHandler().Acquire()) {
handler->Fire();
}
}
+} // namespace
+
void EnableTCMallocLimitHandler(TTCMallocLimitHandlerOptions options)
{
{
- if (LimitHandler_.Acquire()) {
+ if (LimitHandler().Acquire()) {
return;
}
- TAtomicIntrusivePtr<TTCMallocLimitHandler>::TRawPtr expected{nullptr};
- LimitHandler_.CompareAndSwap(expected, New<TTCMallocLimitHandler>(options));
+ TAtomicIntrusivePtr<TTCMallocLimitHandler>::TRawPtr expected = nullptr;
+ LimitHandler().CompareAndSwap(expected, New<TTCMallocLimitHandler>(options));
}
SetSoftMemoryLimitHandler<tcmalloc::MallocExtension>(&HandleTCMallocLimit);
@@ -207,7 +210,9 @@ void EnableTCMallocLimitHandler(TTCMallocLimitHandlerOptions options)
void DisableTCMallocLimitHandler()
{
- LimitHandler_.Reset();
+ LimitHandler().Reset();
}
+////////////////////////////////////////////////////////////////////////////////
+
} // namespace NYT
diff --git a/yt/yt/library/oom/unittests/oom_ut.cpp b/yt/yt/library/oom/unittests/oom_ut.cpp
index 6c61f456f9..692fb85232 100644
--- a/yt/yt/library/oom/unittests/oom_ut.cpp
+++ b/yt/yt/library/oom/unittests/oom_ut.cpp
@@ -14,7 +14,7 @@ namespace {
TEST(EarlyOOM, Crash)
{
auto checkOOM = [] {
- EnableEarlyOOMWatchdog(TOOMOptions{
+ EnableEarlyOomWatchdog(TOomWatchdogOptions{
.MemoryLimit = 0,
});
@@ -28,7 +28,7 @@ TEST(EarlyOOM, Crash)
TEST(EarlyOOM, NoCrash)
{
- EnableEarlyOOMWatchdog(TOOMOptions{
+ EnableEarlyOomWatchdog(TOomWatchdogOptions{
.MemoryLimit = 1_GB,
});
diff --git a/yt/yt/library/tvm/ya.make b/yt/yt/library/tvm/ya.make
index b7f1973dcd..4f8ba3a9b6 100644
--- a/yt/yt/library/tvm/ya.make
+++ b/yt/yt/library/tvm/ya.make
@@ -10,7 +10,7 @@ PEERDIR(
library/cpp/yt/memory
)
-IF(NOT OPENSOURCE)
+IF (NOT OPENSOURCE AND NOT USE_VANILLA_PROTOC)
INCLUDE(ya_non_opensource.inc)
ENDIF()