diff options
author | Alexander Smirnov <alex@ydb.tech> | 2024-07-30 19:23:14 +0000 |
---|---|---|
committer | Alexander Smirnov <alex@ydb.tech> | 2024-07-30 19:23:14 +0000 |
commit | 40beacac031f579786f8b26aa16c59486dbab2b0 (patch) | |
tree | 12a1548bbf15daf6e931eaca2fcd6a9e618d0356 | |
parent | ea1b205d749cc1c3e37c7ae42817534ede33e390 (diff) | |
parent | f7ca71b582e2347ec55857b493d6bccf55bbc3df (diff) | |
download | ydb-40beacac031f579786f8b26aa16c59486dbab2b0.tar.gz |
Merge branch 'rightlib' into mergelibs-240730-1922
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, §s); + + 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, §s); + + 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 & 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 & 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 @@ -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() |