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,23 @@
|
|
|
1
|
+
IF(APPLE)
|
|
2
|
+
IF(NOT OpenSSL_DIR)
|
|
3
|
+
EXECUTE_PROCESS(COMMAND brew --prefix openssl
|
|
4
|
+
OUTPUT_VARIABLE OPENSSL_ROOT_DIR
|
|
5
|
+
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
6
|
+
MESSAGE(STATUS "Found OpenSSL Prefix: ${OPENSSL_ROOT_DIR}")
|
|
7
|
+
ENDIF()
|
|
8
|
+
ENDIF()
|
|
9
|
+
|
|
10
|
+
FIND_PACKAGE(OpenSSL)
|
|
11
|
+
IF(OPENSSL_FOUND AND (NOT LCB_NO_SSL))
|
|
12
|
+
INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
|
|
13
|
+
ADD_DEFINITIONS(${OPENSSL_DEFINITIONS})
|
|
14
|
+
ADD_LIBRARY(lcbssl OBJECT ssl_e.c ssl_c.c ssl_common.c)
|
|
15
|
+
SET(lcb_ssl_libs ${OPENSSL_LIBRARIES} PARENT_SCOPE)
|
|
16
|
+
SET(lcb_ssl_objs $<TARGET_OBJECTS:lcbssl> PARENT_SCOPE)
|
|
17
|
+
LCB_UTIL(lcbssl)
|
|
18
|
+
MESSAGE(STATUS "SSL Found")
|
|
19
|
+
ELSE()
|
|
20
|
+
SET(LCB_NO_SSL ON PARENT_SCOPE)
|
|
21
|
+
SET(lcb_ssl_libs "" PARENT_SCOPE)
|
|
22
|
+
MESSAGE(STATUS "SSL Not Found")
|
|
23
|
+
ENDIF()
|
|
@@ -0,0 +1,415 @@
|
|
|
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 "sllist.h"
|
|
20
|
+
#include "sllist-inl.h"
|
|
21
|
+
|
|
22
|
+
/* throw-away write buffer structure (for encoded data) */
|
|
23
|
+
typedef struct {
|
|
24
|
+
void *parent;
|
|
25
|
+
char buf[1];
|
|
26
|
+
} my_WBUF;
|
|
27
|
+
|
|
28
|
+
/* throw-away write buffer structure (for application data) */
|
|
29
|
+
typedef struct {
|
|
30
|
+
sllist_node slnode;
|
|
31
|
+
lcb_ioC_write2_callback cb;
|
|
32
|
+
void *uarg;
|
|
33
|
+
void *iovroot_;
|
|
34
|
+
lcb_IOV *iov;
|
|
35
|
+
lcb_size_t niov;
|
|
36
|
+
} my_WCTX;
|
|
37
|
+
|
|
38
|
+
typedef struct {
|
|
39
|
+
IOTSSL_COMMON_FIELDS
|
|
40
|
+
lcb_sockdata_t *sd; /**< Socket pointer */
|
|
41
|
+
lcbio_pTIMER as_read; /**< For callbacks when SSL_pending > 0 */
|
|
42
|
+
lcbio_pTIMER as_write; /**< For callbacks when SSL_writes succeeds */
|
|
43
|
+
lcb_IOV urd_iov; /**< User-defined buffer to read in applicataion data */
|
|
44
|
+
void *urd_arg; /**< User-defined argument for read callback */
|
|
45
|
+
my_WCTX *wctx_cached;
|
|
46
|
+
lcb_ioC_read2_callback urd_cb; /**< User defined read callback */
|
|
47
|
+
sllist_root writes; /**< List of pending user writes */
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Whether a current read request is active. This read request refers to
|
|
51
|
+
* this module reading raw data from the actual underlying socket. The
|
|
52
|
+
* presence of a user-level (i.e. lcbio-invoked) read request is determined
|
|
53
|
+
* by the presence of a non-NULL urd_cb value
|
|
54
|
+
*/
|
|
55
|
+
int rdactive;
|
|
56
|
+
|
|
57
|
+
int closed; /**< Pending delivery of close */
|
|
58
|
+
int entered;
|
|
59
|
+
} lcbio_CSSL;
|
|
60
|
+
|
|
61
|
+
#define CS_FROM_IOPS(iops) (lcbio_CSSL *)IOTSSL_FROM_IOPS(iops)
|
|
62
|
+
#define SCHEDULE_WANT_SAFE(cs) if (!(cs)->entered) { schedule_wants(cs); }
|
|
63
|
+
|
|
64
|
+
static void appdata_encode(lcbio_CSSL *);
|
|
65
|
+
static void appdata_free_flushed(lcbio_CSSL *);
|
|
66
|
+
static void appdata_read(lcbio_CSSL *);
|
|
67
|
+
static void schedule_wants(lcbio_CSSL *cs);
|
|
68
|
+
static int maybe_set_error(lcbio_CSSL *cs, int rv)
|
|
69
|
+
{
|
|
70
|
+
return iotssl_maybe_error((lcbio_XSSL *)cs, rv);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* This function goes through all the pending copies of data that was scheduled
|
|
74
|
+
* for write and where the current IOV position is at the end (or niov==0).
|
|
75
|
+
* For each of those routines this function will invoke its write callback
|
|
76
|
+
*/
|
|
77
|
+
static void
|
|
78
|
+
appdata_free_flushed(lcbio_CSSL *cs)
|
|
79
|
+
{
|
|
80
|
+
sllist_iterator iter;
|
|
81
|
+
SLLIST_ITERFOR(&cs->writes, &iter) {
|
|
82
|
+
my_WCTX *cur = SLLIST_ITEM(iter.cur, my_WCTX, slnode);
|
|
83
|
+
if (cur->niov && cs->error == 0) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
/* invoke the callback */
|
|
87
|
+
cur->cb(cs->sd, cs->error?-1:0, cur->uarg);
|
|
88
|
+
sllist_iter_remove(&cs->writes, &iter);
|
|
89
|
+
free(cur->iovroot_);
|
|
90
|
+
if (cs->wctx_cached) {
|
|
91
|
+
free(cur);
|
|
92
|
+
} else {
|
|
93
|
+
cs->wctx_cached = cur;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* This function will attempt to encode pending user data into SSL data. This
|
|
99
|
+
* will be output to the wbio. */
|
|
100
|
+
static void
|
|
101
|
+
appdata_encode(lcbio_CSSL *cs)
|
|
102
|
+
{
|
|
103
|
+
sllist_node *cur;
|
|
104
|
+
|
|
105
|
+
/* each element here represents a used-defined write buffer */
|
|
106
|
+
SLLIST_FOREACH(&cs->writes, cur) {
|
|
107
|
+
my_WCTX *ctx = SLLIST_ITEM(cur, my_WCTX, slnode);
|
|
108
|
+
|
|
109
|
+
for (; ctx->niov && cs->error == 0; ctx->niov--, ctx->iov++) {
|
|
110
|
+
int rv;
|
|
111
|
+
|
|
112
|
+
assert(ctx->iov->iov_len);
|
|
113
|
+
rv = SSL_write(cs->ssl, ctx->iov->iov_base, ctx->iov->iov_len);
|
|
114
|
+
if (rv > 0) {
|
|
115
|
+
continue;
|
|
116
|
+
} else if (maybe_set_error(cs, rv) == 0) {
|
|
117
|
+
/* SSL_ERROR_WANT_READ. Should schedule a read here.
|
|
118
|
+
* XXX: Note that this buffer will not be returned to the user
|
|
119
|
+
* until the _next_ time the appdata_free_flushed function is
|
|
120
|
+
* invoked; the call chain for appdata_free_flushed is like this:
|
|
121
|
+
*
|
|
122
|
+
* start_write2 => async_schedule(async_write) => appdata_free_flushed.
|
|
123
|
+
* OR
|
|
124
|
+
* start_write2 => write_callback => appdata_free_flushed
|
|
125
|
+
*/
|
|
126
|
+
SCHEDULE_WANT_SAFE(cs)
|
|
127
|
+
return;
|
|
128
|
+
} else {
|
|
129
|
+
IOTSSL_ERRNO(cs) = EINVAL;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static void
|
|
136
|
+
async_write(void *arg)
|
|
137
|
+
{
|
|
138
|
+
lcbio_CSSL *cs = arg;
|
|
139
|
+
appdata_encode(cs);
|
|
140
|
+
appdata_free_flushed(cs);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Called when SSL data has been written to the socket */
|
|
144
|
+
static void
|
|
145
|
+
write_callback(lcb_sockdata_t *sd, int status, void *arg)
|
|
146
|
+
{
|
|
147
|
+
my_WBUF *wb = arg;
|
|
148
|
+
lcbio_CSSL *cs = wb->parent;
|
|
149
|
+
|
|
150
|
+
if (status) {
|
|
151
|
+
IOTSSL_ERRNO(cs) = IOT_ERRNO(cs->orig);
|
|
152
|
+
cs->error = 1;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
free(wb);
|
|
156
|
+
|
|
157
|
+
appdata_free_flushed(cs);
|
|
158
|
+
lcbio_table_unref(&cs->base_);
|
|
159
|
+
(void) sd;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* Read application data from SSL's rbio buffer. Invokes the user callback
|
|
163
|
+
* for the current read operation if there is data */
|
|
164
|
+
static void
|
|
165
|
+
appdata_read(lcbio_CSSL *cs)
|
|
166
|
+
{
|
|
167
|
+
/* either an error or an actual read event */
|
|
168
|
+
int nr;
|
|
169
|
+
lcb_ioC_read2_callback cb = cs->urd_cb;
|
|
170
|
+
if (!cb) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
assert(!cs->rdactive);
|
|
174
|
+
nr = SSL_read(cs->ssl, cs->urd_iov.iov_base, cs->urd_iov.iov_len);
|
|
175
|
+
if (nr > 0) {
|
|
176
|
+
/* nothing */
|
|
177
|
+
} else if (cs->closed || nr == 0) {
|
|
178
|
+
nr = 0;
|
|
179
|
+
} else if (maybe_set_error(cs, nr) == 0) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
cs->urd_cb = NULL;
|
|
184
|
+
cb(cs->sd, nr, cs->urd_arg);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Invoked when SSL data has been read from the socket */
|
|
188
|
+
static void
|
|
189
|
+
read_callback(lcb_sockdata_t *sd, lcb_ssize_t nr, void *arg)
|
|
190
|
+
{
|
|
191
|
+
lcbio_CSSL *cs = arg;
|
|
192
|
+
cs->rdactive = 0;
|
|
193
|
+
cs->entered++;
|
|
194
|
+
|
|
195
|
+
if (nr > 0) {
|
|
196
|
+
BUF_MEM *mb;
|
|
197
|
+
|
|
198
|
+
BIO_clear_retry_flags(cs->rbio);
|
|
199
|
+
BIO_get_mem_ptr(cs->rbio, &mb);
|
|
200
|
+
mb->length += nr;
|
|
201
|
+
|
|
202
|
+
} else if (nr == 0) {
|
|
203
|
+
cs->closed = 1;
|
|
204
|
+
cs->error = 1;
|
|
205
|
+
|
|
206
|
+
} else {
|
|
207
|
+
cs->error = 1;
|
|
208
|
+
IOTSSL_ERRNO(cs) = IOT_ERRNO(cs->orig);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
appdata_encode(cs);
|
|
212
|
+
appdata_read(cs);
|
|
213
|
+
|
|
214
|
+
cs->entered--;
|
|
215
|
+
schedule_wants(cs);
|
|
216
|
+
lcbio_table_unref(&cs->base_);
|
|
217
|
+
(void) sd;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
/* This function schedules any I/O on the actual socket. It writes encoded
|
|
222
|
+
* data and requests to read decoded data */
|
|
223
|
+
static void
|
|
224
|
+
schedule_wants(lcbio_CSSL *cs)
|
|
225
|
+
{
|
|
226
|
+
size_t npend = BIO_ctrl_pending(cs->wbio);
|
|
227
|
+
char dummy;
|
|
228
|
+
|
|
229
|
+
int has_appdata = 0;
|
|
230
|
+
|
|
231
|
+
if (SSL_peek(cs->ssl, &dummy, 1) == 1) {
|
|
232
|
+
has_appdata = 1;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (npend) {
|
|
236
|
+
/* Have pending data to write. The buffer is copied here because the
|
|
237
|
+
* BIO structure doesn't support "lockdown" semantics like netbuf/rdb
|
|
238
|
+
* do. We might transplant this with a different sort of BIO eventually..
|
|
239
|
+
*/
|
|
240
|
+
my_WBUF *wb = malloc(sizeof(*wb) + npend);
|
|
241
|
+
lcb_IOV iov;
|
|
242
|
+
BIO_read(cs->wbio, wb->buf, npend);
|
|
243
|
+
iov.iov_base = wb->buf;
|
|
244
|
+
iov.iov_len = npend;
|
|
245
|
+
wb->parent = cs;
|
|
246
|
+
|
|
247
|
+
/* Increment the reference count. This is decremented when we get back
|
|
248
|
+
* the callback. The goal is that a pending internal SSL_write() should
|
|
249
|
+
* keep the object alive despite the user having called lcbio_table_unref()
|
|
250
|
+
* on us.
|
|
251
|
+
*/
|
|
252
|
+
lcbio_table_ref(&cs->base_);
|
|
253
|
+
IOT_V1(cs->orig).write2(
|
|
254
|
+
IOT_ARG(cs->orig), cs->sd, &iov, 1, wb, write_callback);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* Only schedule additional reads if we're not already in the process of a
|
|
258
|
+
* read */
|
|
259
|
+
|
|
260
|
+
if (cs->rdactive == 0) {
|
|
261
|
+
if (cs->error) {
|
|
262
|
+
/* This can happen if we got an SSL error in performing something
|
|
263
|
+
* within this callback.
|
|
264
|
+
*
|
|
265
|
+
* In this case, just signal "as-if" a read happened. appdata_read
|
|
266
|
+
* will do the right thing if there is no read callback, and will
|
|
267
|
+
* return an error if SSL_read() fails (which it should).
|
|
268
|
+
*/
|
|
269
|
+
lcbio_async_signal(cs->as_read);
|
|
270
|
+
|
|
271
|
+
} else if (SSL_want_read(cs->ssl) || (cs->urd_cb && has_appdata == 0)) {
|
|
272
|
+
/* request more data from the socket */
|
|
273
|
+
BUF_MEM *mb;
|
|
274
|
+
lcb_IOV iov;
|
|
275
|
+
|
|
276
|
+
cs->rdactive = 1;
|
|
277
|
+
BIO_get_mem_ptr(cs->rbio, &mb);
|
|
278
|
+
iotssl_bm_reserve(mb);
|
|
279
|
+
iov.iov_base = mb->data + mb->length;
|
|
280
|
+
iov.iov_len = mb->max - mb->length;
|
|
281
|
+
lcbio_table_ref(&cs->base_);
|
|
282
|
+
IOT_V1(cs->orig).read2(
|
|
283
|
+
IOT_ARG(cs->orig), cs->sd, &iov, 1, cs, read_callback);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
static int
|
|
290
|
+
Cssl_read2(lcb_io_opt_t iops, lcb_sockdata_t *sd, lcb_IOV *iov, lcb_size_t niov,
|
|
291
|
+
void *uarg, lcb_ioC_read2_callback callback)
|
|
292
|
+
{
|
|
293
|
+
lcbio_CSSL *cs = CS_FROM_IOPS(iops);
|
|
294
|
+
cs->urd_iov = *iov;
|
|
295
|
+
cs->urd_arg = uarg;
|
|
296
|
+
cs->urd_cb = callback;
|
|
297
|
+
|
|
298
|
+
IOTSSL_PENDING_PRECHECK(cs->ssl);
|
|
299
|
+
if (IOTSSL_IS_PENDING(cs->ssl)) {
|
|
300
|
+
/* have data to be read. Fast path here */
|
|
301
|
+
lcbio_async_signal(cs->as_read);
|
|
302
|
+
} else {
|
|
303
|
+
SCHEDULE_WANT_SAFE(cs);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
(void) niov; (void) sd;
|
|
307
|
+
return 0;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
static int
|
|
311
|
+
Cssl_write2(lcb_io_opt_t io, lcb_sockdata_t *sd, lcb_IOV *iov, lcb_size_t niov,
|
|
312
|
+
void *uarg, lcb_ioC_write2_callback callback)
|
|
313
|
+
{
|
|
314
|
+
lcbio_CSSL *cs = CS_FROM_IOPS(io);
|
|
315
|
+
my_WCTX *wc;
|
|
316
|
+
|
|
317
|
+
/* We keep one of these cached inside the cs structure so we don't have
|
|
318
|
+
* to make a new malloc for each write */
|
|
319
|
+
if (cs->wctx_cached) {
|
|
320
|
+
wc = cs->wctx_cached;
|
|
321
|
+
cs->wctx_cached = NULL;
|
|
322
|
+
memset(wc, 0, sizeof *wc);
|
|
323
|
+
} else {
|
|
324
|
+
wc = calloc(1, sizeof(*wc));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/* assign the common parameters */
|
|
328
|
+
wc->uarg = uarg;
|
|
329
|
+
wc->cb = callback;
|
|
330
|
+
|
|
331
|
+
/* If the socket does not have a pending error and there are no other
|
|
332
|
+
* writes before this, then try to write the current buffer immediately. */
|
|
333
|
+
if (cs->error == 0 && SLLIST_IS_EMPTY(&cs->writes)) {
|
|
334
|
+
unsigned ii;
|
|
335
|
+
for (ii = 0; ii < niov; ++ii) {
|
|
336
|
+
int rv = SSL_write(cs->ssl, iov->iov_base, iov->iov_len);
|
|
337
|
+
if (rv > 0) {
|
|
338
|
+
iov++;
|
|
339
|
+
niov--;
|
|
340
|
+
} else {
|
|
341
|
+
maybe_set_error(cs, rv);
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/* We add this now in order for the SLLIST_IS_EMPTY to be false before, if
|
|
348
|
+
* no other items were pending */
|
|
349
|
+
sllist_append(&cs->writes, &wc->slnode);
|
|
350
|
+
|
|
351
|
+
/* If we have some IOVs remaining then it means we couldn't write all the
|
|
352
|
+
* data. If so, reschedule and place in the queue for later */
|
|
353
|
+
if (niov && cs->error == 0) {
|
|
354
|
+
wc->niov = niov;
|
|
355
|
+
wc->iov = malloc(sizeof (*iov) * wc->niov);
|
|
356
|
+
wc->iovroot_ = wc->iov;
|
|
357
|
+
memcpy(wc->iov, iov, sizeof (*iov) * niov);
|
|
358
|
+
/* This function will try to schedule the proper events. We need at least
|
|
359
|
+
* one SSL_write() in order to advance the state machine. In the future
|
|
360
|
+
* we could determine if we performed a previous SSL_write above */
|
|
361
|
+
appdata_encode(cs);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* In most cases we will want to deliver the "flushed" notification */
|
|
365
|
+
lcbio_async_signal(cs->as_write);
|
|
366
|
+
(void) sd;
|
|
367
|
+
return 0;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
static unsigned
|
|
371
|
+
Cssl_close(lcb_io_opt_t io, lcb_sockdata_t *sd)
|
|
372
|
+
{
|
|
373
|
+
lcbio_CSSL *cs = CS_FROM_IOPS(io);
|
|
374
|
+
IOT_V1(cs->orig).close(IOT_ARG(cs->orig), sd);
|
|
375
|
+
cs->error = 1;
|
|
376
|
+
if (!SLLIST_IS_EMPTY(&cs->writes)) {
|
|
377
|
+
/* It is possible that a prior call to SSL_write returned an SSL_want_read
|
|
378
|
+
* and the next subsequent call to the underlying read API returned an
|
|
379
|
+
* error. For this reason we signal to the as_write function (which
|
|
380
|
+
* then calls the appdata_free_flushed function) in case we have such
|
|
381
|
+
* leftover data.
|
|
382
|
+
*/
|
|
383
|
+
lcbio_async_signal(cs->as_write);
|
|
384
|
+
}
|
|
385
|
+
return 0;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
static void
|
|
389
|
+
Cssl_dtor(void *arg)
|
|
390
|
+
{
|
|
391
|
+
lcbio_CSSL *cs = arg;
|
|
392
|
+
assert(SLLIST_IS_EMPTY(&cs->writes));
|
|
393
|
+
lcbio_timer_destroy(cs->as_read);
|
|
394
|
+
lcbio_timer_destroy(cs->as_write);
|
|
395
|
+
iotssl_destroy_common((lcbio_XSSL *)cs);
|
|
396
|
+
free(cs->wctx_cached);
|
|
397
|
+
free(arg);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
lcbio_pTABLE
|
|
401
|
+
lcbio_Cssl_new(lcbio_pTABLE orig, lcb_sockdata_t *sd, SSL_CTX *sctx)
|
|
402
|
+
{
|
|
403
|
+
lcbio_CSSL *ret = calloc(1, sizeof(*ret));
|
|
404
|
+
lcbio_pTABLE iot = &ret->base_;
|
|
405
|
+
ret->sd = sd;
|
|
406
|
+
ret->as_read = lcbio_timer_new(orig, ret, (void (*)(void*))appdata_read);
|
|
407
|
+
ret->as_write = lcbio_timer_new(orig, ret, async_write);
|
|
408
|
+
ret->base_.dtor = Cssl_dtor;
|
|
409
|
+
|
|
410
|
+
iot->u_io.completion.read2 = Cssl_read2;
|
|
411
|
+
iot->u_io.completion.write2 = Cssl_write2;
|
|
412
|
+
iot->u_io.completion.close = Cssl_close;
|
|
413
|
+
iotssl_init_common((lcbio_XSSL *)ret, orig, sctx);
|
|
414
|
+
return iot;
|
|
415
|
+
}
|
|
@@ -0,0 +1,454 @@
|
|
|
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
|
+
/**
|
|
19
|
+
* This file contains the common bucket of routines necessary for interfacing
|
|
20
|
+
* with OpenSSL.
|
|
21
|
+
*/
|
|
22
|
+
#include "ssl_iot_common.h"
|
|
23
|
+
#include "settings.h"
|
|
24
|
+
#include "logging.h"
|
|
25
|
+
#include <openssl/err.h>
|
|
26
|
+
|
|
27
|
+
#define LOGARGS(ssl, lvl) \
|
|
28
|
+
((lcbio_SOCKET*)SSL_get_app_data(ssl))->settings, "SSL", lvl, __FILE__, __LINE__
|
|
29
|
+
static char *global_event = "dummy event for ssl";
|
|
30
|
+
|
|
31
|
+
/******************************************************************************
|
|
32
|
+
******************************************************************************
|
|
33
|
+
** Boilerplate lcbio_TABLE Wrappers **
|
|
34
|
+
******************************************************************************
|
|
35
|
+
******************************************************************************/
|
|
36
|
+
static void loop_run(lcb_io_opt_t io) {
|
|
37
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
38
|
+
IOT_START(xs->orig);
|
|
39
|
+
}
|
|
40
|
+
static void loop_stop(lcb_io_opt_t io) {
|
|
41
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
42
|
+
IOT_STOP(xs->orig);
|
|
43
|
+
}
|
|
44
|
+
static void *create_event(lcb_io_opt_t io) {
|
|
45
|
+
(void)io;
|
|
46
|
+
return global_event;
|
|
47
|
+
}
|
|
48
|
+
static void destroy_event(lcb_io_opt_t io, void *event) {
|
|
49
|
+
(void) io; (void) event;
|
|
50
|
+
}
|
|
51
|
+
static void *create_timer(lcb_io_opt_t io) {
|
|
52
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
53
|
+
return xs->orig->timer.create(IOT_ARG(xs->orig));
|
|
54
|
+
}
|
|
55
|
+
static int schedule_timer(lcb_io_opt_t io, void *timer, lcb_uint32_t us,
|
|
56
|
+
void *arg, lcb_ioE_callback callback) {
|
|
57
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
58
|
+
return xs->orig->timer.schedule(IOT_ARG(xs->orig), timer, us, arg, callback);
|
|
59
|
+
}
|
|
60
|
+
static void destroy_timer(lcb_io_opt_t io, void *timer) {
|
|
61
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
62
|
+
xs->orig->timer.destroy(IOT_ARG(xs->orig), timer);
|
|
63
|
+
}
|
|
64
|
+
static void cancel_timer(lcb_io_opt_t io, void *timer) {
|
|
65
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
66
|
+
xs->orig->timer.cancel(IOT_ARG(xs->orig), timer);
|
|
67
|
+
}
|
|
68
|
+
static int Eis_closed(lcb_io_opt_t io, lcb_socket_t sock, int flags) {
|
|
69
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
70
|
+
return xs->orig->u_io.v0.io.is_closed(IOT_ARG(xs->orig), sock, flags);
|
|
71
|
+
}
|
|
72
|
+
static int Cis_closed(lcb_io_opt_t io, lcb_sockdata_t *sd, int flags) {
|
|
73
|
+
lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
|
|
74
|
+
return xs->orig->u_io.completion.is_closed(IOT_ARG(xs->orig), sd, flags);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/******************************************************************************
|
|
78
|
+
******************************************************************************
|
|
79
|
+
** Common Routines for lcbio_TABLE Emulation **
|
|
80
|
+
******************************************************************************
|
|
81
|
+
******************************************************************************/
|
|
82
|
+
void
|
|
83
|
+
iotssl_init_common(lcbio_XSSL *xs, lcbio_TABLE *orig, SSL_CTX *sctx)
|
|
84
|
+
{
|
|
85
|
+
lcbio_TABLE *base = &xs->base_;
|
|
86
|
+
xs->iops_dummy_ = calloc(1, sizeof(*xs->iops_dummy_));
|
|
87
|
+
xs->iops_dummy_->v.v0.cookie = xs;
|
|
88
|
+
xs->orig = orig;
|
|
89
|
+
base->model = xs->orig->model;
|
|
90
|
+
base->p = xs->iops_dummy_;
|
|
91
|
+
base->refcount = 1;
|
|
92
|
+
base->loop.start = loop_run;
|
|
93
|
+
base->loop.stop = loop_stop;
|
|
94
|
+
base->timer.create = create_timer;
|
|
95
|
+
base->timer.destroy = destroy_timer;
|
|
96
|
+
base->timer.schedule = schedule_timer;
|
|
97
|
+
base->timer.cancel = cancel_timer;
|
|
98
|
+
|
|
99
|
+
if (orig->model == LCB_IOMODEL_EVENT) {
|
|
100
|
+
base->u_io.v0.ev.create = create_event;
|
|
101
|
+
base->u_io.v0.ev.destroy = destroy_event;
|
|
102
|
+
base->u_io.v0.io.is_closed = Eis_closed;
|
|
103
|
+
} else {
|
|
104
|
+
base->u_io.completion.is_closed = Cis_closed;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
lcbio_table_ref(xs->orig);
|
|
108
|
+
|
|
109
|
+
xs->error = 0;
|
|
110
|
+
xs->ssl = SSL_new(sctx);
|
|
111
|
+
|
|
112
|
+
xs->rbio = BIO_new(BIO_s_mem());
|
|
113
|
+
xs->wbio = BIO_new(BIO_s_mem());
|
|
114
|
+
|
|
115
|
+
SSL_set_bio(xs->ssl, xs->rbio, xs->wbio);
|
|
116
|
+
SSL_set_read_ahead(xs->ssl, 0);
|
|
117
|
+
|
|
118
|
+
/* Indicate that we are a client */
|
|
119
|
+
SSL_set_connect_state(xs->ssl);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
void
|
|
123
|
+
iotssl_destroy_common(lcbio_XSSL *xs)
|
|
124
|
+
{
|
|
125
|
+
free(xs->iops_dummy_);
|
|
126
|
+
SSL_free(xs->ssl);
|
|
127
|
+
lcbio_table_unref(xs->orig);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
void
|
|
131
|
+
iotssl_bm_reserve(BUF_MEM *bm)
|
|
132
|
+
{
|
|
133
|
+
int oldlen;
|
|
134
|
+
oldlen = bm->length;
|
|
135
|
+
while (bm->max - bm->length < 4096) {
|
|
136
|
+
/* there's also a BUF_MEM_grow_clean() but that actually clears the
|
|
137
|
+
* used portion of the buffer */
|
|
138
|
+
BUF_MEM_grow(bm, bm->max + 4096);
|
|
139
|
+
}
|
|
140
|
+
bm->length = oldlen;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void
|
|
144
|
+
iotssl_log_errors(lcbio_XSSL *xs)
|
|
145
|
+
{
|
|
146
|
+
unsigned long curerr;
|
|
147
|
+
while ((curerr = ERR_get_error())) {
|
|
148
|
+
char errbuf[4096];
|
|
149
|
+
ERR_error_string_n(curerr, errbuf, sizeof errbuf);
|
|
150
|
+
lcb_log(LOGARGS(xs->ssl, LCB_LOG_ERROR), "%s", errbuf);
|
|
151
|
+
|
|
152
|
+
if (xs->errcode != LCB_SUCCESS) {
|
|
153
|
+
continue; /* Already set */
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (ERR_GET_LIB(curerr) == ERR_LIB_SSL) {
|
|
157
|
+
switch (ERR_GET_REASON(curerr)) {
|
|
158
|
+
case SSL_R_CERTIFICATE_VERIFY_FAILED:
|
|
159
|
+
case SSL_R_MISSING_VERIFY_MESSAGE:
|
|
160
|
+
xs->errcode = LCB_SSL_CANTVERIFY;
|
|
161
|
+
break;
|
|
162
|
+
|
|
163
|
+
case SSL_R_BAD_PROTOCOL_VERSION_NUMBER:
|
|
164
|
+
case SSL_R_UNKNOWN_PROTOCOL:
|
|
165
|
+
case SSL_R_WRONG_VERSION_NUMBER:
|
|
166
|
+
case SSL_R_UNKNOWN_SSL_VERSION:
|
|
167
|
+
case SSL_R_UNSUPPORTED_SSL_VERSION:
|
|
168
|
+
xs->errcode = LCB_PROTOCOL_ERROR;
|
|
169
|
+
break;
|
|
170
|
+
default:
|
|
171
|
+
xs->errcode = LCB_SSL_ERROR;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
static void
|
|
178
|
+
log_global_errors(lcb_settings *settings)
|
|
179
|
+
{
|
|
180
|
+
unsigned long curerr;
|
|
181
|
+
while ((curerr = ERR_get_error())) {
|
|
182
|
+
char errbuf[4096];
|
|
183
|
+
ERR_error_string_n(curerr, errbuf, sizeof errbuf);
|
|
184
|
+
lcb_log(settings, "SSL", LCB_LOG_ERROR, __FILE__, __LINE__, "SSL Error: %ld, %s", curerr, errbuf);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
int
|
|
189
|
+
iotssl_maybe_error(lcbio_XSSL *xs, int rv)
|
|
190
|
+
{
|
|
191
|
+
assert(rv < 1);
|
|
192
|
+
if (rv == -1) {
|
|
193
|
+
int err = SSL_get_error(xs->ssl, rv);
|
|
194
|
+
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
|
|
195
|
+
/* this is ok. */
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
iotssl_log_errors(xs);
|
|
200
|
+
return -1;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/******************************************************************************
|
|
204
|
+
******************************************************************************
|
|
205
|
+
** Higher Level SSL_CTX Wrappers **
|
|
206
|
+
******************************************************************************
|
|
207
|
+
******************************************************************************/
|
|
208
|
+
static void
|
|
209
|
+
log_callback(const SSL *ssl, int where, int ret)
|
|
210
|
+
{
|
|
211
|
+
const char *retstr = "";
|
|
212
|
+
int should_log = 0;
|
|
213
|
+
lcbio_SOCKET *sock = SSL_get_app_data(ssl);
|
|
214
|
+
/* Ignore low-level SSL stuff */
|
|
215
|
+
|
|
216
|
+
if (where & SSL_CB_ALERT) {
|
|
217
|
+
should_log = 1;
|
|
218
|
+
}
|
|
219
|
+
if (where == SSL_CB_HANDSHAKE_START || where == SSL_CB_HANDSHAKE_DONE) {
|
|
220
|
+
should_log = 1;
|
|
221
|
+
}
|
|
222
|
+
if ((where & SSL_CB_EXIT) && ret == 0) {
|
|
223
|
+
should_log = 1;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (!should_log) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
retstr = SSL_alert_type_string(ret);
|
|
231
|
+
lcb_log(LOGARGS(ssl, LCB_LOG_TRACE), "sock=%p: ST(0x%x). %s. R(0x%x)%s",
|
|
232
|
+
(void*)sock, where, SSL_state_string_long(ssl), ret, retstr);
|
|
233
|
+
|
|
234
|
+
if (where == SSL_CB_HANDSHAKE_DONE) {
|
|
235
|
+
lcb_log(LOGARGS(ssl, LCB_LOG_DEBUG), "sock=%p. Using SSL version %s. Cipher=%s", (void*)sock, SSL_get_version(ssl), SSL_get_cipher_name(ssl));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
#if 0
|
|
240
|
+
static void
|
|
241
|
+
msg_callback(int write_p, int version, int ctype, const void *buf, size_t n,
|
|
242
|
+
SSL *ssl, void *arg)
|
|
243
|
+
{
|
|
244
|
+
printf("Got message (%s). V=0x%x. T=%d. N=%lu\n",
|
|
245
|
+
write_p ? ">" : "<", version, ctype, n);
|
|
246
|
+
(void)ssl; (void)arg; (void)buf;
|
|
247
|
+
}
|
|
248
|
+
#endif
|
|
249
|
+
|
|
250
|
+
struct lcbio_SSLCTX {
|
|
251
|
+
SSL_CTX *ctx;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
lcbio_pSSLCTX
|
|
255
|
+
lcbio_ssl_new(const char *cafile, int noverify, lcb_error_t *errp,
|
|
256
|
+
lcb_settings *settings)
|
|
257
|
+
{
|
|
258
|
+
lcb_error_t err_s;
|
|
259
|
+
lcbio_pSSLCTX ret;
|
|
260
|
+
|
|
261
|
+
if (!errp) {
|
|
262
|
+
errp = &err_s;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
ret = calloc(1, sizeof(*ret));
|
|
266
|
+
if (!ret) {
|
|
267
|
+
*errp = LCB_CLIENT_ENOMEM;
|
|
268
|
+
goto GT_ERR;
|
|
269
|
+
}
|
|
270
|
+
ret->ctx = SSL_CTX_new(SSLv23_client_method());
|
|
271
|
+
if (!ret->ctx) {
|
|
272
|
+
*errp = LCB_SSL_ERROR;
|
|
273
|
+
goto GT_ERR;
|
|
274
|
+
|
|
275
|
+
}
|
|
276
|
+
SSL_CTX_set_cipher_list(ret->ctx, "DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:SEED-SHA:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5");
|
|
277
|
+
// SSL_CTX_set_cipher_list(ret->ctx, "!NULL");
|
|
278
|
+
|
|
279
|
+
if (cafile) {
|
|
280
|
+
if (!SSL_CTX_load_verify_locations(ret->ctx, cafile, NULL)) {
|
|
281
|
+
*errp = LCB_SSL_ERROR;
|
|
282
|
+
goto GT_ERR;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (noverify) {
|
|
287
|
+
SSL_CTX_set_verify(ret->ctx, SSL_VERIFY_NONE, NULL);
|
|
288
|
+
} else {
|
|
289
|
+
SSL_CTX_set_verify(ret->ctx, SSL_VERIFY_PEER, NULL);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
SSL_CTX_set_info_callback(ret->ctx, log_callback);
|
|
293
|
+
#if 0
|
|
294
|
+
SSL_CTX_set_msg_callback(ret->ctx, msg_callback);
|
|
295
|
+
#endif
|
|
296
|
+
|
|
297
|
+
/* this will allow us to do SSL_write and use a different buffer if the
|
|
298
|
+
* first one fails. This is helpful in the scenario where an initial
|
|
299
|
+
* SSL_write() returns an SSL_ERROR_WANT_READ in the ssl_e.c plugin. In
|
|
300
|
+
* such a scenario the correct behavior is to return EWOULDBLOCK. However
|
|
301
|
+
* we have no guarantee that the next time we get a write request we would
|
|
302
|
+
* be using the same buffer.
|
|
303
|
+
*/
|
|
304
|
+
SSL_CTX_set_mode(ret->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
|
|
305
|
+
SSL_CTX_set_options(ret->ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3);
|
|
306
|
+
return ret;
|
|
307
|
+
|
|
308
|
+
GT_ERR:
|
|
309
|
+
log_global_errors(settings);
|
|
310
|
+
if (ret) {
|
|
311
|
+
if (ret->ctx) {
|
|
312
|
+
SSL_CTX_free(ret->ctx);
|
|
313
|
+
}
|
|
314
|
+
free(ret);
|
|
315
|
+
}
|
|
316
|
+
return NULL;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
static void
|
|
320
|
+
noop_dtor(lcbio_PROTOCTX *arg) {
|
|
321
|
+
free(arg);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
lcb_error_t
|
|
325
|
+
lcbio_ssl_apply(lcbio_SOCKET *sock, lcbio_pSSLCTX sctx)
|
|
326
|
+
{
|
|
327
|
+
lcbio_pTABLE old_iot = sock->io, new_iot;
|
|
328
|
+
lcbio_PROTOCTX *sproto;
|
|
329
|
+
|
|
330
|
+
if (old_iot->model == LCB_IOMODEL_EVENT) {
|
|
331
|
+
new_iot = lcbio_Essl_new(old_iot, sock->u.fd, sctx->ctx);
|
|
332
|
+
} else {
|
|
333
|
+
new_iot = lcbio_Cssl_new(old_iot, sock->u.sd, sctx->ctx);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
if (new_iot) {
|
|
337
|
+
sproto = calloc(1, sizeof(*sproto));
|
|
338
|
+
sproto->id = LCBIO_PROTOCTX_SSL;
|
|
339
|
+
sproto->dtor = noop_dtor;
|
|
340
|
+
lcbio_protoctx_add(sock, sproto);
|
|
341
|
+
lcbio_table_unref(old_iot);
|
|
342
|
+
sock->io = new_iot;
|
|
343
|
+
/* just for logging */
|
|
344
|
+
SSL_set_app_data(((lcbio_XSSL *)new_iot)->ssl, sock);
|
|
345
|
+
return LCB_SUCCESS;
|
|
346
|
+
|
|
347
|
+
} else {
|
|
348
|
+
return LCB_ERROR;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
int
|
|
353
|
+
lcbio_ssl_check(lcbio_SOCKET *sock)
|
|
354
|
+
{
|
|
355
|
+
return lcbio_protoctx_get(sock, LCBIO_PROTOCTX_SSL) != NULL;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
lcb_error_t
|
|
359
|
+
lcbio_ssl_get_error(lcbio_SOCKET *sock)
|
|
360
|
+
{
|
|
361
|
+
lcbio_XSSL *xs = (lcbio_XSSL *)sock->io;
|
|
362
|
+
return xs->errcode;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
void
|
|
366
|
+
lcbio_ssl_free(lcbio_pSSLCTX ctx)
|
|
367
|
+
{
|
|
368
|
+
SSL_CTX_free(ctx->ctx);
|
|
369
|
+
free(ctx);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* According to https://www.openssl.org/docs/crypto/threads.html we need
|
|
375
|
+
* to install two functions for locking support, a function that returns
|
|
376
|
+
* a thread ID, and a function which performs locking/unlocking. However later
|
|
377
|
+
* on in the link it says it will select a default implementation to return
|
|
378
|
+
* the thread ID, and thus we only need supply the locking function.
|
|
379
|
+
*/
|
|
380
|
+
#if defined(_POSIX_THREADS)
|
|
381
|
+
#include <pthread.h>
|
|
382
|
+
typedef pthread_mutex_t ossl_LOCKTYPE;
|
|
383
|
+
static void ossl_lock_init(ossl_LOCKTYPE *l) { pthread_mutex_init(l, NULL); }
|
|
384
|
+
static void ossl_lock_acquire(ossl_LOCKTYPE *l) { pthread_mutex_lock(l); }
|
|
385
|
+
static void ossl_lock_release(ossl_LOCKTYPE *l) { pthread_mutex_unlock(l); }
|
|
386
|
+
#elif defined(_WIN32)
|
|
387
|
+
#include <windows.h>
|
|
388
|
+
typedef CRITICAL_SECTION ossl_LOCKTYPE;
|
|
389
|
+
static void ossl_lock_init(ossl_LOCKTYPE *l) { InitializeCriticalSection(l); }
|
|
390
|
+
static void ossl_lock_acquire(ossl_LOCKTYPE *l) { EnterCriticalSection(l); }
|
|
391
|
+
static void ossl_lock_release(ossl_LOCKTYPE *l) { LeaveCriticalSection(l); }
|
|
392
|
+
#else
|
|
393
|
+
typedef char ossl_LOCKTYPE;
|
|
394
|
+
#define ossl_lock_init(l)
|
|
395
|
+
#define ossl_lock_acquire(l)
|
|
396
|
+
#define ossl_lock_release(l)
|
|
397
|
+
#endif
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
static ossl_LOCKTYPE *ossl_locks;
|
|
401
|
+
static void
|
|
402
|
+
ossl_lockfn(int mode, int lkid, const char *f, int line)
|
|
403
|
+
{
|
|
404
|
+
ossl_LOCKTYPE *l = ossl_locks + lkid;
|
|
405
|
+
|
|
406
|
+
if (mode & CRYPTO_LOCK) {
|
|
407
|
+
ossl_lock_acquire(l);
|
|
408
|
+
} else {
|
|
409
|
+
ossl_lock_release(l);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
(void)f;
|
|
413
|
+
(void)line;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
static void
|
|
417
|
+
ossl_init_locks(void)
|
|
418
|
+
{
|
|
419
|
+
unsigned ii, nlocks;
|
|
420
|
+
if (CRYPTO_get_locking_callback() != NULL) {
|
|
421
|
+
/* Someone already set the callback before us. Don't destroy it! */
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
nlocks = CRYPTO_num_locks();
|
|
425
|
+
ossl_locks = malloc(sizeof(*ossl_locks) * nlocks);
|
|
426
|
+
for (ii = 0; ii < nlocks; ii++) {
|
|
427
|
+
ossl_lock_init(ossl_locks + ii);
|
|
428
|
+
}
|
|
429
|
+
CRYPTO_set_locking_callback(ossl_lockfn);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
static volatile int ossl_initialized = 0;
|
|
433
|
+
void lcbio_ssl_global_init(void)
|
|
434
|
+
{
|
|
435
|
+
if (ossl_initialized) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
ossl_initialized = 1;
|
|
439
|
+
SSL_library_init();
|
|
440
|
+
SSL_load_error_strings();
|
|
441
|
+
ossl_init_locks();
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
lcb_error_t
|
|
445
|
+
lcbio_sslify_if_needed(lcbio_SOCKET *sock, lcb_settings *settings)
|
|
446
|
+
{
|
|
447
|
+
if (!(settings->sslopts & LCB_SSL_ENABLED)) {
|
|
448
|
+
return LCB_SUCCESS; /*not needed*/
|
|
449
|
+
}
|
|
450
|
+
if (lcbio_ssl_check(sock)) {
|
|
451
|
+
return LCB_SUCCESS; /*already ssl*/
|
|
452
|
+
}
|
|
453
|
+
return lcbio_ssl_apply(sock, settings->ssl_ctx);
|
|
454
|
+
}
|