grpc 1.2.5 → 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +1434 -399
- data/etc/roots.pem +34 -150
- data/include/grpc/grpc.h +71 -0
- data/include/grpc/impl/codegen/atm.h +5 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +6 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
- data/include/grpc/impl/codegen/atm_windows.h +11 -0
- data/include/grpc/impl/codegen/grpc_types.h +54 -13
- data/include/grpc/impl/codegen/port_platform.h +15 -1
- data/include/grpc/support/alloc.h +2 -1
- data/include/grpc/support/sync.h +4 -0
- data/include/grpc/support/tls.h +1 -1
- data/src/core/ext/census/gen/trace_context.pb.h +1 -1
- data/src/core/ext/census/grpc_filter.c +14 -10
- data/src/core/ext/census/grpc_plugin.c +3 -1
- data/src/core/ext/census/trace_label.h +1 -1
- data/src/core/ext/census/trace_propagation.h +1 -1
- data/src/core/ext/census/trace_status.h +1 -1
- data/src/core/ext/census/trace_string.h +1 -1
- data/src/core/ext/census/tracing.h +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/channel_connectivity.c +56 -27
- data/src/core/ext/{client_channel → filters/client_channel}/client_channel.c +407 -202
- data/src/core/ext/{client_channel → filters/client_channel}/client_channel.h +10 -6
- data/src/core/ext/{client_channel → filters/client_channel}/client_channel_factory.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/client_channel_factory.h +4 -4
- data/src/core/ext/{client_channel → filters/client_channel}/client_channel_plugin.c +12 -7
- data/src/core/ext/{client_channel → filters/client_channel}/connector.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/connector.h +3 -5
- data/src/core/ext/{client_channel → filters/client_channel}/http_connect_handshaker.c +6 -6
- data/src/core/ext/{client_channel → filters/client_channel}/http_connect_handshaker.h +3 -3
- data/src/core/ext/{client_channel → filters/client_channel}/http_proxy.c +4 -4
- data/src/core/ext/{client_channel → filters/client_channel}/http_proxy.h +3 -3
- data/src/core/ext/{client_channel → filters/client_channel}/lb_policy.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/lb_policy.h +4 -4
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb.c +22 -20
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb.h +4 -4
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb_channel.h +5 -4
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb_channel_secure.c +2 -2
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/load_balancer_api.c +1 -1
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/load_balancer_api.h +6 -5
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +1 -1
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -0
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/pick_first/pick_first.c +20 -15
- data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/round_robin/round_robin.c +21 -16
- data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_factory.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_factory.h +5 -5
- data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_registry.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_channel → filters/client_channel}/parse_address.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/parse_address.h +4 -4
- data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper.h +3 -3
- data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper_registry.c +10 -4
- data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper_registry.h +4 -4
- data/src/core/ext/{client_channel → filters/client_channel}/resolver.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/resolver.h +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +350 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +66 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c +319 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +289 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +64 -0
- data/src/core/ext/{resolver → filters/client_channel/resolver}/dns/native/dns_resolver.c +21 -5
- data/src/core/ext/{resolver → filters/client_channel/resolver}/sockaddr/sockaddr_resolver.c +3 -3
- data/src/core/ext/{client_channel → filters/client_channel}/resolver_factory.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/resolver_factory.h +6 -6
- data/src/core/ext/{client_channel → filters/client_channel}/resolver_registry.c +1 -2
- data/src/core/ext/{client_channel → filters/client_channel}/resolver_registry.h +4 -4
- data/src/core/ext/filters/client_channel/retry_throttle.c +210 -0
- data/src/core/ext/filters/client_channel/retry_throttle.h +65 -0
- data/src/core/ext/{client_channel → filters/client_channel}/subchannel.c +49 -43
- data/src/core/ext/{client_channel → filters/client_channel}/subchannel.h +21 -7
- data/src/core/ext/{client_channel → filters/client_channel}/subchannel_index.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/subchannel_index.h +5 -5
- data/src/core/ext/{client_channel → filters/client_channel}/uri_parser.c +1 -1
- data/src/core/ext/{client_channel → filters/client_channel}/uri_parser.h +3 -3
- data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting.c +4 -2
- data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting.h +3 -3
- data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting_filter.c +17 -14
- data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting_filter.h +4 -4
- data/src/core/ext/filters/max_age/max_age_filter.c +439 -0
- data/src/core/ext/filters/max_age/max_age_filter.h +39 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +6 -41
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +2 -2
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +3 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +2 -5
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +2 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +449 -204
- data/src/core/ext/transport/chttp2/transport/frame_data.c +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +37 -7
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +18 -38
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -29
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +64 -37
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +11 -4
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +60 -39
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +2 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.c +75 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +74 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +22 -43
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +8 -10
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -2
- data/src/core/ext/transport/chttp2/transport/parsing.c +33 -15
- data/src/core/ext/transport/chttp2/transport/writing.c +56 -10
- data/src/core/lib/channel/channel_args.c +7 -0
- data/src/core/lib/channel/channel_args.h +2 -0
- data/src/core/lib/channel/channel_stack.c +20 -27
- data/src/core/lib/channel/channel_stack.h +18 -16
- data/src/core/lib/channel/compress_filter.c +20 -18
- data/src/core/lib/channel/connected_channel.c +9 -8
- data/src/core/lib/channel/deadline_filter.c +28 -24
- data/src/core/lib/channel/deadline_filter.h +3 -3
- data/src/core/lib/channel/handshaker.c +3 -2
- data/src/core/lib/channel/http_client_filter.c +119 -61
- data/src/core/lib/channel/http_server_filter.c +124 -69
- data/src/core/lib/channel/message_size_filter.c +23 -19
- data/src/core/lib/http/httpcli.c +8 -6
- data/src/core/lib/http/httpcli_security_connector.c +5 -5
- data/src/core/lib/http/parser.c +57 -31
- data/src/core/lib/iomgr/closure.c +15 -0
- data/src/core/lib/iomgr/closure.h +4 -0
- data/src/core/lib/iomgr/combiner.c +8 -0
- data/src/core/lib/iomgr/endpoint_pair.h +2 -3
- data/src/core/lib/iomgr/endpoint_pair_posix.c +10 -7
- data/src/core/lib/iomgr/endpoint_pair_uv.c +2 -3
- data/src/core/lib/iomgr/endpoint_pair_windows.c +9 -6
- data/src/core/lib/iomgr/error.c +360 -177
- data/src/core/lib/iomgr/error.h +31 -33
- data/src/core/lib/iomgr/error_internal.h +30 -9
- data/src/core/lib/iomgr/ev_epoll_linux.c +25 -239
- data/src/core/lib/iomgr/ev_poll_posix.c +11 -7
- data/src/core/lib/iomgr/ev_posix.c +6 -0
- data/src/core/lib/iomgr/ev_posix.h +3 -0
- data/src/core/lib/iomgr/exec_ctx.c +6 -0
- data/src/core/lib/iomgr/executor.c +8 -2
- data/src/core/lib/iomgr/load_file.c +6 -3
- data/src/core/lib/iomgr/lockfree_event.c +238 -0
- data/src/core/{ext/client_channel/initial_connect_string.h → lib/iomgr/lockfree_event.h} +17 -13
- data/src/core/lib/iomgr/pollset.h +4 -0
- data/src/core/lib/iomgr/pollset_windows.c +2 -2
- data/src/core/lib/iomgr/port.h +9 -0
- data/src/core/lib/iomgr/resolve_address_posix.c +15 -9
- data/src/core/lib/iomgr/resolve_address_uv.c +8 -6
- data/src/core/lib/iomgr/resolve_address_windows.c +2 -2
- data/src/core/lib/iomgr/resource_quota.c +19 -4
- data/src/core/lib/iomgr/resource_quota.h +2 -0
- data/src/core/lib/iomgr/sockaddr_utils.c +3 -1
- data/src/core/lib/iomgr/socket_factory_posix.c +110 -0
- data/src/core/lib/iomgr/socket_factory_posix.h +90 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +25 -9
- data/src/core/lib/iomgr/socket_utils_posix.h +7 -0
- data/src/core/lib/iomgr/tcp_client.h +0 -4
- data/src/core/lib/iomgr/tcp_client_posix.c +15 -31
- data/src/core/lib/iomgr/tcp_client_uv.c +10 -6
- data/src/core/lib/iomgr/tcp_client_windows.c +9 -19
- data/src/core/lib/iomgr/tcp_posix.c +111 -22
- data/src/core/lib/iomgr/tcp_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_server_posix.c +39 -417
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +135 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.c +221 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c +196 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c +49 -0
- data/src/core/lib/iomgr/tcp_server_uv.c +43 -16
- data/src/core/lib/iomgr/tcp_server_windows.c +10 -22
- data/src/core/lib/iomgr/tcp_uv.c +16 -13
- data/src/core/lib/iomgr/tcp_windows.c +24 -12
- data/src/core/lib/iomgr/tcp_windows.h +2 -2
- data/src/core/lib/iomgr/timer.h +3 -0
- data/src/core/lib/iomgr/timer_generic.c +257 -72
- data/src/core/lib/iomgr/timer_generic.h +1 -1
- data/src/core/lib/iomgr/timer_heap.c +8 -8
- data/src/core/lib/iomgr/udp_server.c +54 -24
- data/src/core/lib/iomgr/udp_server.h +7 -7
- data/src/core/lib/iomgr/unix_sockets_posix.c +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +2 -1
- data/src/core/lib/iomgr/wakeup_fd_posix.h +1 -1
- data/src/core/lib/profiling/basic_timers.c +1 -1
- data/src/core/lib/security/credentials/credentials.h +1 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +10 -9
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +2 -2
- data/src/core/lib/security/transport/client_auth_filter.c +33 -26
- data/src/core/lib/security/transport/secure_endpoint.c +8 -5
- data/src/core/lib/security/transport/security_connector.c +37 -37
- data/src/core/lib/security/transport/security_connector.h +1 -1
- data/src/core/lib/security/transport/security_handshaker.c +15 -12
- data/src/core/lib/security/transport/server_auth_filter.c +20 -18
- data/src/core/lib/security/transport/tsi_error.c +5 -3
- data/src/core/lib/security/transport/tsi_error.h +1 -1
- data/src/core/lib/{security/util → slice}/b64.c +21 -6
- data/src/core/lib/{security/util → slice}/b64.h +16 -4
- data/src/core/lib/slice/slice.c +4 -2
- data/src/core/lib/slice/slice_buffer.c +16 -14
- data/src/core/lib/support/arena.c +98 -0
- data/src/core/{ext/client_channel/initial_connect_string.c → lib/support/arena.h} +17 -15
- data/src/core/{ext/client_channel/default_initial_connect_string.c → lib/support/atm.c} +14 -5
- data/src/core/lib/support/cpu_linux.c +5 -0
- data/src/core/lib/support/sync.c +4 -0
- data/src/core/lib/support/time.c +4 -10
- data/src/core/lib/support/wrap_memcpy.c +3 -1
- data/src/core/lib/surface/call.c +252 -221
- data/src/core/lib/surface/channel.c +72 -21
- data/src/core/lib/surface/channel.h +8 -0
- data/src/core/lib/surface/completion_queue.c +2 -3
- data/src/core/lib/surface/completion_queue_factory.c +77 -0
- data/src/core/lib/surface/completion_queue_factory.h +51 -0
- data/src/core/lib/surface/init_secure.c +3 -1
- data/src/core/lib/surface/lame_client.c +18 -14
- data/src/core/lib/surface/server.c +43 -41
- data/src/core/lib/surface/validate_metadata.c +8 -4
- data/src/core/lib/surface/version.c +2 -2
- data/src/core/lib/transport/bdp_estimator.h +1 -1
- data/src/core/lib/transport/connectivity_state.c +2 -1
- data/src/core/lib/transport/error_utils.c +17 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata_batch.c +6 -7
- data/src/core/lib/transport/pid_controller.c +1 -0
- data/src/core/lib/transport/service_config.c +12 -0
- data/src/core/lib/transport/service_config.h +6 -0
- data/src/core/lib/transport/transport.c +29 -17
- data/src/core/lib/transport/transport.h +85 -42
- data/src/core/lib/transport/transport_impl.h +5 -3
- data/src/core/lib/transport/transport_op_string.c +20 -14
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -0
- data/src/core/{lib/tsi → tsi}/fake_transport_security.c +2 -2
- data/src/core/{lib/tsi → tsi}/fake_transport_security.h +4 -4
- data/src/core/{lib/tsi → tsi}/ssl_transport_security.c +40 -79
- data/src/core/{lib/tsi → tsi}/ssl_transport_security.h +44 -21
- data/src/core/{lib/tsi → tsi}/ssl_types.h +3 -3
- data/src/core/{lib/tsi → tsi}/transport_security.c +2 -2
- data/src/core/{lib/tsi → tsi}/transport_security.h +4 -4
- data/src/core/{lib/tsi → tsi}/transport_security_interface.h +3 -3
- data/src/ruby/ext/grpc/extconf.rb +1 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +2 -2
- data/src/ruby/ext/grpc/rb_channel.c +520 -93
- data/src/ruby/ext/grpc/rb_channel.h +2 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +5 -2
- data/src/ruby/ext/grpc/rb_event_thread.c +6 -6
- data/src/ruby/ext/grpc/rb_grpc.c +29 -7
- data/src/ruby/ext/grpc/rb_grpc.h +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +10 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +15 -0
- data/src/ruby/ext/grpc/rb_server.c +5 -3
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_connection_spec.rb +173 -0
- data/src/ruby/spec/channel_spec.rb +29 -0
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +27 -17
- data/third_party/cares/ares_build.h +264 -0
- data/third_party/cares/cares/ares.h +636 -0
- data/third_party/cares/cares/ares__close_sockets.c +61 -0
- data/third_party/cares/cares/ares__get_hostent.c +261 -0
- data/third_party/cares/cares/ares__read_line.c +73 -0
- data/third_party/cares/cares/ares__timeval.c +111 -0
- data/third_party/cares/cares/ares_cancel.c +63 -0
- data/third_party/cares/cares/ares_create_query.c +202 -0
- data/third_party/cares/cares/ares_data.c +221 -0
- data/third_party/cares/cares/ares_data.h +72 -0
- data/third_party/cares/cares/ares_destroy.c +108 -0
- data/third_party/cares/cares/ares_dns.h +103 -0
- data/third_party/cares/cares/ares_expand_name.c +205 -0
- data/third_party/cares/cares/ares_expand_string.c +70 -0
- data/third_party/cares/cares/ares_fds.c +59 -0
- data/third_party/cares/cares/ares_free_hostent.c +41 -0
- data/third_party/cares/cares/ares_free_string.c +25 -0
- data/third_party/cares/cares/ares_getenv.c +30 -0
- data/third_party/cares/cares/ares_getenv.h +26 -0
- data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
- data/third_party/cares/cares/ares_gethostbyname.c +518 -0
- data/third_party/cares/cares/ares_getnameinfo.c +422 -0
- data/third_party/cares/cares/ares_getopt.c +122 -0
- data/third_party/cares/cares/ares_getopt.h +53 -0
- data/third_party/cares/cares/ares_getsock.c +66 -0
- data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
- data/third_party/cares/cares/ares_init.c +2146 -0
- data/third_party/cares/cares/ares_iphlpapi.h +221 -0
- data/third_party/cares/cares/ares_ipv6.h +78 -0
- data/third_party/cares/cares/ares_library_init.c +167 -0
- data/third_party/cares/cares/ares_library_init.h +42 -0
- data/third_party/cares/cares/ares_llist.c +63 -0
- data/third_party/cares/cares/ares_llist.h +39 -0
- data/third_party/cares/cares/ares_mkquery.c +24 -0
- data/third_party/cares/cares/ares_nowarn.c +260 -0
- data/third_party/cares/cares/ares_nowarn.h +61 -0
- data/third_party/cares/cares/ares_options.c +402 -0
- data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
- data/third_party/cares/cares/ares_parse_naptr_reply.c +188 -0
- data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
- data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
- data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
- data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
- data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
- data/third_party/cares/cares/ares_platform.c +11035 -0
- data/third_party/cares/cares/ares_platform.h +43 -0
- data/third_party/cares/cares/ares_private.h +363 -0
- data/third_party/cares/cares/ares_process.c +1359 -0
- data/third_party/cares/cares/ares_query.c +186 -0
- data/third_party/cares/cares/ares_rules.h +125 -0
- data/third_party/cares/cares/ares_search.c +316 -0
- data/third_party/cares/cares/ares_send.c +131 -0
- data/third_party/cares/cares/ares_setup.h +217 -0
- data/third_party/cares/cares/ares_strcasecmp.c +66 -0
- data/third_party/cares/cares/ares_strcasecmp.h +30 -0
- data/third_party/cares/cares/ares_strdup.c +49 -0
- data/third_party/cares/cares/ares_strdup.h +24 -0
- data/third_party/cares/cares/ares_strerror.c +56 -0
- data/third_party/cares/cares/ares_timeout.c +88 -0
- data/third_party/cares/cares/ares_version.c +11 -0
- data/third_party/cares/cares/ares_version.h +24 -0
- data/third_party/cares/cares/ares_writev.c +79 -0
- data/third_party/cares/cares/bitncmp.c +59 -0
- data/third_party/cares/cares/bitncmp.h +26 -0
- data/third_party/cares/cares/config-win32.h +377 -0
- data/third_party/cares/cares/inet_net_pton.c +450 -0
- data/third_party/cares/cares/inet_ntop.c +208 -0
- data/third_party/cares/cares/setup_once.h +554 -0
- data/third_party/cares/cares/windows_port.c +22 -0
- data/third_party/cares/config_darwin/ares_config.h +523 -0
- data/third_party/cares/config_linux/ares_config.h +524 -0
- metadata +164 -68
@@ -0,0 +1,518 @@
|
|
1
|
+
|
2
|
+
/* Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology.
|
3
|
+
*
|
4
|
+
* Permission to use, copy, modify, and distribute this
|
5
|
+
* software and its documentation for any purpose and without
|
6
|
+
* fee is hereby granted, provided that the above copyright
|
7
|
+
* notice appear in all copies and that both that copyright
|
8
|
+
* notice and this permission notice appear in supporting
|
9
|
+
* documentation, and that the name of M.I.T. not be used in
|
10
|
+
* advertising or publicity pertaining to distribution of the
|
11
|
+
* software without specific, written prior permission.
|
12
|
+
* M.I.T. makes no representations about the suitability of
|
13
|
+
* this software for any purpose. It is provided "as is"
|
14
|
+
* without express or implied warranty.
|
15
|
+
*/
|
16
|
+
|
17
|
+
#include "ares_setup.h"
|
18
|
+
|
19
|
+
#ifdef HAVE_NETINET_IN_H
|
20
|
+
# include <netinet/in.h>
|
21
|
+
#endif
|
22
|
+
#ifdef HAVE_NETDB_H
|
23
|
+
# include <netdb.h>
|
24
|
+
#endif
|
25
|
+
#ifdef HAVE_ARPA_INET_H
|
26
|
+
# include <arpa/inet.h>
|
27
|
+
#endif
|
28
|
+
#ifdef HAVE_ARPA_NAMESER_H
|
29
|
+
# include <arpa/nameser.h>
|
30
|
+
#else
|
31
|
+
# include "nameser.h"
|
32
|
+
#endif
|
33
|
+
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
34
|
+
# include <arpa/nameser_compat.h>
|
35
|
+
#endif
|
36
|
+
|
37
|
+
#ifdef HAVE_STRINGS_H
|
38
|
+
#include <strings.h>
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#include "ares.h"
|
42
|
+
#include "ares_inet_net_pton.h"
|
43
|
+
#include "bitncmp.h"
|
44
|
+
#include "ares_platform.h"
|
45
|
+
#include "ares_nowarn.h"
|
46
|
+
#include "ares_private.h"
|
47
|
+
|
48
|
+
#ifdef WATT32
|
49
|
+
#undef WIN32
|
50
|
+
#endif
|
51
|
+
|
52
|
+
struct host_query {
|
53
|
+
/* Arguments passed to ares_gethostbyname() */
|
54
|
+
ares_channel channel;
|
55
|
+
char *name;
|
56
|
+
ares_host_callback callback;
|
57
|
+
void *arg;
|
58
|
+
int sent_family; /* this family is what was is being used */
|
59
|
+
int want_family; /* this family is what is asked for in the API */
|
60
|
+
const char *remaining_lookups;
|
61
|
+
int timeouts;
|
62
|
+
};
|
63
|
+
|
64
|
+
static void next_lookup(struct host_query *hquery, int status_code);
|
65
|
+
static void host_callback(void *arg, int status, int timeouts,
|
66
|
+
unsigned char *abuf, int alen);
|
67
|
+
static void end_hquery(struct host_query *hquery, int status,
|
68
|
+
struct hostent *host);
|
69
|
+
static int fake_hostent(const char *name, int family,
|
70
|
+
ares_host_callback callback, void *arg);
|
71
|
+
static int file_lookup(const char *name, int family, struct hostent **host);
|
72
|
+
static void sort_addresses(struct hostent *host,
|
73
|
+
const struct apattern *sortlist, int nsort);
|
74
|
+
static void sort6_addresses(struct hostent *host,
|
75
|
+
const struct apattern *sortlist, int nsort);
|
76
|
+
static int get_address_index(const struct in_addr *addr,
|
77
|
+
const struct apattern *sortlist, int nsort);
|
78
|
+
static int get6_address_index(const struct ares_in6_addr *addr,
|
79
|
+
const struct apattern *sortlist, int nsort);
|
80
|
+
|
81
|
+
void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
82
|
+
ares_host_callback callback, void *arg)
|
83
|
+
{
|
84
|
+
struct host_query *hquery;
|
85
|
+
|
86
|
+
/* Right now we only know how to look up Internet addresses - and unspec
|
87
|
+
means try both basically. */
|
88
|
+
switch (family) {
|
89
|
+
case AF_INET:
|
90
|
+
case AF_INET6:
|
91
|
+
case AF_UNSPEC:
|
92
|
+
break;
|
93
|
+
default:
|
94
|
+
callback(arg, ARES_ENOTIMP, 0, NULL);
|
95
|
+
return;
|
96
|
+
}
|
97
|
+
|
98
|
+
if (fake_hostent(name, family, callback, arg))
|
99
|
+
return;
|
100
|
+
|
101
|
+
/* Allocate and fill in the host query structure. */
|
102
|
+
hquery = ares_malloc(sizeof(struct host_query));
|
103
|
+
if (!hquery)
|
104
|
+
{
|
105
|
+
callback(arg, ARES_ENOMEM, 0, NULL);
|
106
|
+
return;
|
107
|
+
}
|
108
|
+
hquery->channel = channel;
|
109
|
+
hquery->name = ares_strdup(name);
|
110
|
+
hquery->want_family = family;
|
111
|
+
hquery->sent_family = -1; /* nothing is sent yet */
|
112
|
+
if (!hquery->name) {
|
113
|
+
ares_free(hquery);
|
114
|
+
callback(arg, ARES_ENOMEM, 0, NULL);
|
115
|
+
return;
|
116
|
+
}
|
117
|
+
hquery->callback = callback;
|
118
|
+
hquery->arg = arg;
|
119
|
+
hquery->remaining_lookups = channel->lookups;
|
120
|
+
hquery->timeouts = 0;
|
121
|
+
|
122
|
+
/* Start performing lookups according to channel->lookups. */
|
123
|
+
next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
|
124
|
+
}
|
125
|
+
|
126
|
+
static void next_lookup(struct host_query *hquery, int status_code)
|
127
|
+
{
|
128
|
+
const char *p;
|
129
|
+
struct hostent *host;
|
130
|
+
int status = status_code;
|
131
|
+
|
132
|
+
for (p = hquery->remaining_lookups; *p; p++)
|
133
|
+
{
|
134
|
+
switch (*p)
|
135
|
+
{
|
136
|
+
case 'b':
|
137
|
+
/* DNS lookup */
|
138
|
+
hquery->remaining_lookups = p + 1;
|
139
|
+
if ((hquery->want_family == AF_INET6) ||
|
140
|
+
(hquery->want_family == AF_UNSPEC)) {
|
141
|
+
/* if inet6 or unspec, start out with AAAA */
|
142
|
+
hquery->sent_family = AF_INET6;
|
143
|
+
ares_search(hquery->channel, hquery->name, C_IN, T_AAAA,
|
144
|
+
host_callback, hquery);
|
145
|
+
}
|
146
|
+
else {
|
147
|
+
hquery->sent_family = AF_INET;
|
148
|
+
ares_search(hquery->channel, hquery->name, C_IN, T_A,
|
149
|
+
host_callback, hquery);
|
150
|
+
}
|
151
|
+
return;
|
152
|
+
|
153
|
+
case 'f':
|
154
|
+
/* Host file lookup */
|
155
|
+
status = file_lookup(hquery->name, hquery->want_family, &host);
|
156
|
+
|
157
|
+
/* this status check below previously checked for !ARES_ENOTFOUND,
|
158
|
+
but we should not assume that this single error code is the one
|
159
|
+
that can occur, as that is in fact no longer the case */
|
160
|
+
if (status == ARES_SUCCESS)
|
161
|
+
{
|
162
|
+
end_hquery(hquery, status, host);
|
163
|
+
return;
|
164
|
+
}
|
165
|
+
status = status_code; /* Use original status code */
|
166
|
+
break;
|
167
|
+
}
|
168
|
+
}
|
169
|
+
end_hquery(hquery, status, NULL);
|
170
|
+
}
|
171
|
+
|
172
|
+
static void host_callback(void *arg, int status, int timeouts,
|
173
|
+
unsigned char *abuf, int alen)
|
174
|
+
{
|
175
|
+
struct host_query *hquery = (struct host_query *) arg;
|
176
|
+
ares_channel channel = hquery->channel;
|
177
|
+
struct hostent *host = NULL;
|
178
|
+
|
179
|
+
hquery->timeouts += timeouts;
|
180
|
+
if (status == ARES_SUCCESS)
|
181
|
+
{
|
182
|
+
if (hquery->sent_family == AF_INET)
|
183
|
+
{
|
184
|
+
status = ares_parse_a_reply(abuf, alen, &host, NULL, NULL);
|
185
|
+
if (host && channel->nsort)
|
186
|
+
sort_addresses(host, channel->sortlist, channel->nsort);
|
187
|
+
}
|
188
|
+
else if (hquery->sent_family == AF_INET6)
|
189
|
+
{
|
190
|
+
status = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL);
|
191
|
+
if ((status == ARES_ENODATA || status == ARES_EBADRESP ||
|
192
|
+
(status == ARES_SUCCESS && host && host->h_addr_list[0] == NULL)) &&
|
193
|
+
hquery->want_family == AF_UNSPEC) {
|
194
|
+
/* The query returned something but either there were no AAAA
|
195
|
+
records (e.g. just CNAME) or the response was malformed. Try
|
196
|
+
looking up A instead. */
|
197
|
+
if (host)
|
198
|
+
ares_free_hostent(host);
|
199
|
+
hquery->sent_family = AF_INET;
|
200
|
+
ares_search(hquery->channel, hquery->name, C_IN, T_A,
|
201
|
+
host_callback, hquery);
|
202
|
+
return;
|
203
|
+
}
|
204
|
+
if (host && channel->nsort)
|
205
|
+
sort6_addresses(host, channel->sortlist, channel->nsort);
|
206
|
+
}
|
207
|
+
end_hquery(hquery, status, host);
|
208
|
+
}
|
209
|
+
else if ((status == ARES_ENODATA || status == ARES_EBADRESP ||
|
210
|
+
status == ARES_ETIMEOUT) && (hquery->sent_family == AF_INET6 &&
|
211
|
+
hquery->want_family == AF_UNSPEC))
|
212
|
+
{
|
213
|
+
/* The AAAA query yielded no useful result. Now look up an A instead. */
|
214
|
+
hquery->sent_family = AF_INET;
|
215
|
+
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
216
|
+
hquery);
|
217
|
+
}
|
218
|
+
else if (status == ARES_EDESTRUCTION)
|
219
|
+
end_hquery(hquery, status, NULL);
|
220
|
+
else
|
221
|
+
next_lookup(hquery, status);
|
222
|
+
}
|
223
|
+
|
224
|
+
static void end_hquery(struct host_query *hquery, int status,
|
225
|
+
struct hostent *host)
|
226
|
+
{
|
227
|
+
hquery->callback(hquery->arg, status, hquery->timeouts, host);
|
228
|
+
if (host)
|
229
|
+
ares_free_hostent(host);
|
230
|
+
ares_free(hquery->name);
|
231
|
+
ares_free(hquery);
|
232
|
+
}
|
233
|
+
|
234
|
+
/* If the name looks like an IP address, fake up a host entry, end the
|
235
|
+
* query immediately, and return true. Otherwise return false.
|
236
|
+
*/
|
237
|
+
static int fake_hostent(const char *name, int family,
|
238
|
+
ares_host_callback callback, void *arg)
|
239
|
+
{
|
240
|
+
struct hostent hostent;
|
241
|
+
char *aliases[1] = { NULL };
|
242
|
+
char *addrs[2];
|
243
|
+
int result = 0;
|
244
|
+
struct in_addr in;
|
245
|
+
struct ares_in6_addr in6;
|
246
|
+
|
247
|
+
if (family == AF_INET || family == AF_INET6)
|
248
|
+
{
|
249
|
+
/* It only looks like an IP address if it's all numbers and dots. */
|
250
|
+
int numdots = 0, valid = 1;
|
251
|
+
const char *p;
|
252
|
+
for (p = name; *p; p++)
|
253
|
+
{
|
254
|
+
if (!ISDIGIT(*p) && *p != '.') {
|
255
|
+
valid = 0;
|
256
|
+
break;
|
257
|
+
} else if (*p == '.') {
|
258
|
+
numdots++;
|
259
|
+
}
|
260
|
+
}
|
261
|
+
|
262
|
+
/* if we don't have 3 dots, it is illegal
|
263
|
+
* (although inet_addr doesn't think so).
|
264
|
+
*/
|
265
|
+
if (numdots != 3 || !valid)
|
266
|
+
result = 0;
|
267
|
+
else
|
268
|
+
result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1);
|
269
|
+
|
270
|
+
if (result)
|
271
|
+
family = AF_INET;
|
272
|
+
}
|
273
|
+
if (family == AF_INET6)
|
274
|
+
result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1);
|
275
|
+
|
276
|
+
if (!result)
|
277
|
+
return 0;
|
278
|
+
|
279
|
+
if (family == AF_INET)
|
280
|
+
{
|
281
|
+
hostent.h_length = (int)sizeof(struct in_addr);
|
282
|
+
addrs[0] = (char *)∈
|
283
|
+
}
|
284
|
+
else if (family == AF_INET6)
|
285
|
+
{
|
286
|
+
hostent.h_length = (int)sizeof(struct ares_in6_addr);
|
287
|
+
addrs[0] = (char *)&in6;
|
288
|
+
}
|
289
|
+
/* Duplicate the name, to avoid a constness violation. */
|
290
|
+
hostent.h_name = ares_strdup(name);
|
291
|
+
if (!hostent.h_name)
|
292
|
+
{
|
293
|
+
callback(arg, ARES_ENOMEM, 0, NULL);
|
294
|
+
return 1;
|
295
|
+
}
|
296
|
+
|
297
|
+
/* Fill in the rest of the host structure and terminate the query. */
|
298
|
+
addrs[1] = NULL;
|
299
|
+
hostent.h_aliases = aliases;
|
300
|
+
hostent.h_addrtype = aresx_sitoss(family);
|
301
|
+
hostent.h_addr_list = addrs;
|
302
|
+
callback(arg, ARES_SUCCESS, 0, &hostent);
|
303
|
+
|
304
|
+
ares_free((char *)(hostent.h_name));
|
305
|
+
return 1;
|
306
|
+
}
|
307
|
+
|
308
|
+
/* This is an API method */
|
309
|
+
int ares_gethostbyname_file(ares_channel channel, const char *name,
|
310
|
+
int family, struct hostent **host)
|
311
|
+
{
|
312
|
+
int result;
|
313
|
+
|
314
|
+
/* We only take the channel to ensure that ares_init() been called. */
|
315
|
+
if(channel == NULL)
|
316
|
+
{
|
317
|
+
/* Anything will do, really. This seems fine, and is consistent with
|
318
|
+
other error cases. */
|
319
|
+
*host = NULL;
|
320
|
+
return ARES_ENOTFOUND;
|
321
|
+
}
|
322
|
+
|
323
|
+
/* Just chain to the internal implementation we use here; it's exactly
|
324
|
+
* what we want.
|
325
|
+
*/
|
326
|
+
result = file_lookup(name, family, host);
|
327
|
+
if(result != ARES_SUCCESS)
|
328
|
+
{
|
329
|
+
/* We guarantee a NULL hostent on failure. */
|
330
|
+
*host = NULL;
|
331
|
+
}
|
332
|
+
return result;
|
333
|
+
}
|
334
|
+
|
335
|
+
static int file_lookup(const char *name, int family, struct hostent **host)
|
336
|
+
{
|
337
|
+
FILE *fp;
|
338
|
+
char **alias;
|
339
|
+
int status;
|
340
|
+
int error;
|
341
|
+
|
342
|
+
#ifdef WIN32
|
343
|
+
char PATH_HOSTS[MAX_PATH];
|
344
|
+
win_platform platform;
|
345
|
+
|
346
|
+
PATH_HOSTS[0] = '\0';
|
347
|
+
|
348
|
+
platform = ares__getplatform();
|
349
|
+
|
350
|
+
if (platform == WIN_NT) {
|
351
|
+
char tmp[MAX_PATH];
|
352
|
+
HKEY hkeyHosts;
|
353
|
+
|
354
|
+
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ,
|
355
|
+
&hkeyHosts) == ERROR_SUCCESS)
|
356
|
+
{
|
357
|
+
DWORD dwLength = MAX_PATH;
|
358
|
+
RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp,
|
359
|
+
&dwLength);
|
360
|
+
ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH);
|
361
|
+
RegCloseKey(hkeyHosts);
|
362
|
+
}
|
363
|
+
}
|
364
|
+
else if (platform == WIN_9X)
|
365
|
+
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
366
|
+
else
|
367
|
+
return ARES_ENOTFOUND;
|
368
|
+
|
369
|
+
strcat(PATH_HOSTS, WIN_PATH_HOSTS);
|
370
|
+
|
371
|
+
#elif defined(WATT32)
|
372
|
+
extern const char *_w32_GetHostsFile (void);
|
373
|
+
const char *PATH_HOSTS = _w32_GetHostsFile();
|
374
|
+
|
375
|
+
if (!PATH_HOSTS)
|
376
|
+
return ARES_ENOTFOUND;
|
377
|
+
#endif
|
378
|
+
|
379
|
+
fp = fopen(PATH_HOSTS, "r");
|
380
|
+
if (!fp)
|
381
|
+
{
|
382
|
+
error = ERRNO;
|
383
|
+
switch(error)
|
384
|
+
{
|
385
|
+
case ENOENT:
|
386
|
+
case ESRCH:
|
387
|
+
return ARES_ENOTFOUND;
|
388
|
+
default:
|
389
|
+
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
390
|
+
error, strerror(error)));
|
391
|
+
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
392
|
+
PATH_HOSTS));
|
393
|
+
*host = NULL;
|
394
|
+
return ARES_EFILE;
|
395
|
+
}
|
396
|
+
}
|
397
|
+
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
398
|
+
{
|
399
|
+
if (strcasecmp((*host)->h_name, name) == 0)
|
400
|
+
break;
|
401
|
+
for (alias = (*host)->h_aliases; *alias; alias++)
|
402
|
+
{
|
403
|
+
if (strcasecmp(*alias, name) == 0)
|
404
|
+
break;
|
405
|
+
}
|
406
|
+
if (*alias)
|
407
|
+
break;
|
408
|
+
ares_free_hostent(*host);
|
409
|
+
}
|
410
|
+
fclose(fp);
|
411
|
+
if (status == ARES_EOF)
|
412
|
+
status = ARES_ENOTFOUND;
|
413
|
+
if (status != ARES_SUCCESS)
|
414
|
+
*host = NULL;
|
415
|
+
return status;
|
416
|
+
}
|
417
|
+
|
418
|
+
static void sort_addresses(struct hostent *host,
|
419
|
+
const struct apattern *sortlist, int nsort)
|
420
|
+
{
|
421
|
+
struct in_addr a1, a2;
|
422
|
+
int i1, i2, ind1, ind2;
|
423
|
+
|
424
|
+
/* This is a simple insertion sort, not optimized at all. i1 walks
|
425
|
+
* through the address list, with the loop invariant that everything
|
426
|
+
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
|
427
|
+
* back through the list (via i2) until it is in sorted order.
|
428
|
+
*/
|
429
|
+
for (i1 = 0; host->h_addr_list[i1]; i1++)
|
430
|
+
{
|
431
|
+
memcpy(&a1, host->h_addr_list[i1], sizeof(struct in_addr));
|
432
|
+
ind1 = get_address_index(&a1, sortlist, nsort);
|
433
|
+
for (i2 = i1 - 1; i2 >= 0; i2--)
|
434
|
+
{
|
435
|
+
memcpy(&a2, host->h_addr_list[i2], sizeof(struct in_addr));
|
436
|
+
ind2 = get_address_index(&a2, sortlist, nsort);
|
437
|
+
if (ind2 <= ind1)
|
438
|
+
break;
|
439
|
+
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in_addr));
|
440
|
+
}
|
441
|
+
memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in_addr));
|
442
|
+
}
|
443
|
+
}
|
444
|
+
|
445
|
+
/* Find the first entry in sortlist which matches addr. Return nsort
|
446
|
+
* if none of them match.
|
447
|
+
*/
|
448
|
+
static int get_address_index(const struct in_addr *addr,
|
449
|
+
const struct apattern *sortlist,
|
450
|
+
int nsort)
|
451
|
+
{
|
452
|
+
int i;
|
453
|
+
|
454
|
+
for (i = 0; i < nsort; i++)
|
455
|
+
{
|
456
|
+
if (sortlist[i].family != AF_INET)
|
457
|
+
continue;
|
458
|
+
if (sortlist[i].type == PATTERN_MASK)
|
459
|
+
{
|
460
|
+
if ((addr->s_addr & sortlist[i].mask.addr4.s_addr)
|
461
|
+
== sortlist[i].addrV4.s_addr)
|
462
|
+
break;
|
463
|
+
}
|
464
|
+
else
|
465
|
+
{
|
466
|
+
if (!ares__bitncmp(&addr->s_addr, &sortlist[i].addrV4.s_addr,
|
467
|
+
sortlist[i].mask.bits))
|
468
|
+
break;
|
469
|
+
}
|
470
|
+
}
|
471
|
+
return i;
|
472
|
+
}
|
473
|
+
|
474
|
+
static void sort6_addresses(struct hostent *host,
|
475
|
+
const struct apattern *sortlist, int nsort)
|
476
|
+
{
|
477
|
+
struct ares_in6_addr a1, a2;
|
478
|
+
int i1, i2, ind1, ind2;
|
479
|
+
|
480
|
+
/* This is a simple insertion sort, not optimized at all. i1 walks
|
481
|
+
* through the address list, with the loop invariant that everything
|
482
|
+
* to the left of i1 is sorted. In the loop body, the value at i1 is moved
|
483
|
+
* back through the list (via i2) until it is in sorted order.
|
484
|
+
*/
|
485
|
+
for (i1 = 0; host->h_addr_list[i1]; i1++)
|
486
|
+
{
|
487
|
+
memcpy(&a1, host->h_addr_list[i1], sizeof(struct ares_in6_addr));
|
488
|
+
ind1 = get6_address_index(&a1, sortlist, nsort);
|
489
|
+
for (i2 = i1 - 1; i2 >= 0; i2--)
|
490
|
+
{
|
491
|
+
memcpy(&a2, host->h_addr_list[i2], sizeof(struct ares_in6_addr));
|
492
|
+
ind2 = get6_address_index(&a2, sortlist, nsort);
|
493
|
+
if (ind2 <= ind1)
|
494
|
+
break;
|
495
|
+
memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct ares_in6_addr));
|
496
|
+
}
|
497
|
+
memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct ares_in6_addr));
|
498
|
+
}
|
499
|
+
}
|
500
|
+
|
501
|
+
/* Find the first entry in sortlist which matches addr. Return nsort
|
502
|
+
* if none of them match.
|
503
|
+
*/
|
504
|
+
static int get6_address_index(const struct ares_in6_addr *addr,
|
505
|
+
const struct apattern *sortlist,
|
506
|
+
int nsort)
|
507
|
+
{
|
508
|
+
int i;
|
509
|
+
|
510
|
+
for (i = 0; i < nsort; i++)
|
511
|
+
{
|
512
|
+
if (sortlist[i].family != AF_INET6)
|
513
|
+
continue;
|
514
|
+
if (!ares__bitncmp(addr, &sortlist[i].addrV6, sortlist[i].mask.bits))
|
515
|
+
break;
|
516
|
+
}
|
517
|
+
return i;
|
518
|
+
}
|