@platformatic/rdkafka 4.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/README.md +5 -5
  2. package/bench/seed.sh +0 -0
  3. package/binding.gyp +8 -1
  4. package/ci/prepublish.js +0 -1
  5. package/config.d.ts +126 -10
  6. package/configure +0 -0
  7. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  8. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  9. package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
  10. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  11. package/deps/librdkafka/CHANGELOG.md +471 -1
  12. package/deps/librdkafka/CONFIGURATION.md +29 -9
  13. package/deps/librdkafka/INTRODUCTION.md +909 -601
  14. package/deps/librdkafka/LICENSES.txt +592 -1
  15. package/deps/librdkafka/Makefile +2 -1
  16. package/deps/librdkafka/_mkltmpuuWEwa.c +13 -0
  17. package/deps/librdkafka/configure +0 -0
  18. package/deps/librdkafka/debian/rules +0 -0
  19. package/deps/librdkafka/dev-conf.sh +0 -0
  20. package/deps/librdkafka/examples/consumer.c +18 -8
  21. package/deps/librdkafka/examples/describe_consumer_groups.c +25 -6
  22. package/deps/librdkafka/examples/incremental_alter_configs.c +4 -5
  23. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +26 -42
  24. package/deps/librdkafka/examples/openssl_engine_example.cpp +3 -4
  25. package/deps/librdkafka/examples/producer.cpp +2 -2
  26. package/deps/librdkafka/examples/user_scram.c +4 -5
  27. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +4 -3
  28. package/deps/librdkafka/lds-gen.py +0 -0
  29. package/deps/librdkafka/mklove/Makefile.base +0 -0
  30. package/deps/librdkafka/packaging/RELEASE.md +8 -0
  31. package/deps/librdkafka/packaging/alpine/build-alpine.sh +0 -0
  32. package/deps/librdkafka/packaging/cp/README.md +4 -1
  33. package/deps/librdkafka/packaging/cp/check_features.c +12 -4
  34. package/deps/librdkafka/packaging/cp/verify-deb.sh +6 -6
  35. package/deps/librdkafka/packaging/cp/verify-packages.sh +52 -31
  36. package/deps/librdkafka/packaging/cp/verify-rpm.sh +6 -13
  37. package/deps/librdkafka/packaging/debian/rules +0 -0
  38. package/deps/librdkafka/packaging/get_version.py +0 -0
  39. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +0 -0
  40. package/deps/librdkafka/packaging/mingw-w64/{travis-before-install.sh → export-variables.sh} +0 -7
  41. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +1 -1
  42. package/deps/librdkafka/packaging/nuget/artifact.py +0 -0
  43. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +0 -0
  44. package/deps/librdkafka/packaging/nuget/nuget.sh +0 -0
  45. package/deps/librdkafka/packaging/nuget/packaging.py +0 -0
  46. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +0 -0
  47. package/deps/librdkafka/packaging/nuget/release.py +0 -0
  48. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -3
  49. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +0 -0
  50. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +0 -0
  51. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +0 -0
  52. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +3 -1
  53. package/deps/librdkafka/packaging/tools/build-deb-package.sh +0 -0
  54. package/deps/librdkafka/packaging/tools/build-debian.sh +0 -0
  55. package/deps/librdkafka/packaging/tools/build-manylinux.sh +0 -0
  56. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +0 -0
  57. package/deps/librdkafka/packaging/tools/distro-build.sh +0 -0
  58. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +0 -0
  59. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +0 -0
  60. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  61. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  62. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  63. package/deps/librdkafka/packaging/tools/style-format.sh +6 -5
  64. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  65. package/deps/librdkafka/service.yml +154 -0
  66. package/deps/librdkafka/src/generate_proto.sh +0 -0
  67. package/deps/librdkafka/src/rd.h +145 -2
  68. package/deps/librdkafka/src/rdaddr.h +6 -7
  69. package/deps/librdkafka/src/rdatomic.h +15 -11
  70. package/deps/librdkafka/src/rdavg.h +3 -2
  71. package/deps/librdkafka/src/rdbase64.c +33 -2
  72. package/deps/librdkafka/src/rdbase64.h +2 -0
  73. package/deps/librdkafka/src/rdendian.h +10 -9
  74. package/deps/librdkafka/src/rdhttp.c +418 -100
  75. package/deps/librdkafka/src/rdhttp.h +23 -5
  76. package/deps/librdkafka/src/rdkafka.c +299 -145
  77. package/deps/librdkafka/src/rdkafka.h +89 -6
  78. package/deps/librdkafka/src/rdkafka_admin.c +482 -105
  79. package/deps/librdkafka/src/rdkafka_admin.h +42 -0
  80. package/deps/librdkafka/src/rdkafka_broker.c +463 -312
  81. package/deps/librdkafka/src/rdkafka_broker.h +68 -10
  82. package/deps/librdkafka/src/rdkafka_buf.c +8 -5
  83. package/deps/librdkafka/src/rdkafka_buf.h +4 -3
  84. package/deps/librdkafka/src/rdkafka_cert.c +25 -1
  85. package/deps/librdkafka/src/rdkafka_cert.h +4 -3
  86. package/deps/librdkafka/src/rdkafka_cgrp.c +468 -143
  87. package/deps/librdkafka/src/rdkafka_cgrp.h +36 -2
  88. package/deps/librdkafka/src/rdkafka_conf.c +526 -102
  89. package/deps/librdkafka/src/rdkafka_conf.h +68 -4
  90. package/deps/librdkafka/src/rdkafka_feature.c +472 -35
  91. package/deps/librdkafka/src/rdkafka_feature.h +2 -0
  92. package/deps/librdkafka/src/rdkafka_fetcher.c +22 -2
  93. package/deps/librdkafka/src/rdkafka_fetcher.h +2 -2
  94. package/deps/librdkafka/src/rdkafka_int.h +84 -46
  95. package/deps/librdkafka/src/rdkafka_metadata.c +221 -136
  96. package/deps/librdkafka/src/rdkafka_metadata.h +15 -11
  97. package/deps/librdkafka/src/rdkafka_metadata_cache.c +279 -73
  98. package/deps/librdkafka/src/rdkafka_mock.c +795 -19
  99. package/deps/librdkafka/src/rdkafka_mock.h +119 -0
  100. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1298 -132
  101. package/deps/librdkafka/src/rdkafka_mock_handlers.c +345 -49
  102. package/deps/librdkafka/src/rdkafka_mock_int.h +180 -61
  103. package/deps/librdkafka/src/rdkafka_msg.c +35 -19
  104. package/deps/librdkafka/src/rdkafka_msg.h +3 -3
  105. package/deps/librdkafka/src/rdkafka_msgset_writer.c +14 -10
  106. package/deps/librdkafka/src/rdkafka_offset.c +33 -5
  107. package/deps/librdkafka/src/rdkafka_op.c +1 -1
  108. package/deps/librdkafka/src/rdkafka_op.h +45 -21
  109. package/deps/librdkafka/src/rdkafka_partition.c +118 -23
  110. package/deps/librdkafka/src/rdkafka_partition.h +16 -7
  111. package/deps/librdkafka/src/rdkafka_proto.h +4 -1
  112. package/deps/librdkafka/src/rdkafka_protocol.h +1 -0
  113. package/deps/librdkafka/src/rdkafka_queue.c +125 -48
  114. package/deps/librdkafka/src/rdkafka_queue.h +19 -0
  115. package/deps/librdkafka/src/rdkafka_range_assignor.c +1 -1
  116. package/deps/librdkafka/src/rdkafka_request.c +336 -64
  117. package/deps/librdkafka/src/rdkafka_request.h +24 -1
  118. package/deps/librdkafka/src/rdkafka_sasl.c +5 -3
  119. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +14 -10
  120. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1166 -89
  121. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +13 -3
  122. package/deps/librdkafka/src/rdkafka_sasl_plain.c +3 -3
  123. package/deps/librdkafka/src/rdkafka_sasl_scram.c +4 -3
  124. package/deps/librdkafka/src/rdkafka_ssl.c +306 -81
  125. package/deps/librdkafka/src/rdkafka_ssl.h +22 -0
  126. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4 -0
  127. package/deps/librdkafka/src/rdkafka_telemetry.c +80 -23
  128. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +5 -1
  129. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +20 -20
  130. package/deps/librdkafka/src/rdkafka_topic.c +220 -137
  131. package/deps/librdkafka/src/rdkafka_topic.h +14 -8
  132. package/deps/librdkafka/src/rdkafka_transport.c +59 -47
  133. package/deps/librdkafka/src/rdkafka_transport.h +5 -0
  134. package/deps/librdkafka/src/rdkafka_txnmgr.c +6 -1
  135. package/deps/librdkafka/src/rdmap.c +6 -1
  136. package/deps/librdkafka/src/rdrand.c +11 -1
  137. package/deps/librdkafka/src/rdtime.h +48 -17
  138. package/deps/librdkafka/src/rdunittest.c +42 -25
  139. package/deps/librdkafka/src/rdunittest.h +2 -0
  140. package/deps/librdkafka/src/rdwin32.h +1 -1
  141. package/deps/librdkafka/src/regexp.c +47 -42
  142. package/deps/librdkafka/src/tinycthread_extra.c +45 -21
  143. package/deps/librdkafka/src/tinycthread_extra.h +7 -3
  144. package/deps/librdkafka/src-cpp/rdkafkacpp.h +28 -2
  145. package/deps/librdkafka/tests/0001-multiobj.c +4 -0
  146. package/deps/librdkafka/tests/0004-conf.c +103 -36
  147. package/deps/librdkafka/tests/0009-mock_cluster.c +1 -0
  148. package/deps/librdkafka/tests/0011-produce_batch.c +2 -1
  149. package/deps/librdkafka/tests/0016-client_swname.c +18 -3
  150. package/deps/librdkafka/tests/0017-compression.c +6 -8
  151. package/deps/librdkafka/tests/0018-cgrp_term.c +8 -3
  152. package/deps/librdkafka/tests/0021-rkt_destroy.c +1 -0
  153. package/deps/librdkafka/tests/0022-consume_batch.c +4 -1
  154. package/deps/librdkafka/tests/0026-consume_pause.c +12 -14
  155. package/deps/librdkafka/tests/0028-long_topicnames.c +1 -1
  156. package/deps/librdkafka/tests/0029-assign_offset.c +6 -8
  157. package/deps/librdkafka/tests/0030-offset_commit.c +2 -2
  158. package/deps/librdkafka/tests/0033-regex_subscribe.c +33 -17
  159. package/deps/librdkafka/tests/0034-offset_reset.c +25 -4
  160. package/deps/librdkafka/tests/0036-partial_fetch.c +1 -0
  161. package/deps/librdkafka/tests/0038-performance.c +1 -0
  162. package/deps/librdkafka/tests/0040-io_event.c +11 -5
  163. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +1 -0
  164. package/deps/librdkafka/tests/0044-partition_cnt.c +3 -2
  165. package/deps/librdkafka/tests/0045-subscribe_update.c +284 -20
  166. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +1 -0
  167. package/deps/librdkafka/tests/0048-partitioner.c +1 -1
  168. package/deps/librdkafka/tests/0050-subscribe_adds.c +1 -0
  169. package/deps/librdkafka/tests/0051-assign_adds.c +1 -0
  170. package/deps/librdkafka/tests/0052-msg_timestamps.c +22 -4
  171. package/deps/librdkafka/tests/0053-stats_cb.cpp +12 -20
  172. package/deps/librdkafka/tests/0055-producer_latency.c +176 -3
  173. package/deps/librdkafka/tests/0056-balanced_group_mt.c +6 -2
  174. package/deps/librdkafka/tests/0058-log.cpp +3 -3
  175. package/deps/librdkafka/tests/0059-bsearch.cpp +8 -4
  176. package/deps/librdkafka/tests/0061-consumer_lag.cpp +25 -5
  177. package/deps/librdkafka/tests/0067-empty_topic.cpp +3 -0
  178. package/deps/librdkafka/tests/0068-produce_timeout.c +21 -23
  179. package/deps/librdkafka/tests/0069-consumer_add_parts.c +3 -7
  180. package/deps/librdkafka/tests/0075-retry.c +38 -1
  181. package/deps/librdkafka/tests/0076-produce_retry.c +2 -0
  182. package/deps/librdkafka/tests/0077-compaction.c +8 -2
  183. package/deps/librdkafka/tests/0080-admin_ut.c +34 -4
  184. package/deps/librdkafka/tests/0081-admin.c +455 -155
  185. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +4 -0
  186. package/deps/librdkafka/tests/0083-cb_event.c +8 -3
  187. package/deps/librdkafka/tests/0084-destroy_flags.c +14 -18
  188. package/deps/librdkafka/tests/0085-headers.cpp +4 -0
  189. package/deps/librdkafka/tests/0086-purge.c +40 -7
  190. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +1 -1
  191. package/deps/librdkafka/tests/0089-max_poll_interval.c +12 -7
  192. package/deps/librdkafka/tests/0090-idempotence.c +1 -2
  193. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +5 -7
  194. package/deps/librdkafka/tests/0092-mixed_msgver.c +6 -0
  195. package/deps/librdkafka/tests/0093-holb.c +8 -5
  196. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +1 -0
  197. package/deps/librdkafka/tests/0097-ssl_verify.cpp +262 -70
  198. package/deps/librdkafka/tests/0098-consumer-txn.cpp +16 -16
  199. package/deps/librdkafka/tests/0099-commit_metadata.c +1 -1
  200. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +1 -1
  201. package/deps/librdkafka/tests/0102-static_group_rebalance.c +317 -16
  202. package/deps/librdkafka/tests/0103-transactions.c +7 -7
  203. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +1 -0
  204. package/deps/librdkafka/tests/0105-transactions_mock.c +18 -11
  205. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +35 -14
  206. package/deps/librdkafka/tests/0107-topic_recreate.c +2 -2
  207. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +86 -26
  208. package/deps/librdkafka/tests/0110-batch_size.cpp +1 -2
  209. package/deps/librdkafka/tests/0112-assign_unknown_part.c +3 -14
  210. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +248 -104
  211. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +3 -3
  212. package/deps/librdkafka/tests/0115-producer_auth.cpp +4 -1
  213. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +7 -5
  214. package/deps/librdkafka/tests/0117-mock_errors.c +15 -5
  215. package/deps/librdkafka/tests/0118-commit_rebalance.c +41 -8
  216. package/deps/librdkafka/tests/0119-consumer_auth.cpp +20 -1
  217. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +8 -3
  218. package/deps/librdkafka/tests/0125-immediate_flush.c +1 -1
  219. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +323 -8
  220. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +1 -0
  221. package/deps/librdkafka/tests/0132-strategy_ordering.c +12 -4
  222. package/deps/librdkafka/tests/0133-ssl_keys.c +28 -6
  223. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +24 -14
  224. package/deps/librdkafka/tests/0139-offset_validation_mock.c +510 -2
  225. package/deps/librdkafka/tests/0140-commit_metadata.cpp +1 -1
  226. package/deps/librdkafka/tests/0142-reauthentication.c +37 -17
  227. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +39 -40
  228. package/deps/librdkafka/tests/0146-metadata_mock.c +76 -15
  229. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  230. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  231. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  232. package/deps/librdkafka/tests/0150-telemetry_mock.c +9 -6
  233. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  234. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  235. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  236. package/deps/librdkafka/tests/CMakeLists.txt +6 -0
  237. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +34 -9
  238. package/deps/librdkafka/tests/autotest.sh +0 -0
  239. package/deps/librdkafka/tests/broker_version_tests.py +0 -0
  240. package/deps/librdkafka/tests/buildbox.sh +0 -0
  241. package/deps/librdkafka/tests/cleanup-checker-tests.sh +0 -0
  242. package/deps/librdkafka/tests/cluster_testing.py +0 -0
  243. package/deps/librdkafka/tests/delete-test-topics.sh +0 -0
  244. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  245. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  246. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  247. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  248. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +42 -101
  249. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  250. package/deps/librdkafka/tests/fixtures/ssl/client2.key +41 -29
  251. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +112 -37
  252. package/deps/librdkafka/tests/gen-ssl-certs.sh +0 -0
  253. package/deps/librdkafka/tests/interactive_broker_version.py +0 -0
  254. package/deps/librdkafka/tests/java/Makefile +2 -1
  255. package/deps/librdkafka/tests/java/run-class.sh +0 -0
  256. package/deps/librdkafka/tests/lz4_manual_test.sh +0 -0
  257. package/deps/librdkafka/tests/multi-broker-version-test.sh +0 -0
  258. package/deps/librdkafka/tests/parse-refcnt.sh +0 -0
  259. package/deps/librdkafka/tests/performance_plot.py +0 -0
  260. package/deps/librdkafka/tests/requirements.txt +1 -1
  261. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  262. package/deps/librdkafka/tests/run-consumer-tests.sh +0 -0
  263. package/deps/librdkafka/tests/run-producer-tests.sh +0 -0
  264. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  265. package/deps/librdkafka/tests/run-test.sh +0 -0
  266. package/deps/librdkafka/tests/sasl_test.py +0 -0
  267. package/deps/librdkafka/tests/test.c +478 -18
  268. package/deps/librdkafka/tests/test.h +62 -13
  269. package/deps/librdkafka/tests/testcpp.cpp +6 -1
  270. package/deps/librdkafka/tests/testcpp.h +30 -2
  271. package/deps/librdkafka/tests/testshared.h +16 -2
  272. package/deps/librdkafka/tests/tools/stats/graph.py +0 -0
  273. package/deps/librdkafka/tests/tools/stats/to_csv.py +1 -1
  274. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  275. package/deps/librdkafka/tests/until-fail.sh +0 -0
  276. package/deps/librdkafka/tests/xxxx-metadata.cpp +1 -1
  277. package/deps/librdkafka/vcpkg.json +1 -1
  278. package/deps/librdkafka/win32/setup-msys2.ps1 +24 -8
  279. package/deps/librdkafka/win32/setup-vcpkg.ps1 +28 -6
  280. package/deps/librdkafka/win32/tests/tests.vcxproj +6 -0
  281. package/deps/librdkafka/win32/wingetopt.h +5 -4
  282. package/errors.d.ts +27 -1
  283. package/lib/error.js +29 -3
  284. package/make_docs.sh +0 -0
  285. package/package.json +11 -11
  286. package/run_docker.sh +0 -0
  287. package/src/callbacks.cc +6 -9
  288. package/src/callbacks.h +1 -5
  289. package/test/kafka-consumer-worker.js +10 -7
  290. package/test/kafka-consumer.spec.js +32 -21
  291. package/ci/update-version.js +0 -123
  292. package/deps/librdkafka/.semaphore/project.yml +0 -43
  293. package/deps/librdkafka/.semaphore/project_public.yml +0 -20
  294. package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
