libcouchbase 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.travis.yml +35 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +389 -0
- data/Rakefile +75 -0
- data/ext/README.md +6 -0
- data/ext/Rakefile +20 -0
- data/ext/libcouchbase/.gitignore +130 -0
- data/ext/libcouchbase/.travis.yml +19 -0
- data/ext/libcouchbase/CMakeLists.txt +429 -0
- data/ext/libcouchbase/CONTRIBUTING.md +124 -0
- data/ext/libcouchbase/LICENSE +202 -0
- data/ext/libcouchbase/README.markdown +163 -0
- data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
- data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
- data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
- data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
- data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
- data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
- data/ext/libcouchbase/cmake/configure +357 -0
- data/ext/libcouchbase/cmake/defs.mk.in +8 -0
- data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
- data/ext/libcouchbase/cmake/source_files.cmake +73 -0
- data/ext/libcouchbase/configure.pl +1 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
- data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
- data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
- data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
- data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
- data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
- data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
- data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
- data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
- data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
- data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
- data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
- data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
- data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
- data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
- data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
- data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
- data/ext/libcouchbase/example/CMakeLists.txt +37 -0
- data/ext/libcouchbase/example/README.markdown +47 -0
- data/ext/libcouchbase/example/db/db.c +167 -0
- data/ext/libcouchbase/example/db/vb.c +227 -0
- data/ext/libcouchbase/example/instancepool/main.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.h +69 -0
- data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
- data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
- data/ext/libcouchbase/example/minimal/minimal.c +130 -0
- data/ext/libcouchbase/example/observe/observe.c +146 -0
- data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
- data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
- data/ext/libcouchbase/example/tick/tick.c +119 -0
- data/ext/libcouchbase/example/views/views-example.cc +83 -0
- data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
- data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
- data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
- data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
- data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
- data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
- data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
- data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
- data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
- data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
- data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
- data/ext/libcouchbase/include/memcached/COPYING +30 -0
- data/ext/libcouchbase/include/memcached/README +10 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/README +7 -0
- data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
- data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
- data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
- data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
- data/ext/libcouchbase/packaging/deb/compat +1 -0
- data/ext/libcouchbase/packaging/deb/control +73 -0
- data/ext/libcouchbase/packaging/deb/copyright +10 -0
- data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
- data/ext/libcouchbase/packaging/deb/package.mk +31 -0
- data/ext/libcouchbase/packaging/deb/rules +46 -0
- data/ext/libcouchbase/packaging/deb/source/format +1 -0
- data/ext/libcouchbase/packaging/distinfo/README +1 -0
- data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
- data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
- data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
- data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
- data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
- data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
- data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
- data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
- data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
- data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
- data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
- data/ext/libcouchbase/src/README.md +103 -0
- data/ext/libcouchbase/src/aspend.h +106 -0
- data/ext/libcouchbase/src/auth.cc +74 -0
- data/ext/libcouchbase/src/auth.h +54 -0
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +129 -0
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/callbacks.c +378 -0
- data/ext/libcouchbase/src/cbft.cc +210 -0
- data/ext/libcouchbase/src/cntl.cc +847 -0
- data/ext/libcouchbase/src/config_static.h +159 -0
- data/ext/libcouchbase/src/connspec.cc +462 -0
- data/ext/libcouchbase/src/connspec.h +105 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
- data/ext/libcouchbase/src/dump.c +98 -0
- data/ext/libcouchbase/src/getconfig.c +100 -0
- data/ext/libcouchbase/src/gethrtime.c +109 -0
- data/ext/libcouchbase/src/handler.c +922 -0
- data/ext/libcouchbase/src/hashset.c +164 -0
- data/ext/libcouchbase/src/hashset.h +86 -0
- data/ext/libcouchbase/src/hashtable.c +75 -0
- data/ext/libcouchbase/src/hdr_timings.c +92 -0
- data/ext/libcouchbase/src/hostlist.cc +301 -0
- data/ext/libcouchbase/src/hostlist.h +171 -0
- data/ext/libcouchbase/src/http/http-priv.h +307 -0
- data/ext/libcouchbase/src/http/http.cc +633 -0
- data/ext/libcouchbase/src/http/http.h +34 -0
- data/ext/libcouchbase/src/http/http_io.cc +307 -0
- data/ext/libcouchbase/src/instance.cc +722 -0
- data/ext/libcouchbase/src/internal.h +244 -0
- data/ext/libcouchbase/src/iofactory.c +575 -0
- data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
- data/ext/libcouchbase/src/jsparse/parser.h +173 -0
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +364 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
- data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
- data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
- data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
- data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
- data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
- data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
- data/ext/libcouchbase/src/lcbio/manager.c +584 -0
- data/ext/libcouchbase/src/lcbio/manager.h +156 -0
- data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
- data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
- data/ext/libcouchbase/src/lcbio/timer.c +132 -0
- data/ext/libcouchbase/src/legacy.c +430 -0
- data/ext/libcouchbase/src/list.c +144 -0
- data/ext/libcouchbase/src/list.h +127 -0
- data/ext/libcouchbase/src/logging.c +244 -0
- data/ext/libcouchbase/src/logging.h +86 -0
- data/ext/libcouchbase/src/mc/compress.c +90 -0
- data/ext/libcouchbase/src/mc/compress.h +61 -0
- data/ext/libcouchbase/src/mc/forward.c +186 -0
- data/ext/libcouchbase/src/mc/forward.h +90 -0
- data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
- data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
- data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
- data/ext/libcouchbase/src/mc/mcreq.c +954 -0
- data/ext/libcouchbase/src/mc/mcreq.h +977 -0
- data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
- data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
- data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
- data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
- data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
- data/ext/libcouchbase/src/n1ql/params.cc +215 -0
- data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
- data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
- data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
- data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
- data/ext/libcouchbase/src/newconfig.c +385 -0
- data/ext/libcouchbase/src/nodeinfo.cc +194 -0
- data/ext/libcouchbase/src/operations/cbflush.c +71 -0
- data/ext/libcouchbase/src/operations/counter.c +116 -0
- data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
- data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
- data/ext/libcouchbase/src/operations/durability.c +668 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
- data/ext/libcouchbase/src/operations/get.c +409 -0
- data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
- data/ext/libcouchbase/src/operations/observe.c +340 -0
- data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
- data/ext/libcouchbase/src/operations/remove.c +83 -0
- data/ext/libcouchbase/src/operations/stats.c +461 -0
- data/ext/libcouchbase/src/operations/store.c +360 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
- data/ext/libcouchbase/src/operations/touch.c +81 -0
- data/ext/libcouchbase/src/packetutils.c +60 -0
- data/ext/libcouchbase/src/packetutils.h +147 -0
- data/ext/libcouchbase/src/probes.d +211 -0
- data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
- data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
- data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
- data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
- data/ext/libcouchbase/src/rdb/rope.c +419 -0
- data/ext/libcouchbase/src/rdb/rope.h +488 -0
- data/ext/libcouchbase/src/retrychk.c +113 -0
- data/ext/libcouchbase/src/retryq.c +424 -0
- data/ext/libcouchbase/src/retryq.h +157 -0
- data/ext/libcouchbase/src/ringbuffer.c +442 -0
- data/ext/libcouchbase/src/ringbuffer.h +100 -0
- data/ext/libcouchbase/src/settings.c +95 -0
- data/ext/libcouchbase/src/settings.h +188 -0
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/sllist-inl.h +197 -0
- data/ext/libcouchbase/src/sllist.h +76 -0
- data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
- data/ext/libcouchbase/src/timings.c +208 -0
- data/ext/libcouchbase/src/trace.h +105 -0
- data/ext/libcouchbase/src/utilities.c +171 -0
- data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
- data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
- data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
- data/ext/libcouchbase/src/vbucket/hash.h +30 -0
- data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
- data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
- data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
- data/ext/libcouchbase/src/views/docreq.c +194 -0
- data/ext/libcouchbase/src/views/docreq.h +83 -0
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +36 -0
- data/ext/libcouchbase/src/wait.c +161 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
- data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
- data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
- data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
- data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
- data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
- data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
- data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
- data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
- data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
- data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
- data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
- data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
- data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
- data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
- data/ext/libcouchbase/tests/check-all.cc +608 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
- data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
- data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
- data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
- data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
- data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
- data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
- data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
- data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
- data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
- data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
- data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
- data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
- data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
- data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
- data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
- data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
- data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
- data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
- data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
- data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
- data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
- data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
- data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
- data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
- data/ext/libcouchbase/tests/mc/mctest.h +119 -0
- data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
- data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
- data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
- data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
- data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
- data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
- data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
- data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
- data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
- data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
- data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
- data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
- data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
- data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
- data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
- data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
- data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
- data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
- data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
- data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
- data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
- data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
- data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
- data/ext/libcouchbase/tests/start_mock.bat +15 -0
- data/ext/libcouchbase/tests/start_mock.sh +42 -0
- data/ext/libcouchbase/tests/unit_tests.cc +43 -0
- data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
- data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
- data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
- data/ext/libcouchbase/tools/cbc.cc +1541 -0
- data/ext/libcouchbase/tools/common/histogram.cc +43 -0
- data/ext/libcouchbase/tools/common/histogram.h +23 -0
- data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
- data/ext/libcouchbase/tools/common/options.cc +420 -0
- data/ext/libcouchbase/tools/common/options.h +81 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
- data/ext/libcouchbase/tools/docgen/loc.h +210 -0
- data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
- data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
- data/lib/libcouchbase.rb +36 -0
- data/lib/libcouchbase/bucket.rb +819 -0
- data/lib/libcouchbase/callbacks.rb +72 -0
- data/lib/libcouchbase/connection.rb +790 -0
- data/lib/libcouchbase/design_docs.rb +86 -0
- data/lib/libcouchbase/error.rb +68 -0
- data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
- data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
- data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
- data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
- data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
- data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
- data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
- data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
- data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
- data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
- data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
- data/lib/libcouchbase/ext/tasks.rb +87 -0
- data/lib/libcouchbase/n1ql.rb +73 -0
- data/lib/libcouchbase/query_full_text.rb +147 -0
- data/lib/libcouchbase/query_n1ql.rb +121 -0
- data/lib/libcouchbase/query_view.rb +129 -0
- data/lib/libcouchbase/results_fiber.rb +262 -0
- data/lib/libcouchbase/results_native.rb +211 -0
- data/lib/libcouchbase/version.rb +5 -0
- data/libcouchbase.gemspec +61 -0
- data/spec/bucket_spec.rb +270 -0
- data/spec/connection_spec.rb +277 -0
- data/spec/design_docs_spec.rb +23 -0
- data/spec/error_spec.rb +26 -0
- data/spec/fts_spec.rb +129 -0
- data/spec/n1ql_spec.rb +201 -0
- data/spec/results_libuv_spec.rb +229 -0
- data/spec/results_native_spec.rb +259 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
- data/spec/view_spec.rb +195 -0
- metadata +775 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "ssl_iot_common.h"
|
|
19
|
+
#include "simplestring.h"
|
|
20
|
+
#include <openssl/err.h>
|
|
21
|
+
/**
|
|
22
|
+
* Event-Style SSL Wrapping.
|
|
23
|
+
*
|
|
24
|
+
* This wraps the IO Table for SSL I/O
|
|
25
|
+
*
|
|
26
|
+
*
|
|
27
|
+
* Writes and reads will always use SSL_write and SSL_read methods respectively.
|
|
28
|
+
* I/O will be preemptively scheduled whenever:
|
|
29
|
+
*
|
|
30
|
+
* - SSL_want_read() is true
|
|
31
|
+
* - The wbio is not empty
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
typedef struct {
|
|
35
|
+
IOTSSL_COMMON_FIELDS
|
|
36
|
+
void *event; /**< Event pointer (parent->create_event) */
|
|
37
|
+
void *arg; /**< Argument to pass for user-defined callback */
|
|
38
|
+
short requested; /**< User defined event flags */
|
|
39
|
+
short fakewhich; /**< Flags to deliver immediately */
|
|
40
|
+
lcb_ioE_callback ucb; /**< User defined callback */
|
|
41
|
+
int entered; /**< Whether we are inside a handler */
|
|
42
|
+
int closed;
|
|
43
|
+
lcb_socket_t fd; /**< Socket descriptor */
|
|
44
|
+
lcbio_pTIMER as_fake;
|
|
45
|
+
lcb_SIZE last_nw; /**< Last failed call to SSL_write() */
|
|
46
|
+
} lcbio_ESSL;
|
|
47
|
+
|
|
48
|
+
#ifdef USE_EAGAIN
|
|
49
|
+
#define C_EAGAIN EWOULDBLOCK: case EAGAIN
|
|
50
|
+
#else
|
|
51
|
+
#define C_EAGAIN EWOULDBLOCK
|
|
52
|
+
#endif
|
|
53
|
+
|
|
54
|
+
#define ES_FROM_IOPS(iops) (lcbio_ESSL *)(IOTSSL_FROM_IOPS(iops))
|
|
55
|
+
#define MINIMUM(a,b) a < b ? a : b
|
|
56
|
+
|
|
57
|
+
static int maybe_error(lcbio_ESSL *es, int rv) {
|
|
58
|
+
return iotssl_maybe_error((lcbio_XSSL *)es, rv);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static void event_handler(lcb_socket_t, short, void *);
|
|
62
|
+
|
|
63
|
+
#define SCHEDULE_PENDING_SAFE(es) if (!(es)->entered) { schedule_pending(es); }
|
|
64
|
+
/* Schedule watch events:
|
|
65
|
+
* - If we have SSL data to be written, the watcher is activated for WRITE_EVENT
|
|
66
|
+
* - If SSL_pending() is true and the user has requested read, the as_fake
|
|
67
|
+
* handler is triggered
|
|
68
|
+
*/
|
|
69
|
+
static void
|
|
70
|
+
schedule_pending(lcbio_ESSL *es)
|
|
71
|
+
{
|
|
72
|
+
short avail = LCB_WRITE_EVENT;
|
|
73
|
+
/* Bitflags of events that the SSL pointer needs in order to progress */
|
|
74
|
+
short wanted = 0;
|
|
75
|
+
|
|
76
|
+
IOTSSL_PENDING_PRECHECK(es->ssl);
|
|
77
|
+
if (IOTSSL_IS_PENDING(es->ssl)) {
|
|
78
|
+
/* have user data in buffer */
|
|
79
|
+
avail |= LCB_READ_EVENT;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (SSL_want_read(es->ssl)) {
|
|
83
|
+
/* SSL need data from the network */
|
|
84
|
+
wanted |= LCB_READ_EVENT;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (BIO_ctrl_pending(es->wbio)) {
|
|
88
|
+
/* have data to flush */
|
|
89
|
+
wanted |= LCB_WRITE_EVENT;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* set the events to deliver on the next 'fake' event. This will be all
|
|
93
|
+
* the available events AND'ed with all the events the user cared about */
|
|
94
|
+
es->fakewhich = avail;
|
|
95
|
+
if (es->fakewhich & es->requested) {
|
|
96
|
+
lcbio_async_signal(es->as_fake);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if ((es->requested & LCB_READ_EVENT) && (avail & LCB_READ_EVENT) == 0) {
|
|
100
|
+
/* if the user wanted application data but nothing is currently
|
|
101
|
+
* available in the SSL's internal buffer, request a read as demanded
|
|
102
|
+
* by the application. */
|
|
103
|
+
wanted |= LCB_READ_EVENT;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* Schedule events to watch for here */
|
|
107
|
+
IOT_V0EV(es->orig).watch(
|
|
108
|
+
IOT_ARG(es->orig), es->fd, es->event, wanted, es, event_handler);
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Reads encrypted data from the socket into SSL */
|
|
113
|
+
static int
|
|
114
|
+
read_ssl_data(lcbio_ESSL *es)
|
|
115
|
+
{
|
|
116
|
+
BUF_MEM *rmb;
|
|
117
|
+
int nr;
|
|
118
|
+
lcbio_pTABLE iot = es->orig;
|
|
119
|
+
|
|
120
|
+
/* This block is an optimization over BIO_write to avoid copying the memory
|
|
121
|
+
* to a temporary buffer and _then_ copying it into the BIO */
|
|
122
|
+
|
|
123
|
+
BIO_get_mem_ptr(es->rbio, &rmb);
|
|
124
|
+
while (1) {
|
|
125
|
+
/* I don't know why this is here, but it's found inside BIO_write */
|
|
126
|
+
BIO_clear_retry_flags(es->rbio);
|
|
127
|
+
iotssl_bm_reserve(rmb);
|
|
128
|
+
nr = IOT_V0IO(iot).recv(IOT_ARG(iot), es->fd,
|
|
129
|
+
rmb->data + rmb->length, rmb->max - rmb->length, 0);
|
|
130
|
+
|
|
131
|
+
if (nr > 0) {
|
|
132
|
+
/* Extend the BIO used length */
|
|
133
|
+
rmb->length += nr;
|
|
134
|
+
} else if (nr == 0) {
|
|
135
|
+
es->closed = 1;
|
|
136
|
+
return -1;
|
|
137
|
+
} else {
|
|
138
|
+
switch (IOT_ERRNO(iot)) {
|
|
139
|
+
case C_EAGAIN:
|
|
140
|
+
return 0;
|
|
141
|
+
case EINTR:
|
|
142
|
+
continue;
|
|
143
|
+
default:
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/* CONSTCOND */
|
|
149
|
+
return 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Writes encrypted data from SSL over to the network */
|
|
153
|
+
static int
|
|
154
|
+
flush_ssl_data(lcbio_ESSL *es)
|
|
155
|
+
{
|
|
156
|
+
BUF_MEM *wmb;
|
|
157
|
+
char *tmp_p;
|
|
158
|
+
int tmp_len, nw;
|
|
159
|
+
lcbio_pTABLE iot = es->orig;
|
|
160
|
+
|
|
161
|
+
BIO_get_mem_ptr(es->wbio, &wmb);
|
|
162
|
+
tmp_p = wmb->data;
|
|
163
|
+
tmp_len = wmb->length;
|
|
164
|
+
|
|
165
|
+
/* We use this block of code over BIO_read() as we have no guarantee that
|
|
166
|
+
* we'll be able to flush all the bytes received from BIO_read(), and
|
|
167
|
+
* BIO has no way to "put back" some bytes. Thus this block is not an
|
|
168
|
+
* optimization but a necessity.
|
|
169
|
+
*
|
|
170
|
+
* tmp_len is the number of bytes originally inside the BUF_MEM structure.
|
|
171
|
+
* It is decremented each time we write data from the network.
|
|
172
|
+
*
|
|
173
|
+
* The loop here terminates until we get a WOULDBLOCK from the socket or we
|
|
174
|
+
* have no more data left to write.
|
|
175
|
+
*/
|
|
176
|
+
while (tmp_len) {
|
|
177
|
+
nw = IOT_V0IO(iot).send(IOT_ARG(iot), es->fd, tmp_p, tmp_len, 0);
|
|
178
|
+
if (nw > 0) {
|
|
179
|
+
tmp_len -= nw;
|
|
180
|
+
tmp_p += nw;
|
|
181
|
+
continue;
|
|
182
|
+
} else if (nw == 0) {
|
|
183
|
+
return -1;
|
|
184
|
+
} else {
|
|
185
|
+
switch (IOT_ERRNO(iot)) {
|
|
186
|
+
case C_EAGAIN:
|
|
187
|
+
goto GT_WRITE_DONE;
|
|
188
|
+
case EINTR:
|
|
189
|
+
continue;
|
|
190
|
+
default:
|
|
191
|
+
return -1;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* TODO: This block is inefficient as it results in a bunch of memmove()
|
|
197
|
+
* calls. While we could have done this inline with the send() call this
|
|
198
|
+
* would make future optimization more difficult. */
|
|
199
|
+
GT_WRITE_DONE:
|
|
200
|
+
while (wmb->length > (size_t)tmp_len) {
|
|
201
|
+
char dummy[4096];
|
|
202
|
+
unsigned to_read = MINIMUM(wmb->length-tmp_len, sizeof dummy);
|
|
203
|
+
BIO_read(es->wbio, dummy, to_read);
|
|
204
|
+
}
|
|
205
|
+
BIO_clear_retry_flags(es->wbio);
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* This is the raw event handler called from the underlying IOPS */
|
|
210
|
+
static void
|
|
211
|
+
event_handler(lcb_socket_t fd, short which, void *arg)
|
|
212
|
+
{
|
|
213
|
+
lcbio_ESSL *es = arg;
|
|
214
|
+
int rv = 0;
|
|
215
|
+
int u_which;
|
|
216
|
+
es->entered++;
|
|
217
|
+
|
|
218
|
+
if (which & LCB_READ_EVENT) {
|
|
219
|
+
rv = read_ssl_data(es);
|
|
220
|
+
}
|
|
221
|
+
if (rv == 0 && (which & LCB_WRITE_EVENT)) {
|
|
222
|
+
rv = flush_ssl_data(es);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (rv == -1) {
|
|
226
|
+
es->error = 1;
|
|
227
|
+
|
|
228
|
+
/* stop internal watcher */
|
|
229
|
+
IOT_V0EV(es->orig).watch(
|
|
230
|
+
IOT_ARG(es->orig), es->fd, es->event, 0, NULL, NULL);
|
|
231
|
+
|
|
232
|
+
/* send/recv will detect es->error and return -1/EINVAL appropriately */
|
|
233
|
+
if (es->requested && es->ucb) {
|
|
234
|
+
es->ucb(fd, es->requested, es->arg);
|
|
235
|
+
}
|
|
236
|
+
es->entered--;
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* deliver stuff back to the user: */
|
|
241
|
+
u_which = 0;
|
|
242
|
+
if (es->requested & LCB_READ_EVENT) {
|
|
243
|
+
u_which |= LCB_READ_EVENT;
|
|
244
|
+
}
|
|
245
|
+
if (es->requested & LCB_WRITE_EVENT) {
|
|
246
|
+
u_which |= LCB_WRITE_EVENT;
|
|
247
|
+
}
|
|
248
|
+
if (es->ucb && u_which) {
|
|
249
|
+
es->ucb(fd, u_which & es->requested, es->arg);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* socket closed. Don't reschedule */
|
|
253
|
+
if (es->fd == -1) {
|
|
254
|
+
es->entered--;
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
es->entered--;
|
|
259
|
+
schedule_pending(es);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* User events are delivered out-of-sync with SSL events. This is mainly with
|
|
263
|
+
* respect to write events. */
|
|
264
|
+
static void
|
|
265
|
+
fake_signal(void *arg)
|
|
266
|
+
{
|
|
267
|
+
lcbio_ESSL *es = arg;
|
|
268
|
+
short which = es->fakewhich;
|
|
269
|
+
es->fakewhich = 0;
|
|
270
|
+
es->entered++;
|
|
271
|
+
|
|
272
|
+
/* invoke the callback */
|
|
273
|
+
which &= es->requested;
|
|
274
|
+
if (which && es->ucb) {
|
|
275
|
+
es->ucb(es->fd, which, es->arg);
|
|
276
|
+
}
|
|
277
|
+
es->entered--;
|
|
278
|
+
schedule_pending(es);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
static int
|
|
282
|
+
start_watch(lcb_io_opt_t iops, lcb_socket_t sock, void *event, short which,
|
|
283
|
+
void *uarg, lcb_ioE_callback callback)
|
|
284
|
+
{
|
|
285
|
+
lcbio_ESSL *es = ES_FROM_IOPS(iops);
|
|
286
|
+
es->arg = uarg;
|
|
287
|
+
es->requested = which;
|
|
288
|
+
es->ucb = callback;
|
|
289
|
+
|
|
290
|
+
SCHEDULE_PENDING_SAFE(es);
|
|
291
|
+
|
|
292
|
+
(void)event;
|
|
293
|
+
(void)sock;
|
|
294
|
+
|
|
295
|
+
return 0;
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
static void
|
|
300
|
+
stop_watch(lcb_io_opt_t iops, lcb_socket_t sock, void *event)
|
|
301
|
+
{
|
|
302
|
+
start_watch(iops, sock, event, 0, NULL, NULL);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
/** socket routines go here now.. */
|
|
307
|
+
static lcb_ssize_t
|
|
308
|
+
Essl_recv(lcb_io_opt_t iops, lcb_socket_t sock, void *buf, lcb_size_t nbuf,
|
|
309
|
+
int ign)
|
|
310
|
+
{
|
|
311
|
+
lcbio_ESSL *es = ES_FROM_IOPS(iops);
|
|
312
|
+
int rv = SSL_read(es->ssl, buf, nbuf);
|
|
313
|
+
|
|
314
|
+
if (es->error) {
|
|
315
|
+
IOTSSL_ERRNO(es) = EINVAL;
|
|
316
|
+
return -1;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (rv >= 0) {
|
|
320
|
+
/* data or clean shutdown */
|
|
321
|
+
return rv;
|
|
322
|
+
} else if (es->closed) {
|
|
323
|
+
return 0;
|
|
324
|
+
} else if (maybe_error(es, rv) != 0) {
|
|
325
|
+
IOTSSL_ERRNO(es) = EINVAL;
|
|
326
|
+
} else {
|
|
327
|
+
IOTSSL_ERRNO(es) = EWOULDBLOCK;
|
|
328
|
+
}
|
|
329
|
+
(void) ign; (void) sock;
|
|
330
|
+
return -1;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
static lcb_ssize_t
|
|
334
|
+
Essl_send(lcb_io_opt_t iops, lcb_socket_t sock, const void *buf, lcb_size_t nbuf,
|
|
335
|
+
int ign)
|
|
336
|
+
{
|
|
337
|
+
lcbio_ESSL *es = ES_FROM_IOPS(iops);
|
|
338
|
+
int rv;
|
|
339
|
+
(void) ign; (void) sock;
|
|
340
|
+
|
|
341
|
+
if (es->error) {
|
|
342
|
+
IOTSSL_ERRNO(es) = EINVAL;
|
|
343
|
+
return -1;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
rv = SSL_write(es->ssl, buf, nbuf);
|
|
347
|
+
if (rv >= 0) {
|
|
348
|
+
/* still need to schedule data to get flushed to the network */
|
|
349
|
+
SCHEDULE_PENDING_SAFE(es);
|
|
350
|
+
return rv;
|
|
351
|
+
} else if (maybe_error(es, rv)) {
|
|
352
|
+
IOTSSL_ERRNO(es) = EINVAL;
|
|
353
|
+
return -1;
|
|
354
|
+
} else {
|
|
355
|
+
IOTSSL_ERRNO(es) = EWOULDBLOCK;
|
|
356
|
+
return -1;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
static lcb_ssize_t
|
|
361
|
+
Essl_recvv(lcb_io_opt_t iops, lcb_socket_t sock, lcb_IOV *iov, lcb_size_t niov) {
|
|
362
|
+
(void) niov;
|
|
363
|
+
return Essl_recv(iops, sock, iov->iov_base, iov->iov_len, 0);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
static lcb_ssize_t
|
|
367
|
+
Essl_sendv(lcb_io_opt_t iops, lcb_socket_t sock, lcb_IOV *iov, lcb_size_t niov) {
|
|
368
|
+
(void) niov;
|
|
369
|
+
return Essl_send(iops, sock, iov->iov_base, iov->iov_len, 0);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
static void
|
|
373
|
+
Essl_close(lcb_io_opt_t iops, lcb_socket_t fd)
|
|
374
|
+
{
|
|
375
|
+
lcbio_ESSL *es = ES_FROM_IOPS(iops);
|
|
376
|
+
IOT_V0IO(es->orig).close(IOT_ARG(es->orig), fd);
|
|
377
|
+
es->fd = -1;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
static void
|
|
381
|
+
Essl_dtor(void *arg)
|
|
382
|
+
{
|
|
383
|
+
lcbio_ESSL *es = arg;
|
|
384
|
+
IOT_V0EV(es->orig).destroy(IOT_ARG(es->orig), es->event);
|
|
385
|
+
lcbio_timer_destroy(es->as_fake);
|
|
386
|
+
iotssl_destroy_common((lcbio_XSSL *)es);
|
|
387
|
+
free(es);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
lcbio_pTABLE
|
|
391
|
+
lcbio_Essl_new(lcbio_pTABLE orig, lcb_socket_t fd, SSL_CTX *sctx)
|
|
392
|
+
{
|
|
393
|
+
lcbio_ESSL *es = calloc(1, sizeof(*es));
|
|
394
|
+
lcbio_TABLE *iot = &es->base_;
|
|
395
|
+
es->fd = fd;
|
|
396
|
+
es->as_fake = lcbio_timer_new(orig, es, fake_signal);
|
|
397
|
+
es->event = IOT_V0EV(orig).create(IOT_ARG(orig));
|
|
398
|
+
iot->u_io.v0.ev.watch = start_watch;
|
|
399
|
+
iot->u_io.v0.ev.cancel = stop_watch;
|
|
400
|
+
iot->u_io.v0.io.recv = Essl_recv;
|
|
401
|
+
iot->u_io.v0.io.send = Essl_send;
|
|
402
|
+
iot->u_io.v0.io.recvv = Essl_recvv;
|
|
403
|
+
iot->u_io.v0.io.sendv = Essl_sendv;
|
|
404
|
+
iot->u_io.v0.io.close = Essl_close;
|
|
405
|
+
iot->dtor = Essl_dtor;
|
|
406
|
+
iotssl_init_common((lcbio_XSSL *)es, orig, sctx);
|
|
407
|
+
return iot;
|
|
408
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#ifndef LCB_SSL_IOTCOMMON
|
|
19
|
+
#define LCB_SSL_IOTCOMMON
|
|
20
|
+
|
|
21
|
+
#include <lcbio/lcbio.h>
|
|
22
|
+
#include <lcbio/iotable.h>
|
|
23
|
+
#include <lcbio/timer-ng.h>
|
|
24
|
+
#include <stddef.h>
|
|
25
|
+
#include <errno.h>
|
|
26
|
+
#include <openssl/ssl.h>
|
|
27
|
+
#include <lcbio/ssl.h>
|
|
28
|
+
|
|
29
|
+
#define IOTSSL_COMMON_FIELDS \
|
|
30
|
+
lcbio_TABLE base_; /**< Base table structure to export */ \
|
|
31
|
+
lcbio_pTABLE orig; /**< Table pointer we are wrapping */ \
|
|
32
|
+
SSL *ssl; /**< SSL object */ \
|
|
33
|
+
BIO *wbio; /**< BIO used for writing data to network */ \
|
|
34
|
+
BIO *rbio; /**<< BIO used for reading data from network */\
|
|
35
|
+
lcb_io_opt_t iops_dummy_; /**< Dummy IOPS structure which is exposed to LCB */ \
|
|
36
|
+
int error; /**< Internal error flag set once a fatal error is detect */\
|
|
37
|
+
lcb_error_t errcode; /**< The error, converted into libcouchbase */
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @brief
|
|
41
|
+
* This is the 'base' class for the lcbio_TABLE with SSL. This contains the
|
|
42
|
+
* core BIO and SSL structures as well as some other boilerplate needed to
|
|
43
|
+
* expose a complete lcbio_TABLE interface to the rest of the library.
|
|
44
|
+
*
|
|
45
|
+
* This is 'subclassed' as lcbio_CSSL and lcbio_ESSL for Completion and Event
|
|
46
|
+
* based I/O models respectively.
|
|
47
|
+
*/
|
|
48
|
+
typedef struct {
|
|
49
|
+
IOTSSL_COMMON_FIELDS
|
|
50
|
+
} lcbio_XSSL;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @brief Get the associated lcbio_XSSL from an iops pointer
|
|
54
|
+
* @param iops the IOPS structure
|
|
55
|
+
* @return the lcbio_XSSL pointer
|
|
56
|
+
*/
|
|
57
|
+
#define IOTSSL_FROM_IOPS(iops) (iops)->v.v0.cookie
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @brief Access the iops `error` field which is exposed to the rest of LCBIO.
|
|
61
|
+
* The rest of the code will inspect this variable when a call fails to retrieve
|
|
62
|
+
* the errno.
|
|
63
|
+
* @param xs the lcbio_XSSL base pointer
|
|
64
|
+
* @return An lvaue to the error field
|
|
65
|
+
*/
|
|
66
|
+
#define IOTSSL_ERRNO(xs) (xs)->iops_dummy_->v.v0.error
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @brief Check and handle SSL errors
|
|
70
|
+
*
|
|
71
|
+
* This function inspects the error state of the current `SSL` object. If a
|
|
72
|
+
* fatal error is detected, the internal error flag is set and pending errors
|
|
73
|
+
* are logged.
|
|
74
|
+
*
|
|
75
|
+
* @param xs The XSSL context
|
|
76
|
+
* @param rv The return code received from an `SSL_read()` or `SSL_write()`
|
|
77
|
+
* @return nonzero if a fatal error has occurred, 0 if the error is transient
|
|
78
|
+
* and is `SSL_ERROR_WANT_READ` or `SSL_ERROR_WANT_WRITE`.
|
|
79
|
+
*
|
|
80
|
+
* @note Do not call this function if `rv` is `>0`.
|
|
81
|
+
*/
|
|
82
|
+
int
|
|
83
|
+
iotssl_maybe_error(lcbio_XSSL *xs, int rv);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Flush errors from the internal error queue. Call this whenever an error
|
|
87
|
+
* has taken place
|
|
88
|
+
* @param xs
|
|
89
|
+
*/
|
|
90
|
+
void
|
|
91
|
+
iotssl_log_errors(lcbio_XSSL *xs);
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* This function acts as the 'base' constructor for lcbio_XSSL. It will
|
|
95
|
+
* initialize and proxy the various timer and run/stop routines to the underlying
|
|
96
|
+
* iops plugin. The 'subclass' is still expected to implement the actual send,
|
|
97
|
+
* recv, close, and event routines.
|
|
98
|
+
*
|
|
99
|
+
* @param xs The lcbio_XSSL pointer to initialize (usually a pointer to a field
|
|
100
|
+
* within the real structure)
|
|
101
|
+
* @param orig The original lcbio_TABLE containing the actual socket I/O routines.
|
|
102
|
+
* @param ctx the `SSL_CTX*` which will be used to create the `SSL*` pointer
|
|
103
|
+
*/
|
|
104
|
+
void
|
|
105
|
+
iotssl_init_common(lcbio_XSSL *xs, lcbio_TABLE *orig, SSL_CTX *ctx);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* This function acts as the base destructor for lcbio_XSSL
|
|
109
|
+
* @param xs the lcbio_XSSL to clean up.
|
|
110
|
+
* After this function has been called, none of the base fields should be
|
|
111
|
+
* considered valid (unless a refcounted item is specifically kept alive).
|
|
112
|
+
*/
|
|
113
|
+
void
|
|
114
|
+
iotssl_destroy_common(lcbio_XSSL *xs);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Reserve a specified amount of bytes for reading into a `BUF_MEM*` structure.
|
|
118
|
+
* Currently the amount reserved is hard coded.
|
|
119
|
+
*
|
|
120
|
+
* Use this function to retrievw a pointer to the unused (but allocated) portion
|
|
121
|
+
* of the `BUF_MEM` structure rather than doing an explicit BIO_write which
|
|
122
|
+
* will result in needless copying of memory. Unfortunately OpenSSL does not have
|
|
123
|
+
* a clean way of growing this buffer but it is possible.
|
|
124
|
+
*
|
|
125
|
+
* @param bm The `BUF_MEM*` structure.
|
|
126
|
+
*
|
|
127
|
+
* @code{.c}
|
|
128
|
+
* BUF_MEM *bm;
|
|
129
|
+
* iotssl_bm_reserve(bm);
|
|
130
|
+
* recv(fd, bm->data, bm->max-mb->length, 0);
|
|
131
|
+
* @endcode
|
|
132
|
+
*/
|
|
133
|
+
void
|
|
134
|
+
iotssl_bm_reserve(BUF_MEM *bm);
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Prepare the SSL structure so that a subsequent call to SSL_pending will
|
|
138
|
+
* actually determine if there's any data available for read
|
|
139
|
+
* @param ssl the SSL object
|
|
140
|
+
* @return
|
|
141
|
+
*/
|
|
142
|
+
#define IOTSSL_PENDING_PRECHECK(ssl) do { \
|
|
143
|
+
char iotssl__dummy; \
|
|
144
|
+
SSL_peek(ssl, &iotssl__dummy, 1); \
|
|
145
|
+
} while (0);
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Wrapper for SSL_pending. In order to work around another bug of the well
|
|
149
|
+
* designed OpenSSL library, which will strangely place "undefined" errors
|
|
150
|
+
* into the queue unless this check is done beforehand.
|
|
151
|
+
*
|
|
152
|
+
* See: https://groups.google.com/forum/#!msg/mailing.openssl.users/so242GuI6Yo/2Jp3Qoo_gsgJ
|
|
153
|
+
* See: http://stackoverflow.com/questions/22753221/openssl-read-write-handshake-data-with-memory-bio
|
|
154
|
+
* See: http://www.opensubscriber.com/message/openssl-users@openssl.org/8638179.html
|
|
155
|
+
*/
|
|
156
|
+
#define IOTSSL_IS_PENDING(ssl) \
|
|
157
|
+
(SSL_get_ssl_method(ssl) != SSLv23_client_method()) && SSL_pending(ssl)
|
|
158
|
+
/**
|
|
159
|
+
* Create and return a pointer to an lcbio_TABLE with an underlying
|
|
160
|
+
* completion-based I/O model
|
|
161
|
+
* @param orig The original table
|
|
162
|
+
* @param sd The socket descriptor which is already connected
|
|
163
|
+
* @param sctx
|
|
164
|
+
* @return NULL on error
|
|
165
|
+
*/
|
|
166
|
+
lcbio_pTABLE
|
|
167
|
+
lcbio_Cssl_new(lcbio_pTABLE orig, lcb_sockdata_t *sd, SSL_CTX *sctx);
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Create and return a pointer to an lcbio_TABLE with an underlying event
|
|
171
|
+
* based I/O model
|
|
172
|
+
* @param orig The original pointer
|
|
173
|
+
* @param fd Socket descriptor
|
|
174
|
+
* @param sctx
|
|
175
|
+
* @return NULL on error.
|
|
176
|
+
*/
|
|
177
|
+
lcbio_pTABLE
|
|
178
|
+
lcbio_Essl_new(lcbio_pTABLE orig, lcb_socket_t fd, SSL_CTX *sctx);
|
|
179
|
+
|
|
180
|
+
#endif
|