grpc 1.28.0 → 1.30.2

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 (503) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7694 -11190
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +30 -9
  5. data/include/grpc/grpc_security_constants.h +1 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -21
  7. data/include/grpc/impl/codegen/port_platform.h +6 -2
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +212 -241
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  16. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  17. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  28. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  34. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
  35. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  36. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  37. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  38. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  48. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
  49. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  51. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  55. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  58. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
  59. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
  60. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  61. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  62. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  63. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  64. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  65. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  66. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  67. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  68. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  69. data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
  70. data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
  71. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
  72. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
  73. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  74. data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
  75. data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
  76. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  77. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
  78. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  79. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  80. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  83. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
  89. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  90. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  92. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  93. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  94. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  96. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  97. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  98. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  99. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  100. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  101. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  102. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  103. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  104. data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
  105. data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  107. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
  108. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
  116. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
  117. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  120. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  121. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  122. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  123. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
  124. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
  125. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  126. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  129. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  130. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
  131. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  133. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
  134. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  141. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
  142. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  145. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
  146. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
  148. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  151. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
  153. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
  154. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  156. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
  157. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  158. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
  159. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  160. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  161. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  163. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  164. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  165. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  166. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
  168. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  170. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  171. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  172. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  174. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  175. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  176. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  177. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  178. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  179. data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
  180. data/src/core/lib/channel/channel_args.cc +15 -14
  181. data/src/core/lib/channel/channel_args.h +3 -1
  182. data/src/core/lib/channel/channel_stack.h +20 -13
  183. data/src/core/lib/channel/channelz.cc +5 -6
  184. data/src/core/lib/channel/channelz.h +3 -2
  185. data/src/core/lib/channel/channelz_registry.cc +5 -3
  186. data/src/core/lib/channel/connected_channel.cc +7 -5
  187. data/src/core/lib/channel/context.h +1 -1
  188. data/src/core/lib/channel/handshaker.cc +11 -13
  189. data/src/core/lib/channel/handshaker.h +4 -2
  190. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  191. data/src/core/lib/channel/status_util.cc +2 -3
  192. data/src/core/lib/compression/message_compress.cc +5 -1
  193. data/src/core/lib/debug/stats.cc +21 -27
  194. data/src/core/lib/debug/stats.h +3 -1
  195. data/src/core/lib/gpr/spinlock.h +2 -3
  196. data/src/core/lib/gpr/string.cc +2 -26
  197. data/src/core/lib/gpr/string.h +0 -16
  198. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  199. data/src/core/lib/gpr/time.cc +4 -0
  200. data/src/core/lib/gpr/time_posix.cc +1 -1
  201. data/src/core/lib/gprpp/atomic.h +6 -6
  202. data/src/core/lib/gprpp/fork.cc +1 -1
  203. data/src/core/lib/gprpp/host_port.cc +29 -35
  204. data/src/core/lib/gprpp/host_port.h +14 -17
  205. data/src/core/lib/gprpp/map.h +5 -11
  206. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  207. data/src/core/lib/http/format_request.cc +46 -65
  208. data/src/core/lib/http/httpcli.cc +2 -3
  209. data/src/core/lib/http/httpcli.h +2 -3
  210. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  211. data/src/core/lib/http/parser.h +2 -3
  212. data/src/core/lib/iomgr/buffer_list.h +22 -21
  213. data/src/core/lib/iomgr/call_combiner.h +3 -2
  214. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  215. data/src/core/lib/iomgr/closure.h +2 -3
  216. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  217. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  218. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  219. data/src/core/lib/iomgr/error.cc +6 -9
  220. data/src/core/lib/iomgr/error.h +0 -1
  221. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  222. data/src/core/lib/iomgr/ev_apple.h +43 -0
  223. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  224. data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
  225. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  226. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  227. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  228. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  229. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  230. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  231. data/src/core/lib/iomgr/port.h +1 -0
  232. data/src/core/lib/iomgr/python_util.h +46 -0
  233. data/src/core/lib/iomgr/resolve_address.h +4 -6
  234. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  235. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  236. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  237. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  238. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  239. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  240. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  241. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  242. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  243. data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
  244. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
  247. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  248. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  253. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  254. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  255. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  256. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  257. data/src/core/lib/iomgr/timer_heap.h +2 -3
  258. data/src/core/lib/iomgr/udp_server.cc +9 -14
  259. data/src/core/lib/json/json.h +3 -2
  260. data/src/core/lib/json/json_reader.cc +5 -5
  261. data/src/core/lib/json/json_writer.cc +13 -12
  262. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  263. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  264. data/src/core/lib/security/credentials/credentials.cc +0 -84
  265. data/src/core/lib/security/credentials/credentials.h +8 -59
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  274. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
  276. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
  278. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  279. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  280. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
  281. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  282. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
  283. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  284. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  285. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  286. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
  287. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  288. data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
  289. data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
  290. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
  291. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  292. data/src/core/lib/security/transport/auth_filters.h +0 -5
  293. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  294. data/src/core/lib/slice/slice_intern.cc +2 -3
  295. data/src/core/lib/slice/slice_internal.h +14 -0
  296. data/src/core/lib/slice/slice_utils.h +9 -0
  297. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  298. data/src/core/lib/surface/call.cc +2 -3
  299. data/src/core/lib/surface/call_log_batch.cc +50 -58
  300. data/src/core/lib/surface/channel.cc +53 -31
  301. data/src/core/lib/surface/channel.h +35 -4
  302. data/src/core/lib/surface/channel_ping.cc +2 -3
  303. data/src/core/lib/surface/completion_queue.cc +33 -33
  304. data/src/core/lib/surface/event_string.cc +18 -25
  305. data/src/core/lib/surface/event_string.h +3 -1
  306. data/src/core/lib/surface/init_secure.cc +1 -4
  307. data/src/core/lib/surface/server.cc +570 -369
  308. data/src/core/lib/surface/server.h +32 -0
  309. data/src/core/lib/surface/version.cc +2 -2
  310. data/src/core/lib/transport/byte_stream.h +7 -2
  311. data/src/core/lib/transport/connectivity_state.cc +7 -6
  312. data/src/core/lib/transport/connectivity_state.h +5 -3
  313. data/src/core/lib/transport/metadata.cc +3 -3
  314. data/src/core/lib/transport/metadata_batch.h +2 -3
  315. data/src/core/lib/transport/static_metadata.h +1 -1
  316. data/src/core/lib/transport/status_conversion.cc +6 -14
  317. data/src/core/lib/transport/transport.cc +2 -3
  318. data/src/core/lib/transport/transport.h +3 -2
  319. data/src/core/lib/transport/transport_op_string.cc +61 -102
  320. data/src/core/lib/uri/uri_parser.h +2 -3
  321. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  322. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  323. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
  324. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  325. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
  326. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  327. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  328. data/src/core/tsi/fake_transport_security.cc +10 -15
  329. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  330. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  331. data/src/core/tsi/ssl_transport_security.cc +52 -39
  332. data/src/core/tsi/ssl_transport_security.h +8 -8
  333. data/src/core/tsi/ssl_types.h +0 -2
  334. data/src/core/tsi/transport_security.h +6 -9
  335. data/src/core/tsi/transport_security_grpc.h +2 -3
  336. data/src/core/tsi/transport_security_interface.h +3 -3
  337. data/src/ruby/ext/grpc/rb_call.c +9 -1
  338. data/src/ruby/ext/grpc/rb_call_credentials.c +3 -2
  339. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  340. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  341. data/src/ruby/lib/grpc/errors.rb +103 -42
  342. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  343. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  344. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  345. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  346. data/src/ruby/lib/grpc/structs.rb +1 -1
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  349. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  350. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  351. data/src/ruby/spec/debug_message_spec.rb +134 -0
  352. data/src/ruby/spec/generic/service_spec.rb +2 -0
  353. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  354. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  355. data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
  356. data/src/ruby/spec/support/services.rb +10 -4
  357. data/src/ruby/spec/testdata/ca.pem +18 -13
  358. data/src/ruby/spec/testdata/client.key +26 -14
  359. data/src/ruby/spec/testdata/client.pem +18 -12
  360. data/src/ruby/spec/testdata/server1.key +26 -14
  361. data/src/ruby/spec/testdata/server1.pem +20 -14
  362. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  363. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  364. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  365. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  366. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  367. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  368. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  369. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  370. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  371. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  372. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  373. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  374. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  375. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  376. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  377. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  378. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  379. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  380. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  381. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  382. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  383. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  384. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  385. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  386. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  387. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  388. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  389. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  390. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  391. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  392. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  393. data/third_party/boringssl-with-bazel/err_data.c +329 -297
  394. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  395. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  396. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  397. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  398. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  399. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  400. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  401. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  402. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  404. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  405. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  406. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  407. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  437. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  438. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  439. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  441. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  442. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  443. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
  444. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  446. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  447. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  449. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  450. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  451. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
  453. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
  454. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  456. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  457. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  459. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  460. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  461. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  462. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  463. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  464. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  465. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  466. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
  467. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  468. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  469. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
  470. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  471. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  472. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  473. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  474. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  475. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
  476. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
  477. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
  478. data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
  479. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  480. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  481. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  482. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  483. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  484. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
  485. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  486. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
  487. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  488. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
  489. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  490. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  491. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
  492. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  493. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
  494. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  495. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  496. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  497. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  498. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  499. metadata +115 -39
  500. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  501. data/src/core/lib/gprpp/string_view.h +0 -60
  502. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  503. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -0,0 +1,122 @@