@@ -278,10 +278,17 @@ static ssize_t rd_kafka_transport_socket_recvmsg(rd_kafka_transport_t *rktrans,
278
278
  if (unlikely(r <= 0)) {
279
279
  if (r == -1 && rd_socket_errno == EAGAIN)
280
280
  return 0;
281
- else if (r == 0 || (r == -1 && rd_socket_errno == ECONNRESET)) {
281
+ else if (r == 0) {
282
282
  /* Receive 0 after POLLIN event means
283
283
  * connection closed. */
284
- rd_snprintf(errstr, errstr_size, "Disconnected");
284
+ rd_snprintf(errstr, errstr_size,
285
+ "Disconnected: connection closed by "
286
+ "peer: receive 0 after POLLIN");
287
+ return -1;
288
+ } else if (r == -1 && rd_socket_errno == ECONNRESET) {
289
+ rd_snprintf(errstr, errstr_size,
290
+ "Disconnected: connection "
291
+ "reset by peer");
285
292
  return -1;
286
293
  } else if (r == -1) {
287
294
  rd_snprintf(errstr, errstr_size, "%s",
@@ -335,7 +342,9 @@ static ssize_t rd_kafka_transport_socket_recv0(rd_kafka_transport_t *rktrans,
335
342
  } else if (unlikely(r == 0)) {
336
343
  /* Receive 0 after POLLIN event means
337
344
  * connection closed. */
338
- rd_snprintf(errstr, errstr_size, "Disconnected");
345
+ rd_snprintf(errstr, errstr_size,
346
+ "Disconnected: connection closed by "
347
+ "peer: receive 0 after POLLIN");
339
348
  return -1;
340
349
  }
341
350
 
@@ -543,33 +552,6 @@ void rd_kafka_transport_post_connect_setup(rd_kafka_transport_t *rktrans) {
543
552
  rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
544
553
  unsigned int slen;
545
554
 
546
- /* Set socket send & receive buffer sizes if configuerd */
547
- if (rkb->rkb_rk->rk_conf.socket_sndbuf_size != 0) {
548
- if (setsockopt(
549
- rktrans->rktrans_s, SOL_SOCKET, SO_SNDBUF,
550
- (void *)&rkb->rkb_rk->rk_conf.socket_sndbuf_size,
551
- sizeof(rkb->rkb_rk->rk_conf.socket_sndbuf_size)) ==
552
- RD_SOCKET_ERROR)
553
- rd_rkb_log(rkb, LOG_WARNING, "SNDBUF",
554
- "Failed to set socket send "
555
- "buffer size to %i: %s",
556
- rkb->rkb_rk->rk_conf.socket_sndbuf_size,
557
- rd_socket_strerror(rd_socket_errno));
558
- }
559
-
560
- if (rkb->rkb_rk->rk_conf.socket_rcvbuf_size != 0) {
561
- if (setsockopt(
562
- rktrans->rktrans_s, SOL_SOCKET, SO_RCVBUF,
563
- (void *)&rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
564
- sizeof(rkb->rkb_rk->rk_conf.socket_rcvbuf_size)) ==
565
- RD_SOCKET_ERROR)
566
- rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
567
- "Failed to set socket receive "
568
- "buffer size to %i: %s",
569
- rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
570
- rd_socket_strerror(rd_socket_errno));
571
- }
572
-
573
555
  /* Get send and receive buffer sizes to allow limiting
574
556
  * the total number of bytes passed with iovecs to sendmsg()
575
557
  * and recvmsg(). */
@@ -598,19 +580,6 @@ void rd_kafka_transport_post_connect_setup(rd_kafka_transport_t *rktrans) {
598
580
  } else if (rktrans->rktrans_sndbuf_size < 1024 * 64)
599
581
  rktrans->rktrans_sndbuf_size =
600
582
  1024 * 64; /* Use at least 64KB */
601
-
602
-
603
- #ifdef TCP_NODELAY
604
- if (rkb->rkb_rk->rk_conf.socket_nagle_disable) {
605
- int one = 1;
606
- if (setsockopt(rktrans->rktrans_s, IPPROTO_TCP, TCP_NODELAY,
607
- (void *)&one, sizeof(one)) == RD_SOCKET_ERROR)
608
- rd_rkb_log(rkb, LOG_WARNING, "NAGLE",
609
- "Failed to disable Nagle (TCP_NODELAY) "
610
- "on socket: %s",
611
- rd_socket_strerror(rd_socket_errno));
612
- }
613
- #endif
614
583
  }
615
584
 
616
585
 
@@ -746,7 +715,9 @@ static void rd_kafka_transport_io_event(rd_kafka_transport_t *rktrans,
746
715
  if (r == 0 /* handshake still in progress */ &&
747
716
  (events & POLLHUP)) {
748
717
  rd_kafka_broker_conn_closed(
749
- rkb, RD_KAFKA_RESP_ERR__TRANSPORT, "Disconnected");
718
+ rkb, RD_KAFKA_RESP_ERR__TRANSPORT,
719
+ "Disconnected: during "
720
+ "SSL connection handshake");
750
721
  return;
751
722
  }
752
723
 
@@ -770,7 +741,8 @@ static void rd_kafka_transport_io_event(rd_kafka_transport_t *rktrans,
770
741
  if (events & POLLHUP) {
771
742
  rd_kafka_broker_fail(rkb, LOG_ERR,
772
743
  RD_KAFKA_RESP_ERR__AUTHENTICATION,
773
- "Disconnected");
744
+ "Disconnected: hung up from "
745
+ "peer in state AUTH_LEGACY");
774
746
 
775
747
  return;
776
748
  }
@@ -781,7 +753,6 @@ static void rd_kafka_transport_io_event(rd_kafka_transport_t *rktrans,
781
753
  case RD_KAFKA_BROKER_STATE_AUTH_HANDSHAKE:
782
754
  case RD_KAFKA_BROKER_STATE_AUTH_REQ:
783
755
  case RD_KAFKA_BROKER_STATE_UP:
784
- case RD_KAFKA_BROKER_STATE_UPDATE:
785
756
 
786
757
  if (events & POLLIN) {
787
758
  while (rkb->rkb_state >= RD_KAFKA_BROKER_STATE_UP &&
@@ -795,7 +766,9 @@ static void rd_kafka_transport_io_event(rd_kafka_transport_t *rktrans,
795
766
 
796
767
  if (events & POLLHUP) {
797
768
  rd_kafka_broker_conn_closed(
798
- rkb, RD_KAFKA_RESP_ERR__TRANSPORT, "Disconnected");
769
+ rkb, RD_KAFKA_RESP_ERR__TRANSPORT,
770
+ "Disconnected: connection closed by "
771
+ "peer: POLLHUP");
799
772
  return;
800
773
  }
801
774
 
@@ -1081,6 +1054,45 @@ rd_kafka_transport_t *rd_kafka_transport_new(rd_kafka_broker_t *rkb,
1081
1054
  }
1082
1055
  #endif
1083
1056
 
1057
+ #ifdef TCP_NODELAY
1058
+ if (rkb->rkb_rk->rk_conf.socket_nagle_disable) {
1059
+ int one = 1;
1060
+ if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (void *)&one,
1061
+ sizeof(one)) == RD_SOCKET_ERROR)
1062
+ rd_rkb_log(rkb, LOG_WARNING, "NAGLE",
1063
+ "Failed to disable Nagle (TCP_NODELAY) "
1064
+ "on socket: %s",
1065
+ rd_socket_strerror(rd_socket_errno));
1066
+ }
1067
+ #endif
1068
+
1069
+ /* Set socket send & receive buffer sizes if configuerd */
1070
+ if (rkb->rkb_rk->rk_conf.socket_sndbuf_size != 0) {
1071
+ if (setsockopt(
1072
+ s, SOL_SOCKET, SO_SNDBUF,
1073
+ (void *)&rkb->rkb_rk->rk_conf.socket_sndbuf_size,
1074
+ sizeof(rkb->rkb_rk->rk_conf.socket_sndbuf_size)) ==
1075
+ RD_SOCKET_ERROR)
1076
+ rd_rkb_log(rkb, LOG_WARNING, "SNDBUF",
1077
+ "Failed to set socket send "
1078
+ "buffer size to %i: %s",
1079
+ rkb->rkb_rk->rk_conf.socket_sndbuf_size,
1080
+ rd_socket_strerror(rd_socket_errno));
1081
+ }
1082
+
1083
+ if (rkb->rkb_rk->rk_conf.socket_rcvbuf_size != 0) {
1084
+ if (setsockopt(
1085
+ s, SOL_SOCKET, SO_RCVBUF,
1086
+ (void *)&rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
1087
+ sizeof(rkb->rkb_rk->rk_conf.socket_rcvbuf_size)) ==
1088
+ RD_SOCKET_ERROR)
1089
+ rd_rkb_log(rkb, LOG_WARNING, "RCVBUF",
1090
+ "Failed to set socket receive "
1091
+ "buffer size to %i: %s",
1092
+ rkb->rkb_rk->rk_conf.socket_rcvbuf_size,
1093
+ rd_socket_strerror(rd_socket_errno));
1094
+ }
1095
+
1084
1096
  /* Set the socket to non-blocking */
1085
1097
  if ((r = rd_fd_set_nonblocking(s))) {
1086
1098
  rd_snprintf(errstr, errstr_size,
@@ -88,6 +88,11 @@ void rd_kafka_transport_set_blocked(rd_kafka_transport_t *rktrans,
88
88
  } while (0)
89
89
  #endif
90
90
 
91
+ static RD_INLINE RD_UNUSED rd_bool_t
92
+ rd_kafka_transport_error_disconnected(const char *errstr) {
93
+ return strncmp(errstr, "Disconnected", 12) == 0;
94
+ }
95
+
91
96
 
92
97
  void rd_kafka_transport_init(void);
93
98
 
@@ -2029,7 +2029,7 @@ rd_kafka_error_t *rd_kafka_send_offsets_to_transaction(
2029
2029
  rd_kafka_topic_partition_list_sort_by_topic(valid_offsets);
2030
2030
 
2031
2031
  rko = rd_kafka_op_new_cb(rk, RD_KAFKA_OP_TXN,
2032
- rd_kafka_txn_op_send_offsets_to_transaction);
2032
+ rd_kafka_txn_op_send_offsets_to_transaction);
2033
2033
  rko->rko_u.txn.offsets = valid_offsets;
2034
2034
  rko->rko_u.txn.cgmetadata =
2035
2035
  rd_kafka_consumer_group_metadata_dup(cgmetadata);
@@ -2958,6 +2958,11 @@ static void rd_kafka_txn_handle_FindCoordinator(rd_kafka_t *rk,
2958
2958
  NodeId);
2959
2959
  err = RD_KAFKA_RESP_ERR__UNKNOWN_BROKER;
2960
2960
  }
2961
+ if (rkb && rkb->rkb_source != RD_KAFKA_LEARNED) {
2962
+ rd_kafka_broker_destroy(rkb);
2963
+ rkb = NULL;
2964
+ err = RD_KAFKA_RESP_ERR__UNKNOWN_BROKER;
2965
+ }
2961
2966
  rd_kafka_rdunlock(rk);
2962
2967
 
2963
2968
  if (err)
@@ -404,12 +404,17 @@ static int unittest_typed_map2(void) {
404
404
  static int unittest_untyped_map(void) {
405
405
  rd_map_t rmap;
406
406
  int pass, i, r;
407
- int cnt = 100000;
407
+ int cnt = rd_unittest_with_valgrind ? 1000 : 100000;
408
408
  int exp_cnt = 0, get_cnt = 0, iter_cnt = 0;
409
409
  const rd_map_elem_t *elem;
410
410
  rd_ts_t ts = rd_clock();
411
411
  rd_ts_t ts_get = 0;
412
412
 
413
+ if (rd_unittest_with_valgrind)
414
+ RD_UT_WARN(
415
+ "Reducing count in "
416
+ "untyped map test when using Valgrind");
417
+
413
418
  rd_map_init(&rmap, cnt, rd_map_str_cmp, rd_map_str_hash, rd_free,
414
419
  rd_free);
415
420
 
@@ -30,6 +30,7 @@
30
30
  #include "rdrand.h"
31
31
  #include "rdtime.h"
32
32
  #include "tinycthread.h"
33
+ #include "rdmurmur2.h"
33
34
 
34
35
  int rd_jitter(int low, int high) {
35
36
  int rand_num;
@@ -40,8 +41,17 @@ int rd_jitter(int low, int high) {
40
41
  if (unlikely(seed == 0)) {
41
42
  struct timeval tv;
42
43
  rd_gettimeofday(&tv, NULL);
43
- seed = (unsigned int)(tv.tv_usec / 1000);
44
+ seed = (unsigned int)(tv.tv_usec);
44
45
  seed ^= (unsigned int)(intptr_t)thrd_current();
46
+
47
+ /* When many threads are created at the same time and the
48
+ * thread id is different only by a few bits it's possible that
49
+ * `rand_r`, that is initially multiplying by `1103515245`,
50
+ * truncates the variable bits and uses the same seed for
51
+ * different threads. By applying `murmur2` we ensure that seed
52
+ * variability is distributed across various bits at different
53
+ * positions. */
54
+ seed = (unsigned int)rd_murmur2(&seed, sizeof(seed));
45
55
  }
46
56
 
47
57
  rand_num = rand_r(&seed);
@@ -2,6 +2,7 @@
2
2
  * librd - Rapid Development C library
3
3
  *
4
4
  * Copyright (c) 2012-2022, Magnus Edenhill
5
+ * 2025, Confluent Inc.
5
6
  * All rights reserved.
6
7
  *
7
8
  * Redistribution and use in source and binary forms, with or without
@@ -168,12 +169,11 @@ static RD_INLINE int rd_timeout_ms(rd_ts_t timeout_us) {
168
169
  * @brief Initialize an absolute timeout based on the provided \p timeout_ms
169
170
  * and given clock \p now
170
171
  *
171
- * To be used with rd_timeout_adjust().
172
+ * To be used with rd_timeout_remains() or rd_timeout_remains_us().
172
173
  *
173
174
  * Honours RD_POLL_INFINITE, RD_POLL_NOWAIT.
174
175
  *
175
- * @returns the absolute timeout which should later be passed
176
- * to rd_timeout_adjust().
176
+ * @returns the absolute timeout.
177
177
  */
178
178
  static RD_INLINE rd_ts_t rd_timeout_init0(rd_ts_t now, int timeout_ms) {
179
179
  if (timeout_ms == RD_POLL_INFINITE || timeout_ms == RD_POLL_NOWAIT)
@@ -182,6 +182,23 @@ static RD_INLINE rd_ts_t rd_timeout_init0(rd_ts_t now, int timeout_ms) {
182
182
  return now + ((rd_ts_t)timeout_ms * 1000);
183
183
  }
184
184
 
185
+ /**
186
+ * @brief Initialize an absolute timeout based on the provided \p timeout_us
187
+ * and given clock \p now
188
+ *
189
+ * To be used with rd_timeout_remains() or rd_timeout_remains_us().
190
+ *
191
+ * Honours RD_POLL_INFINITE, RD_POLL_NOWAIT.
192
+ *
193
+ * @returns the absolute timeout.
194
+ */
195
+ static RD_INLINE rd_ts_t rd_timeout_init_us0(rd_ts_t now, rd_ts_t timeout_us) {
196
+ if (timeout_us == RD_POLL_INFINITE || timeout_us == RD_POLL_NOWAIT)
197
+ return timeout_us;
198
+
199
+ return now + timeout_us;
200
+ }
201
+
185
202
 
186
203
  /**
187
204
  * @brief Initialize an absolute timeout based on the provided \p timeout_ms
@@ -198,6 +215,32 @@ static RD_INLINE rd_ts_t rd_timeout_init(int timeout_ms) {
198
215
  return rd_timeout_init0(rd_clock(), timeout_ms);
199
216
  }
200
217
 
218
+ /**
219
+ * @brief Initialize an absolute timeout based on the provided \p timeout_us
220
+ * and current clock.
221
+ *
222
+ * To be used with rd_timeout_remains() or rd_timeout_remains_us().
223
+ *
224
+ * Honours RD_POLL_INFINITE, RD_POLL_NOWAIT.
225
+ *
226
+ * @returns the absolute timeout.
227
+ */
228
+ static RD_INLINE rd_ts_t rd_timeout_init_us(rd_ts_t timeout_us) {
229
+ return rd_timeout_init_us0(rd_clock(), timeout_us);
230
+ }
231
+
232
+ /**
233
+ * @brief Gets time since epoch (UTC).
234
+ */
235
+ static RD_INLINE void rd_timespec_get(struct timespec *tspec) {
236
+ #if defined(__APPLE__) || (defined(__ANDROID__) && __ANDROID_API__ < 29)
237
+ struct timeval tv;
238
+ gettimeofday(&tv, NULL);
239
+ TIMEVAL_TO_TIMESPEC(&tv, tspec);
240
+ #else
241
+ timespec_get(tspec, TIME_UTC);
242
+ #endif
243
+ }
201
244
 
202
245
  /**
203
246
  * @brief Initialize an absolute timespec timeout based on the provided
@@ -213,13 +256,7 @@ static RD_INLINE void rd_timeout_init_timespec_us(struct timespec *tspec,
213
256
  tspec->tv_sec = timeout_us;
214
257
  tspec->tv_nsec = 0;
215
258
  } else {
216
- #if defined(__APPLE__) || (defined(__ANDROID__) && __ANDROID_API__ < 29)
217
- struct timeval tv;
218
- gettimeofday(&tv, NULL);
219
- TIMEVAL_TO_TIMESPEC(&tv, tspec);
220
- #else
221
- timespec_get(tspec, TIME_UTC);
222
- #endif
259
+ rd_timespec_get(tspec);
223
260
  tspec->tv_sec += timeout_us / 1000000;
224
261
  tspec->tv_nsec += (timeout_us % 1000000) * 1000;
225
262
  if (tspec->tv_nsec >= 1000000000) {
@@ -243,13 +280,7 @@ static RD_INLINE void rd_timeout_init_timespec(struct timespec *tspec,
243
280
  tspec->tv_sec = timeout_ms;
244
281
  tspec->tv_nsec = 0;
245
282
  } else {
246
- #if defined(__APPLE__) || (defined(__ANDROID__) && __ANDROID_API__ < 29)
247
- struct timeval tv;
248
- gettimeofday(&tv, NULL);
249
- TIMEVAL_TO_TIMESPEC(&tv, tspec);
250
- #else
251
- timespec_get(tspec, TIME_UTC);
252
- #endif
283
+ rd_timespec_get(tspec);
253
284
  tspec->tv_sec += timeout_ms / 1000;
254
285
  tspec->tv_nsec += (timeout_ms % 1000) * 1000000;
255
286
  if (tspec->tv_nsec >= 1000000000) {
@@ -55,6 +55,7 @@
55
55
  #include "rdkafka_txnmgr.h"
56
56
 
57
57
  rd_bool_t rd_unittest_assert_on_failure = rd_false;
58
+ rd_bool_t rd_unittest_with_valgrind = rd_false;
58
59
  rd_bool_t rd_unittest_on_ci = rd_false;
59
60
  rd_bool_t rd_unittest_slow = rd_false;
60
61
 
@@ -416,6 +417,7 @@ static int unittest_rdclock(void) {
416
417
 
417
418
  extern int unittest_string(void);
418
419
  extern int unittest_cgrp(void);
420
+ extern int unittest_mock_cluster(void);
419
421
  #if WITH_SASL_SCRAM
420
422
  extern int unittest_scram(void);
421
423
  #endif
@@ -426,7 +428,10 @@ extern int unittest_http(void);
426
428
  #endif
427
429
  #if WITH_OAUTHBEARER_OIDC
428
430
  extern int unittest_sasl_oauthbearer_oidc(void);
431
+ extern int unittest_sasl_oauthbearer_oidc_jwt_bearer(void);
432
+ extern int unittest_sasl_oauthbearer_oidc_assertion(void);
429
433
  #endif
434
+ extern int unittest_telemetry(void);
430
435
  extern int unittest_telemetry_decode(void);
431
436
 
432
437
  int rd_unittest(void) {
@@ -435,42 +440,48 @@ int rd_unittest(void) {
435
440
  const char *name;
436
441
  int (*call)(void);
437
442
  } unittests[] = {
438
- {"sysqueue", unittest_sysqueue},
439
- {"string", unittest_string},
440
- {"map", unittest_map},
441
- {"rdbuf", unittest_rdbuf},
442
- {"rdvarint", unittest_rdvarint},
443
- {"crc32c", unittest_rd_crc32c},
444
- {"msg", unittest_msg},
445
- {"murmurhash", unittest_murmur2},
446
- {"fnv1a", unittest_fnv1a},
443
+ {"sysqueue", unittest_sysqueue},
444
+ {"string", unittest_string},
445
+ {"map", unittest_map},
446
+ {"rdbuf", unittest_rdbuf},
447
+ {"rdvarint", unittest_rdvarint},
448
+ {"crc32c", unittest_rd_crc32c},
449
+ {"msg", unittest_msg},
450
+ {"murmurhash", unittest_murmur2},
451
+ {"fnv1a", unittest_fnv1a},
452
+ {"mock", unittest_mock_cluster},
447
453
  #if WITH_HDRHISTOGRAM
448
- {"rdhdrhistogram", unittest_rdhdrhistogram},
454
+ {"rdhdrhistogram", unittest_rdhdrhistogram},
449
455
  #endif
450
456
  #ifdef _WIN32
451
- {"rdclock", unittest_rdclock},
457
+ {"rdclock", unittest_rdclock},
452
458
  #endif
453
- {"conf", unittest_conf},
454
- {"broker", unittest_broker},
455
- {"request", unittest_request},
459
+ {"conf", unittest_conf},
460
+ {"broker", unittest_broker},
461
+ {"request", unittest_request},
456
462
  #if WITH_SASL_OAUTHBEARER
457
- {"sasl_oauthbearer", unittest_sasl_oauthbearer},
463
+ {"sasl_oauthbearer", unittest_sasl_oauthbearer},
458
464
  #endif
459
- {"aborted_txns", unittest_aborted_txns},
460
- {"cgrp", unittest_cgrp},
465
+ {"aborted_txns", unittest_aborted_txns},
466
+ {"cgrp", unittest_cgrp},
461
467
  #if WITH_SASL_SCRAM
462
- {"scram", unittest_scram},
468
+ {"scram", unittest_scram},
463
469
  #endif
464
- {"assignors", unittest_assignors},
470
+ {"assignors", unittest_assignors},
465
471
  #if WITH_CURL
466
- {"http", unittest_http},
472
+ {"http", unittest_http},
467
473
  #endif
468
474
  #if WITH_OAUTHBEARER_OIDC
469
- {"sasl_oauthbearer_oidc", unittest_sasl_oauthbearer_oidc},
475
+ {"sasl_oauthbearer_oidc", unittest_sasl_oauthbearer_oidc},
476
+ {"sasl_oauthbearer_oidc_jwt_bearer",
477
+ unittest_sasl_oauthbearer_oidc_jwt_bearer},
478
+ {"sasl_oauthbearer_oidc_assertion",
479
+ unittest_sasl_oauthbearer_oidc_assertion},
470
480
  #endif
471
- {"telemetry", unittest_telemetry_decode},
472
- {NULL}
473
- };
481
+ {"telemetry", unittest_telemetry},
482
+ {"telemetry_decode", unittest_telemetry_decode},
483
+ {"feature", unittest_feature},
484
+ {NULL}};
474
485
  int i;
475
486
  const char *match = rd_getenv("RD_UT_TEST", NULL);
476
487
  int cnt = 0;
@@ -482,7 +493,13 @@ int rd_unittest(void) {
482
493
  rd_unittest_on_ci = rd_true;
483
494
  }
484
495
 
485
- if (rd_unittest_on_ci || (ENABLE_DEVEL + 0)) {
496
+ if (rd_strcmp(rd_getenv("TEST_MODE", NULL), "valgrind") == 0) {
497
+ RD_UT_SAY("Unittests running with valgrind");
498
+ rd_unittest_with_valgrind = rd_true;
499
+ }
500
+
501
+ if (rd_unittest_on_ci || rd_unittest_with_valgrind ||
502
+ (ENABLE_DEVEL + 0)) {
486
503
  RD_UT_SAY("Unittests will not error out on slow CPUs");
487
504
  rd_unittest_slow = rd_true;
488
505
  }
@@ -2,6 +2,7 @@
2
2
  * librdkafka - Apache Kafka C library
3
3
  *
4
4
  * Copyright (c) 2017-2022, Magnus Edenhill
5
+ * 2025, Confluent Inc.
5
6
  * All rights reserved.
6
7
  *
7
8
  * Redistribution and use in source and binary forms, with or without
@@ -34,6 +35,7 @@
34
35
 
35
36
  extern rd_bool_t rd_unittest_assert_on_failure;
36
37
  extern rd_bool_t rd_unittest_on_ci;
38
+ extern rd_bool_t rd_unittest_with_valgrind;
37
39
  extern rd_bool_t rd_unittest_slow;
38
40
 
39
41
  #define ENABLE_CODECOV ENABLE_DEVEL
@@ -42,7 +42,7 @@
42
42
  #include <winsock2.h> /* for sockets + struct timeval */
43
43
  #include <io.h>
44
44
  #include <fcntl.h>
45
-
45
+ #include <windows.h>
46
46
 
47
47
  /**
48
48
  * Types
@@ -95,16 +95,17 @@ static Rune canon(Rune c) {
95
95
 
96
96
  /* Scan */
97
97
 
98
- enum { L_CHAR = 256,
99
- L_CCLASS, /* character class */
100
- L_NCCLASS, /* negative character class */
101
- L_NC, /* "(?:" no capture */
102
- L_PLA, /* "(?=" positive lookahead */
103
- L_NLA, /* "(?!" negative lookahead */
104
- L_WORD, /* "\b" word boundary */
105
- L_NWORD, /* "\B" non-word boundary */
106
- L_REF, /* "\1" back-reference */
107
- L_COUNT /* {M,N} */
98
+ enum {
99
+ L_CHAR = 256,
100
+ L_CCLASS, /* character class */
101
+ L_NCCLASS, /* negative character class */
102
+ L_NC, /* "(?:" no capture */
103
+ L_PLA, /* "(?=" positive lookahead */
104
+ L_NLA, /* "(?!" negative lookahead */
105
+ L_WORD, /* "\b" word boundary */
106
+ L_NWORD, /* "\B" non-word boundary */
107
+ L_REF, /* "\1" back-reference */
108
+ L_COUNT /* {M,N} */
108
109
  };
109
110
 
110
111
  static int hex(Restate *g, int c) {
@@ -451,21 +452,23 @@ static int lex(Restate *g) {
451
452
 
452
453
  /* Parse */
453
454
 
454
- enum { P_CAT,
455
- P_ALT,
456
- P_REP,
457
- P_BOL,
458
- P_EOL,
459
- P_WORD,
460
- P_NWORD,
461
- P_PAR,
462
- P_PLA,
463
- P_NLA,
464
- P_ANY,
465
- P_CHAR,
466
- P_CCLASS,
467
- P_NCCLASS,
468
- P_REF };
455
+ enum {
456
+ P_CAT,
457
+ P_ALT,
458
+ P_REP,
459
+ P_BOL,
460
+ P_EOL,
461
+ P_WORD,
462
+ P_NWORD,
463
+ P_PAR,
464
+ P_PLA,
465
+ P_NLA,
466
+ P_ANY,
467
+ P_CHAR,
468
+ P_CCLASS,
469
+ P_NCCLASS,
470
+ P_REF
471
+ };
469
472
 
470
473
  struct Renode {
471
474
  unsigned char type;
@@ -662,23 +665,25 @@ static Renode *parsealt(Restate *g) {
662
665
 
663
666
  /* Compile */
664
667
 
665
- enum { I_END,
666
- I_JUMP,
667
- I_SPLIT,
668
- I_PLA,
669
- I_NLA,
670
- I_ANYNL,
671
- I_ANY,
672
- I_CHAR,
673
- I_CCLASS,
674
- I_NCCLASS,
675
- I_REF,
676
- I_BOL,
677
- I_EOL,
678
- I_WORD,
679
- I_NWORD,
680
- I_LPAR,
681
- I_RPAR };
668
+ enum {
669
+ I_END,
670
+ I_JUMP,
671
+ I_SPLIT,
672
+ I_PLA,
673
+ I_NLA,
674
+ I_ANYNL,
675
+ I_ANY,
676
+ I_CHAR,
677
+ I_CCLASS,
678
+ I_NCCLASS,
679
+ I_REF,
680
+ I_BOL,
681
+ I_EOL,
682
+ I_WORD,
683
+ I_NWORD,
684
+ I_LPAR,
685
+ I_RPAR
686
+ };
682
687
 
683
688
  struct Reinst {
684
689
  unsigned char opcode;