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.

Files changed (327) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1434 -399
  3. data/etc/roots.pem +34 -150
  4. data/include/grpc/grpc.h +71 -0
  5. data/include/grpc/impl/codegen/atm.h +5 -0
  6. data/include/grpc/impl/codegen/atm_gcc_atomic.h +6 -0
  7. data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
  8. data/include/grpc/impl/codegen/atm_windows.h +11 -0
  9. data/include/grpc/impl/codegen/grpc_types.h +54 -13
  10. data/include/grpc/impl/codegen/port_platform.h +15 -1
  11. data/include/grpc/support/alloc.h +2 -1
  12. data/include/grpc/support/sync.h +4 -0
  13. data/include/grpc/support/tls.h +1 -1
  14. data/src/core/ext/census/gen/trace_context.pb.h +1 -1
  15. data/src/core/ext/census/grpc_filter.c +14 -10
  16. data/src/core/ext/census/grpc_plugin.c +3 -1
  17. data/src/core/ext/census/trace_label.h +1 -1
  18. data/src/core/ext/census/trace_propagation.h +1 -1
  19. data/src/core/ext/census/trace_status.h +1 -1
  20. data/src/core/ext/census/trace_string.h +1 -1
  21. data/src/core/ext/census/tracing.h +1 -1
  22. data/src/core/ext/{client_channel → filters/client_channel}/channel_connectivity.c +56 -27
  23. data/src/core/ext/{client_channel → filters/client_channel}/client_channel.c +407 -202
  24. data/src/core/ext/{client_channel → filters/client_channel}/client_channel.h +10 -6
  25. data/src/core/ext/{client_channel → filters/client_channel}/client_channel_factory.c +1 -1
  26. data/src/core/ext/{client_channel → filters/client_channel}/client_channel_factory.h +4 -4
  27. data/src/core/ext/{client_channel → filters/client_channel}/client_channel_plugin.c +12 -7
  28. data/src/core/ext/{client_channel → filters/client_channel}/connector.c +1 -1
  29. data/src/core/ext/{client_channel → filters/client_channel}/connector.h +3 -5
  30. data/src/core/ext/{client_channel → filters/client_channel}/http_connect_handshaker.c +6 -6
  31. data/src/core/ext/{client_channel → filters/client_channel}/http_connect_handshaker.h +3 -3
  32. data/src/core/ext/{client_channel → filters/client_channel}/http_proxy.c +4 -4
  33. data/src/core/ext/{client_channel → filters/client_channel}/http_proxy.h +3 -3
  34. data/src/core/ext/{client_channel → filters/client_channel}/lb_policy.c +1 -1
  35. data/src/core/ext/{client_channel → filters/client_channel}/lb_policy.h +4 -4
  36. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb.c +22 -20
  37. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb.h +4 -4
  38. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb_channel.h +5 -4
  39. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/grpclb_channel_secure.c +2 -2
  40. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/load_balancer_api.c +1 -1
  41. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/load_balancer_api.h +6 -5
  42. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +1 -1
  43. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -0
  44. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/pick_first/pick_first.c +20 -15
  45. data/src/core/ext/{lb_policy → filters/client_channel/lb_policy}/round_robin/round_robin.c +21 -16
  46. data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_factory.c +1 -1
  47. data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_factory.h +5 -5
  48. data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_registry.c +1 -1
  49. data/src/core/ext/{client_channel → filters/client_channel}/lb_policy_registry.h +4 -4
  50. data/src/core/ext/{client_channel → filters/client_channel}/parse_address.c +1 -1
  51. data/src/core/ext/{client_channel → filters/client_channel}/parse_address.h +4 -4
  52. data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper.c +1 -1
  53. data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper.h +3 -3
  54. data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper_registry.c +10 -4
  55. data/src/core/ext/{client_channel → filters/client_channel}/proxy_mapper_registry.h +4 -4
  56. data/src/core/ext/{client_channel → filters/client_channel}/resolver.c +1 -1
  57. data/src/core/ext/{client_channel → filters/client_channel}/resolver.h +4 -4
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +350 -0
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +66 -0
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c +319 -0
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +289 -0
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +64 -0
  63. data/src/core/ext/{resolver → filters/client_channel/resolver}/dns/native/dns_resolver.c +21 -5
  64. data/src/core/ext/{resolver → filters/client_channel/resolver}/sockaddr/sockaddr_resolver.c +3 -3
  65. data/src/core/ext/{client_channel → filters/client_channel}/resolver_factory.c +1 -1
  66. data/src/core/ext/{client_channel → filters/client_channel}/resolver_factory.h +6 -6
  67. data/src/core/ext/{client_channel → filters/client_channel}/resolver_registry.c +1 -2
  68. data/src/core/ext/{client_channel → filters/client_channel}/resolver_registry.h +4 -4
  69. data/src/core/ext/filters/client_channel/retry_throttle.c +210 -0
  70. data/src/core/ext/filters/client_channel/retry_throttle.h +65 -0
  71. data/src/core/ext/{client_channel → filters/client_channel}/subchannel.c +49 -43
  72. data/src/core/ext/{client_channel → filters/client_channel}/subchannel.h +21 -7
  73. data/src/core/ext/{client_channel → filters/client_channel}/subchannel_index.c +1 -1
  74. data/src/core/ext/{client_channel → filters/client_channel}/subchannel_index.h +5 -5
  75. data/src/core/ext/{client_channel → filters/client_channel}/uri_parser.c +1 -1
  76. data/src/core/ext/{client_channel → filters/client_channel}/uri_parser.h +3 -3
  77. data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting.c +4 -2
  78. data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting.h +3 -3
  79. data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting_filter.c +17 -14
  80. data/src/core/ext/{load_reporting → filters/load_reporting}/load_reporting_filter.h +4 -4
  81. data/src/core/ext/filters/max_age/max_age_filter.c +439 -0
  82. data/src/core/ext/filters/max_age/max_age_filter.h +39 -0
  83. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +6 -41
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  85. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +2 -2
  86. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +3 -3
  87. data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
  88. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +2 -5
  89. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +2 -2
  90. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +449 -204
  91. data/src/core/ext/transport/chttp2/transport/frame_data.c +10 -7
  92. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +3 -2
  93. data/src/core/ext/transport/chttp2/transport/frame_ping.c +37 -7
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +4 -3
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.c +18 -38
  97. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -29
  98. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +2 -2
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +64 -37
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +11 -4
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +60 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_table.c +2 -2
  103. data/src/core/ext/transport/chttp2/transport/http2_settings.c +75 -0
  104. data/src/core/ext/transport/chttp2/transport/http2_settings.h +74 -0
  105. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +22 -43
  106. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +8 -10
  107. data/src/core/ext/transport/chttp2/transport/internal.h +24 -2
  108. data/src/core/ext/transport/chttp2/transport/parsing.c +33 -15
  109. data/src/core/ext/transport/chttp2/transport/writing.c +56 -10
  110. data/src/core/lib/channel/channel_args.c +7 -0
  111. data/src/core/lib/channel/channel_args.h +2 -0
  112. data/src/core/lib/channel/channel_stack.c +20 -27
  113. data/src/core/lib/channel/channel_stack.h +18 -16
  114. data/src/core/lib/channel/compress_filter.c +20 -18
  115. data/src/core/lib/channel/connected_channel.c +9 -8
  116. data/src/core/lib/channel/deadline_filter.c +28 -24
  117. data/src/core/lib/channel/deadline_filter.h +3 -3
  118. data/src/core/lib/channel/handshaker.c +3 -2
  119. data/src/core/lib/channel/http_client_filter.c +119 -61
  120. data/src/core/lib/channel/http_server_filter.c +124 -69
  121. data/src/core/lib/channel/message_size_filter.c +23 -19
  122. data/src/core/lib/http/httpcli.c +8 -6
  123. data/src/core/lib/http/httpcli_security_connector.c +5 -5
  124. data/src/core/lib/http/parser.c +57 -31
  125. data/src/core/lib/iomgr/closure.c +15 -0
  126. data/src/core/lib/iomgr/closure.h +4 -0
  127. data/src/core/lib/iomgr/combiner.c +8 -0
  128. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  129. data/src/core/lib/iomgr/endpoint_pair_posix.c +10 -7
  130. data/src/core/lib/iomgr/endpoint_pair_uv.c +2 -3
  131. data/src/core/lib/iomgr/endpoint_pair_windows.c +9 -6
  132. data/src/core/lib/iomgr/error.c +360 -177
  133. data/src/core/lib/iomgr/error.h +31 -33
  134. data/src/core/lib/iomgr/error_internal.h +30 -9
  135. data/src/core/lib/iomgr/ev_epoll_linux.c +25 -239
  136. data/src/core/lib/iomgr/ev_poll_posix.c +11 -7
  137. data/src/core/lib/iomgr/ev_posix.c +6 -0
  138. data/src/core/lib/iomgr/ev_posix.h +3 -0
  139. data/src/core/lib/iomgr/exec_ctx.c +6 -0
  140. data/src/core/lib/iomgr/executor.c +8 -2
  141. data/src/core/lib/iomgr/load_file.c +6 -3
  142. data/src/core/lib/iomgr/lockfree_event.c +238 -0
  143. data/src/core/{ext/client_channel/initial_connect_string.h → lib/iomgr/lockfree_event.h} +17 -13
  144. data/src/core/lib/iomgr/pollset.h +4 -0
  145. data/src/core/lib/iomgr/pollset_windows.c +2 -2
  146. data/src/core/lib/iomgr/port.h +9 -0
  147. data/src/core/lib/iomgr/resolve_address_posix.c +15 -9
  148. data/src/core/lib/iomgr/resolve_address_uv.c +8 -6
  149. data/src/core/lib/iomgr/resolve_address_windows.c +2 -2
  150. data/src/core/lib/iomgr/resource_quota.c +19 -4
  151. data/src/core/lib/iomgr/resource_quota.h +2 -0
  152. data/src/core/lib/iomgr/sockaddr_utils.c +3 -1
  153. data/src/core/lib/iomgr/socket_factory_posix.c +110 -0
  154. data/src/core/lib/iomgr/socket_factory_posix.h +90 -0
  155. data/src/core/lib/iomgr/socket_utils_common_posix.c +25 -9
  156. data/src/core/lib/iomgr/socket_utils_posix.h +7 -0
  157. data/src/core/lib/iomgr/tcp_client.h +0 -4
  158. data/src/core/lib/iomgr/tcp_client_posix.c +15 -31
  159. data/src/core/lib/iomgr/tcp_client_uv.c +10 -6
  160. data/src/core/lib/iomgr/tcp_client_windows.c +9 -19
  161. data/src/core/lib/iomgr/tcp_posix.c +111 -22
  162. data/src/core/lib/iomgr/tcp_posix.h +3 -4
  163. data/src/core/lib/iomgr/tcp_server_posix.c +39 -417
  164. data/src/core/lib/iomgr/tcp_server_utils_posix.h +135 -0
  165. data/src/core/lib/iomgr/tcp_server_utils_posix_common.c +221 -0
  166. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c +196 -0
  167. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c +49 -0
  168. data/src/core/lib/iomgr/tcp_server_uv.c +43 -16
  169. data/src/core/lib/iomgr/tcp_server_windows.c +10 -22
  170. data/src/core/lib/iomgr/tcp_uv.c +16 -13
  171. data/src/core/lib/iomgr/tcp_windows.c +24 -12
  172. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  173. data/src/core/lib/iomgr/timer.h +3 -0
  174. data/src/core/lib/iomgr/timer_generic.c +257 -72
  175. data/src/core/lib/iomgr/timer_generic.h +1 -1
  176. data/src/core/lib/iomgr/timer_heap.c +8 -8
  177. data/src/core/lib/iomgr/udp_server.c +54 -24
  178. data/src/core/lib/iomgr/udp_server.h +7 -7
  179. data/src/core/lib/iomgr/unix_sockets_posix.c +1 -1
  180. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +2 -1
  181. data/src/core/lib/iomgr/wakeup_fd_posix.h +1 -1
  182. data/src/core/lib/profiling/basic_timers.c +1 -1
  183. data/src/core/lib/security/credentials/credentials.h +1 -1
  184. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +10 -9
  185. data/src/core/lib/security/credentials/jwt/json_token.c +1 -1
  186. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +2 -2
  187. data/src/core/lib/security/transport/client_auth_filter.c +33 -26
  188. data/src/core/lib/security/transport/secure_endpoint.c +8 -5
  189. data/src/core/lib/security/transport/security_connector.c +37 -37
  190. data/src/core/lib/security/transport/security_connector.h +1 -1
  191. data/src/core/lib/security/transport/security_handshaker.c +15 -12
  192. data/src/core/lib/security/transport/server_auth_filter.c +20 -18
  193. data/src/core/lib/security/transport/tsi_error.c +5 -3
  194. data/src/core/lib/security/transport/tsi_error.h +1 -1
  195. data/src/core/lib/{security/util → slice}/b64.c +21 -6
  196. data/src/core/lib/{security/util → slice}/b64.h +16 -4
  197. data/src/core/lib/slice/slice.c +4 -2
  198. data/src/core/lib/slice/slice_buffer.c +16 -14
  199. data/src/core/lib/support/arena.c +98 -0
  200. data/src/core/{ext/client_channel/initial_connect_string.c → lib/support/arena.h} +17 -15
  201. data/src/core/{ext/client_channel/default_initial_connect_string.c → lib/support/atm.c} +14 -5
  202. data/src/core/lib/support/cpu_linux.c +5 -0
  203. data/src/core/lib/support/sync.c +4 -0
  204. data/src/core/lib/support/time.c +4 -10
  205. data/src/core/lib/support/wrap_memcpy.c +3 -1
  206. data/src/core/lib/surface/call.c +252 -221
  207. data/src/core/lib/surface/channel.c +72 -21
  208. data/src/core/lib/surface/channel.h +8 -0
  209. data/src/core/lib/surface/completion_queue.c +2 -3
  210. data/src/core/lib/surface/completion_queue_factory.c +77 -0
  211. data/src/core/lib/surface/completion_queue_factory.h +51 -0
  212. data/src/core/lib/surface/init_secure.c +3 -1
  213. data/src/core/lib/surface/lame_client.c +18 -14
  214. data/src/core/lib/surface/server.c +43 -41
  215. data/src/core/lib/surface/validate_metadata.c +8 -4
  216. data/src/core/lib/surface/version.c +2 -2
  217. data/src/core/lib/transport/bdp_estimator.h +1 -1
  218. data/src/core/lib/transport/connectivity_state.c +2 -1
  219. data/src/core/lib/transport/error_utils.c +17 -17
  220. data/src/core/lib/transport/error_utils.h +1 -1
  221. data/src/core/lib/transport/metadata_batch.c +6 -7
  222. data/src/core/lib/transport/pid_controller.c +1 -0
  223. data/src/core/lib/transport/service_config.c +12 -0
  224. data/src/core/lib/transport/service_config.h +6 -0
  225. data/src/core/lib/transport/transport.c +29 -17
  226. data/src/core/lib/transport/transport.h +85 -42
  227. data/src/core/lib/transport/transport_impl.h +5 -3
  228. data/src/core/lib/transport/transport_op_string.c +20 -14
  229. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -0
  230. data/src/core/{lib/tsi → tsi}/fake_transport_security.c +2 -2
  231. data/src/core/{lib/tsi → tsi}/fake_transport_security.h +4 -4
  232. data/src/core/{lib/tsi → tsi}/ssl_transport_security.c +40 -79
  233. data/src/core/{lib/tsi → tsi}/ssl_transport_security.h +44 -21
  234. data/src/core/{lib/tsi → tsi}/ssl_types.h +3 -3
  235. data/src/core/{lib/tsi → tsi}/transport_security.c +2 -2
  236. data/src/core/{lib/tsi → tsi}/transport_security.h +4 -4
  237. data/src/core/{lib/tsi → tsi}/transport_security_interface.h +3 -3
  238. data/src/ruby/ext/grpc/extconf.rb +1 -0
  239. data/src/ruby/ext/grpc/rb_call_credentials.c +2 -2
  240. data/src/ruby/ext/grpc/rb_channel.c +520 -93
  241. data/src/ruby/ext/grpc/rb_channel.h +2 -0
  242. data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -0
  243. data/src/ruby/ext/grpc/rb_compression_options.c +5 -2
  244. data/src/ruby/ext/grpc/rb_event_thread.c +6 -6
  245. data/src/ruby/ext/grpc/rb_grpc.c +29 -7
  246. data/src/ruby/ext/grpc/rb_grpc.h +2 -0
  247. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +10 -0
  248. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +15 -0
  249. data/src/ruby/ext/grpc/rb_server.c +5 -3
  250. data/src/ruby/lib/grpc/version.rb +1 -1
  251. data/src/ruby/spec/channel_connection_spec.rb +173 -0
  252. data/src/ruby/spec/channel_spec.rb +29 -0
  253. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +27 -17
  254. data/third_party/cares/ares_build.h +264 -0
  255. data/third_party/cares/cares/ares.h +636 -0
  256. data/third_party/cares/cares/ares__close_sockets.c +61 -0
  257. data/third_party/cares/cares/ares__get_hostent.c +261 -0
  258. data/third_party/cares/cares/ares__read_line.c +73 -0
  259. data/third_party/cares/cares/ares__timeval.c +111 -0
  260. data/third_party/cares/cares/ares_cancel.c +63 -0
  261. data/third_party/cares/cares/ares_create_query.c +202 -0
  262. data/third_party/cares/cares/ares_data.c +221 -0
  263. data/third_party/cares/cares/ares_data.h +72 -0
  264. data/third_party/cares/cares/ares_destroy.c +108 -0
  265. data/third_party/cares/cares/ares_dns.h +103 -0
  266. data/third_party/cares/cares/ares_expand_name.c +205 -0
  267. data/third_party/cares/cares/ares_expand_string.c +70 -0
  268. data/third_party/cares/cares/ares_fds.c +59 -0
  269. data/third_party/cares/cares/ares_free_hostent.c +41 -0
  270. data/third_party/cares/cares/ares_free_string.c +25 -0
  271. data/third_party/cares/cares/ares_getenv.c +30 -0
  272. data/third_party/cares/cares/ares_getenv.h +26 -0
  273. data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
  274. data/third_party/cares/cares/ares_gethostbyname.c +518 -0
  275. data/third_party/cares/cares/ares_getnameinfo.c +422 -0
  276. data/third_party/cares/cares/ares_getopt.c +122 -0
  277. data/third_party/cares/cares/ares_getopt.h +53 -0
  278. data/third_party/cares/cares/ares_getsock.c +66 -0
  279. data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
  280. data/third_party/cares/cares/ares_init.c +2146 -0
  281. data/third_party/cares/cares/ares_iphlpapi.h +221 -0
  282. data/third_party/cares/cares/ares_ipv6.h +78 -0
  283. data/third_party/cares/cares/ares_library_init.c +167 -0
  284. data/third_party/cares/cares/ares_library_init.h +42 -0
  285. data/third_party/cares/cares/ares_llist.c +63 -0
  286. data/third_party/cares/cares/ares_llist.h +39 -0
  287. data/third_party/cares/cares/ares_mkquery.c +24 -0
  288. data/third_party/cares/cares/ares_nowarn.c +260 -0
  289. data/third_party/cares/cares/ares_nowarn.h +61 -0
  290. data/third_party/cares/cares/ares_options.c +402 -0
  291. data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
  292. data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
  293. data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
  294. data/third_party/cares/cares/ares_parse_naptr_reply.c +188 -0
  295. data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
  296. data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
  297. data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
  298. data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
  299. data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
  300. data/third_party/cares/cares/ares_platform.c +11035 -0
  301. data/third_party/cares/cares/ares_platform.h +43 -0
  302. data/third_party/cares/cares/ares_private.h +363 -0
  303. data/third_party/cares/cares/ares_process.c +1359 -0
  304. data/third_party/cares/cares/ares_query.c +186 -0
  305. data/third_party/cares/cares/ares_rules.h +125 -0
  306. data/third_party/cares/cares/ares_search.c +316 -0
  307. data/third_party/cares/cares/ares_send.c +131 -0
  308. data/third_party/cares/cares/ares_setup.h +217 -0
  309. data/third_party/cares/cares/ares_strcasecmp.c +66 -0
  310. data/third_party/cares/cares/ares_strcasecmp.h +30 -0
  311. data/third_party/cares/cares/ares_strdup.c +49 -0
  312. data/third_party/cares/cares/ares_strdup.h +24 -0
  313. data/third_party/cares/cares/ares_strerror.c +56 -0
  314. data/third_party/cares/cares/ares_timeout.c +88 -0
  315. data/third_party/cares/cares/ares_version.c +11 -0
  316. data/third_party/cares/cares/ares_version.h +24 -0
  317. data/third_party/cares/cares/ares_writev.c +79 -0
  318. data/third_party/cares/cares/bitncmp.c +59 -0
  319. data/third_party/cares/cares/bitncmp.h +26 -0
  320. data/third_party/cares/cares/config-win32.h +377 -0
  321. data/third_party/cares/cares/inet_net_pton.c +450 -0
  322. data/third_party/cares/cares/inet_ntop.c +208 -0
  323. data/third_party/cares/cares/setup_once.h +554 -0
  324. data/third_party/cares/cares/windows_port.c +22 -0
  325. data/third_party/cares/config_darwin/ares_config.h +523 -0
  326. data/third_party/cares/config_linux/ares_config.h +524 -0
  327. 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 *)&in;
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
+ }