1
+ /* Layout and location of TZif files. */
2
+
3
+ #ifndef TZFILE_H
4
+
5
+ #define TZFILE_H
6
+
7
+ /*
8
+ ** This file is in the public domain, so clarified as of
9
+ ** 1996-06-05 by Arthur David Olson.
10
+ */
11
+
12
+ /*
13
+ ** This header is for use ONLY with the time conversion code.
14
+ ** There is no guarantee that it will remain unchanged,
15
+ ** or that it will remain at all.
16
+ ** Do NOT copy it to any system include directory.
17
+ ** Thank you!
18
+ */
19
+
20
+ /*
21
+ ** Information about time zone files.
22
+ */
23
+
24
+ #ifndef TZDIR
25
+ #define TZDIR "/usr/share/zoneinfo" /* Time zone object file directory */
26
+ #endif /* !defined TZDIR */
27
+
28
+ #ifndef TZDEFAULT
29
+ #define TZDEFAULT "/etc/localtime"
30
+ #endif /* !defined TZDEFAULT */
31
+
32
+ #ifndef TZDEFRULES
33
+ #define TZDEFRULES "posixrules"
34
+ #endif /* !defined TZDEFRULES */
35
+
36
+ /* See Internet RFC 8536 for more details about the following format. */
37
+
38
+ /*
39
+ ** Each file begins with. . .
40
+ */
41
+
42
+ #define TZ_MAGIC "TZif"
43
+
44
+ struct tzhead {
45
+ char tzh_magic[4]; /* TZ_MAGIC */
46
+ char tzh_version[1]; /* '\0' or '2' or '3' as of 2013 */
47
+ char tzh_reserved[15]; /* reserved; must be zero */
48
+ char tzh_ttisutcnt[4]; /* coded number of trans. time flags */
49
+ char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
50
+ char tzh_leapcnt[4]; /* coded number of leap seconds */
51
+ char tzh_timecnt[4]; /* coded number of transition times */
52
+ char tzh_typecnt[4]; /* coded number of local time types */
53
+ char tzh_charcnt[4]; /* coded number of abbr. chars */
54
+ };
55
+
56
+ /*
57
+ ** . . .followed by. . .
58
+ **
59
+ ** tzh_timecnt (char [4])s coded transition times a la time(2)
60
+ ** tzh_timecnt (unsigned char)s types of local time starting at above
61
+ ** tzh_typecnt repetitions of
62
+ ** one (char [4]) coded UT offset in seconds
63
+ ** one (unsigned char) used to set tm_isdst
64
+ ** one (unsigned char) that's an abbreviation list index
65
+ ** tzh_charcnt (char)s '\0'-terminated zone abbreviations
66
+ ** tzh_leapcnt repetitions of
67
+ ** one (char [4]) coded leap second transition times
68
+ ** one (char [4]) total correction after above
69
+ ** tzh_ttisstdcnt (char)s indexed by type; if 1, transition
70
+ ** time is standard time, if 0,
71
+ ** transition time is local (wall clock)
72
+ ** time; if absent, transition times are
73
+ ** assumed to be local time
74
+ ** tzh_ttisutcnt (char)s indexed by type; if 1, transition
75
+ ** time is UT, if 0, transition time is
76
+ ** local time; if absent, transition
77
+ ** times are assumed to be local time.
78
+ ** When this is 1, the corresponding
79
+ ** std/wall indicator must also be 1.
80
+ */
81
+
82
+ /*
83
+ ** If tzh_version is '2' or greater, the above is followed by a second instance
84
+ ** of tzhead and a second instance of the data in which each coded transition
85
+ ** time uses 8 rather than 4 chars,
86
+ ** then a POSIX-TZ-environment-variable-style std::string for use in handling
87
+ ** instants after the last transition time stored in the file
88
+ ** (with nothing between the newlines if there is no POSIX representation for
89
+ ** such instants).
90
+ **
91
+ ** If tz_version is '3' or greater, the above is extended as follows.
92
+ ** First, the POSIX TZ std::string's hour offset may range from -167
93
+ ** through 167 as compared to the POSIX-required 0 through 24.
94
+ ** Second, its DST start time may be January 1 at 00:00 and its stop
95
+ ** time December 31 at 24:00 plus the difference between DST and
96
+ ** standard time, indicating DST all year.
97
+ */
98
+
99
+ /*
100
+ ** In the current implementation, "tzset()" refuses to deal with files that
101
+ ** exceed any of the limits below.
102
+ */
103
+
104
+ #ifndef TZ_MAX_TIMES
105
+ #define TZ_MAX_TIMES 2000
106
+ #endif /* !defined TZ_MAX_TIMES */
107
+
108
+ #ifndef TZ_MAX_TYPES
109
+ /* This must be at least 17 for Europe/Samara and Europe/Vilnius. */
110
+ #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
111
+ #endif /* !defined TZ_MAX_TYPES */
112
+
113
+ #ifndef TZ_MAX_CHARS
114
+ #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
115
+ /* (limited by what unsigned chars can hold) */
116
+ #endif /* !defined TZ_MAX_CHARS */
117
+
118
+ #ifndef TZ_MAX_LEAPS
119
+ #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
120
+ #endif /* !defined TZ_MAX_LEAPS */
121
+
122
+ #endif /* !defined TZFILE_H */
@@ -0,0 +1,115 @@
1
+ // Copyright 2016 Google Inc. All Rights Reserved.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/time/internal/cctz/include/cctz/zone_info_source.h"
16
+
17
+ #include "absl/base/config.h"
18
+
19
+ namespace absl {
20
+ ABSL_NAMESPACE_BEGIN
21
+ namespace time_internal {
22
+ namespace cctz {
23
+
24
+ // Defined out-of-line to avoid emitting a weak vtable in all TUs.
25
+ ZoneInfoSource::~ZoneInfoSource() {}
26
+ std::string ZoneInfoSource::Version() const { return std::string(); }
27
+
28
+ } // namespace cctz
29
+ } // namespace time_internal
30
+ ABSL_NAMESPACE_END
31
+ } // namespace absl
32
+
33
+ namespace absl {
34
+ ABSL_NAMESPACE_BEGIN
35
+ namespace time_internal {
36
+ namespace cctz_extension {
37
+
38
+ namespace {
39
+
40
+ // A default for cctz_extension::zone_info_source_factory, which simply
41
+ // defers to the fallback factory.
42
+ std::unique_ptr<absl::time_internal::cctz::ZoneInfoSource> DefaultFactory(
43
+ const std::string& name,
44
+ const std::function<
45
+ std::unique_ptr<absl::time_internal::cctz::ZoneInfoSource>(
46
+ const std::string& name)>& fallback_factory) {
47
+ return fallback_factory(name);
48
+ }
49
+
50
+ } // namespace
51
+
52
+ // A "weak" definition for cctz_extension::zone_info_source_factory.
53
+ // The user may override this with their own "strong" definition (see
54
+ // zone_info_source.h).
55
+ #if !defined(__has_attribute)
56
+ #define __has_attribute(x) 0
57
+ #endif
58
+ // MinGW is GCC on Windows, so while it asserts __has_attribute(weak), the
59
+ // Windows linker cannot handle that. Nor does the MinGW compiler know how to
60
+ // pass "#pragma comment(linker, ...)" to the Windows linker.
61
+ #if (__has_attribute(weak) || defined(__GNUC__)) && !defined(__MINGW32__)
62
+ ZoneInfoSourceFactory zone_info_source_factory __attribute__((weak)) =
63
+ DefaultFactory;
64
+ #elif defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_LIBCPP_VERSION)
65
+ extern ZoneInfoSourceFactory zone_info_source_factory;
66
+ extern ZoneInfoSourceFactory default_factory;
67
+ ZoneInfoSourceFactory default_factory = DefaultFactory;
68
+ #if defined(_M_IX86)
69
+ #pragma comment( \
70
+ linker, \
71
+ "/alternatename:?zone_info_source_factory@cctz_extension@time_internal@" ABSL_INTERNAL_MANGLED_NS \
72
+ "@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
73
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
74
+ "@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
75
+ "@ABV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
76
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
77
+ "@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
78
+ "@@ZA=?default_factory@cctz_extension@time_internal@" ABSL_INTERNAL_MANGLED_NS \
79
+ "@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
80
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
81
+ "@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
82
+ "@ABV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
83
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
84
+ "@@@std@@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
85
+ "@@ZA")
86
+ #elif defined(_M_IA_64) || defined(_M_AMD64) || defined(_M_ARM64)
87
+ #pragma comment( \
88
+ linker, \
89
+ "/alternatename:?zone_info_source_factory@cctz_extension@time_internal@" ABSL_INTERNAL_MANGLED_NS \
90
+ "@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
91
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
92
+ "@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
93
+ "@AEBV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
94
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
95
+ "@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
96
+ "@@ZEA=?default_factory@cctz_extension@time_internal@" ABSL_INTERNAL_MANGLED_NS \
97
+ "@@3P6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
98
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
99
+ "@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
100
+ "@AEBV?$function@$$A6A?AV?$unique_ptr@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
101
+ "@@U?$default_delete@VZoneInfoSource@cctz@time_internal@" ABSL_INTERNAL_MANGLED_NS \
102
+ "@@@std@@@std@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z@" ABSL_INTERNAL_MANGLED_BACKREFERENCE \
103
+ "@@ZEA")
104
+ #else
105
+ #error Unsupported MSVC platform
106
+ #endif // _M_<PLATFORM>
107
+ #else
108
+ // Make it a "strong" definition if we have no other choice.
109
+ ZoneInfoSourceFactory zone_info_source_factory = DefaultFactory;
110
+ #endif
111
+
112
+ } // namespace cctz_extension
113
+ } // namespace time_internal
114
+ ABSL_NAMESPACE_END
115
+ } // namespace absl
@@ -0,0 +1,31 @@
1
+ // Copyright 2018 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <chrono>
16
+ #include <cstdint>
17
+
18
+ namespace absl {
19
+ ABSL_NAMESPACE_BEGIN
20
+ namespace time_internal {
21
+
22
+ static int64_t GetCurrentTimeNanosFromSystem() {
23
+ return std::chrono::duration_cast<std::chrono::nanoseconds>(
24
+ std::chrono::system_clock::now() -
25
+ std::chrono::system_clock::from_time_t(0))
26
+ .count();
27
+ }
28
+
29
+ } // namespace time_internal
30
+ ABSL_NAMESPACE_END
31
+ } // namespace absl
@@ -0,0 +1,24 @@
1
+ #include "absl/time/clock.h"
2
+
3
+ #include <sys/time.h>
4
+ #include <ctime>
5
+ #include <cstdint>
6
+
7
+ #include "absl/base/internal/raw_logging.h"
8
+
9
+ namespace absl {
10
+ ABSL_NAMESPACE_BEGIN
11
+ namespace time_internal {
12
+
13
+ static int64_t GetCurrentTimeNanosFromSystem() {
14
+ const int64_t kNanosPerSecond = 1000 * 1000 * 1000;
15
+ struct timespec ts;
16
+ ABSL_RAW_CHECK(clock_gettime(CLOCK_REALTIME, &ts) == 0,
17
+ "Failed to read real-time clock.");
18
+ return (int64_t{ts.tv_sec} * kNanosPerSecond +
19
+ int64_t{ts.tv_nsec});
20
+ }
21
+
22
+ } // namespace time_internal
23
+ ABSL_NAMESPACE_END
24
+ } // namespace absl
@@ -0,0 +1,499 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ // The implementation of the absl::Time class, which is declared in
16
+ // //absl/time.h.
17
+ //
18
+ // The representation for an absl::Time is an absl::Duration offset from the
19
+ // epoch. We use the traditional Unix epoch (1970-01-01 00:00:00 +0000)
20
+ // for convenience, but this is not exposed in the API and could be changed.
21
+ //
22
+ // NOTE: To keep type verbosity to a minimum, the following variable naming
23
+ // conventions are used throughout this file.
24
+ //
25
+ // tz: An absl::TimeZone
26
+ // ci: An absl::TimeZone::CivilInfo
27
+ // ti: An absl::TimeZone::TimeInfo
28
+ // cd: An absl::CivilDay or a cctz::civil_day
29
+ // cs: An absl::CivilSecond or a cctz::civil_second
30
+ // bd: An absl::Time::Breakdown
31
+ // cl: A cctz::time_zone::civil_lookup
32
+ // al: A cctz::time_zone::absolute_lookup
33
+
34
+ #include "absl/time/time.h"
35
+
36
+ #if defined(_MSC_VER)
37
+ #include <winsock2.h> // for timeval
38
+ #endif
39
+
40
+ #include <cstring>
41
+ #include <ctime>
42
+ #include <limits>
43
+
44
+ #include "absl/time/internal/cctz/include/cctz/civil_time.h"
45
+ #include "absl/time/internal/cctz/include/cctz/time_zone.h"
46
+
47
+ namespace cctz = absl::time_internal::cctz;
48
+
49
+ namespace absl {
50
+ ABSL_NAMESPACE_BEGIN
51
+
52
+ namespace {
53
+
54
+ inline cctz::time_point<cctz::seconds> unix_epoch() {
55
+ return std::chrono::time_point_cast<cctz::seconds>(
56
+ std::chrono::system_clock::from_time_t(0));
57
+ }
58
+
59
+ // Floors d to the next unit boundary closer to negative infinity.
60
+ inline int64_t FloorToUnit(absl::Duration d, absl::Duration unit) {
61
+ absl::Duration rem;
62
+ int64_t q = absl::IDivDuration(d, unit, &rem);
63
+ return (q > 0 ||
64
+ rem >= ZeroDuration() ||
65
+ q == std::numeric_limits<int64_t>::min()) ? q : q - 1;
66
+ }
67
+
68
+ inline absl::Time::Breakdown InfiniteFutureBreakdown() {
69
+ absl::Time::Breakdown bd;
70
+ bd.year = std::numeric_limits<int64_t>::max();
71
+ bd.month = 12;
72
+ bd.day = 31;
73
+ bd.hour = 23;
74
+ bd.minute = 59;
75
+ bd.second = 59;
76
+ bd.subsecond = absl::InfiniteDuration();
77
+ bd.weekday = 4;
78
+ bd.yearday = 365;
79
+ bd.offset = 0;
80
+ bd.is_dst = false;
81
+ bd.zone_abbr = "-00";
82
+ return bd;
83
+ }
84
+
85
+ inline absl::Time::Breakdown InfinitePastBreakdown() {
86
+ Time::Breakdown bd;
87
+ bd.year = std::numeric_limits<int64_t>::min();
88
+ bd.month = 1;
89
+ bd.day = 1;
90
+ bd.hour = 0;
91
+ bd.minute = 0;
92
+ bd.second = 0;
93
+ bd.subsecond = -absl::InfiniteDuration();
94
+ bd.weekday = 7;
95
+ bd.yearday = 1;
96
+ bd.offset = 0;
97
+ bd.is_dst = false;
98
+ bd.zone_abbr = "-00";
99
+ return bd;
100
+ }
101
+
102
+ inline absl::TimeZone::CivilInfo InfiniteFutureCivilInfo() {
103
+ TimeZone::CivilInfo ci;
104
+ ci.cs = CivilSecond::max();
105
+ ci.subsecond = InfiniteDuration();
106
+ ci.offset = 0;
107
+ ci.is_dst = false;
108
+ ci.zone_abbr = "-00";
109
+ return ci;
110
+ }
111
+
112
+ inline absl::TimeZone::CivilInfo InfinitePastCivilInfo() {
113
+ TimeZone::CivilInfo ci;
114
+ ci.cs = CivilSecond::min();
115
+ ci.subsecond = -InfiniteDuration();
116
+ ci.offset = 0;
117
+ ci.is_dst = false;
118
+ ci.zone_abbr = "-00";
119
+ return ci;
120
+ }
121
+
122
+ inline absl::TimeConversion InfiniteFutureTimeConversion() {
123
+ absl::TimeConversion tc;
124
+ tc.pre = tc.trans = tc.post = absl::InfiniteFuture();
125
+ tc.kind = absl::TimeConversion::UNIQUE;
126
+ tc.normalized = true;
127
+ return tc;
128
+ }
129
+
130
+ inline TimeConversion InfinitePastTimeConversion() {
131
+ absl::TimeConversion tc;
132
+ tc.pre = tc.trans = tc.post = absl::InfinitePast();
133
+ tc.kind = absl::TimeConversion::UNIQUE;
134
+ tc.normalized = true;
135
+ return tc;
136
+ }
137
+
138
+ // Makes a Time from sec, overflowing to InfiniteFuture/InfinitePast as
139
+ // necessary. If sec is min/max, then consult cs+tz to check for overlow.
140
+ Time MakeTimeWithOverflow(const cctz::time_point<cctz::seconds>& sec,
141
+ const cctz::civil_second& cs,
142
+ const cctz::time_zone& tz,
143
+ bool* normalized = nullptr) {
144
+ const auto max = cctz::time_point<cctz::seconds>::max();
145
+ const auto min = cctz::time_point<cctz::seconds>::min();
146
+ if (sec == max) {
147
+ const auto al = tz.lookup(max);
148
+ if (cs > al.cs) {
149
+ if (normalized) *normalized = true;
150
+ return absl::InfiniteFuture();
151
+ }
152
+ }
153
+ if (sec == min) {
154
+ const auto al = tz.lookup(min);
155
+ if (cs < al.cs) {
156
+ if (normalized) *normalized = true;
157
+ return absl::InfinitePast();
158
+ }
159
+ }
160
+ const auto hi = (sec - unix_epoch()).count();
161
+ return time_internal::FromUnixDuration(time_internal::MakeDuration(hi));
162
+ }
163
+
164
+ // Returns Mon=1..Sun=7.
165
+ inline int MapWeekday(const cctz::weekday& wd) {
166
+ switch (wd) {
167
+ case cctz::weekday::monday:
168
+ return 1;
169
+ case cctz::weekday::tuesday:
170
+ return 2;
171
+ case cctz::weekday::wednesday:
172
+ return 3;
173
+ case cctz::weekday::thursday:
174
+ return 4;
175
+ case cctz::weekday::friday:
176
+ return 5;
177
+ case cctz::weekday::saturday:
178
+ return 6;
179
+ case cctz::weekday::sunday:
180
+ return 7;
181
+ }
182
+ return 1;
183
+ }
184
+
185
+ bool FindTransition(const cctz::time_zone& tz,
186
+ bool (cctz::time_zone::*find_transition)(
187
+ const cctz::time_point<cctz::seconds>& tp,
188
+ cctz::time_zone::civil_transition* trans) const,
189
+ Time t, TimeZone::CivilTransition* trans) {
190
+ // Transitions are second-aligned, so we can discard any fractional part.
191
+ const auto tp = unix_epoch() + cctz::seconds(ToUnixSeconds(t));
192
+ cctz::time_zone::civil_transition tr;
193
+ if (!(tz.*find_transition)(tp, &tr)) return false;
194
+ trans->from = CivilSecond(tr.from);
195
+ trans->to = CivilSecond(tr.to);
196
+ return true;
197
+ }
198
+
199
+ } // namespace
200
+
201
+ //
202
+ // Time
203
+ //
204
+
205
+ absl::Time::Breakdown Time::In(absl::TimeZone tz) const {
206
+ if (*this == absl::InfiniteFuture()) return InfiniteFutureBreakdown();
207
+ if (*this == absl::InfinitePast()) return InfinitePastBreakdown();
208
+
209
+ const auto tp = unix_epoch() + cctz::seconds(time_internal::GetRepHi(rep_));
210
+ const auto al = cctz::time_zone(tz).lookup(tp);
211
+ const auto cs = al.cs;
212
+ const auto cd = cctz::civil_day(cs);
213
+
214
+ absl::Time::Breakdown bd;
215
+ bd.year = cs.year();
216
+ bd.month = cs.month();
217
+ bd.day = cs.day();
218
+ bd.hour = cs.hour();
219
+ bd.minute = cs.minute();
220
+ bd.second = cs.second();
221
+ bd.subsecond = time_internal::MakeDuration(0, time_internal::GetRepLo(rep_));
222
+ bd.weekday = MapWeekday(cctz::get_weekday(cd));
223
+ bd.yearday = cctz::get_yearday(cd);
224
+ bd.offset = al.offset;
225
+ bd.is_dst = al.is_dst;
226
+ bd.zone_abbr = al.abbr;
227
+ return bd;
228
+ }
229
+
230
+ //
231
+ // Conversions from/to other time types.
232
+ //
233
+
234
+ absl::Time FromUDate(double udate) {
235
+ return time_internal::FromUnixDuration(absl::Milliseconds(udate));
236
+ }
237
+
238
+ absl::Time FromUniversal(int64_t universal) {
239
+ return absl::UniversalEpoch() + 100 * absl::Nanoseconds(universal);
240
+ }
241
+
242
+ int64_t ToUnixNanos(Time t) {
243
+ if (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >= 0 &&
244
+ time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >> 33 == 0) {
245
+ return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) *
246
+ 1000 * 1000 * 1000) +
247
+ (time_internal::GetRepLo(time_internal::ToUnixDuration(t)) / 4);
248
+ }
249
+ return FloorToUnit(time_internal::ToUnixDuration(t), absl::Nanoseconds(1));
250
+ }
251
+
252
+ int64_t ToUnixMicros(Time t) {
253
+ if (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >= 0 &&
254
+ time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >> 43 == 0) {
255
+ return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) *
256
+ 1000 * 1000) +
257
+ (time_internal::GetRepLo(time_internal::ToUnixDuration(t)) / 4000);
258
+ }
259
+ return FloorToUnit(time_internal::ToUnixDuration(t), absl::Microseconds(1));
260
+ }
261
+
262
+ int64_t ToUnixMillis(Time t) {
263
+ if (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >= 0 &&
264
+ time_internal::GetRepHi(time_internal::ToUnixDuration(t)) >> 53 == 0) {
265
+ return (time_internal::GetRepHi(time_internal::ToUnixDuration(t)) * 1000) +
266
+ (time_internal::GetRepLo(time_internal::ToUnixDuration(t)) /
267
+ (4000 * 1000));
268
+ }
269
+ return FloorToUnit(time_internal::ToUnixDuration(t), absl::Milliseconds(1));
270
+ }
271
+
272
+ int64_t ToUnixSeconds(Time t) {
273
+ return time_internal::GetRepHi(time_internal::ToUnixDuration(t));
274
+ }
275
+
276
+ time_t ToTimeT(Time t) { return absl::ToTimespec(t).tv_sec; }
277
+
278
+ double ToUDate(Time t) {
279
+ return absl::FDivDuration(time_internal::ToUnixDuration(t),
280
+ absl::Milliseconds(1));
281
+ }
282
+
283
+ int64_t ToUniversal(absl::Time t) {
284
+ return absl::FloorToUnit(t - absl::UniversalEpoch(), absl::Nanoseconds(100));
285
+ }
286
+
287
+ absl::Time TimeFromTimespec(timespec ts) {
288
+ return time_internal::FromUnixDuration(absl::DurationFromTimespec(ts));
289
+ }
290
+
291
+ absl::Time TimeFromTimeval(timeval tv) {
292
+ return time_internal::FromUnixDuration(absl::DurationFromTimeval(tv));
293
+ }
294
+
295
+ timespec ToTimespec(Time t) {
296
+ timespec ts;
297
+ absl::Duration d = time_internal::ToUnixDuration(t);
298
+ if (!time_internal::IsInfiniteDuration(d)) {
299
+ ts.tv_sec = time_internal::GetRepHi(d);
300
+ if (ts.tv_sec == time_internal::GetRepHi(d)) { // no time_t narrowing
301
+ ts.tv_nsec = time_internal::GetRepLo(d) / 4; // floor
302
+ return ts;
303
+ }
304
+ }
305
+ if (d >= absl::ZeroDuration()) {
306
+ ts.tv_sec = std::numeric_limits<time_t>::max();
307
+ ts.tv_nsec = 1000 * 1000 * 1000 - 1;
308
+ } else {
309
+ ts.tv_sec = std::numeric_limits<time_t>::min();
310
+ ts.tv_nsec = 0;
311
+ }
312
+ return ts;
313
+ }
314
+
315
+ timeval ToTimeval(Time t) {
316
+ timeval tv;
317
+ timespec ts = absl::ToTimespec(t);
318
+ tv.tv_sec = ts.tv_sec;
319
+ if (tv.tv_sec != ts.tv_sec) { // narrowing
320
+ if (ts.tv_sec < 0) {
321
+ tv.tv_sec = std::numeric_limits<decltype(tv.tv_sec)>::min();
322
+ tv.tv_usec = 0;
323
+ } else {
324
+ tv.tv_sec = std::numeric_limits<decltype(tv.tv_sec)>::max();
325
+ tv.tv_usec = 1000 * 1000 - 1;
326
+ }
327
+ return tv;
328
+ }
329
+ tv.tv_usec = static_cast<int>(ts.tv_nsec / 1000); // suseconds_t
330
+ return tv;
331
+ }
332
+
333
+ Time FromChrono(const std::chrono::system_clock::time_point& tp) {
334
+ return time_internal::FromUnixDuration(time_internal::FromChrono(
335
+ tp - std::chrono::system_clock::from_time_t(0)));
336
+ }
337
+
338
+ std::chrono::system_clock::time_point ToChronoTime(absl::Time t) {
339
+ using D = std::chrono::system_clock::duration;
340
+ auto d = time_internal::ToUnixDuration(t);
341
+ if (d < ZeroDuration()) d = Floor(d, FromChrono(D{1}));
342
+ return std::chrono::system_clock::from_time_t(0) +
343
+ time_internal::ToChronoDuration<D>(d);
344
+ }
345
+
346
+ //
347
+ // TimeZone
348
+ //
349
+
350
+ absl::TimeZone::CivilInfo TimeZone::At(Time t) const {
351
+ if (t == absl::InfiniteFuture()) return InfiniteFutureCivilInfo();
352
+ if (t == absl::InfinitePast()) return InfinitePastCivilInfo();
353
+
354
+ const auto ud = time_internal::ToUnixDuration(t);
355
+ const auto tp = unix_epoch() + cctz::seconds(time_internal::GetRepHi(ud));
356
+ const auto al = cz_.lookup(tp);
357
+
358
+ TimeZone::CivilInfo ci;
359
+ ci.cs = CivilSecond(al.cs);
360
+ ci.subsecond = time_internal::MakeDuration(0, time_internal::GetRepLo(ud));
361
+ ci.offset = al.offset;
362
+ ci.is_dst = al.is_dst;
363
+ ci.zone_abbr = al.abbr;
364
+ return ci;
365
+ }
366
+
367
+ absl::TimeZone::TimeInfo TimeZone::At(CivilSecond ct) const {
368
+ const cctz::civil_second cs(ct);
369
+ const auto cl = cz_.lookup(cs);
370
+
371
+ TimeZone::TimeInfo ti;
372
+ switch (cl.kind) {
373
+ case cctz::time_zone::civil_lookup::UNIQUE:
374
+ ti.kind = TimeZone::TimeInfo::UNIQUE;
375
+ break;
376
+ case cctz::time_zone::civil_lookup::SKIPPED:
377
+ ti.kind = TimeZone::TimeInfo::SKIPPED;
378
+ break;
379
+ case cctz::time_zone::civil_lookup::REPEATED:
380
+ ti.kind = TimeZone::TimeInfo::REPEATED;
381
+ break;
382
+ }
383
+ ti.pre = MakeTimeWithOverflow(cl.pre, cs, cz_);
384
+ ti.trans = MakeTimeWithOverflow(cl.trans, cs, cz_);
385
+ ti.post = MakeTimeWithOverflow(cl.post, cs, cz_);
386
+ return ti;
387
+ }
388
+
389
+ bool TimeZone::NextTransition(Time t, CivilTransition* trans) const {
390
+ return FindTransition(cz_, &cctz::time_zone::next_transition, t, trans);
391
+ }
392
+
393
+ bool TimeZone::PrevTransition(Time t, CivilTransition* trans) const {
394
+ return FindTransition(cz_, &cctz::time_zone::prev_transition, t, trans);
395
+ }
396
+
397
+ //
398
+ // Conversions involving time zones.
399
+ //
400
+
401
+ absl::TimeConversion ConvertDateTime(int64_t year, int mon, int day, int hour,
402
+ int min, int sec, TimeZone tz) {
403
+ // Avoids years that are too extreme for CivilSecond to normalize.
404
+ if (year > 300000000000) return InfiniteFutureTimeConversion();
405
+ if (year < -300000000000) return InfinitePastTimeConversion();
406
+
407
+ const CivilSecond cs(year, mon, day, hour, min, sec);
408
+ const auto ti = tz.At(cs);
409
+
410
+ TimeConversion tc;
411
+ tc.pre = ti.pre;
412
+ tc.trans = ti.trans;
413
+ tc.post = ti.post;
414
+ switch (ti.kind) {
415
+ case TimeZone::TimeInfo::UNIQUE:
416
+ tc.kind = TimeConversion::UNIQUE;
417
+ break;
418
+ case TimeZone::TimeInfo::SKIPPED:
419
+ tc.kind = TimeConversion::SKIPPED;
420
+ break;
421
+ case TimeZone::TimeInfo::REPEATED:
422
+ tc.kind = TimeConversion::REPEATED;
423
+ break;
424
+ }
425
+ tc.normalized = false;
426
+ if (year != cs.year() || mon != cs.month() || day != cs.day() ||
427
+ hour != cs.hour() || min != cs.minute() || sec != cs.second()) {
428
+ tc.normalized = true;
429
+ }
430
+ return tc;
431
+ }
432
+
433
+ absl::Time FromTM(const struct tm& tm, absl::TimeZone tz) {
434
+ civil_year_t tm_year = tm.tm_year;
435
+ // Avoids years that are too extreme for CivilSecond to normalize.
436
+ if (tm_year > 300000000000ll) return InfiniteFuture();
437
+ if (tm_year < -300000000000ll) return InfinitePast();
438
+ int tm_mon = tm.tm_mon;
439
+ if (tm_mon == std::numeric_limits<int>::max()) {
440
+ tm_mon -= 12;
441
+ tm_year += 1;
442
+ }
443
+ const auto ti = tz.At(CivilSecond(tm_year + 1900, tm_mon + 1, tm.tm_mday,
444
+ tm.tm_hour, tm.tm_min, tm.tm_sec));
445
+ return tm.tm_isdst == 0 ? ti.post : ti.pre;
446
+ }
447
+
448
+ struct tm ToTM(absl::Time t, absl::TimeZone tz) {
449
+ struct tm tm = {};
450
+
451
+ const auto ci = tz.At(t);
452
+ const auto& cs = ci.cs;
453
+ tm.tm_sec = cs.second();
454
+ tm.tm_min = cs.minute();
455
+ tm.tm_hour = cs.hour();
456
+ tm.tm_mday = cs.day();
457
+ tm.tm_mon = cs.month() - 1;
458
+
459
+ // Saturates tm.tm_year in cases of over/underflow, accounting for the fact
460
+ // that tm.tm_year is years since 1900.
461
+ if (cs.year() < std::numeric_limits<int>::min() + 1900) {
462
+ tm.tm_year = std::numeric_limits<int>::min();
463
+ } else if (cs.year() > std::numeric_limits<int>::max()) {
464
+ tm.tm_year = std::numeric_limits<int>::max() - 1900;
465
+ } else {
466
+ tm.tm_year = static_cast<int>(cs.year() - 1900);
467
+ }
468
+
469
+ switch (GetWeekday(cs)) {
470
+ case Weekday::sunday:
471
+ tm.tm_wday = 0;
472
+ break;
473
+ case Weekday::monday:
474
+ tm.tm_wday = 1;
475
+ break;
476
+ case Weekday::tuesday:
477
+ tm.tm_wday = 2;
478
+ break;
479
+ case Weekday::wednesday:
480
+ tm.tm_wday = 3;
481
+ break;
482
+ case Weekday::thursday:
483
+ tm.tm_wday = 4;
484
+ break;
485
+ case Weekday::friday:
486
+ tm.tm_wday = 5;
487
+ break;
488
+ case Weekday::saturday:
489
+ tm.tm_wday = 6;
490
+ break;
491
+ }
492
+ tm.tm_yday = GetYearDay(cs) - 1;
493
+ tm.tm_isdst = ci.is_dst ? 1 : 0;
494
+
495
+ return tm;
496
+ }
497
+
498
+ ABSL_NAMESPACE_END
499
+ } // namespace absl