libcouchbase 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (561) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +389 -0
  9. data/Rakefile +75 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +20 -0
  12. data/ext/libcouchbase/.gitignore +130 -0
  13. data/ext/libcouchbase/.travis.yml +19 -0
  14. data/ext/libcouchbase/CMakeLists.txt +429 -0
  15. data/ext/libcouchbase/CONTRIBUTING.md +124 -0
  16. data/ext/libcouchbase/LICENSE +202 -0
  17. data/ext/libcouchbase/README.markdown +163 -0
  18. data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
  19. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
  20. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  21. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  22. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
  26. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
  27. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
  28. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
  29. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
  30. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  31. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  32. data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
  33. data/ext/libcouchbase/cmake/configure +357 -0
  34. data/ext/libcouchbase/cmake/defs.mk.in +8 -0
  35. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +73 -0
  37. data/ext/libcouchbase/configure.pl +1 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
  39. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  40. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
  41. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  42. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  52. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  53. data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
  55. data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
  57. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  98. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  99. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  100. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  102. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  103. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  105. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  110. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
  111. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  112. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  123. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  124. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  125. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  126. data/ext/libcouchbase/example/CMakeLists.txt +37 -0
  127. data/ext/libcouchbase/example/README.markdown +47 -0
  128. data/ext/libcouchbase/example/db/db.c +167 -0
  129. data/ext/libcouchbase/example/db/vb.c +227 -0
  130. data/ext/libcouchbase/example/instancepool/main.cc +102 -0
  131. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  132. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  133. data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
  134. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  135. data/ext/libcouchbase/example/minimal/minimal.c +130 -0
  136. data/ext/libcouchbase/example/observe/observe.c +146 -0
  137. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
  138. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
  139. data/ext/libcouchbase/example/tick/tick.c +119 -0
  140. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  141. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  142. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  143. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  144. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  145. data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
  146. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
  147. data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
  148. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
  149. data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
  150. data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
  151. data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
  152. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  153. data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
  154. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  155. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
  156. data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
  157. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  158. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
  159. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  160. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  161. data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
  162. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  163. data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
  164. data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
  165. data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
  166. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  167. data/ext/libcouchbase/include/memcached/README +10 -0
  168. data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
  169. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  170. data/ext/libcouchbase/packaging/README +7 -0
  171. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  172. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  173. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  174. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  175. data/ext/libcouchbase/packaging/deb/compat +1 -0
  176. data/ext/libcouchbase/packaging/deb/control +73 -0
  177. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  178. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  179. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  180. data/ext/libcouchbase/packaging/deb/rules +46 -0
  181. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  182. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  183. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  184. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  185. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  186. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  187. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  188. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
  189. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  190. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  191. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
  192. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  193. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  194. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  195. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  196. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
  197. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
  198. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  199. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
  200. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  201. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  202. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
  203. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
  204. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  205. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
  206. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
  207. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
  208. data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
  209. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  210. data/ext/libcouchbase/src/README.md +103 -0
  211. data/ext/libcouchbase/src/aspend.h +106 -0
  212. data/ext/libcouchbase/src/auth.cc +74 -0
  213. data/ext/libcouchbase/src/auth.h +54 -0
  214. data/ext/libcouchbase/src/bootstrap.c +269 -0
  215. data/ext/libcouchbase/src/bootstrap.h +129 -0
  216. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
  217. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  218. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  219. data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
  220. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  221. data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
  222. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  223. data/ext/libcouchbase/src/callbacks.c +378 -0
  224. data/ext/libcouchbase/src/cbft.cc +210 -0
  225. data/ext/libcouchbase/src/cntl.cc +847 -0
  226. data/ext/libcouchbase/src/config_static.h +159 -0
  227. data/ext/libcouchbase/src/connspec.cc +462 -0
  228. data/ext/libcouchbase/src/connspec.h +105 -0
  229. data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
  230. data/ext/libcouchbase/src/dump.c +98 -0
  231. data/ext/libcouchbase/src/getconfig.c +100 -0
  232. data/ext/libcouchbase/src/gethrtime.c +109 -0
  233. data/ext/libcouchbase/src/handler.c +922 -0
  234. data/ext/libcouchbase/src/hashset.c +164 -0
  235. data/ext/libcouchbase/src/hashset.h +86 -0
  236. data/ext/libcouchbase/src/hashtable.c +75 -0
  237. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  238. data/ext/libcouchbase/src/hostlist.cc +301 -0
  239. data/ext/libcouchbase/src/hostlist.h +171 -0
  240. data/ext/libcouchbase/src/http/http-priv.h +307 -0
  241. data/ext/libcouchbase/src/http/http.cc +633 -0
  242. data/ext/libcouchbase/src/http/http.h +34 -0
  243. data/ext/libcouchbase/src/http/http_io.cc +307 -0
  244. data/ext/libcouchbase/src/instance.cc +722 -0
  245. data/ext/libcouchbase/src/internal.h +244 -0
  246. data/ext/libcouchbase/src/iofactory.c +575 -0
  247. data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
  248. data/ext/libcouchbase/src/jsparse/parser.h +173 -0
  249. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  250. data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
  251. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  252. data/ext/libcouchbase/src/lcbio/connect.h +364 -0
  253. data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
  254. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  255. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  256. data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
  257. data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
  258. data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
  259. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  260. data/ext/libcouchbase/src/lcbio/manager.c +584 -0
  261. data/ext/libcouchbase/src/lcbio/manager.h +156 -0
  262. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  263. data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
  264. data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
  265. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  266. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  267. data/ext/libcouchbase/src/legacy.c +430 -0
  268. data/ext/libcouchbase/src/list.c +144 -0
  269. data/ext/libcouchbase/src/list.h +127 -0
  270. data/ext/libcouchbase/src/logging.c +244 -0
  271. data/ext/libcouchbase/src/logging.h +86 -0
  272. data/ext/libcouchbase/src/mc/compress.c +90 -0
  273. data/ext/libcouchbase/src/mc/compress.h +61 -0
  274. data/ext/libcouchbase/src/mc/forward.c +186 -0
  275. data/ext/libcouchbase/src/mc/forward.h +90 -0
  276. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  277. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  278. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
  279. data/ext/libcouchbase/src/mc/mcreq.c +954 -0
  280. data/ext/libcouchbase/src/mc/mcreq.h +977 -0
  281. data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
  282. data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
  283. data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
  284. data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
  285. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
  286. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  287. data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
  288. data/ext/libcouchbase/src/n1ql/params.cc +215 -0
  289. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  290. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  291. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  292. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  293. data/ext/libcouchbase/src/newconfig.c +385 -0
  294. data/ext/libcouchbase/src/nodeinfo.cc +194 -0
  295. data/ext/libcouchbase/src/operations/cbflush.c +71 -0
  296. data/ext/libcouchbase/src/operations/counter.c +116 -0
  297. data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
  298. data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
  299. data/ext/libcouchbase/src/operations/durability.c +668 -0
  300. data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
  301. data/ext/libcouchbase/src/operations/get.c +409 -0
  302. data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
  303. data/ext/libcouchbase/src/operations/observe.c +340 -0
  304. data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
  305. data/ext/libcouchbase/src/operations/remove.c +83 -0
  306. data/ext/libcouchbase/src/operations/stats.c +461 -0
  307. data/ext/libcouchbase/src/operations/store.c +360 -0
  308. data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
  309. data/ext/libcouchbase/src/operations/touch.c +81 -0
  310. data/ext/libcouchbase/src/packetutils.c +60 -0
  311. data/ext/libcouchbase/src/packetutils.h +147 -0
  312. data/ext/libcouchbase/src/probes.d +211 -0
  313. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  314. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  315. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  316. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  317. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  318. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  319. data/ext/libcouchbase/src/retrychk.c +113 -0
  320. data/ext/libcouchbase/src/retryq.c +424 -0
  321. data/ext/libcouchbase/src/retryq.h +157 -0
  322. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  323. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  324. data/ext/libcouchbase/src/settings.c +95 -0
  325. data/ext/libcouchbase/src/settings.h +188 -0
  326. data/ext/libcouchbase/src/simplestring.c +211 -0
  327. data/ext/libcouchbase/src/simplestring.h +228 -0
  328. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  329. data/ext/libcouchbase/src/sllist.h +76 -0
  330. data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
  331. data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
  332. data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
  333. data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
  334. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
  335. data/ext/libcouchbase/src/ssobuf.h +82 -0
  336. data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
  337. data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
  338. data/ext/libcouchbase/src/timings.c +208 -0
  339. data/ext/libcouchbase/src/trace.h +105 -0
  340. data/ext/libcouchbase/src/utilities.c +171 -0
  341. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  342. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  343. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  344. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  345. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  346. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  347. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  348. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  349. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  350. data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
  351. data/ext/libcouchbase/src/views/docreq.c +194 -0
  352. data/ext/libcouchbase/src/views/docreq.h +83 -0
  353. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  354. data/ext/libcouchbase/src/views/viewreq.h +36 -0
  355. data/ext/libcouchbase/src/wait.c +161 -0
  356. data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
  357. data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
  358. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  359. data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
  360. data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
  361. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  362. data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
  363. data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
  364. data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
  365. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  366. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  367. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  368. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  369. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
  370. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  371. data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
  372. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  373. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  374. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  375. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  376. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  377. data/ext/libcouchbase/tests/check-all.cc +608 -0
  378. data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
  379. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  380. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  381. data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
  382. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  383. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  384. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  385. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  386. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  387. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  388. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  389. data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
  390. data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
  391. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  392. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  393. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  394. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  395. data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
  396. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  397. data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
  398. data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
  399. data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
  400. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  401. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  402. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  403. data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
  404. data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
  405. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  406. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  407. data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
  408. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
  409. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  410. data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
  411. data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
  412. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  413. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
  414. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  415. data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
  416. data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
  417. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  418. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  419. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  420. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  421. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  422. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  423. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  424. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  425. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  426. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  427. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  428. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  429. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  430. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  431. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  432. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  433. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  434. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  435. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  436. data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
  437. data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
  438. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  439. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  440. data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
  441. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  442. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  443. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  444. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  445. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  446. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  447. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  448. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  449. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  450. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  451. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  452. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  453. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  454. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  455. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  456. data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
  457. data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
  458. data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
  459. data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
  460. data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
  461. data/ext/libcouchbase/tools/cbc.cc +1541 -0
  462. data/ext/libcouchbase/tools/common/histogram.cc +43 -0
  463. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  464. data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
  465. data/ext/libcouchbase/tools/common/options.cc +420 -0
  466. data/ext/libcouchbase/tools/common/options.h +81 -0
  467. data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
  468. data/ext/libcouchbase/tools/docgen/loc.h +210 -0
  469. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  470. data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
  471. data/lib/libcouchbase.rb +36 -0
  472. data/lib/libcouchbase/bucket.rb +819 -0
  473. data/lib/libcouchbase/callbacks.rb +72 -0
  474. data/lib/libcouchbase/connection.rb +790 -0
  475. data/lib/libcouchbase/design_docs.rb +86 -0
  476. data/lib/libcouchbase/error.rb +68 -0
  477. data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
  478. data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
  479. data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
  480. data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
  481. data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
  482. data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
  483. data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
  484. data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
  485. data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
  486. data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
  487. data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
  488. data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
  489. data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
  490. data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
  491. data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
  492. data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
  493. data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
  494. data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
  495. data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
  496. data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
  497. data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
  498. data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
  499. data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
  500. data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
  501. data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
  502. data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
  503. data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
  504. data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
  505. data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
  506. data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
  507. data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
  508. data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
  509. data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
  510. data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
  511. data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
  512. data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
  513. data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
  514. data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
  515. data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
  516. data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
  517. data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
  518. data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
  519. data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
  520. data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
  521. data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
  522. data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
  523. data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
  524. data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
  525. data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
  526. data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
  527. data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
  528. data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
  529. data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
  530. data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
  531. data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
  532. data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
  533. data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
  534. data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
  535. data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
  536. data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
  537. data/lib/libcouchbase/ext/tasks.rb +87 -0
  538. data/lib/libcouchbase/n1ql.rb +73 -0
  539. data/lib/libcouchbase/query_full_text.rb +147 -0
  540. data/lib/libcouchbase/query_n1ql.rb +121 -0
  541. data/lib/libcouchbase/query_view.rb +129 -0
  542. data/lib/libcouchbase/results_fiber.rb +262 -0
  543. data/lib/libcouchbase/results_native.rb +211 -0
  544. data/lib/libcouchbase/version.rb +5 -0
  545. data/libcouchbase.gemspec +61 -0
  546. data/spec/bucket_spec.rb +270 -0
  547. data/spec/connection_spec.rb +277 -0
  548. data/spec/design_docs_spec.rb +23 -0
  549. data/spec/error_spec.rb +26 -0
  550. data/spec/fts_spec.rb +129 -0
  551. data/spec/n1ql_spec.rb +201 -0
  552. data/spec/results_libuv_spec.rb +229 -0
  553. data/spec/results_native_spec.rb +259 -0
  554. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  555. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  556. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  557. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  558. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  559. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  560. data/spec/view_spec.rb +195 -0
  561. metadata +775 -0
