@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.1
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.
- package/CHANGELOG.md +457 -0
- package/LICENSE.kafkajs +31 -0
- package/LICENSE.node-rdkafka +25 -0
- package/LICENSE.txt +20 -0
- package/README.md +133 -0
- package/binding.gyp +184 -0
- package/build/Release/confluent-kafka-javascript.node +0 -0
- package/build/deps/librdkafka++.so.1 +0 -0
- package/build/deps/librdkafka.Makefile +6 -0
- package/build/deps/librdkafka.so.1 +0 -0
- package/build/deps/librdkafka.target.mk +55 -0
- package/deps/librdkafka/.clang-format +136 -0
- package/deps/librdkafka/.clang-format-cpp +103 -0
- package/deps/librdkafka/.dir-locals.el +10 -0
- package/deps/librdkafka/.formatignore +35 -0
- package/deps/librdkafka/.gdbmacros +19 -0
- package/deps/librdkafka/CHANGELOG.md +2477 -0
- package/deps/librdkafka/CMakeLists.txt +291 -0
- package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
- package/deps/librdkafka/CONFIGURATION.md +212 -0
- package/deps/librdkafka/CONTRIBUTING.md +431 -0
- package/deps/librdkafka/Doxyfile +2375 -0
- package/deps/librdkafka/INTRODUCTION.md +2752 -0
- package/deps/librdkafka/LICENSE +26 -0
- package/deps/librdkafka/LICENSE.cjson +22 -0
- package/deps/librdkafka/LICENSE.crc32c +28 -0
- package/deps/librdkafka/LICENSE.fnv1a +18 -0
- package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
- package/deps/librdkafka/LICENSE.lz4 +26 -0
- package/deps/librdkafka/LICENSE.murmur2 +25 -0
- package/deps/librdkafka/LICENSE.nanopb +22 -0
- package/deps/librdkafka/LICENSE.opentelemetry +203 -0
- package/deps/librdkafka/LICENSE.pycrc +23 -0
- package/deps/librdkafka/LICENSE.queue +31 -0
- package/deps/librdkafka/LICENSE.regexp +5 -0
- package/deps/librdkafka/LICENSE.snappy +36 -0
- package/deps/librdkafka/LICENSE.tinycthread +26 -0
- package/deps/librdkafka/LICENSE.wingetopt +49 -0
- package/deps/librdkafka/LICENSES.txt +625 -0
- package/deps/librdkafka/Makefile +125 -0
- package/deps/librdkafka/README.md +201 -0
- package/deps/librdkafka/README.win32 +26 -0
- package/deps/librdkafka/STATISTICS.md +624 -0
- package/deps/librdkafka/configure +214 -0
- package/deps/librdkafka/configure.self +341 -0
- package/deps/librdkafka/dev-conf.sh +123 -0
- package/deps/librdkafka/lds-gen.py +73 -0
- package/deps/librdkafka/mainpage.doxy +40 -0
- package/deps/librdkafka/mklove/Makefile.base +329 -0
- package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
- package/deps/librdkafka/mklove/modules/configure.base +2484 -0
- package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
- package/deps/librdkafka/mklove/modules/configure.cc +186 -0
- package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
- package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
- package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
- package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
- package/deps/librdkafka/mklove/modules/configure.host +132 -0
- package/deps/librdkafka/mklove/modules/configure.lib +49 -0
- package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
- package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
- package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
- package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
- package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
- package/deps/librdkafka/mklove/modules/configure.pic +16 -0
- package/deps/librdkafka/mklove/modules/configure.socket +20 -0
- package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
- package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
- package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
- package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
- package/deps/librdkafka/service.yml +182 -0
- package/deps/librdkafka/src/CMakeLists.txt +379 -0
- package/deps/librdkafka/src/Makefile +105 -0
- package/deps/librdkafka/src/README.lz4.md +30 -0
- package/deps/librdkafka/src/cJSON.c +3191 -0
- package/deps/librdkafka/src/cJSON.h +306 -0
- package/deps/librdkafka/src/crc32c.c +430 -0
- package/deps/librdkafka/src/crc32c.h +38 -0
- package/deps/librdkafka/src/generate_proto.sh +66 -0
- package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
- package/deps/librdkafka/src/lz4.c +2727 -0
- package/deps/librdkafka/src/lz4.h +842 -0
- package/deps/librdkafka/src/lz4frame.c +2078 -0
- package/deps/librdkafka/src/lz4frame.h +692 -0
- package/deps/librdkafka/src/lz4frame_static.h +47 -0
- package/deps/librdkafka/src/lz4hc.c +1631 -0
- package/deps/librdkafka/src/lz4hc.h +413 -0
- package/deps/librdkafka/src/nanopb/pb.h +917 -0
- package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
- package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
- package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
- package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
- package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
- package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
- package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
- package/deps/librdkafka/src/queue.h +850 -0
- package/deps/librdkafka/src/rd.h +592 -0
- package/deps/librdkafka/src/rdaddr.c +255 -0
- package/deps/librdkafka/src/rdaddr.h +202 -0
- package/deps/librdkafka/src/rdatomic.h +262 -0
- package/deps/librdkafka/src/rdavg.h +260 -0
- package/deps/librdkafka/src/rdavl.c +210 -0
- package/deps/librdkafka/src/rdavl.h +250 -0
- package/deps/librdkafka/src/rdbase64.c +200 -0
- package/deps/librdkafka/src/rdbase64.h +43 -0
- package/deps/librdkafka/src/rdbuf.c +1884 -0
- package/deps/librdkafka/src/rdbuf.h +375 -0
- package/deps/librdkafka/src/rdcrc32.c +114 -0
- package/deps/librdkafka/src/rdcrc32.h +170 -0
- package/deps/librdkafka/src/rddl.c +179 -0
- package/deps/librdkafka/src/rddl.h +43 -0
- package/deps/librdkafka/src/rdendian.h +175 -0
- package/deps/librdkafka/src/rdfloat.h +67 -0
- package/deps/librdkafka/src/rdfnv1a.c +113 -0
- package/deps/librdkafka/src/rdfnv1a.h +35 -0
- package/deps/librdkafka/src/rdgz.c +120 -0
- package/deps/librdkafka/src/rdgz.h +46 -0
- package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
- package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
- package/deps/librdkafka/src/rdhttp.c +831 -0
- package/deps/librdkafka/src/rdhttp.h +101 -0
- package/deps/librdkafka/src/rdinterval.h +177 -0
- package/deps/librdkafka/src/rdkafka.c +7287 -0
- package/deps/librdkafka/src/rdkafka.h +11795 -0
- package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
- package/deps/librdkafka/src/rdkafka_admin.h +658 -0
- package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
- package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
- package/deps/librdkafka/src/rdkafka_assignor.c +1800 -0
- package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
- package/deps/librdkafka/src/rdkafka_aux.c +409 -0
- package/deps/librdkafka/src/rdkafka_aux.h +174 -0
- package/deps/librdkafka/src/rdkafka_background.c +222 -0
- package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
- package/deps/librdkafka/src/rdkafka_broker.h +851 -0
- package/deps/librdkafka/src/rdkafka_buf.c +543 -0
- package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
- package/deps/librdkafka/src/rdkafka_cert.c +576 -0
- package/deps/librdkafka/src/rdkafka_cert.h +62 -0
- package/deps/librdkafka/src/rdkafka_cgrp.c +8310 -0
- package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
- package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
- package/deps/librdkafka/src/rdkafka_conf.h +746 -0
- package/deps/librdkafka/src/rdkafka_confval.h +97 -0
- package/deps/librdkafka/src/rdkafka_coord.c +623 -0
- package/deps/librdkafka/src/rdkafka_coord.h +132 -0
- package/deps/librdkafka/src/rdkafka_error.c +228 -0
- package/deps/librdkafka/src/rdkafka_error.h +80 -0
- package/deps/librdkafka/src/rdkafka_event.c +502 -0
- package/deps/librdkafka/src/rdkafka_event.h +126 -0
- package/deps/librdkafka/src/rdkafka_feature.c +898 -0
- package/deps/librdkafka/src/rdkafka_feature.h +104 -0
- package/deps/librdkafka/src/rdkafka_fetcher.c +3820 -0
- package/deps/librdkafka/src/rdkafka_fetcher.h +62 -0
- package/deps/librdkafka/src/rdkafka_header.c +220 -0
- package/deps/librdkafka/src/rdkafka_header.h +76 -0
- package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
- package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
- package/deps/librdkafka/src/rdkafka_int.h +1505 -0
- package/deps/librdkafka/src/rdkafka_interceptor.c +842 -0
- package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
- package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
- package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
- package/deps/librdkafka/src/rdkafka_metadata.c +2347 -0
- package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
- package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
- package/deps/librdkafka/src/rdkafka_mock.h +867 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
- package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
- package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
- package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
- package/deps/librdkafka/src/rdkafka_msg.h +629 -0
- package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
- package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
- package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -0
- package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
- package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
- package/deps/librdkafka/src/rdkafka_offset.h +150 -0
- package/deps/librdkafka/src/rdkafka_op.c +1219 -0
- package/deps/librdkafka/src/rdkafka_op.h +1065 -0
- package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
- package/deps/librdkafka/src/rdkafka_partition.h +1215 -0
- package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
- package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
- package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
- package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
- package/deps/librdkafka/src/rdkafka_proto.h +739 -0
- package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
- package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
- package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
- package/deps/librdkafka/src/rdkafka_request.c +7298 -0
- package/deps/librdkafka/src/rdkafka_request.h +761 -0
- package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
- package/deps/librdkafka/src/rdkafka_sasl.c +589 -0
- package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
- package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
- package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1827 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
- package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
- package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
- package/deps/librdkafka/src/rdkafka_share_acknowledgement.c +1445 -0
- package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
- package/deps/librdkafka/src/rdkafka_ssl.c +2235 -0
- package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
- package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
- package/deps/librdkafka/src/rdkafka_subscription.c +411 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
- package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
- package/deps/librdkafka/src/rdkafka_timer.c +407 -0
- package/deps/librdkafka/src/rdkafka_timer.h +117 -0
- package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
- package/deps/librdkafka/src/rdkafka_topic.h +369 -0
- package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
- package/deps/librdkafka/src/rdkafka_transport.h +99 -0
- package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
- package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
- package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
- package/deps/librdkafka/src/rdlist.c +593 -0
- package/deps/librdkafka/src/rdlist.h +444 -0
- package/deps/librdkafka/src/rdlog.c +89 -0
- package/deps/librdkafka/src/rdlog.h +41 -0
- package/deps/librdkafka/src/rdmap.c +508 -0
- package/deps/librdkafka/src/rdmap.h +492 -0
- package/deps/librdkafka/src/rdmurmur2.c +167 -0
- package/deps/librdkafka/src/rdmurmur2.h +35 -0
- package/deps/librdkafka/src/rdports.c +61 -0
- package/deps/librdkafka/src/rdports.h +38 -0
- package/deps/librdkafka/src/rdposix.h +250 -0
- package/deps/librdkafka/src/rdrand.c +151 -0
- package/deps/librdkafka/src/rdrand.h +72 -0
- package/deps/librdkafka/src/rdregex.c +156 -0
- package/deps/librdkafka/src/rdregex.h +43 -0
- package/deps/librdkafka/src/rdsignal.h +57 -0
- package/deps/librdkafka/src/rdstring.c +645 -0
- package/deps/librdkafka/src/rdstring.h +98 -0
- package/deps/librdkafka/src/rdsysqueue.h +404 -0
- package/deps/librdkafka/src/rdtime.h +356 -0
- package/deps/librdkafka/src/rdtypes.h +86 -0
- package/deps/librdkafka/src/rdunittest.c +564 -0
- package/deps/librdkafka/src/rdunittest.h +232 -0
- package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
- package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
- package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -0
- package/deps/librdkafka/src/rdvarint.c +134 -0
- package/deps/librdkafka/src/rdvarint.h +165 -0
- package/deps/librdkafka/src/rdwin32.h +382 -0
- package/deps/librdkafka/src/rdxxhash.c +1030 -0
- package/deps/librdkafka/src/rdxxhash.h +328 -0
- package/deps/librdkafka/src/regexp.c +1352 -0
- package/deps/librdkafka/src/regexp.h +41 -0
- package/deps/librdkafka/src/snappy.c +1866 -0
- package/deps/librdkafka/src/snappy.h +62 -0
- package/deps/librdkafka/src/snappy_compat.h +138 -0
- package/deps/librdkafka/src/statistics_schema.json +444 -0
- package/deps/librdkafka/src/tinycthread.c +932 -0
- package/deps/librdkafka/src/tinycthread.h +503 -0
- package/deps/librdkafka/src/tinycthread_extra.c +210 -0
- package/deps/librdkafka/src/tinycthread_extra.h +218 -0
- package/deps/librdkafka/src/win32_config.h +58 -0
- package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
- package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
- package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
- package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
- package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
- package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
- package/deps/librdkafka/src-cpp/Makefile +55 -0
- package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
- package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
- package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
- package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
- package/deps/librdkafka/src-cpp/README.md +16 -0
- package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
- package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
- package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
- package/deps/librdkafka/tests/0000-unittests.c +72 -0
- package/deps/librdkafka/tests/0001-multiobj.c +102 -0
- package/deps/librdkafka/tests/0002-unkpart.c +244 -0
- package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
- package/deps/librdkafka/tests/0004-conf.c +934 -0
- package/deps/librdkafka/tests/0005-order.c +133 -0
- package/deps/librdkafka/tests/0006-symbols.c +163 -0
- package/deps/librdkafka/tests/0007-autotopic.c +136 -0
- package/deps/librdkafka/tests/0008-reqacks.c +179 -0
- package/deps/librdkafka/tests/0009-mock_cluster.c +272 -0
- package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
- package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
- package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
- package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
- package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
- package/deps/librdkafka/tests/0016-client_swname.c +181 -0
- package/deps/librdkafka/tests/0017-compression.c +140 -0
- package/deps/librdkafka/tests/0018-cgrp_term.c +444 -0
- package/deps/librdkafka/tests/0019-list_groups.c +289 -0
- package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
- package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
- package/deps/librdkafka/tests/0022-consume_batch.c +331 -0
- package/deps/librdkafka/tests/0025-timers.c +147 -0
- package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
- package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
- package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
- package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
- package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
- package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
- package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
- package/deps/librdkafka/tests/0035-api_version.c +73 -0
- package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
- package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
- package/deps/librdkafka/tests/0038-performance.c +121 -0
- package/deps/librdkafka/tests/0039-event.c +284 -0
- package/deps/librdkafka/tests/0040-io_event.c +257 -0
- package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
- package/deps/librdkafka/tests/0042-many_topics.c +252 -0
- package/deps/librdkafka/tests/0043-no_connection.c +77 -0
- package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
- package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
- package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
- package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
- package/deps/librdkafka/tests/0048-partitioner.c +283 -0
- package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
- package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
- package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
- package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
- package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
- package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
- package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
- package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
- package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
- package/deps/librdkafka/tests/0058-log.cpp +123 -0
- package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
- package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
- package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
- package/deps/librdkafka/tests/0062-stats_event.c +126 -0
- package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
- package/deps/librdkafka/tests/0064-interceptors.c +529 -0
- package/deps/librdkafka/tests/0065-yield.cpp +140 -0
- package/deps/librdkafka/tests/0066-plugins.cpp +143 -0
- package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
- package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
- package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
- package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
- package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
- package/deps/librdkafka/tests/0073-headers.c +381 -0
- package/deps/librdkafka/tests/0074-producev.c +87 -0
- package/deps/librdkafka/tests/0075-retry.c +290 -0
- package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
- package/deps/librdkafka/tests/0077-compaction.c +366 -0
- package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
- package/deps/librdkafka/tests/0079-fork.c +93 -0
- package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
- package/deps/librdkafka/tests/0081-admin.c +5633 -0
- package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
- package/deps/librdkafka/tests/0083-cb_event.c +233 -0
- package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
- package/deps/librdkafka/tests/0085-headers.cpp +392 -0
- package/deps/librdkafka/tests/0086-purge.c +368 -0
- package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
- package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
- package/deps/librdkafka/tests/0090-idempotence.c +171 -0
- package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
- package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
- package/deps/librdkafka/tests/0093-holb.c +200 -0
- package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
- package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
- package/deps/librdkafka/tests/0097-ssl_verify.cpp +674 -0
- package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
- package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
- package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
- package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
- package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
- package/deps/librdkafka/tests/0103-transactions.c +1383 -0
- package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
- package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
- package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
- package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
- package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
- package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
- package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
- package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
- package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
- package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
- package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
- package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
- package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
- package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
- package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
- package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
- package/deps/librdkafka/tests/0121-clusterid.c +115 -0
- package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
- package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
- package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
- package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
- package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +1164 -0
- package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
- package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -0
- package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
- package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
- package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
- package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
- package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
- package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
- package/deps/librdkafka/tests/0135-sasl_credentials.cpp +279 -0
- package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
- package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -0
- package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
- package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
- package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
- package/deps/librdkafka/tests/0142-reauthentication.c +931 -0
- package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
- package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
- package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
- package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
- package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +1210 -0
- package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -0
- package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
- package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
- package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
- package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
- package/deps/librdkafka/tests/0153-memberid.c +128 -0
- package/deps/librdkafka/tests/0155-share_group_heartbeat_mock.c +2695 -0
- package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
- package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
- package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
- package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
- package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
- package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
- package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
- package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
- package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
- package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
- package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
- package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
- package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
- package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
- package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
- package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
- package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
- package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
- package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
- package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
- package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -0
- package/deps/librdkafka/tests/1000-unktopic.c +164 -0
- package/deps/librdkafka/tests/8000-idle.cpp +60 -0
- package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
- package/deps/librdkafka/tests/CMakeLists.txt +193 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
- package/deps/librdkafka/tests/Makefile +182 -0
- package/deps/librdkafka/tests/README.md +514 -0
- package/deps/librdkafka/tests/autotest.sh +33 -0
- package/deps/librdkafka/tests/backtrace.gdb +30 -0
- package/deps/librdkafka/tests/broker_version_tests.py +315 -0
- package/deps/librdkafka/tests/buildbox.sh +17 -0
- package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
- package/deps/librdkafka/tests/cluster_testing.py +203 -0
- package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
- package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
- package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
- package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
- package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
- package/deps/librdkafka/tests/fuzzers/README.md +31 -0
- package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
- package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
- package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
- package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
- package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
- package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
- package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
- package/deps/librdkafka/tests/java/Makefile +13 -0
- package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
- package/deps/librdkafka/tests/java/README.md +14 -0
- package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
- package/deps/librdkafka/tests/java/run-class.sh +11 -0
- package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
- package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
- package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
- package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
- package/deps/librdkafka/tests/performance_plot.py +115 -0
- package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
- package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
- package/deps/librdkafka/tests/requirements.txt +2 -0
- package/deps/librdkafka/tests/run-all-tests.sh +81 -0
- package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-test-batches.py +157 -0
- package/deps/librdkafka/tests/run-test.sh +141 -0
- package/deps/librdkafka/tests/rusage.c +249 -0
- package/deps/librdkafka/tests/sasl_test.py +289 -0
- package/deps/librdkafka/tests/scenarios/README.md +6 -0
- package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
- package/deps/librdkafka/tests/scenarios/default.json +5 -0
- package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
- package/deps/librdkafka/tests/share_telemetry_verify/share-otel-collector-config.yaml +28 -0
- package/deps/librdkafka/tests/sockem.c +801 -0
- package/deps/librdkafka/tests/sockem.h +85 -0
- package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
- package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
- package/deps/librdkafka/tests/test.c +8376 -0
- package/deps/librdkafka/tests/test.conf.example +27 -0
- package/deps/librdkafka/tests/test.h +1150 -0
- package/deps/librdkafka/tests/testcpp.cpp +131 -0
- package/deps/librdkafka/tests/testcpp.h +388 -0
- package/deps/librdkafka/tests/testshared.h +416 -0
- package/deps/librdkafka/tests/tools/README.md +4 -0
- package/deps/librdkafka/tests/tools/stats/README.md +21 -0
- package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
- package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
- package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
- package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
- package/deps/librdkafka/tests/trivup/trivup-0.15.0.tar.gz +0 -0
- package/deps/librdkafka/tests/until-fail.sh +87 -0
- package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
- package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
- package/deps/librdkafka/vcpkg.json +23 -0
- package/deps/librdkafka/win32/README.md +5 -0
- package/deps/librdkafka/win32/build-package.bat +3 -0
- package/deps/librdkafka/win32/build.bat +19 -0
- package/deps/librdkafka/win32/common.vcxproj +84 -0
- package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
- package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
- package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
- package/deps/librdkafka/win32/librdkafka.sln +226 -0
- package/deps/librdkafka/win32/librdkafka.vcxproj +282 -0
- package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
- package/deps/librdkafka/win32/msbuild.ps1 +58 -0
- package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
- package/deps/librdkafka/win32/package-zip.ps1 +46 -0
- package/deps/librdkafka/win32/packages/repositories.config +4 -0
- package/deps/librdkafka/win32/push-package.bat +4 -0
- package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
- package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
- package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
- package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
- package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
- package/deps/librdkafka/win32/tests/test.conf.example +25 -0
- package/deps/librdkafka/win32/tests/tests.vcxproj +278 -0
- package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
- package/deps/librdkafka/win32/wingetopt.c +564 -0
- package/deps/librdkafka/win32/wingetopt.h +101 -0
- package/deps/librdkafka/win32/wintime.h +33 -0
- package/deps/librdkafka.gyp +83 -0
- package/deps/windows-install.py +80 -0
- package/index.d.ts +3 -0
- package/lib/admin.js +732 -0
- package/lib/client.js +679 -0
- package/lib/error.js +501 -0
- package/lib/index.js +8 -0
- package/lib/kafka-consumer-stream.js +399 -0
- package/lib/kafka-consumer.js +798 -0
- package/lib/kafkajs/_admin.js +1052 -0
- package/lib/kafkajs/_common.js +887 -0
- package/lib/kafkajs/_consumer.js +2156 -0
- package/lib/kafkajs/_consumer_cache.js +310 -0
- package/lib/kafkajs/_error.js +298 -0
- package/lib/kafkajs/_kafka.js +125 -0
- package/lib/kafkajs/_linked-list.js +220 -0
- package/lib/kafkajs/_producer.js +863 -0
- package/lib/kafkajs/index.js +5 -0
- package/lib/producer/high-level-producer.js +400 -0
- package/lib/producer-stream.js +337 -0
- package/lib/producer.js +405 -0
- package/lib/rdkafka.js +44 -0
- package/lib/tools/ref-counter.js +53 -0
- package/lib/topic-partition.js +91 -0
- package/lib/topic.js +43 -0
- package/lib/util.js +55 -0
- package/librdkafka.js +12 -0
- package/package.json +85 -0
- package/shim/source_location +54 -0
- package/src/admin.cc +1597 -0
- package/src/admin.h +112 -0
- package/src/binding.cc +76 -0
- package/src/binding.h +25 -0
- package/src/callbacks.cc +676 -0
- package/src/callbacks.h +302 -0
- package/src/common.cc +1628 -0
- package/src/common.h +192 -0
- package/src/config.cc +219 -0
- package/src/config.h +61 -0
- package/src/connection.cc +703 -0
- package/src/connection.h +117 -0
- package/src/errors.cc +119 -0
- package/src/errors.h +60 -0
- package/src/kafka-consumer.cc +1539 -0
- package/src/kafka-consumer.h +147 -0
- package/src/producer.cc +917 -0
- package/src/producer.h +124 -0
- package/src/topic.cc +173 -0
- package/src/topic.h +54 -0
- package/src/workers.cc +1714 -0
- package/src/workers.h +690 -0
- package/types/config.d.ts +1269 -0
- package/types/errors.d.ts +373 -0
- package/types/kafkajs.d.ts +568 -0
- package/types/rdkafka.d.ts +571 -0
- package/util/configure.js +32 -0
- package/util/generate-docs.sh +18 -0
- package/util/get-env.js +6 -0
- package/util/test-compile.js +11 -0
- package/util/test-producer-delivery.js +100 -0
|
@@ -0,0 +1,801 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* sockem - socket-level network emulation
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2016-2022, Magnus Edenhill, Andreas Smas
|
|
5
|
+
* All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
|
9
|
+
*
|
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
11
|
+
* this list of conditions and the following disclaimer.
|
|
12
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
20
|
+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
21
|
+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
22
|
+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
23
|
+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
24
|
+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
25
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
26
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
#define _GNU_SOURCE /* for strdupa() and RTLD_NEXT */
|
|
30
|
+
#include <errno.h>
|
|
31
|
+
#include <unistd.h>
|
|
32
|
+
#include <stdlib.h>
|
|
33
|
+
#include <string.h>
|
|
34
|
+
#include <stdarg.h>
|
|
35
|
+
#include <stdio.h>
|
|
36
|
+
#include <poll.h>
|
|
37
|
+
#include <assert.h>
|
|
38
|
+
#include <netinet/in.h>
|
|
39
|
+
#include <dlfcn.h>
|
|
40
|
+
|
|
41
|
+
#include "sockem.h"
|
|
42
|
+
|
|
43
|
+
#include <sys/queue.h>
|
|
44
|
+
|
|
45
|
+
#ifdef __APPLE__
|
|
46
|
+
#include <sys/time.h> /* for gettimeofday() */
|
|
47
|
+
#endif
|
|
48
|
+
|
|
49
|
+
#ifdef _WIN32
|
|
50
|
+
#define socket_errno() WSAGetLastError()
|
|
51
|
+
#else
|
|
52
|
+
#define socket_errno() errno
|
|
53
|
+
#define SOCKET_ERROR -1
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
#ifndef strdupa
|
|
57
|
+
#define strdupa(s) \
|
|
58
|
+
({ \
|
|
59
|
+
const char *_s = (s); \
|
|
60
|
+
size_t _len = strlen(_s) + 1; \
|
|
61
|
+
char *_d = (char *)alloca(_len); \
|
|
62
|
+
(char *)memcpy(_d, _s, _len); \
|
|
63
|
+
})
|
|
64
|
+
#endif
|
|
65
|
+
|
|
66
|
+
#include <pthread.h>
|
|
67
|
+
typedef pthread_mutex_t mtx_t;
|
|
68
|
+
#define mtx_init(M) pthread_mutex_init(M, NULL)
|
|
69
|
+
#define mtx_destroy(M) pthread_mutex_destroy(M)
|
|
70
|
+
#define mtx_lock(M) pthread_mutex_lock(M)
|
|
71
|
+
#define mtx_unlock(M) pthread_mutex_unlock(M)
|
|
72
|
+
|
|
73
|
+
typedef pthread_t thrd_t;
|
|
74
|
+
#define thrd_create(THRD, START_ROUTINE, ARG) \
|
|
75
|
+
pthread_create(THRD, NULL, START_ROUTINE, ARG)
|
|
76
|
+
#define thrd_join0(THRD) pthread_join(THRD, NULL)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
static mtx_t sockem_lock;
|
|
80
|
+
static LIST_HEAD(, sockem_s) sockems;
|
|
81
|
+
|
|
82
|
+
static pthread_once_t sockem_once = PTHREAD_ONCE_INIT;
|
|
83
|
+
static char *sockem_conf_str = "";
|
|
84
|
+
|
|
85
|
+
typedef int64_t sockem_ts_t;
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
#ifdef LIBSOCKEM_PRELOAD
|
|
89
|
+
static int (*sockem_orig_connect)(int, const struct sockaddr *, socklen_t);
|
|
90
|
+
static int (*sockem_orig_close)(int);
|
|
91
|
+
|
|
92
|
+
#define sockem_close0(S) (sockem_orig_close(S))
|
|
93
|
+
#define sockem_connect0(S, A, AL) (sockem_orig_connect(S, A, AL))
|
|
94
|
+
#else
|
|
95
|
+
#define sockem_close0(S) close(S)
|
|
96
|
+
#define sockem_connect0(S, A, AL) connect(S, A, AL)
|
|
97
|
+
#endif
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
struct sockem_conf {
|
|
101
|
+
/* FIXME: these needs to be implemented */
|
|
102
|
+
int tx_thruput; /* app->peer bytes/second */
|
|
103
|
+
int rx_thruput; /* peer->app bytes/second */
|
|
104
|
+
int delay; /* latency in ms */
|
|
105
|
+
int jitter; /* latency variation in ms */
|
|
106
|
+
int debug; /* enable sockem printf debugging */
|
|
107
|
+
size_t recv_bufsz; /* recv chunk/buffer size */
|
|
108
|
+
int direct; /* direct forward, no delay or rate-limiting */
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
typedef struct sockem_buf_s {
|
|
113
|
+
TAILQ_ENTRY(sockem_buf_s) sb_link;
|
|
114
|
+
size_t sb_size;
|
|
115
|
+
size_t sb_of;
|
|
116
|
+
char *sb_data;
|
|
117
|
+
int64_t sb_at; /* Transmit at this absolute time. */
|
|
118
|
+
} sockem_buf_t;
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
struct sockem_s {
|
|
122
|
+
LIST_ENTRY(sockem_s) link;
|
|
123
|
+
|
|
124
|
+
enum {
|
|
125
|
+
/* Forwarder thread run states */
|
|
126
|
+
SOCKEM_INIT,
|
|
127
|
+
SOCKEM_START,
|
|
128
|
+
SOCKEM_RUN,
|
|
129
|
+
SOCKEM_TERM
|
|
130
|
+
} run;
|
|
131
|
+
|
|
132
|
+
int as; /* application's socket. */
|
|
133
|
+
int ls; /* internal application listen socket */
|
|
134
|
+
int ps; /* internal peer socket connecting sockem to the peer.*/
|
|
135
|
+
|
|
136
|
+
void *recv_buf; /* Receive buffer */
|
|
137
|
+
size_t recv_bufsz; /* .. size */
|
|
138
|
+
|
|
139
|
+
int linked; /* On sockems list */
|
|
140
|
+
|
|
141
|
+
thrd_t thrd; /* Forwarder thread */
|
|
142
|
+
|
|
143
|
+
mtx_t lock;
|
|
144
|
+
|
|
145
|
+
struct sockem_conf conf; /* application-set config.
|
|
146
|
+
* protected by .lock */
|
|
147
|
+
|
|
148
|
+
struct sockem_conf use; /* last copy of .conf
|
|
149
|
+
* local to skm thread */
|
|
150
|
+
|
|
151
|
+
TAILQ_HEAD(, sockem_buf_s)
|
|
152
|
+
bufs; /* Buffers in queue waiting for
|
|
153
|
+
* transmission (delayed) */
|
|
154
|
+
|
|
155
|
+
size_t bufs_size; /* Total number of bytes currently enqueued
|
|
156
|
+
* for transmission */
|
|
157
|
+
size_t bufs_size_max; /* Soft max threshold for bufs_size,
|
|
158
|
+
* when this value is exceeded the app fd
|
|
159
|
+
* is removed from the poll set until
|
|
160
|
+
* bufs_size falls below the threshold again. */
|
|
161
|
+
int poll_fd_cnt;
|
|
162
|
+
int64_t ts_last_fwd; /* For rate-limiter: timestamp of last forward */
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
static int sockem_vset(sockem_t *skm, va_list ap);
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* A microsecond monotonic clock
|
|
171
|
+
*/
|
|
172
|
+
static __attribute__((unused)) __inline int64_t sockem_clock(void) {
|
|
173
|
+
#ifdef __APPLE__
|
|
174
|
+
/* No monotonic clock on Darwin */
|
|
175
|
+
struct timeval tv;
|
|
176
|
+
gettimeofday(&tv, NULL);
|
|
177
|
+
return ((int64_t)tv.tv_sec * 1000000LLU) + (int64_t)tv.tv_usec;
|
|
178
|
+
#elif defined(_WIN32)
|
|
179
|
+
return (int64_t)GetTickCount64() * 1000LLU;
|
|
180
|
+
#else
|
|
181
|
+
struct timespec ts;
|
|
182
|
+
clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
183
|
+
return ((int64_t)ts.tv_sec * 1000000LLU) +
|
|
184
|
+
((int64_t)ts.tv_nsec / 1000LLU);
|
|
185
|
+
#endif
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @brief Initialize libsockem once.
|
|
190
|
+
*/
|
|
191
|
+
static void sockem_init(void) {
|
|
192
|
+
mtx_init(&sockem_lock);
|
|
193
|
+
sockem_conf_str = getenv("SOCKEM_CONF");
|
|
194
|
+
if (!sockem_conf_str)
|
|
195
|
+
sockem_conf_str = "";
|
|
196
|
+
if (strstr(sockem_conf_str, "debug"))
|
|
197
|
+
fprintf(stderr, "%% libsockem pre-loaded (%s)\n",
|
|
198
|
+
sockem_conf_str);
|
|
199
|
+
#ifdef LIBSOCKEM_PRELOAD
|
|
200
|
+
sockem_orig_connect = dlsym(RTLD_NEXT, "connect");
|
|
201
|
+
sockem_orig_close = dlsym(RTLD_NEXT, "close");
|
|
202
|
+
#endif
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @returns the maximum waittime in ms for poll(), at most 1000 ms.
|
|
208
|
+
* @remark lock must be held
|
|
209
|
+
*/
|
|
210
|
+
static int sockem_calc_waittime(sockem_t *skm, int64_t now) {
|
|
211
|
+
const sockem_buf_t *sb;
|
|
212
|
+
int64_t r;
|
|
213
|
+
|
|
214
|
+
if (!(sb = TAILQ_FIRST(&skm->bufs)))
|
|
215
|
+
return 1000;
|
|
216
|
+
else if (now >= sb->sb_at || skm->use.direct)
|
|
217
|
+
return 0;
|
|
218
|
+
else if ((r = (sb->sb_at - now)) < 1000000) {
|
|
219
|
+
if (r < 1000)
|
|
220
|
+
return 1; /* Ceil to 1 to avoid busy-loop during
|
|
221
|
+
* last millisecond. */
|
|
222
|
+
else
|
|
223
|
+
return (int)(r / 1000);
|
|
224
|
+
} else
|
|
225
|
+
return 1000;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @brief Unlink and destroy a buffer
|
|
231
|
+
*/
|
|
232
|
+
static void sockem_buf_destroy(sockem_t *skm, sockem_buf_t *sb) {
|
|
233
|
+
skm->bufs_size -= sb->sb_size - sb->sb_of;
|
|
234
|
+
TAILQ_REMOVE(&skm->bufs, sb, sb_link);
|
|
235
|
+
free(sb);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* @brief Add delayed buffer to transmit.
|
|
240
|
+
*/
|
|
241
|
+
static sockem_buf_t *
|
|
242
|
+
sockem_buf_add(sockem_t *skm, size_t size, const void *data) {
|
|
243
|
+
sockem_buf_t *sb;
|
|
244
|
+
|
|
245
|
+
skm->bufs_size += size;
|
|
246
|
+
if (skm->bufs_size > skm->bufs_size_max) {
|
|
247
|
+
/* No more buffer space, halt recv fd until
|
|
248
|
+
* queued buffers drop below threshold. */
|
|
249
|
+
skm->poll_fd_cnt = 1;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
sb = malloc(sizeof(*sb) + size);
|
|
253
|
+
|
|
254
|
+
sb->sb_of = 0;
|
|
255
|
+
sb->sb_size = size;
|
|
256
|
+
sb->sb_data = (char *)(sb + 1);
|
|
257
|
+
sb->sb_at = sockem_clock() +
|
|
258
|
+
((skm->use.delay + (skm->use.jitter / 2) /*FIXME*/) * 1000);
|
|
259
|
+
memcpy(sb->sb_data, data, size);
|
|
260
|
+
|
|
261
|
+
TAILQ_INSERT_TAIL(&skm->bufs, sb, sb_link);
|
|
262
|
+
|
|
263
|
+
return sb;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @brief Forward any delayed buffers that have passed their deadline
|
|
269
|
+
* @remark lock must be held but will be released momentarily while
|
|
270
|
+
* performing send syscall.
|
|
271
|
+
*/
|
|
272
|
+
static int sockem_fwd_bufs(sockem_t *skm, int ofd) {
|
|
273
|
+
sockem_buf_t *sb;
|
|
274
|
+
int64_t now = sockem_clock();
|
|
275
|
+
size_t to_write;
|
|
276
|
+
int64_t elapsed;
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
if (skm->use.direct)
|
|
280
|
+
to_write = 1024 * 1024 * 100;
|
|
281
|
+
else if ((elapsed = now - skm->ts_last_fwd)) {
|
|
282
|
+
/* Calculate how many bytes to send to adhere to rate-limit */
|
|
283
|
+
to_write = (size_t)((double)skm->use.tx_thruput *
|
|
284
|
+
((double)elapsed / 1000000.0));
|
|
285
|
+
} else
|
|
286
|
+
return 0;
|
|
287
|
+
|
|
288
|
+
while (to_write > 0 && (sb = TAILQ_FIRST(&skm->bufs)) &&
|
|
289
|
+
(skm->use.direct || sb->sb_at <= now)) {
|
|
290
|
+
ssize_t r;
|
|
291
|
+
size_t remain = sb->sb_size - sb->sb_of;
|
|
292
|
+
size_t wr = to_write < remain ? to_write : remain;
|
|
293
|
+
|
|
294
|
+
if (wr == 0)
|
|
295
|
+
break;
|
|
296
|
+
|
|
297
|
+
mtx_unlock(&skm->lock);
|
|
298
|
+
|
|
299
|
+
r = send(ofd, sb->sb_data + sb->sb_of, wr, 0);
|
|
300
|
+
|
|
301
|
+
mtx_lock(&skm->lock);
|
|
302
|
+
|
|
303
|
+
if (r == -1) {
|
|
304
|
+
if (errno == ENOBUFS || errno == EAGAIN ||
|
|
305
|
+
errno == EWOULDBLOCK)
|
|
306
|
+
return 0;
|
|
307
|
+
return -1;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
skm->ts_last_fwd = now;
|
|
311
|
+
|
|
312
|
+
sb->sb_of += r;
|
|
313
|
+
to_write -= r;
|
|
314
|
+
|
|
315
|
+
if (sb->sb_of < sb->sb_size)
|
|
316
|
+
break;
|
|
317
|
+
|
|
318
|
+
sockem_buf_destroy(skm, sb);
|
|
319
|
+
|
|
320
|
+
now = sockem_clock();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/* Re-enable app fd poll if queued buffers are below threshold */
|
|
324
|
+
if (skm->bufs_size < skm->bufs_size_max)
|
|
325
|
+
skm->poll_fd_cnt = 2;
|
|
326
|
+
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* @brief read from \p ifd, write to \p ofd in a blocking fashion.
|
|
333
|
+
*
|
|
334
|
+
* @returns the number of bytes forwarded, or -1 on error.
|
|
335
|
+
*/
|
|
336
|
+
static int sockem_recv_fwd(sockem_t *skm, int ifd, int ofd, int direct) {
|
|
337
|
+
ssize_t r, wr;
|
|
338
|
+
|
|
339
|
+
r = recv(ifd, skm->recv_buf, skm->recv_bufsz, MSG_DONTWAIT);
|
|
340
|
+
if (r == -1) {
|
|
341
|
+
int serr = socket_errno();
|
|
342
|
+
if (serr == EAGAIN || serr == EWOULDBLOCK)
|
|
343
|
+
return 0;
|
|
344
|
+
return -1;
|
|
345
|
+
|
|
346
|
+
} else if (r == 0) {
|
|
347
|
+
/* Socket closed */
|
|
348
|
+
return -1;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (direct) {
|
|
352
|
+
/* No delay, rate limit, or buffered data: send right away */
|
|
353
|
+
wr = send(ofd, skm->recv_buf, r, 0);
|
|
354
|
+
if (wr < r)
|
|
355
|
+
return -1;
|
|
356
|
+
|
|
357
|
+
return wr;
|
|
358
|
+
} else {
|
|
359
|
+
sockem_buf_add(skm, r, skm->recv_buf);
|
|
360
|
+
return r;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* @brief Close all sockets and unsets ->run.
|
|
367
|
+
* @remark Preserves caller's errno.
|
|
368
|
+
* @remark lock must be held.
|
|
369
|
+
*/
|
|
370
|
+
static void sockem_close_all(sockem_t *skm) {
|
|
371
|
+
int serr = socket_errno();
|
|
372
|
+
|
|
373
|
+
if (skm->ls != -1) {
|
|
374
|
+
sockem_close0(skm->ls);
|
|
375
|
+
skm->ls = -1;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
if (skm->ps != -1) {
|
|
379
|
+
sockem_close0(skm->ps);
|
|
380
|
+
skm->ps = -1;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
skm->run = SOCKEM_TERM;
|
|
384
|
+
|
|
385
|
+
errno = serr;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* @brief Copy desired (app) config to internally use(d) configuration.
|
|
391
|
+
* @remark lock must be held
|
|
392
|
+
*/
|
|
393
|
+
static __inline void sockem_conf_use(sockem_t *skm) {
|
|
394
|
+
skm->use = skm->conf;
|
|
395
|
+
/* Figure out if direct forward is to be used */
|
|
396
|
+
skm->use.direct = !(skm->use.delay || skm->use.jitter ||
|
|
397
|
+
(skm->use.tx_thruput < (1 << 30)));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* @brief sockem internal per-socket forwarder thread
|
|
402
|
+
*/
|
|
403
|
+
static void *sockem_run(void *arg) {
|
|
404
|
+
sockem_t *skm = arg;
|
|
405
|
+
int cs = -1;
|
|
406
|
+
int ls;
|
|
407
|
+
struct pollfd pfd[2];
|
|
408
|
+
|
|
409
|
+
mtx_lock(&skm->lock);
|
|
410
|
+
if (skm->run == SOCKEM_START)
|
|
411
|
+
skm->run = SOCKEM_RUN;
|
|
412
|
+
sockem_conf_use(skm);
|
|
413
|
+
ls = skm->ls;
|
|
414
|
+
mtx_unlock(&skm->lock);
|
|
415
|
+
|
|
416
|
+
skm->recv_bufsz = skm->use.recv_bufsz;
|
|
417
|
+
skm->recv_buf = malloc(skm->recv_bufsz);
|
|
418
|
+
|
|
419
|
+
/* Accept connection from sockfd in sockem_connect() */
|
|
420
|
+
cs = accept(ls, NULL, 0);
|
|
421
|
+
if (cs == -1) {
|
|
422
|
+
mtx_lock(&skm->lock);
|
|
423
|
+
if (skm->run == SOCKEM_TERM) {
|
|
424
|
+
/* App socket was closed. */
|
|
425
|
+
goto done;
|
|
426
|
+
}
|
|
427
|
+
fprintf(stderr, "%% sockem: accept(%d) failed: %s\n", ls,
|
|
428
|
+
strerror(socket_errno()));
|
|
429
|
+
mtx_unlock(&skm->lock);
|
|
430
|
+
assert(cs != -1);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* Set up poll (blocking IO) */
|
|
434
|
+
memset(pfd, 0, sizeof(pfd));
|
|
435
|
+
pfd[1].fd = cs;
|
|
436
|
+
pfd[1].events = POLLIN;
|
|
437
|
+
|
|
438
|
+
mtx_lock(&skm->lock);
|
|
439
|
+
pfd[0].fd = skm->ps;
|
|
440
|
+
mtx_unlock(&skm->lock);
|
|
441
|
+
pfd[0].events = POLLIN;
|
|
442
|
+
|
|
443
|
+
skm->poll_fd_cnt = 2;
|
|
444
|
+
|
|
445
|
+
mtx_lock(&skm->lock);
|
|
446
|
+
while (skm->run == SOCKEM_RUN) {
|
|
447
|
+
int r;
|
|
448
|
+
int i;
|
|
449
|
+
int waittime = sockem_calc_waittime(skm, sockem_clock());
|
|
450
|
+
|
|
451
|
+
mtx_unlock(&skm->lock);
|
|
452
|
+
r = poll(pfd, skm->poll_fd_cnt, waittime);
|
|
453
|
+
if (r == -1)
|
|
454
|
+
break;
|
|
455
|
+
|
|
456
|
+
/* Send/forward delayed buffers */
|
|
457
|
+
mtx_lock(&skm->lock);
|
|
458
|
+
sockem_conf_use(skm);
|
|
459
|
+
|
|
460
|
+
if (sockem_fwd_bufs(skm, skm->ps) == -1) {
|
|
461
|
+
mtx_unlock(&skm->lock);
|
|
462
|
+
skm->run = SOCKEM_TERM;
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
mtx_unlock(&skm->lock);
|
|
466
|
+
|
|
467
|
+
for (i = 0; r > 0 && i < 2; i++) {
|
|
468
|
+
if (pfd[i].revents & (POLLHUP | POLLERR)) {
|
|
469
|
+
skm->run = SOCKEM_TERM;
|
|
470
|
+
|
|
471
|
+
} else if (pfd[i].revents & POLLIN) {
|
|
472
|
+
if (sockem_recv_fwd(
|
|
473
|
+
skm, pfd[i].fd, pfd[i ^ 1].fd,
|
|
474
|
+
/* direct mode for app socket
|
|
475
|
+
* without delay, and always for
|
|
476
|
+
* peer socket (receive channel) */
|
|
477
|
+
i == 0 || (skm->use.direct &&
|
|
478
|
+
skm->bufs_size == 0)) ==
|
|
479
|
+
-1) {
|
|
480
|
+
skm->run = SOCKEM_TERM;
|
|
481
|
+
break;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
mtx_lock(&skm->lock);
|
|
487
|
+
}
|
|
488
|
+
done:
|
|
489
|
+
if (cs != -1)
|
|
490
|
+
sockem_close0(cs);
|
|
491
|
+
sockem_close_all(skm);
|
|
492
|
+
|
|
493
|
+
mtx_unlock(&skm->lock);
|
|
494
|
+
free(skm->recv_buf);
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
return NULL;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* @brief Connect socket \p s to \p addr
|
|
504
|
+
*/
|
|
505
|
+
static int
|
|
506
|
+
sockem_do_connect(int s, const struct sockaddr *addr, socklen_t addrlen) {
|
|
507
|
+
int r;
|
|
508
|
+
|
|
509
|
+
r = sockem_connect0(s, addr, addrlen);
|
|
510
|
+
if (r == SOCKET_ERROR) {
|
|
511
|
+
int serr = socket_errno();
|
|
512
|
+
if (serr != EINPROGRESS
|
|
513
|
+
#ifdef _WIN32
|
|
514
|
+
&& serr != WSAEWOULDBLOCK
|
|
515
|
+
#endif
|
|
516
|
+
) {
|
|
517
|
+
#ifndef _WIN32
|
|
518
|
+
errno = serr;
|
|
519
|
+
#endif
|
|
520
|
+
return -1;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return 0;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
sockem_t *sockem_connect(int sockfd,
|
|
529
|
+
const struct sockaddr *addr,
|
|
530
|
+
socklen_t addrlen,
|
|
531
|
+
...) {
|
|
532
|
+
sockem_t *skm;
|
|
533
|
+
int ls, ps;
|
|
534
|
+
struct sockaddr_in6 sin6 = {.sin6_family = addr->sa_family};
|
|
535
|
+
socklen_t addrlen2 = addrlen;
|
|
536
|
+
va_list ap;
|
|
537
|
+
|
|
538
|
+
pthread_once(&sockem_once, sockem_init);
|
|
539
|
+
|
|
540
|
+
/* Create internal app listener socket */
|
|
541
|
+
ls = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
|
|
542
|
+
if (ls == -1)
|
|
543
|
+
return NULL;
|
|
544
|
+
|
|
545
|
+
if (bind(ls, (struct sockaddr *)&sin6, addrlen) == -1) {
|
|
546
|
+
sockem_close0(ls);
|
|
547
|
+
return NULL;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/* Get bound address */
|
|
551
|
+
if (getsockname(ls, (struct sockaddr *)&sin6, &addrlen2) == -1) {
|
|
552
|
+
sockem_close0(ls);
|
|
553
|
+
return NULL;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (listen(ls, 1) == -1) {
|
|
557
|
+
sockem_close0(ls);
|
|
558
|
+
return NULL;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/* Create internal peer socket */
|
|
562
|
+
ps = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
|
|
563
|
+
if (ps == -1) {
|
|
564
|
+
sockem_close0(ls);
|
|
565
|
+
return NULL;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/* Connect to peer */
|
|
569
|
+
if (sockem_do_connect(ps, addr, addrlen) == -1) {
|
|
570
|
+
sockem_close0(ls);
|
|
571
|
+
sockem_close0(ps);
|
|
572
|
+
return NULL;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/* Create sockem handle */
|
|
576
|
+
skm = calloc(1, sizeof(*skm));
|
|
577
|
+
skm->as = sockfd;
|
|
578
|
+
skm->ls = ls;
|
|
579
|
+
skm->ps = ps;
|
|
580
|
+
skm->bufs_size_max = 16 * 1024 * 1024; /* 16kb of queue buffer */
|
|
581
|
+
TAILQ_INIT(&skm->bufs);
|
|
582
|
+
mtx_init(&skm->lock);
|
|
583
|
+
|
|
584
|
+
/* Default config */
|
|
585
|
+
skm->conf.rx_thruput = 1 << 30;
|
|
586
|
+
skm->conf.tx_thruput = 1 << 30;
|
|
587
|
+
skm->conf.delay = 0;
|
|
588
|
+
skm->conf.jitter = 0;
|
|
589
|
+
skm->conf.recv_bufsz = 1024 * 1024;
|
|
590
|
+
skm->conf.direct = 1;
|
|
591
|
+
|
|
592
|
+
/* Apply passed configuration */
|
|
593
|
+
va_start(ap, addrlen);
|
|
594
|
+
if (sockem_vset(skm, ap) == -1) {
|
|
595
|
+
va_end(ap);
|
|
596
|
+
sockem_close(skm);
|
|
597
|
+
return NULL;
|
|
598
|
+
}
|
|
599
|
+
va_end(ap);
|
|
600
|
+
|
|
601
|
+
mtx_lock(&skm->lock);
|
|
602
|
+
skm->run = SOCKEM_START;
|
|
603
|
+
|
|
604
|
+
/* Create pipe thread */
|
|
605
|
+
if (thrd_create(&skm->thrd, sockem_run, skm) != 0) {
|
|
606
|
+
mtx_unlock(&skm->lock);
|
|
607
|
+
sockem_close(skm);
|
|
608
|
+
return NULL;
|
|
609
|
+
}
|
|
610
|
+
mtx_unlock(&skm->lock);
|
|
611
|
+
|
|
612
|
+
/* Connect application socket to listen socket */
|
|
613
|
+
if (sockem_do_connect(sockfd, (struct sockaddr *)&sin6, addrlen2) ==
|
|
614
|
+
-1) {
|
|
615
|
+
sockem_close(skm);
|
|
616
|
+
return NULL;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
mtx_lock(&sockem_lock);
|
|
620
|
+
LIST_INSERT_HEAD(&sockems, skm, link);
|
|
621
|
+
mtx_lock(&skm->lock);
|
|
622
|
+
skm->linked = 1;
|
|
623
|
+
mtx_unlock(&skm->lock);
|
|
624
|
+
mtx_unlock(&sockem_lock);
|
|
625
|
+
|
|
626
|
+
return skm;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
/**
|
|
631
|
+
* @brief Purge/drop all queued buffers
|
|
632
|
+
*/
|
|
633
|
+
static void sockem_bufs_purge(sockem_t *skm) {
|
|
634
|
+
sockem_buf_t *sb;
|
|
635
|
+
|
|
636
|
+
while ((sb = TAILQ_FIRST(&skm->bufs)))
|
|
637
|
+
sockem_buf_destroy(skm, sb);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
void sockem_close(sockem_t *skm) {
|
|
642
|
+
mtx_lock(&sockem_lock);
|
|
643
|
+
mtx_lock(&skm->lock);
|
|
644
|
+
if (skm->linked)
|
|
645
|
+
LIST_REMOVE(skm, link);
|
|
646
|
+
mtx_unlock(&sockem_lock);
|
|
647
|
+
|
|
648
|
+
/* If thread is running let it close the sockets
|
|
649
|
+
* to avoid race condition. */
|
|
650
|
+
if (skm->run == SOCKEM_START || skm->run == SOCKEM_RUN)
|
|
651
|
+
skm->run = SOCKEM_TERM;
|
|
652
|
+
else
|
|
653
|
+
sockem_close_all(skm);
|
|
654
|
+
|
|
655
|
+
mtx_unlock(&skm->lock);
|
|
656
|
+
|
|
657
|
+
thrd_join0(skm->thrd);
|
|
658
|
+
|
|
659
|
+
sockem_bufs_purge(skm);
|
|
660
|
+
|
|
661
|
+
mtx_destroy(&skm->lock);
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
free(skm);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* @brief Set single conf key.
|
|
670
|
+
* @remark lock must be held.
|
|
671
|
+
* @returns 0 on success or -1 if key is unknown
|
|
672
|
+
*/
|
|
673
|
+
static int sockem_set0(sockem_t *skm, const char *key, int val) {
|
|
674
|
+
if (!strcmp(key, "rx.thruput") || !strcmp(key, "rx.throughput"))
|
|
675
|
+
skm->conf.rx_thruput = val;
|
|
676
|
+
else if (!strcmp(key, "tx.thruput") || !strcmp(key, "tx.throughput"))
|
|
677
|
+
skm->conf.tx_thruput = val;
|
|
678
|
+
else if (!strcmp(key, "delay"))
|
|
679
|
+
skm->conf.delay = val;
|
|
680
|
+
else if (!strcmp(key, "jitter"))
|
|
681
|
+
skm->conf.jitter = val;
|
|
682
|
+
else if (!strcmp(key, "rx.bufsz"))
|
|
683
|
+
skm->conf.recv_bufsz = val;
|
|
684
|
+
else if (!strcmp(key, "debug"))
|
|
685
|
+
skm->conf.debug = val;
|
|
686
|
+
else if (!strcmp(key, "true"))
|
|
687
|
+
; /* dummy key for allowing non-empty but default config */
|
|
688
|
+
else if (!strchr(key, ',')) {
|
|
689
|
+
char *s = strdupa(key);
|
|
690
|
+
while (*s) {
|
|
691
|
+
char *t = strchr(s, ',');
|
|
692
|
+
char *d = strchr(s, '=');
|
|
693
|
+
if (t)
|
|
694
|
+
*t = '\0';
|
|
695
|
+
if (!d)
|
|
696
|
+
return -1;
|
|
697
|
+
*(d++) = '\0';
|
|
698
|
+
|
|
699
|
+
if (sockem_set0(skm, s, atoi(d)) == -1)
|
|
700
|
+
return -1;
|
|
701
|
+
|
|
702
|
+
if (!t)
|
|
703
|
+
break;
|
|
704
|
+
s += 1;
|
|
705
|
+
}
|
|
706
|
+
} else
|
|
707
|
+
return -1;
|
|
708
|
+
|
|
709
|
+
return 0;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* @brief Set sockem config parameters
|
|
715
|
+
*/
|
|
716
|
+
static int sockem_vset(sockem_t *skm, va_list ap) {
|
|
717
|
+
const char *key;
|
|
718
|
+
int val;
|
|
719
|
+
|
|
720
|
+
mtx_lock(&skm->lock);
|
|
721
|
+
while ((key = va_arg(ap, const char *))) {
|
|
722
|
+
val = va_arg(ap, int);
|
|
723
|
+
if (sockem_set0(skm, key, val) == -1) {
|
|
724
|
+
mtx_unlock(&skm->lock);
|
|
725
|
+
return -1;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
mtx_unlock(&skm->lock);
|
|
729
|
+
|
|
730
|
+
return 0;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
int sockem_set(sockem_t *skm, ...) {
|
|
734
|
+
va_list ap;
|
|
735
|
+
int r;
|
|
736
|
+
|
|
737
|
+
va_start(ap, skm);
|
|
738
|
+
r = sockem_vset(skm, ap);
|
|
739
|
+
va_end(ap);
|
|
740
|
+
|
|
741
|
+
return r;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
sockem_t *sockem_find(int sockfd) {
|
|
746
|
+
sockem_t *skm;
|
|
747
|
+
|
|
748
|
+
pthread_once(&sockem_once, sockem_init);
|
|
749
|
+
|
|
750
|
+
mtx_lock(&sockem_lock);
|
|
751
|
+
LIST_FOREACH(skm, &sockems, link)
|
|
752
|
+
if (skm->as == sockfd)
|
|
753
|
+
break;
|
|
754
|
+
mtx_unlock(&sockem_lock);
|
|
755
|
+
|
|
756
|
+
return skm;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
#ifdef LIBSOCKEM_PRELOAD
|
|
761
|
+
/**
|
|
762
|
+
* Provide overloading socket APIs and conf bootstrapping from env vars.
|
|
763
|
+
*
|
|
764
|
+
*/
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
/**
|
|
769
|
+
* @brief connect(2) overload
|
|
770
|
+
*/
|
|
771
|
+
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
|
|
772
|
+
sockem_t *skm;
|
|
773
|
+
|
|
774
|
+
pthread_once(&sockem_once, sockem_init);
|
|
775
|
+
|
|
776
|
+
skm = sockem_connect(sockfd, addr, addrlen, sockem_conf_str, 0, NULL);
|
|
777
|
+
if (!skm)
|
|
778
|
+
return -1;
|
|
779
|
+
|
|
780
|
+
return 0;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* @brief close(2) overload
|
|
785
|
+
*/
|
|
786
|
+
int close(int fd) {
|
|
787
|
+
sockem_t *skm;
|
|
788
|
+
|
|
789
|
+
pthread_once(&sockem_once, sockem_init);
|
|
790
|
+
|
|
791
|
+
mtx_lock(&sockem_lock);
|
|
792
|
+
skm = sockem_find(fd);
|
|
793
|
+
|
|
794
|
+
if (skm)
|
|
795
|
+
sockem_close(skm);
|
|
796
|
+
mtx_unlock(&sockem_lock);
|
|
797
|
+
|
|
798
|
+
return sockem_close0(fd);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
#endif
|