@@ -0,0 +1,15 @@
1
+ #ifndef SRC_HASH_H_
2
+ #define SRC_HASH_H_ 1
3
+ #include "config.h"
4
+
5
+ #ifdef __cplusplus
6
+ extern "C" {
7
+ #endif
8
+
9
+ uint32_t cbsasl_hash(const void *key, size_t length, const uint32_t initval);
10
+
11
+ #ifdef __cplusplus
12
+ }
13
+ #endif
14
+
15
+ #endif /* SRC_HASH_H_ */
@@ -0,0 +1,31 @@
1
+ /*
2
+ * Copyright 2013 Couchbase, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #ifndef CBSASL_UTIL_H_
18
+ #define CBSASL_UTIL_H_ 1
19
+ #include <config.h>
20
+
21
+ /* Encode hexadecimal representation of bytes from src into dest.
22
+ * Will write srclen * 2 bytes. */
23
+ void cbsasl_hex_encode(char *dest, const char *src, size_t srclen);
24
+
25
+ /* Compare a and b without revealing their content by short-circuiting */
26
+ int cbsasl_secure_compare(const char *a, size_t alen, const char *b, size_t blen);
27
+
28
+ cbsasl_error_t cbsasl_secure_random(char *dest, size_t len);
29
+
30
+
31
+ #endif /* CBSASL_UTIL_H_ */
@@ -0,0 +1,2 @@
1
+ ADD_LIBRARY(cliopts OBJECT cliopts.c)
2
+ SET_TARGET_PROPERTIES(cbsasl PROPERTIES COMPILE_FLAGS "${LCB_CORE_CFLAGS}")
@@ -0,0 +1,747 @@
1
+ #ifndef _WIN32
2
+ #include <sys/ioctl.h>
3
+ #include <termios.h>
4
+ #else
5
+ #include <windows.h>
6
+ #endif
7
+
8
+ #include <string.h>
9
+ #include <stdlib.h>
10
+ #include <stdio.h>
11
+ #include <limits.h>
12
+ #include <errno.h>
13
+ #include <ctype.h>
14
+
15
+ #include "cliopts.h"
16
+
17
+
18
+ enum {
19
+ CLIOPTS_ERR_SUCCESS,
20
+ CLIOPTS_ERR_NEED_ARG,
21
+ CLIOPTS_ERR_ISSWITCH,
22
+ CLIOPTS_ERR_BADOPT,
23
+ CLIOPTS_ERR_BAD_VALUE,
24
+ CLIOPTS_ERR_UNRECOGNIZED
25
+ };
26
+
27
+ struct cliopts_priv {
28
+ cliopts_entry *entries;
29
+
30
+ cliopts_entry *prev;
31
+ cliopts_entry *current;
32
+ struct cliopts_extra_settings *settings;
33
+
34
+ char *errstr;
35
+ int errnum;
36
+
37
+ int argsplit;
38
+ int wanted;
39
+
40
+ char current_key[4096];
41
+ char current_value[4096];
42
+ };
43
+
44
+ enum {
45
+ WANT_OPTION,
46
+ WANT_VALUE,
47
+
48
+ MODE_ERROR,
49
+ MODE_RESTARGS,
50
+ MODE_HELP
51
+ };
52
+
53
+ #define INDENT " "
54
+
55
+ #ifdef CLIOPTS_DEBUG
56
+
57
+ #define cliopt_debug(...) \
58
+ fprintf(stderr, "(%s:%d) ", __func__, __LINE__); \
59
+ fprintf(stderr, __VA_ARGS__); \
60
+ fprintf(stderr, "\n")
61
+
62
+ #else
63
+ /** variadic macros not c89 */
64
+ static void cliopt_debug(void *unused, ...) { (void)unused; }
65
+ #endif /* CLIOPT_DEBUG */
66
+
67
+ static int
68
+ parse_option(struct cliopts_priv *ctx, const char *key);
69
+
70
+
71
+ static int
72
+ parse_value(struct cliopts_priv *ctx, const char *value);
73
+
74
+ static void
75
+ add_list_value(const char *src, size_t nsrc, cliopts_list *l)
76
+ {
77
+ char *cp = malloc(nsrc + 1);
78
+
79
+ if (!l->nalloc) {
80
+ l->nalloc = 2;
81
+ l->values = malloc(l->nalloc * sizeof(*l->values));
82
+ } else {
83
+ l->nalloc *= 1.5;
84
+ l->values = realloc(l->values, sizeof(*l->values) * l->nalloc);
85
+ }
86
+
87
+ l->values[l->nvalues++] = cp;
88
+ cp[nsrc] = '\0';
89
+ memcpy(cp, src, nsrc);
90
+ }
91
+
92
+ CLIOPTS_API
93
+ void
94
+ cliopts_list_clear(cliopts_list *l)
95
+ {
96
+ size_t ii;
97
+ for (ii = 0; ii < l->nvalues; ii++) {
98
+ free(l->values[ii]);
99
+ }
100
+ free(l->values);
101
+ l->values = NULL;
102
+ l->nvalues = 0;
103
+ l->nalloc = 0;
104
+ }
105
+
106
+ /**
107
+ * Various extraction/conversion functions for numerics
108
+ */
109
+
110
+ #define _VERIFY_INT_COMMON(m1, m2) \
111
+ if (value == m1 || value > m2) { *errp = "Value too large"; return -1; } \
112
+ if (*endptr != '\0') { *errp = "Trailing garbage"; return -1; }
113
+
114
+ static int
115
+ extract_int(const char *s, void *dest, char **errp)
116
+ {
117
+ long int value;
118
+ char *endptr = NULL;
119
+ value = strtol(s, &endptr, 10);
120
+ _VERIFY_INT_COMMON(LONG_MAX, INT_MAX)
121
+ *(int*)dest = value;
122
+ return 0;
123
+ }
124
+
125
+ static int
126
+ extract_uint(const char *s, void *dest, char **errp)
127
+ {
128
+ unsigned long int value;
129
+ char *endptr = NULL;
130
+ value = strtoul(s, &endptr, 10);
131
+ _VERIFY_INT_COMMON(ULONG_MAX, UINT_MAX)
132
+ *(unsigned int*)dest = value;
133
+ return 0;
134
+ }
135
+
136
+ static int
137
+ extract_hex(const char *s, void *dest, char **errp)
138
+ {
139
+ unsigned long value;
140
+ char *endptr = NULL;
141
+ value = strtoul(s, &endptr, 16);
142
+ _VERIFY_INT_COMMON(ULONG_MAX, UINT_MAX);
143
+ *(unsigned int*)dest = value;
144
+ return 0;
145
+ }
146
+
147
+ #undef _VERIFY_INT_COMMON
148
+
149
+ static int
150
+ extract_float(const char *s, void *dest, char **errp)
151
+ {
152
+ char dummy_buf[4096];
153
+ float value;
154
+ if (sscanf(s, "%f%s", &value, dummy_buf) != 1) {
155
+ *errp = "Found trailing garbage";
156
+ return -1;
157
+ }
158
+ *(float*)dest = value;
159
+ return 0;
160
+ }
161
+
162
+ typedef int(*cliopts_extractor_func)(const char*, void*, char**);
163
+
164
+
165
+ /**
166
+ * This function tries to extract a single value for an option key.
167
+ * If it successfully has extracted a value, it returns MODE_VALUE.
168
+ * If the entry takes no arguments, then the current string is a key,
169
+ * and it will return MODE_OPTION. On error, MODE_ERROR is set, and errp
170
+ * will point to a string.
171
+ *
172
+ * @param entry The current entry
173
+ * @param value the string which might be a value
174
+ * @errp a pointer which will be populated with the address of the error, if any
175
+ *
176
+ * @return a MODE_* type
177
+ */
178
+ static int
179
+ parse_value(struct cliopts_priv *ctx,
180
+ const char *value)
181
+ {
182
+ cliopts_entry *entry = ctx->current;
183
+
184
+ size_t vlen = strlen(value);
185
+ cliopts_extractor_func exfn = NULL;
186
+ int exret;
187
+ int is_option = 0;
188
+
189
+ cliopt_debug("Called with %s, want=%d", value, ctx->wanted);
190
+
191
+ if (ctx->argsplit) {
192
+ if (vlen > 2 && strncmp(value, "--", 2) == 0) {
193
+ is_option = 1;
194
+ } else if (*value == '-') {
195
+ is_option = 1;
196
+ }
197
+ }
198
+
199
+ if (is_option) {
200
+ ctx->errstr = "Expected option. Got '-' or '--' prefixed value "
201
+ "(use = if this is really a value)";
202
+ ctx->errnum = CLIOPTS_ERR_NEED_ARG;
203
+ return MODE_ERROR;
204
+ }
205
+
206
+ if (entry->ktype == CLIOPTS_ARGT_STRING) {
207
+ char *vp = malloc(vlen+1);
208
+ vp[vlen] = 0;
209
+ strcpy(vp, value);
210
+ *(char**)entry->dest = vp;
211
+ return WANT_OPTION;
212
+ }
213
+
214
+ if (entry->ktype == CLIOPTS_ARGT_LIST) {
215
+ add_list_value(value, vlen, (cliopts_list *)entry->dest);
216
+ return WANT_OPTION;
217
+ }
218
+
219
+ if (entry->ktype == CLIOPTS_ARGT_FLOAT) {
220
+ exfn = extract_float;
221
+ } else if (entry->ktype == CLIOPTS_ARGT_HEX) {
222
+ exfn = extract_hex;
223
+ } else if (entry->ktype == CLIOPTS_ARGT_INT) {
224
+ exfn = extract_int;
225
+ } else if (entry->ktype == CLIOPTS_ARGT_UINT) {
226
+ exfn = extract_uint;
227
+ } else {
228
+ fprintf(stderr, "Unrecognized type %d. Abort.\n", entry->ktype);
229
+ }
230
+
231
+ exret = exfn(value, entry->dest, &ctx->errstr);
232
+ if (exret == 0) {
233
+ return WANT_OPTION;
234
+ } else {
235
+ ctx->errnum = CLIOPTS_ERR_BAD_VALUE;
236
+ }
237
+
238
+ return MODE_ERROR;
239
+ }
240
+
241
+ /**
242
+ * Like parse_value, except for keys.
243
+ *
244
+ * @param entries all option entries
245
+ * @param key the current string from argv
246
+ * @param errp a pointer which will be populated with the address of an error
247
+ * string
248
+ *
249
+ * @param found_entry a pointer to be populated with the relevant entry
250
+ * structure
251
+ * @param kp a pointer which will be poplated with the address of the 'sanitized'
252
+ * key string
253
+ *
254
+ * @param valp if the string is actually a key-value pair (i.e. --foo=bar) then
255
+ * this will be populated with the address of that string
256
+ *
257
+ * @return MODE_OPTION if an option was found, MODE_VALUE if the current option
258
+ * is a value, or MODE_ERROR on error
259
+ */
260
+ static int
261
+ parse_option(struct cliopts_priv *ctx,
262
+ const char *key)
263
+ {
264
+ cliopts_entry *cur = NULL;
265
+ int prefix_len = 0;
266
+ unsigned ii = 0;
267
+ const char *valp = NULL;
268
+ size_t klen;
269
+
270
+ klen = strlen(key);
271
+ ctx->errstr = NULL;
272
+ ctx->prev = ctx->current;
273
+ ctx->current = NULL;
274
+
275
+ cliopt_debug("Called with %s, want=%d", key, ctx->wanted);
276
+ if (klen == 0) {
277
+ ctx->errstr = "Got an empty string";
278
+ ctx->errnum = CLIOPTS_ERR_BADOPT;
279
+ return MODE_ERROR;
280
+ }
281
+
282
+ /**
283
+ * figure out what type of option it is..
284
+ * it can either be a -c, --long, or --long=value
285
+ */
286
+ while (*key == '-') {
287
+ key++;
288
+ prefix_len++;
289
+ klen--;
290
+ }
291
+
292
+ for (ii = 0; ii < klen; ii++) {
293
+ if (key[ii] == '"' || key[ii] == '\'') {
294
+ ii = klen;
295
+ break;
296
+
297
+ } else if (key[ii] == '=' && prefix_len == 2) {
298
+ /* only split on '=' if we're called as '--' */
299
+ valp = key + (ii + 1);
300
+ klen = ii;
301
+ break;
302
+ }
303
+ }
304
+
305
+ GT_PARSEOPT:
306
+ memset(ctx->current_value, 0, sizeof(ctx->current_value));
307
+ memcpy(ctx->current_key, key, klen);
308
+ ctx->current_key[ii] = '\0';
309
+
310
+ if (valp) {
311
+ strcpy(ctx->current_value, valp);
312
+ }
313
+
314
+ if (prefix_len == 0 || prefix_len > 2) {
315
+ if (ctx->settings->restargs) {
316
+ key -= prefix_len;
317
+ ctx->settings->restargs[ctx->settings->nrestargs++] = key;
318
+ return WANT_OPTION;
319
+ } else if (ctx->prev && ctx->prev->ktype == CLIOPTS_ARGT_NONE) {
320
+ ctx->errstr = "Option does not accept a value";
321
+ ctx->errnum = CLIOPTS_ERR_ISSWITCH;
322
+ } else {
323
+ ctx->errstr = "Options must begin with either '-' or '--'";
324
+ ctx->errnum = CLIOPTS_ERR_BADOPT;
325
+ }
326
+ return MODE_ERROR;
327
+ }
328
+
329
+ /**
330
+ * --help or -?
331
+ */
332
+
333
+ if ( (prefix_len == 1 && *key == '?') ||
334
+ (prefix_len == 2 && strcmp(key, "help") == 0)) {
335
+ return MODE_HELP;
336
+ }
337
+
338
+ /**
339
+ * Bare --
340
+ */
341
+ if (prefix_len == 2 && *key == '\0') {
342
+ if (ctx->settings->restargs) {
343
+
344
+ }
345
+ if (ctx->wanted == WANT_VALUE) {
346
+ ctx->errnum = CLIOPTS_ERR_NEED_ARG;
347
+ ctx->errstr = "Found bare '--', but value wanted";
348
+ return MODE_ERROR;
349
+ }
350
+
351
+ return MODE_RESTARGS;
352
+ }
353
+
354
+ for (cur = ctx->entries; cur->dest; cur++) {
355
+ int optlen;
356
+ if (prefix_len == 1) {
357
+ if (cur->kshort == ctx->current_key[0]) {
358
+ ctx->current = cur;
359
+ break;
360
+ }
361
+ continue;
362
+ }
363
+ /** else, prefix_len is 2 */
364
+ if (cur->klong == NULL ||
365
+ (optlen = strlen(cur->klong) != klen) ||
366
+ strncmp(cur->klong, ctx->current_key, klen) != 0) {
367
+
368
+ continue;
369
+ }
370
+
371
+ ctx->current = cur;
372
+ break;
373
+ }
374
+
375
+ if (!ctx->current) {
376
+ ctx->errstr = "Unknown option";
377
+ ctx->errnum = CLIOPTS_ERR_UNRECOGNIZED;
378
+ return MODE_ERROR;
379
+ }
380
+
381
+ ctx->current->found++;
382
+ if (ctx->current->ktype != CLIOPTS_ARGT_NONE) {
383
+ ctx->wanted = WANT_VALUE;
384
+ }
385
+
386
+ if (ctx->current_value[0]) {
387
+ /* --foo=bar */
388
+ if (ctx->current->ktype == CLIOPTS_ARGT_NONE) {
389
+ ctx->errnum = CLIOPTS_ERR_ISSWITCH;
390
+ ctx->errstr = "Option takes no arguments";
391
+ return MODE_ERROR;
392
+ } else {
393
+ return parse_value(ctx, ctx->current_value);
394
+ }
395
+ }
396
+
397
+ if (ctx->current->ktype == CLIOPTS_ARGT_NONE) {
398
+ *(char*)ctx->current->dest = 1;
399
+
400
+ if (prefix_len == 1 && klen > 1) {
401
+ /**
402
+ * e.g. ls -lsh
403
+ */
404
+ klen--;
405
+ key++;
406
+
407
+ /**
408
+ * While we can also possibly recurse, this may be a security risk
409
+ * as it wouldn't take much to cause a deep recursion on the stack
410
+ * which will cause all sorts of nasties.
411
+ */
412
+ goto GT_PARSEOPT;
413
+ }
414
+ return WANT_OPTION;
415
+
416
+ } else if (prefix_len == 1 && klen > 1) {
417
+
418
+ /* e.g. patch -p0 */
419
+ ctx->wanted = WANT_VALUE;
420
+ return parse_value(ctx, key + 1);
421
+ }
422
+ return WANT_VALUE;
423
+ }
424
+
425
+ static char *
426
+ get_option_name(cliopts_entry *entry, char *buf)
427
+ {
428
+ /* [-s,--option] */
429
+ char *bufp = buf;
430
+ bufp += sprintf(buf, "[");
431
+ if (entry->kshort) {
432
+ bufp += sprintf(bufp, "-%c", entry->kshort);
433
+ }
434
+ if (entry->klong) {
435
+ if (entry->kshort) {
436
+ bufp += sprintf(bufp, ",");
437
+ }
438
+ bufp += sprintf(bufp, "--%s", entry->klong);
439
+ }
440
+ sprintf(bufp, "]");
441
+ return buf;
442
+ }
443
+
444
+ static int get_terminal_width(void)
445
+ {
446
+ #ifndef _WIN32
447
+ struct winsize max;
448
+ if (ioctl(0, TIOCGWINSZ, &max) != -1) {
449
+ return max.ws_col;
450
+ } else {
451
+ return 80;
452
+ }
453
+ #else
454
+ CONSOLE_SCREEN_BUFFER_INFO cbsi;
455
+ GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cbsi);
456
+ return cbsi.srWindow.Right - cbsi.srWindow.Left;
457
+ #endif
458
+ }
459
+
460
+ static char*
461
+ format_option_help(cliopts_entry *entry,
462
+ char *buf,
463
+ struct cliopts_extra_settings *settings)
464
+ {
465
+ char *bufp = buf;
466
+ if (entry->kshort) {
467
+ bufp += sprintf(bufp, " -%c ", entry->kshort);
468
+ }
469
+
470
+ #define _advance_margin(offset) \
471
+ while(bufp-buf < offset || *bufp) { \
472
+ if (!*bufp) { \
473
+ *bufp = ' '; \
474
+ } \
475
+ bufp++; \
476
+ }
477
+
478
+ _advance_margin(4)
479
+
480
+ if (entry->klong) {
481
+ bufp += sprintf(bufp, " --%s ", entry->klong);
482
+ }
483
+
484
+ if (entry->vdesc) {
485
+ bufp += sprintf(bufp, " <%s> ", entry->vdesc);
486
+ }
487
+
488
+ _advance_margin(35)
489
+ #undef _advance_margin
490
+
491
+ if (entry->help) {
492
+ unsigned initial_indent = bufp - buf + 1;
493
+ int curpos = initial_indent;
494
+ const char *help_p = entry->help;
495
+
496
+ for (; *help_p; help_p++, curpos++, bufp++) {
497
+
498
+ if (curpos >= settings->line_max) {
499
+ unsigned ii;
500
+ if (!isspace(*help_p) && !isspace(*(help_p-1))) {
501
+ *bufp = '-';
502
+ bufp++;
503
+ }
504
+ *bufp = '\n';
505
+ bufp++;
506
+
507
+ for (ii = 0; ii < initial_indent+1; ii++, bufp++) {
508
+ *bufp = ' ';
509
+ }
510
+
511
+ curpos = initial_indent;
512
+ if (isspace(*help_p)) {
513
+ bufp--;
514
+ continue;
515
+ }
516
+ }
517
+ *bufp = *help_p;
518
+ }
519
+ }
520
+
521
+ *bufp = '\0';
522
+ return buf;
523
+ }
524
+
525
+ static void
526
+ print_help(struct cliopts_priv *ctx, struct cliopts_extra_settings *settings)
527
+ {
528
+ cliopts_entry *cur;
529
+ cliopts_entry helpent = { 0 };
530
+ char helpbuf[1024] = { 0 };
531
+
532
+ helpent.klong = "help";
533
+ helpent.kshort = '?';
534
+ helpent.help = "this message";
535
+
536
+ fprintf(stderr, "Usage:\n");
537
+ fprintf(stderr, " %s %s\n\n", settings->progname, settings->argstring);
538
+ if (settings->shortdesc) {
539
+ fprintf(stderr, "%s", settings->shortdesc);
540
+ fprintf(stderr, "\n");
541
+ }
542
+
543
+
544
+ for (cur = ctx->entries; cur->dest; cur++) {
545
+ if (cur->hidden) {
546
+ continue;
547
+ }
548
+
549
+ memset(helpbuf, 0, sizeof(helpbuf));
550
+ format_option_help(cur, helpbuf, settings);
551
+ fprintf(stderr, INDENT "%s", helpbuf);
552
+
553
+
554
+ if (settings->show_defaults) {
555
+ fprintf(stderr, " [Default=");
556
+
557
+ switch (cur->ktype) {
558
+ case CLIOPTS_ARGT_STRING:
559
+ fprintf(stderr, "'%s'", (cur->dest && *(char **)cur->dest) ?
560
+ *(char**)cur->dest : "");
561
+ break;
562
+ case CLIOPTS_ARGT_LIST: {
563
+ size_t ii;
564
+ cliopts_list *l = (cliopts_list *)cur->dest;
565
+ for (ii = 0; ii < l->nvalues; ii++) {
566
+ fprintf(stderr, "'%s'", l->values[ii]);
567
+ if (ii != l->nvalues-1) {
568
+ fprintf(stderr, ", ");
569
+ }
570
+ }
571
+ break;
572
+ }
573
+ case CLIOPTS_ARGT_FLOAT:
574
+ fprintf(stderr, "%0.2f", *(float*)cur->dest);
575
+ break;
576
+ case CLIOPTS_ARGT_HEX:
577
+ fprintf(stderr, "0x%x", *(int*)cur->dest);
578
+ break;
579
+ case CLIOPTS_ARGT_INT:
580
+ fprintf(stderr, "%d", *(int*)cur->dest);
581
+ break;
582
+ case CLIOPTS_ARGT_UINT:
583
+ fprintf(stderr, "%u", *(unsigned int*)cur->dest);
584
+ break;
585
+ case CLIOPTS_ARGT_NONE:
586
+ fprintf(stderr, "%s", *(int*)cur->dest ? "TRUE" : "FALSE");
587
+ break;
588
+ default:
589
+ fprintf(stderr, "Unknown option type '%d'", (int)cur->ktype);
590
+ break;
591
+ }
592
+ fprintf(stderr, "]");
593
+ }
594
+ fprintf(stderr, "\n");
595
+ }
596
+ memset(helpbuf, 0, sizeof(helpbuf));
597
+ fprintf(stderr, INDENT "%s\n",
598
+ format_option_help(&helpent, helpbuf, settings));
599
+
600
+ }
601
+
602
+ static void
603
+ dump_error(struct cliopts_priv *ctx)
604
+ {
605
+ fprintf(stderr, "Couldn't parse options: %s\n", ctx->errstr);
606
+ if (ctx->errnum == CLIOPTS_ERR_BADOPT) {
607
+ fprintf(stderr, "Bad option: %s", ctx->current_key);
608
+ } else if (ctx->errnum == CLIOPTS_ERR_BAD_VALUE) {
609
+ fprintf(stderr, "Bad value '%s' for %s",
610
+ ctx->current_value,
611
+ ctx->current_key);
612
+ } else if (ctx->errnum == CLIOPTS_ERR_UNRECOGNIZED) {
613
+ fprintf(stderr, "No such option: %s", ctx->current_key);
614
+ } else if (ctx->errnum == CLIOPTS_ERR_ISSWITCH) {
615
+ char optbuf[64] = { 0 };
616
+ fprintf(stderr, "Option %s takes no arguments",
617
+ get_option_name(ctx->prev, optbuf));
618
+ }
619
+ fprintf(stderr, "\n");
620
+
621
+ }
622
+
623
+ CLIOPTS_API
624
+ int
625
+ cliopts_parse_options(cliopts_entry *entries,
626
+ int argc,
627
+ char **argv,
628
+ int *lastidx,
629
+ struct cliopts_extra_settings *settings)
630
+ {
631
+ /**
632
+ * Now let's build ourselves a
633
+ */
634
+ int curmode;
635
+ int ii, ret = 0, lastidx_s = 0;
636
+ struct cliopts_priv ctx = { 0 };
637
+ struct cliopts_extra_settings default_settings = { 0 };
638
+
639
+ if (!lastidx) {
640
+ lastidx = &lastidx_s;
641
+ }
642
+
643
+ ctx.entries = entries;
644
+
645
+ if (!settings) {
646
+ settings = &default_settings;
647
+ settings->show_defaults = 1;
648
+ }
649
+ if (!settings->progname) {
650
+ settings->progname = argv[0];
651
+ }
652
+ if (!settings->argstring) {
653
+ settings->argstring = "[OPTIONS...]";
654
+ }
655
+ settings->nrestargs = 0;
656
+
657
+ if (!settings->line_max) {
658
+ settings->line_max = get_terminal_width() - 3;
659
+ }
660
+
661
+ ii = (settings->argv_noskip) ? 0 : 1;
662
+
663
+ if (ii >= argc) {
664
+ *lastidx = 0;
665
+ ret = 0;
666
+ goto GT_CHECK_REQ;
667
+ return 0;
668
+ }
669
+
670
+ curmode = WANT_OPTION;
671
+ ctx.wanted = curmode;
672
+ ctx.settings = settings;
673
+
674
+ for (; ii < argc; ii++) {
675
+
676
+ if (curmode == WANT_OPTION) {
677
+ curmode = parse_option(&ctx, argv[ii]);
678
+ } else if (curmode == WANT_VALUE) {
679
+ curmode = parse_value(&ctx, argv[ii]);
680
+ }
681
+
682
+ if (curmode == MODE_ERROR) {
683
+ if (settings->error_nohelp == 0) {
684
+ dump_error(&ctx);
685
+ }
686
+ ret = -1;
687
+ break;
688
+ } else if (curmode == MODE_HELP) {
689
+ if (settings->help_noflag) {
690
+ /* ignore it ? */
691
+ continue;
692
+ }
693
+
694
+ print_help(&ctx, settings);
695
+ exit(0);
696
+
697
+ } else if (curmode == MODE_RESTARGS) {
698
+ ii++;
699
+ break;
700
+ } else {
701
+ ctx.wanted = curmode;
702
+ }
703
+ }
704
+
705
+ *lastidx = ii;
706
+
707
+ if (curmode == WANT_VALUE) {
708
+ ret = -1;
709
+
710
+ if (settings->error_nohelp == 0) {
711
+ fprintf(stderr,
712
+ "Option %s requires argument\n",
713
+ ctx.current_key);
714
+ }
715
+ goto GT_RET;
716
+ }
717
+
718
+ GT_CHECK_REQ:
719
+ {
720
+ cliopts_entry *cur_ent;
721
+ for (cur_ent = entries; cur_ent->dest; cur_ent++) {
722
+ char entbuf[128] = { 0 };
723
+ if (cur_ent->found || cur_ent->required == 0) {
724
+ continue;
725
+ }
726
+
727
+ ret = -1;
728
+ if (settings->error_nohelp) {
729
+ goto GT_RET;
730
+ }
731
+
732
+ fprintf(stderr, "Required option %s missing\n",
733
+ get_option_name(cur_ent, entbuf));
734
+ }
735
+ }
736
+
737
+ GT_RET:
738
+ if (ret == -1) {
739
+ if (settings->error_nohelp == 0) {
740
+ print_help(&ctx, settings);
741
+ }
742
+ if (settings->error_noexit == 0) {
743
+ exit(EXIT_FAILURE);
744
+ }
745
+ }
746
+ return ret;
747
+ }