laag-libczmq 4.1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (697) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +57 -0
  3. data/LICENSE.txt +373 -0
  4. data/README.org +34 -0
  5. data/ext/laag/libczmq/extconf.rb +24 -0
  6. data/laag-libczmq.gemspec +21 -0
  7. data/lib/laag/libczmq.rb +30 -0
  8. data/vendor/github.com/zeromq/czmq/.editorconfig +19 -0
  9. data/vendor/github.com/zeromq/czmq/.gitattributes +5 -0
  10. data/vendor/github.com/zeromq/czmq/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  11. data/vendor/github.com/zeromq/czmq/.gitignore +137 -0
  12. data/vendor/github.com/zeromq/czmq/.travis.yml +126 -0
  13. data/vendor/github.com/zeromq/czmq/AUTHORS +69 -0
  14. data/vendor/github.com/zeromq/czmq/CMakeLists.txt +653 -0
  15. data/vendor/github.com/zeromq/czmq/CONTRIBUTING.md +19 -0
  16. data/vendor/github.com/zeromq/czmq/Dockerfile +29 -0
  17. data/vendor/github.com/zeromq/czmq/Findlibsodium.cmake +47 -0
  18. data/vendor/github.com/zeromq/czmq/Findlibzmq.cmake +49 -0
  19. data/vendor/github.com/zeromq/czmq/Findlz4.cmake +49 -0
  20. data/vendor/github.com/zeromq/czmq/Findsystemd.cmake +49 -0
  21. data/vendor/github.com/zeromq/czmq/Finduuid.cmake +49 -0
  22. data/vendor/github.com/zeromq/czmq/INSTALL.cygwin +13 -0
  23. data/vendor/github.com/zeromq/czmq/ISSUES.cygwin +6 -0
  24. data/vendor/github.com/zeromq/czmq/Jenkinsfile +439 -0
  25. data/vendor/github.com/zeromq/czmq/LICENSE +373 -0
  26. data/vendor/github.com/zeromq/czmq/Makefile.am +70 -0
  27. data/vendor/github.com/zeromq/czmq/NEWS +823 -0
  28. data/vendor/github.com/zeromq/czmq/README.cygwin +23 -0
  29. data/vendor/github.com/zeromq/czmq/README.md +9345 -0
  30. data/vendor/github.com/zeromq/czmq/README.txt +512 -0
  31. data/vendor/github.com/zeromq/czmq/Vagrantfile +49 -0
  32. data/vendor/github.com/zeromq/czmq/acinclude.m4 +7 -0
  33. data/vendor/github.com/zeromq/czmq/api/zactor.api +77 -0
  34. data/vendor/github.com/zeromq/czmq/api/zargs.api +110 -0
  35. data/vendor/github.com/zeromq/czmq/api/zarmour.api +103 -0
  36. data/vendor/github.com/zeromq/czmq/api/zcert.api +128 -0
  37. data/vendor/github.com/zeromq/czmq/api/zcertstore.api +80 -0
  38. data/vendor/github.com/zeromq/czmq/api/zchunk.api +171 -0
  39. data/vendor/github.com/zeromq/czmq/api/zclock.api +43 -0
  40. data/vendor/github.com/zeromq/czmq/api/zconfig.api +205 -0
  41. data/vendor/github.com/zeromq/czmq/api/zdigest.api +45 -0
  42. data/vendor/github.com/zeromq/czmq/api/zdir.api +124 -0
  43. data/vendor/github.com/zeromq/czmq/api/zdir_patch.api +62 -0
  44. data/vendor/github.com/zeromq/czmq/api/zfile.api +157 -0
  45. data/vendor/github.com/zeromq/czmq/api/zframe.api +157 -0
  46. data/vendor/github.com/zeromq/czmq/api/zgossip_msg.api +104 -0
  47. data/vendor/github.com/zeromq/czmq/api/zhash.api +184 -0
  48. data/vendor/github.com/zeromq/czmq/api/zhashx.api +295 -0
  49. data/vendor/github.com/zeromq/czmq/api/ziflist.api +73 -0
  50. data/vendor/github.com/zeromq/czmq/api/zlist.api +158 -0
  51. data/vendor/github.com/zeromq/czmq/api/zlistx.api +220 -0
  52. data/vendor/github.com/zeromq/czmq/api/zloop.api +176 -0
  53. data/vendor/github.com/zeromq/czmq/api/zmsg.api +250 -0
  54. data/vendor/github.com/zeromq/czmq/api/zpoller.api +71 -0
  55. data/vendor/github.com/zeromq/czmq/api/zproc.api +247 -0
  56. data/vendor/github.com/zeromq/czmq/api/zsock.api +412 -0
  57. data/vendor/github.com/zeromq/czmq/api/zsock_option.api +847 -0
  58. data/vendor/github.com/zeromq/czmq/api/zstr.api +119 -0
  59. data/vendor/github.com/zeromq/czmq/api/zsys.api +490 -0
  60. data/vendor/github.com/zeromq/czmq/api/ztimerset.api +69 -0
  61. data/vendor/github.com/zeromq/czmq/api/ztrie.api +80 -0
  62. data/vendor/github.com/zeromq/czmq/api/zuuid.api +82 -0
  63. data/vendor/github.com/zeromq/czmq/appveyor.yml +73 -0
  64. data/vendor/github.com/zeromq/czmq/autogen.sh +52 -0
  65. data/vendor/github.com/zeromq/czmq/bindings/jni/.gitignore +8 -0
  66. data/vendor/github.com/zeromq/czmq/bindings/jni/CMakeLists.txt +79 -0
  67. data/vendor/github.com/zeromq/czmq/bindings/jni/Findczmq.cmake +47 -0
  68. data/vendor/github.com/zeromq/czmq/bindings/jni/README.md +130 -0
  69. data/vendor/github.com/zeromq/czmq/bindings/jni/android/CMakeLists.txt +79 -0
  70. data/vendor/github.com/zeromq/czmq/bindings/jni/android/android_toolchain.cmake +52 -0
  71. data/vendor/github.com/zeromq/czmq/bindings/jni/android/build.sh +68 -0
  72. data/vendor/github.com/zeromq/czmq/bindings/jni/build.gradle +151 -0
  73. data/vendor/github.com/zeromq/czmq/bindings/jni/ci_build.sh +96 -0
  74. data/vendor/github.com/zeromq/czmq/bindings/jni/gradle/wrapper/gradle-wrapper.jar +0 -0
  75. data/vendor/github.com/zeromq/czmq/bindings/jni/gradle/wrapper/gradle-wrapper.properties +6 -0
  76. data/vendor/github.com/zeromq/czmq/bindings/jni/gradlew +164 -0
  77. data/vendor/github.com/zeromq/czmq/bindings/jni/gradlew.bat +90 -0
  78. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/.gitignore +8 -0
  79. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/configure.bat +93 -0
  80. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/platform.h +1 -0
  81. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Common.props +21 -0
  82. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DLL.props +16 -0
  83. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Debug.props +29 -0
  84. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugDEXE.props +21 -0
  85. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugDLL.props +20 -0
  86. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLEXE.props +20 -0
  87. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLIB.props +21 -0
  88. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLTCG.props +20 -0
  89. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugSEXE.props +21 -0
  90. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/EXE.props +17 -0
  91. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/LIB.props +16 -0
  92. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/LTCG.props +13 -0
  93. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Link.props +21 -0
  94. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Messages.props +15 -0
  95. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Output.props +30 -0
  96. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Release.props +41 -0
  97. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseDEXE.props +20 -0
  98. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseDLL.props +19 -0
  99. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLEXE.props +20 -0
  100. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLIB.props +19 -0
  101. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLTCG.props +19 -0
  102. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseSEXE.props +20 -0
  103. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Win32.props +20 -0
  104. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/x64.props +23 -0
  105. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/resource.h +14 -0
  106. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/resource.rc +94 -0
  107. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/build.bat +48 -0
  108. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/call_javah.bat +84 -0
  109. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/czmq.sln +25 -0
  110. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.props +69 -0
  111. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.vcxproj +165 -0
  112. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.vcxproj.filters +210 -0
  113. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/build.bat +48 -0
  114. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/call_javah.bat +84 -0
  115. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/czmq.sln +25 -0
  116. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.props +69 -0
  117. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.vcxproj +165 -0
  118. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.vcxproj.filters +210 -0
  119. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/build.bat +48 -0
  120. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/call_javah.bat +84 -0
  121. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/czmq.sln +25 -0
  122. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.props +69 -0
  123. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.vcxproj +165 -0
  124. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.vcxproj.filters +210 -0
  125. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/build.bat +48 -0
  126. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/call_javah.bat +84 -0
  127. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/czmq.sln +25 -0
  128. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.props +69 -0
  129. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.vcxproj +165 -0
  130. data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.vcxproj.filters +210 -0
  131. data/vendor/github.com/zeromq/czmq/bindings/jni/settings.gradle +1 -0
  132. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zarmour.c +132 -0
  133. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zcert.c +188 -0
  134. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zcertstore.c +69 -0
  135. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zchunk.c +191 -0
  136. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zclock.c +54 -0
  137. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zconfig.c +252 -0
  138. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zdigest.c +66 -0
  139. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zdir.c +116 -0
  140. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_ZdirPatch.c +88 -0
  141. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zfile.c +186 -0
  142. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zframe.c +199 -0
  143. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zhash.c +174 -0
  144. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zhashx.c +175 -0
  145. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ziflist.c +112 -0
  146. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zlist.c +135 -0
  147. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zlistx.c +189 -0
  148. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zloop.c +95 -0
  149. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zmsg.c +261 -0
  150. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zpoller.c +74 -0
  151. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zproc.c +278 -0
  152. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zsock.c +1310 -0
  153. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zstr.c +108 -0
  154. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zsys.c +445 -0
  155. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ztimerset.c +68 -0
  156. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ztrie.c +86 -0
  157. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zuuid.c +125 -0
  158. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zarmour.java +148 -0
  159. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zcert.java +178 -0
  160. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zcertstore.java +94 -0
  161. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zchunk.java +204 -0
  162. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zclock.java +67 -0
  163. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zconfig.java +253 -0
  164. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zdigest.java +78 -0
  165. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zdir.java +159 -0
  166. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/ZdirPatch.java +96 -0
  167. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zfile.java +217 -0
  168. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zframe.java +212 -0
  169. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zhash.java +223 -0
  170. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zhashx.java +248 -0
  171. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ziflist.java +124 -0
  172. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zlist.java +171 -0
  173. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zlistx.java +247 -0
  174. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zloop.java +134 -0
  175. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zmsg.java +308 -0
  176. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zpoller.java +105 -0
  177. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zproc.java +331 -0
  178. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zsock.java +1556 -0
  179. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zstr.java +117 -0
  180. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zsys.java +534 -0
  181. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ztimerset.java +87 -0
  182. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ztrie.java +102 -0
  183. data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zuuid.java +127 -0
  184. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZarmourTest.java +25 -0
  185. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZcertTest.java +25 -0
  186. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZcertstoreTest.java +25 -0
  187. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZchunkTest.java +25 -0
  188. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZclockTest.java +25 -0
  189. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZconfigTest.java +25 -0
  190. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdigestTest.java +25 -0
  191. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdirPatchTest.java +25 -0
  192. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdirTest.java +25 -0
  193. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZfileTest.java +25 -0
  194. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZframeTest.java +25 -0
  195. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZhashTest.java +25 -0
  196. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZhashxTest.java +25 -0
  197. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZiflistTest.java +25 -0
  198. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZlistTest.java +25 -0
  199. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZlistxTest.java +25 -0
  200. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZloopTest.java +25 -0
  201. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZmsgTest.java +25 -0
  202. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZpollerTest.java +25 -0
  203. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZprocTest.java +25 -0
  204. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZsockTest.java +25 -0
  205. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZstrTest.java +25 -0
  206. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZsysTest.java +25 -0
  207. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZtimersetTest.java +25 -0
  208. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZtrieTest.java +25 -0
  209. data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZuuidTest.java +25 -0
  210. data/vendor/github.com/zeromq/czmq/bindings/lua_ffi/czmq_ffi.lua +4079 -0
  211. data/vendor/github.com/zeromq/czmq/bindings/nodejs/.gitignore +10 -0
  212. data/vendor/github.com/zeromq/czmq/bindings/nodejs/.prebuildrc +2 -0
  213. data/vendor/github.com/zeromq/czmq/bindings/nodejs/README.md +4373 -0
  214. data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.cc +8324 -0
  215. data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.gyp +49 -0
  216. data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.h +952 -0
  217. data/vendor/github.com/zeromq/czmq/bindings/nodejs/build.sh +79 -0
  218. data/vendor/github.com/zeromq/czmq/bindings/nodejs/index.js +39 -0
  219. data/vendor/github.com/zeromq/czmq/bindings/nodejs/package.json +26 -0
  220. data/vendor/github.com/zeromq/czmq/bindings/nodejs/test_binding.js +32 -0
  221. data/vendor/github.com/zeromq/czmq/bindings/python/ci_build.sh +59 -0
  222. data/vendor/github.com/zeromq/czmq/bindings/python/czmq/__init__.py +3 -0
  223. data/vendor/github.com/zeromq/czmq/bindings/python/czmq/_czmq_ctypes.py +8344 -0
  224. data/vendor/github.com/zeromq/czmq/bindings/python/test.py +1078 -0
  225. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/README.md +28 -0
  226. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zactor.py +78 -0
  227. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zargs.py +133 -0
  228. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zarmour.py +124 -0
  229. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zcert.py +132 -0
  230. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zcertstore.py +84 -0
  231. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zchunk.py +192 -0
  232. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zclock.py +59 -0
  233. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zconfig.py +211 -0
  234. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zdigest.py +64 -0
  235. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zdir.py +144 -0
  236. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/ZdirPatch.py +79 -0
  237. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zfile.py +185 -0
  238. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zframe.py +160 -0
  239. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zhash.py +197 -0
  240. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zhashx.py +271 -0
  241. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ziflist.py +103 -0
  242. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zlist.py +176 -0
  243. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zlistx.py +235 -0
  244. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zloop.py +171 -0
  245. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zmsg.py +250 -0
  246. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zpoller.py +89 -0
  247. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zproc.py +287 -0
  248. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zsock.py +1283 -0
  249. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zstr.py +123 -0
  250. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zsys.py +532 -0
  251. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ztimerset.py +78 -0
  252. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ztrie.py +93 -0
  253. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zuuid.py +100 -0
  254. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/__init__.py +33 -0
  255. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/_cdefs.inc +4081 -0
  256. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/build.py +345 -0
  257. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/cdefs.py +4086 -0
  258. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/dlopen.py +33 -0
  259. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/utils.py +50 -0
  260. data/vendor/github.com/zeromq/czmq/bindings/python_cffi/setup.py +23 -0
  261. data/vendor/github.com/zeromq/czmq/bindings/qml/.gitignore +1 -0
  262. data/vendor/github.com/zeromq/czmq/bindings/qml/README.md +157 -0
  263. data/vendor/github.com/zeromq/czmq/bindings/qml/Rakefile +34 -0
  264. data/vendor/github.com/zeromq/czmq/bindings/qml/qml_czmq_bindings.pro +136 -0
  265. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZactor.cpp +88 -0
  266. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZactor.h +86 -0
  267. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZargs.cpp +121 -0
  268. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZargs.h +105 -0
  269. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZarmour.cpp +135 -0
  270. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZarmour.h +108 -0
  271. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcert.cpp +166 -0
  272. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcert.h +122 -0
  273. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcertstore.cpp +95 -0
  274. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcertstore.h +93 -0
  275. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZchunk.cpp +214 -0
  276. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZchunk.h +149 -0
  277. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZclock.cpp +67 -0
  278. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZclock.h +77 -0
  279. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZconfig.cpp +255 -0
  280. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZconfig.h +165 -0
  281. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdigest.cpp +70 -0
  282. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdigest.h +78 -0
  283. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdir.cpp +158 -0
  284. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdir.h +134 -0
  285. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdirPatch.cpp +89 -0
  286. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdirPatch.h +84 -0
  287. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZfile.cpp +204 -0
  288. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZfile.h +152 -0
  289. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZframe.cpp +200 -0
  290. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZframe.h +143 -0
  291. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhash.cpp +219 -0
  292. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhash.h +174 -0
  293. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhashx.cpp +308 -0
  294. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhashx.h +225 -0
  295. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZiflist.cpp +111 -0
  296. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZiflist.h +96 -0
  297. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlist.cpp +184 -0
  298. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlist.h +148 -0
  299. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlistx.cpp +244 -0
  300. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlistx.h +184 -0
  301. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZloop.cpp +177 -0
  302. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZloop.h +149 -0
  303. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZmsg.cpp +313 -0
  304. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZmsg.h +209 -0
  305. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZpoller.cpp +95 -0
  306. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZpoller.h +97 -0
  307. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZproc.cpp +296 -0
  308. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZproc.h +211 -0
  309. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsock.cpp +1471 -0
  310. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsock.h +882 -0
  311. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZstr.cpp +137 -0
  312. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZstr.h +120 -0
  313. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsys.cpp +541 -0
  314. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsys.h +373 -0
  315. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtimerset.cpp +84 -0
  316. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtimerset.h +86 -0
  317. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtrie.cpp +101 -0
  318. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtrie.h +95 -0
  319. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZuuid.cpp +116 -0
  320. data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZuuid.h +99 -0
  321. data/vendor/github.com/zeromq/czmq/bindings/qml/src/qml_czmq_plugin.h +174 -0
  322. data/vendor/github.com/zeromq/czmq/bindings/qml/src/qmldir +2 -0
  323. data/vendor/github.com/zeromq/czmq/bindings/qml/test/tst_QmlCZMQ.qml +16 -0
  324. data/vendor/github.com/zeromq/czmq/bindings/qt/README.md +87 -0
  325. data/vendor/github.com/zeromq/czmq/bindings/qt/buildlib/buildlib.pro +36 -0
  326. data/vendor/github.com/zeromq/czmq/bindings/qt/common.pri +20 -0
  327. data/vendor/github.com/zeromq/czmq/bindings/qt/config.pri +1 -0
  328. data/vendor/github.com/zeromq/czmq/bindings/qt/qczmq.pro +13 -0
  329. data/vendor/github.com/zeromq/czmq/bindings/qt/selftest/main.cpp +57 -0
  330. data/vendor/github.com/zeromq/czmq/bindings/qt/selftest/selftest.pro +19 -0
  331. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qczmq.h +96 -0
  332. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qczmq.pri +81 -0
  333. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzactor.cpp +98 -0
  334. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzactor.h +61 -0
  335. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzargs.cpp +130 -0
  336. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzargs.h +72 -0
  337. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzarmour.cpp +162 -0
  338. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzarmour.h +83 -0
  339. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcert.cpp +191 -0
  340. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcert.h +97 -0
  341. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcertstore.cpp +105 -0
  342. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcertstore.h +68 -0
  343. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzchunk.cpp +250 -0
  344. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzchunk.h +124 -0
  345. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzclock.cpp +78 -0
  346. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzclock.h +52 -0
  347. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzconfig.cpp +292 -0
  348. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzconfig.h +140 -0
  349. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdigest.cpp +80 -0
  350. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdigest.h +53 -0
  351. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdir.cpp +176 -0
  352. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdir.h +109 -0
  353. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdirpatch.cpp +101 -0
  354. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdirpatch.h +59 -0
  355. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzfile.cpp +243 -0
  356. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzfile.h +127 -0
  357. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzframe.cpp +231 -0
  358. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzframe.h +118 -0
  359. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhash.cpp +250 -0
  360. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhash.h +149 -0
  361. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhashx.cpp +350 -0
  362. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhashx.h +200 -0
  363. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qziflist.cpp +133 -0
  364. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qziflist.h +71 -0
  365. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlist.cpp +220 -0
  366. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlist.h +123 -0
  367. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlistx.cpp +296 -0
  368. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlistx.h +159 -0
  369. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzloop.cpp +211 -0
  370. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzloop.h +124 -0
  371. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzmsg.cpp +354 -0
  372. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzmsg.h +184 -0
  373. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzpoller.cpp +100 -0
  374. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzpoller.h +67 -0
  375. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzproc.cpp +365 -0
  376. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzproc.h +186 -0
  377. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsock.cpp +1719 -0
  378. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsock.h +815 -0
  379. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzstr.cpp +128 -0
  380. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzstr.h +78 -0
  381. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsys.cpp +600 -0
  382. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsys.h +321 -0
  383. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztimerset.cpp +98 -0
  384. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztimerset.h +61 -0
  385. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztrie.cpp +117 -0
  386. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztrie.h +70 -0
  387. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzuuid.cpp +135 -0
  388. data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzuuid.h +74 -0
  389. data/vendor/github.com/zeromq/czmq/bindings/ruby/Rakefile +8 -0
  390. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi.rb +875 -0
  391. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/version.rb +15 -0
  392. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zactor.rb +219 -0
  393. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zargs.rb +259 -0
  394. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zarmour.rb +286 -0
  395. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zcert.rb +304 -0
  396. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zcertstore.rb +224 -0
  397. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zchunk.rb +388 -0
  398. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zclock.rb +140 -0
  399. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zconfig.rb +462 -0
  400. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdigest.rb +156 -0
  401. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdir.rb +283 -0
  402. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdir_patch.rb +194 -0
  403. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zfile.rb +361 -0
  404. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zframe.rb +360 -0
  405. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zhash.rb +386 -0
  406. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zhashx.rb +617 -0
  407. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ziflist.rb +219 -0
  408. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zlist.rb +365 -0
  409. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zlistx.rb +478 -0
  410. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zloop.rb +396 -0
  411. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zmsg.rb +515 -0
  412. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zpoller.rb +194 -0
  413. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zproc.rb +497 -0
  414. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zsock.rb +4673 -0
  415. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zstr.rb +242 -0
  416. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zsys.rb +836 -0
  417. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ztimerset.rb +203 -0
  418. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ztrie.rb +221 -0
  419. data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zuuid.rb +227 -0
  420. data/vendor/github.com/zeromq/czmq/bindings/ruby/spec/ffi_spec.rb +15 -0
  421. data/vendor/github.com/zeromq/czmq/bindings/ruby/spec/spec_helper.rb +8 -0
  422. data/vendor/github.com/zeromq/czmq/builds/android/android_build_helper.sh +298 -0
  423. data/vendor/github.com/zeromq/czmq/builds/android/build.sh +94 -0
  424. data/vendor/github.com/zeromq/czmq/builds/android/ci_build.sh +41 -0
  425. data/vendor/github.com/zeromq/czmq/builds/check_zproject/ci_build.sh +52 -0
  426. data/vendor/github.com/zeromq/czmq/builds/check_zproto/ci_build.sh +23 -0
  427. data/vendor/github.com/zeromq/czmq/builds/cmake/ci_build.sh +93 -0
  428. data/vendor/github.com/zeromq/czmq/builds/cygwin/Makefile.cygwin +32 -0
  429. data/vendor/github.com/zeromq/czmq/builds/docs/ci_build.sh +24 -0
  430. data/vendor/github.com/zeromq/czmq/builds/gyp/.gitignore +5 -0
  431. data/vendor/github.com/zeromq/czmq/builds/gyp/README.md +33 -0
  432. data/vendor/github.com/zeromq/czmq/builds/gyp/platform.h +46 -0
  433. data/vendor/github.com/zeromq/czmq/builds/gyp/project.gyp +195 -0
  434. data/vendor/github.com/zeromq/czmq/builds/mingw32/Makefile.mingw32 +33 -0
  435. data/vendor/github.com/zeromq/czmq/builds/mingw32/platform.h +0 -0
  436. data/vendor/github.com/zeromq/czmq/builds/msvc/.gitignore +8 -0
  437. data/vendor/github.com/zeromq/czmq/builds/msvc/configure.bat +93 -0
  438. data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.bat +14 -0
  439. data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.nuspec +92 -0
  440. data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.targets +128 -0
  441. data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.xml +29 -0
  442. data/vendor/github.com/zeromq/czmq/builds/msvc/platform.h +1 -0
  443. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Common.props +21 -0
  444. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DLL.props +16 -0
  445. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Debug.props +29 -0
  446. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugDEXE.props +21 -0
  447. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugDLL.props +20 -0
  448. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLEXE.props +20 -0
  449. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLIB.props +21 -0
  450. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLTCG.props +20 -0
  451. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugSEXE.props +21 -0
  452. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/EXE.props +17 -0
  453. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/LIB.props +16 -0
  454. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/LTCG.props +13 -0
  455. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Link.props +21 -0
  456. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Messages.props +15 -0
  457. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Output.props +30 -0
  458. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Release.props +41 -0
  459. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseDEXE.props +20 -0
  460. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseDLL.props +19 -0
  461. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLEXE.props +20 -0
  462. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLIB.props +19 -0
  463. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLTCG.props +19 -0
  464. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseSEXE.props +20 -0
  465. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Win32.props +20 -0
  466. data/vendor/github.com/zeromq/czmq/builds/msvc/properties/x64.props +23 -0
  467. data/vendor/github.com/zeromq/czmq/builds/msvc/resource.h +14 -0
  468. data/vendor/github.com/zeromq/czmq/builds/msvc/resource.rc +94 -0
  469. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2008/czmq/czmq.sln +65 -0
  470. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2008/czmq/czmq.vcproj +1411 -0
  471. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/.gitignore +1 -0
  472. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/build.bat +129 -0
  473. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq.import.props +59 -0
  474. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq.sln +81 -0
  475. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq_selftest/czmq_selftest.props +75 -0
  476. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq_selftest/czmq_selftest.vcxproj +146 -0
  477. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.import.xml +29 -0
  478. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.props +81 -0
  479. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.vcxproj +215 -0
  480. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.vcxproj.filters +203 -0
  481. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/test_randof/test_randof.props +75 -0
  482. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/test_randof/test_randof.vcxproj +146 -0
  483. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zmakecert/zmakecert.props +75 -0
  484. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zmakecert/zmakecert.vcxproj +146 -0
  485. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zsp/zsp.props +75 -0
  486. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zsp/zsp.vcxproj +146 -0
  487. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/.gitignore +1 -0
  488. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/build.bat +129 -0
  489. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq.import.props +59 -0
  490. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq.sln +81 -0
  491. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq_selftest/czmq_selftest.props +75 -0
  492. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq_selftest/czmq_selftest.vcxproj +146 -0
  493. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.import.xml +29 -0
  494. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.props +81 -0
  495. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.vcxproj +215 -0
  496. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.vcxproj.filters +203 -0
  497. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/test_randof/test_randof.props +75 -0
  498. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/test_randof/test_randof.vcxproj +146 -0
  499. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zmakecert/zmakecert.props +75 -0
  500. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zmakecert/zmakecert.vcxproj +146 -0
  501. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zsp/zsp.props +75 -0
  502. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zsp/zsp.vcxproj +146 -0
  503. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/build.bat +129 -0
  504. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq.import.props +59 -0
  505. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq.sln +81 -0
  506. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq_selftest/czmq_selftest.props +75 -0
  507. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq_selftest/czmq_selftest.vcxproj +146 -0
  508. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.import.xml +29 -0
  509. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.props +81 -0
  510. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.vcxproj +215 -0
  511. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.vcxproj.filters +203 -0
  512. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/test_randof/test_randof.props +75 -0
  513. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/test_randof/test_randof.vcxproj +146 -0
  514. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zmakecert/zmakecert.props +75 -0
  515. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zmakecert/zmakecert.vcxproj +146 -0
  516. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zsp/zsp.props +75 -0
  517. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zsp/zsp.vcxproj +146 -0
  518. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/build.bat +129 -0
  519. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq.import.props +59 -0
  520. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq.sln +81 -0
  521. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq_selftest/czmq_selftest.props +75 -0
  522. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq_selftest/czmq_selftest.vcxproj +146 -0
  523. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.import.xml +29 -0
  524. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.props +81 -0
  525. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.vcxproj +215 -0
  526. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.vcxproj.filters +203 -0
  527. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/test_randof/test_randof.props +75 -0
  528. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/test_randof/test_randof.vcxproj +146 -0
  529. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zmakecert/zmakecert.props +75 -0
  530. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zmakecert/zmakecert.vcxproj +146 -0
  531. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zsp/zsp.props +75 -0
  532. data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zsp/zsp.vcxproj +146 -0
  533. data/vendor/github.com/zeromq/czmq/builds/nuget/czmq.autobuild +49 -0
  534. data/vendor/github.com/zeromq/czmq/builds/nuget/readme.nuget +18 -0
  535. data/vendor/github.com/zeromq/czmq/builds/rpi/.gitignore +8 -0
  536. data/vendor/github.com/zeromq/czmq/builds/rpi/README.md +62 -0
  537. data/vendor/github.com/zeromq/czmq/builds/rpi/build.sh +142 -0
  538. data/vendor/github.com/zeromq/czmq/builds/rpi/build_image.sh +32 -0
  539. data/vendor/github.com/zeromq/czmq/builds/rpi/prepare_img.sh +111 -0
  540. data/vendor/github.com/zeromq/czmq/builds/stable_zmq/ci_build.sh +62 -0
  541. data/vendor/github.com/zeromq/czmq/builds/valgrind/ci_build.sh +43 -0
  542. data/vendor/github.com/zeromq/czmq/ci_build.sh +317 -0
  543. data/vendor/github.com/zeromq/czmq/ci_deploy.sh +29 -0
  544. data/vendor/github.com/zeromq/czmq/ci_deploy_obs.sh +23 -0
  545. data/vendor/github.com/zeromq/czmq/configure.ac +856 -0
  546. data/vendor/github.com/zeromq/czmq/doc/.gitignore +91 -0
  547. data/vendor/github.com/zeromq/czmq/doc/Makefile.am +222 -0
  548. data/vendor/github.com/zeromq/czmq/doc/asciidoc.conf +64 -0
  549. data/vendor/github.com/zeromq/czmq/doc/czmq.adoc +51 -0
  550. data/vendor/github.com/zeromq/czmq/doc/czmq.txt +380 -0
  551. data/vendor/github.com/zeromq/czmq/doc/mkman +217 -0
  552. data/vendor/github.com/zeromq/czmq/doc/mkmans +15 -0
  553. data/vendor/github.com/zeromq/czmq/doc/wdput +43 -0
  554. data/vendor/github.com/zeromq/czmq/examples/security/LICENSE +18 -0
  555. data/vendor/github.com/zeromq/czmq/examples/security/README.txt +9 -0
  556. data/vendor/github.com/zeromq/czmq/examples/security/grasslands.c +32 -0
  557. data/vendor/github.com/zeromq/czmq/examples/security/hello.c +13 -0
  558. data/vendor/github.com/zeromq/czmq/examples/security/ironhouse.c +64 -0
  559. data/vendor/github.com/zeromq/czmq/examples/security/ironhouse2.c +123 -0
  560. data/vendor/github.com/zeromq/czmq/examples/security/ironhouse2_v2.c +107 -0
  561. data/vendor/github.com/zeromq/czmq/examples/security/passwords +2 -0
  562. data/vendor/github.com/zeromq/czmq/examples/security/stonehouse.c +59 -0
  563. data/vendor/github.com/zeromq/czmq/examples/security/strawhouse.c +49 -0
  564. data/vendor/github.com/zeromq/czmq/examples/security/woodhouse.c +47 -0
  565. data/vendor/github.com/zeromq/czmq/images/README_1.png +0 -0
  566. data/vendor/github.com/zeromq/czmq/include/.gitignore +1 -0
  567. data/vendor/github.com/zeromq/czmq/include/czmq.h +39 -0
  568. data/vendor/github.com/zeromq/czmq/include/czmq_library.h +190 -0
  569. data/vendor/github.com/zeromq/czmq/include/czmq_prelude.h +735 -0
  570. data/vendor/github.com/zeromq/czmq/include/test_zgossip.h +44 -0
  571. data/vendor/github.com/zeromq/czmq/include/zactor.h +94 -0
  572. data/vendor/github.com/zeromq/czmq/include/zargs.h +134 -0
  573. data/vendor/github.com/zeromq/czmq/include/zarmour.h +114 -0
  574. data/vendor/github.com/zeromq/czmq/include/zauth.h +100 -0
  575. data/vendor/github.com/zeromq/czmq/include/zbeacon.h +86 -0
  576. data/vendor/github.com/zeromq/czmq/include/zcert.h +133 -0
  577. data/vendor/github.com/zeromq/czmq/include/zcertstore.h +101 -0
  578. data/vendor/github.com/zeromq/czmq/include/zchunk.h +163 -0
  579. data/vendor/github.com/zeromq/czmq/include/zclock.h +73 -0
  580. data/vendor/github.com/zeromq/czmq/include/zconfig.h +199 -0
  581. data/vendor/github.com/zeromq/czmq/include/zdigest.h +65 -0
  582. data/vendor/github.com/zeromq/czmq/include/zdir.h +149 -0
  583. data/vendor/github.com/zeromq/czmq/include/zdir_patch.h +82 -0
  584. data/vendor/github.com/zeromq/czmq/include/zfile.h +185 -0
  585. data/vendor/github.com/zeromq/czmq/include/zframe.h +177 -0
  586. data/vendor/github.com/zeromq/czmq/include/zgossip.h +95 -0
  587. data/vendor/github.com/zeromq/czmq/include/zhash.h +183 -0
  588. data/vendor/github.com/zeromq/czmq/include/zhashx.h +279 -0
  589. data/vendor/github.com/zeromq/czmq/include/ziflist.h +98 -0
  590. data/vendor/github.com/zeromq/czmq/include/zlist.h +158 -0
  591. data/vendor/github.com/zeromq/czmq/include/zlistx.h +205 -0
  592. data/vendor/github.com/zeromq/czmq/include/zloop.h +163 -0
  593. data/vendor/github.com/zeromq/czmq/include/zmonitor.h +73 -0
  594. data/vendor/github.com/zeromq/czmq/include/zmsg.h +280 -0
  595. data/vendor/github.com/zeromq/czmq/include/zpoller.h +87 -0
  596. data/vendor/github.com/zeromq/czmq/include/zproc.h +270 -0
  597. data/vendor/github.com/zeromq/czmq/include/zproxy.h +111 -0
  598. data/vendor/github.com/zeromq/czmq/include/zrex.h +82 -0
  599. data/vendor/github.com/zeromq/czmq/include/zsock.h +1209 -0
  600. data/vendor/github.com/zeromq/czmq/include/zstr.h +135 -0
  601. data/vendor/github.com/zeromq/czmq/include/zsys.h +439 -0
  602. data/vendor/github.com/zeromq/czmq/include/ztimerset.h +90 -0
  603. data/vendor/github.com/zeromq/czmq/include/ztrie.h +106 -0
  604. data/vendor/github.com/zeromq/czmq/include/zuuid.h +96 -0
  605. data/vendor/github.com/zeromq/czmq/issues/README.md +6 -0
  606. data/vendor/github.com/zeromq/czmq/issues/c +520 -0
  607. data/vendor/github.com/zeromq/czmq/issues/issue-407.c +146 -0
  608. data/vendor/github.com/zeromq/czmq/license.xml +9 -0
  609. data/vendor/github.com/zeromq/czmq/mkdoc +7 -0
  610. data/vendor/github.com/zeromq/czmq/model/chkopts.pl +47 -0
  611. data/vendor/github.com/zeromq/czmq/model/rename_class +42 -0
  612. data/vendor/github.com/zeromq/czmq/packaging/debian/changelog +5 -0
  613. data/vendor/github.com/zeromq/czmq/packaging/debian/compat +1 -0
  614. data/vendor/github.com/zeromq/czmq/packaging/debian/control +86 -0
  615. data/vendor/github.com/zeromq/czmq/packaging/debian/copyright +13 -0
  616. data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.dsc.obs +20 -0
  617. data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.install +2 -0
  618. data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.manpages +1 -0
  619. data/vendor/github.com/zeromq/czmq/packaging/debian/format +1 -0
  620. data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq-dev.install +4 -0
  621. data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq-dev.manpages +2 -0
  622. data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq4.install +1 -0
  623. data/vendor/github.com/zeromq/czmq/packaging/debian/rules +96 -0
  624. data/vendor/github.com/zeromq/czmq/packaging/dist/gitlog2changelog.py +125 -0
  625. data/vendor/github.com/zeromq/czmq/packaging/obs/_service +91 -0
  626. data/vendor/github.com/zeromq/czmq/packaging/redhat/czmq.spec +202 -0
  627. data/vendor/github.com/zeromq/czmq/project.gyp +121 -0
  628. data/vendor/github.com/zeromq/czmq/project.xml +99 -0
  629. data/vendor/github.com/zeromq/czmq/setup.py +9 -0
  630. data/vendor/github.com/zeromq/czmq/src/.gitignore +20 -0
  631. data/vendor/github.com/zeromq/czmq/src/.valgrind.supp +33 -0
  632. data/vendor/github.com/zeromq/czmq/src/CMakeLists-local.txt +22 -0
  633. data/vendor/github.com/zeromq/czmq/src/Makemodule-local.am +15 -0
  634. data/vendor/github.com/zeromq/czmq/src/Makemodule.am +353 -0
  635. data/vendor/github.com/zeromq/czmq/src/czmq_classes.h +388 -0
  636. data/vendor/github.com/zeromq/czmq/src/czmq_private_selftest.c +40 -0
  637. data/vendor/github.com/zeromq/czmq/src/czmq_selftest.c +220 -0
  638. data/vendor/github.com/zeromq/czmq/src/foreign/sha1/sha1.h +76 -0
  639. data/vendor/github.com/zeromq/czmq/src/foreign/sha1/sha1.inc_c +335 -0
  640. data/vendor/github.com/zeromq/czmq/src/foreign/slre/readme.txt +83 -0
  641. data/vendor/github.com/zeromq/czmq/src/foreign/slre/slre.h +92 -0
  642. data/vendor/github.com/zeromq/czmq/src/foreign/slre/slre.inc_c +660 -0
  643. data/vendor/github.com/zeromq/czmq/src/libczmq.pc.in +24 -0
  644. data/vendor/github.com/zeromq/czmq/src/python_cffi.inc +17 -0
  645. data/vendor/github.com/zeromq/czmq/src/selftest-ro/.gitkeep +0 -0
  646. data/vendor/github.com/zeromq/czmq/src/selftest.cfg +5 -0
  647. data/vendor/github.com/zeromq/czmq/src/sockopts.gsl +36 -0
  648. data/vendor/github.com/zeromq/czmq/src/sockopts.xml +193 -0
  649. data/vendor/github.com/zeromq/czmq/src/test_randof.c +182 -0
  650. data/vendor/github.com/zeromq/czmq/src/test_zgossip.c +188 -0
  651. data/vendor/github.com/zeromq/czmq/src/valgrind.supp +14 -0
  652. data/vendor/github.com/zeromq/czmq/src/zactor.c +338 -0
  653. data/vendor/github.com/zeromq/czmq/src/zargs.c +289 -0
  654. data/vendor/github.com/zeromq/czmq/src/zarmour.c +941 -0
  655. data/vendor/github.com/zeromq/czmq/src/zauth.c +821 -0
  656. data/vendor/github.com/zeromq/czmq/src/zbeacon.c +651 -0
  657. data/vendor/github.com/zeromq/czmq/src/zcert.c +557 -0
  658. data/vendor/github.com/zeromq/czmq/src/zcertstore.c +407 -0
  659. data/vendor/github.com/zeromq/czmq/src/zchunk.c +609 -0
  660. data/vendor/github.com/zeromq/czmq/src/zclock.c +237 -0
  661. data/vendor/github.com/zeromq/czmq/src/zconfig.c +1369 -0
  662. data/vendor/github.com/zeromq/czmq/src/zdigest.c +163 -0
  663. data/vendor/github.com/zeromq/czmq/src/zdir.c +1138 -0
  664. data/vendor/github.com/zeromq/czmq/src/zdir_patch.c +227 -0
  665. data/vendor/github.com/zeromq/czmq/src/zfile.c +920 -0
  666. data/vendor/github.com/zeromq/czmq/src/zframe.c +756 -0
  667. data/vendor/github.com/zeromq/czmq/src/zgossip.c +689 -0
  668. data/vendor/github.com/zeromq/czmq/src/zgossip.xml +57 -0
  669. data/vendor/github.com/zeromq/czmq/src/zgossip_engine.inc +1008 -0
  670. data/vendor/github.com/zeromq/czmq/src/zgossip_msg.bnf +43 -0
  671. data/vendor/github.com/zeromq/czmq/src/zgossip_msg.c +688 -0
  672. data/vendor/github.com/zeromq/czmq/src/zgossip_msg.h +127 -0
  673. data/vendor/github.com/zeromq/czmq/src/zgossip_msg.xml +46 -0
  674. data/vendor/github.com/zeromq/czmq/src/zhash.c +956 -0
  675. data/vendor/github.com/zeromq/czmq/src/zhash_primes.inc +329 -0
  676. data/vendor/github.com/zeromq/czmq/src/zhashx.c +1369 -0
  677. data/vendor/github.com/zeromq/czmq/src/ziflist.c +517 -0
  678. data/vendor/github.com/zeromq/czmq/src/zlist.c +634 -0
  679. data/vendor/github.com/zeromq/czmq/src/zlistx.c +753 -0
  680. data/vendor/github.com/zeromq/czmq/src/zloop.c +1000 -0
  681. data/vendor/github.com/zeromq/czmq/src/zmakecert.c +64 -0
  682. data/vendor/github.com/zeromq/czmq/src/zmonitor.c +447 -0
  683. data/vendor/github.com/zeromq/czmq/src/zmsg.c +1258 -0
  684. data/vendor/github.com/zeromq/czmq/src/zpoller.c +397 -0
  685. data/vendor/github.com/zeromq/czmq/src/zproc.c +1160 -0
  686. data/vendor/github.com/zeromq/czmq/src/zproxy.c +791 -0
  687. data/vendor/github.com/zeromq/czmq/src/zrex.c +310 -0
  688. data/vendor/github.com/zeromq/czmq/src/zsock.c +2207 -0
  689. data/vendor/github.com/zeromq/czmq/src/zsock_option.gsl +404 -0
  690. data/vendor/github.com/zeromq/czmq/src/zsock_option.inc +3946 -0
  691. data/vendor/github.com/zeromq/czmq/src/zsp.c +118 -0
  692. data/vendor/github.com/zeromq/czmq/src/zstr.c +548 -0
  693. data/vendor/github.com/zeromq/czmq/src/zsys.c +2225 -0
  694. data/vendor/github.com/zeromq/czmq/src/ztimerset.c +227 -0
  695. data/vendor/github.com/zeromq/czmq/src/ztrie.c +809 -0
  696. data/vendor/github.com/zeromq/czmq/src/zuuid.c +344 -0
  697. metadata +780 -0
@@ -0,0 +1,310 @@
1
+ /* =========================================================================
2
+ zrex - work with regular expressions
3
+
4
+ Copyright (c) the Contributors as noted in the AUTHORS file.
5
+ This file is part of CZMQ, the high-level C binding for 0MQ:
6
+ http://czmq.zeromq.org.
7
+
8
+ This Source Code Form is subject to the terms of the Mozilla Public
9
+ License, v. 2.0. If a copy of the MPL was not distributed with this
10
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
11
+ =========================================================================
12
+ */
13
+
14
+ /*
15
+ @header
16
+ Wraps a very simple regular expression library (SLRE) as a CZMQ class.
17
+ Supports this syntax:
18
+
19
+ ^ Match beginning of a buffer
20
+ $ Match end of a buffer
21
+ () Grouping and substring capturing
22
+ [...] Match any character from set
23
+ [^...] Match any character but ones from set
24
+ . Match any character
25
+ \s Match whitespace
26
+ \S Match non-whitespace
27
+ \d Match decimal digit
28
+ \D Match non decimal digit
29
+ \a Match alphabetic character
30
+ \A Match non-alphabetic character
31
+ \w Match alphanumeric character
32
+ \W Match non-alphanumeric character
33
+ \r Match carriage return
34
+ \n Match newline
35
+ + Match one or more times (greedy)
36
+ +? Match one or more times (non-greedy)
37
+ * Match zero or more times (greedy)
38
+ *? Match zero or more times (non-greedy)
39
+ ? Match zero or once
40
+ \xDD Match byte with hex value 0xDD
41
+ \meta Match one of the meta character: ^$().[*+?\
42
+ @discuss
43
+ @end
44
+ */
45
+
46
+ #include "czmq_classes.h"
47
+ #include "foreign/slre/slre.inc_c"
48
+
49
+ #define MAX_HITS 100 // Should be enough for anyone :)
50
+
51
+ // Structure of our class
52
+
53
+ struct _zrex_t {
54
+ struct slre slre; // Compiled regular expression
55
+ bool valid; // Is expression valid or not?
56
+ const char *strerror; // Error message if any
57
+ uint hits; // Number of hits matched
58
+ size_t hit_set_len; // Length of hit set
59
+ char *hit_set; // Captured hits as single string
60
+ char *hit [MAX_HITS]; // Pointers into hit_set
61
+ struct cap caps [MAX_HITS]; // Position/length for each hit
62
+ };
63
+
64
+
65
+ // --------------------------------------------------------------------------
66
+ // Constructor. Optionally, sets an expression against which we can match
67
+ // text and capture hits. If there is an error in the expression, reports
68
+ // zrex_valid() as false and provides the error in zrex_strerror(). If you
69
+ // set a pattern, you can call zrex_matches() to test it against text.
70
+
71
+ zrex_t *
72
+ zrex_new (const char *expression)
73
+ {
74
+ zrex_t *self = (zrex_t *) zmalloc (sizeof (zrex_t));
75
+ assert (self);
76
+ self->strerror = "No error";
77
+ if (expression) {
78
+ // Returns 1 on success, 0 on failure
79
+ self->valid = (slre_compile (&self->slre, expression) == 1);
80
+ if (!self->valid)
81
+ self->strerror = self->slre.err_str;
82
+ assert (self->slre.num_caps < MAX_HITS);
83
+ }
84
+ return self;
85
+ }
86
+
87
+
88
+ // --------------------------------------------------------------------------
89
+ // Destructor
90
+
91
+ void
92
+ zrex_destroy (zrex_t **self_p)
93
+ {
94
+ assert (self_p);
95
+ if (*self_p) {
96
+ zrex_t *self = *self_p;
97
+ zstr_free (&self->hit_set);
98
+ freen (self);
99
+ *self_p = NULL;
100
+ }
101
+ }
102
+
103
+
104
+ // --------------------------------------------------------------------------
105
+ // Return true if the expression was valid and compiled without errors.
106
+
107
+ bool
108
+ zrex_valid (zrex_t *self)
109
+ {
110
+ assert (self);
111
+ return self->valid;
112
+ }
113
+
114
+
115
+ // --------------------------------------------------------------------------
116
+ // Return the error message generated during compilation of the expression.
117
+
118
+ const char *
119
+ zrex_strerror (zrex_t *self)
120
+ {
121
+ assert (self);
122
+ return self->strerror;
123
+ }
124
+
125
+
126
+ // --------------------------------------------------------------------------
127
+ // Returns true if the text matches the previously compiled expression.
128
+ // Use this method to compare one expression against many strings.
129
+
130
+ bool
131
+ zrex_matches (zrex_t *self, const char *text)
132
+ {
133
+ assert (self);
134
+ assert (text);
135
+
136
+ // Free any previously-allocated hits
137
+ self->hits = 0;
138
+
139
+ bool matches = slre_match (&self->slre, text, strlen (text), self->caps) != 0;
140
+ if (matches) {
141
+ // Count number of captures plus whole string
142
+ self->hits = self->slre.num_caps + 1;
143
+ if (self->hits > MAX_HITS)
144
+ self->hits = MAX_HITS;
145
+
146
+ // Collect hits and prepare hit array, which is a single block of
147
+ // memory holding all hits as null-terminated strings
148
+ uint index;
149
+ // First count total length of hit strings
150
+ size_t hit_set_len = 0;
151
+ for (index = 0; index < self->hits; index++)
152
+ hit_set_len += self->caps [index].len + 1;
153
+ if (hit_set_len > self->hit_set_len) {
154
+ zstr_free (&self->hit_set);
155
+ self->hit_set = (char *) zmalloc (hit_set_len);
156
+ self->hit_set_len = hit_set_len;
157
+ }
158
+ // FIXME: no way to return an error
159
+ assert (self->hit_set);
160
+
161
+ // Now prepare hit strings for access by caller
162
+ char *hit_set_ptr = self->hit_set;
163
+ for (index = 0; index < self->hits; index++) {
164
+ memcpy (hit_set_ptr, self->caps [index].ptr, self->caps [index].len);
165
+ self->hit [index] = hit_set_ptr;
166
+ hit_set_ptr += self->caps [index].len + 1;
167
+ }
168
+ }
169
+ return matches;
170
+ }
171
+
172
+
173
+ // --------------------------------------------------------------------------
174
+ // Returns true if the text matches the supplied expression. Use this
175
+ // method to compare one string against several expressions.
176
+
177
+ bool
178
+ zrex_eq (zrex_t *self, const char *text, const char *expression)
179
+ {
180
+ assert (self);
181
+ assert (text);
182
+ assert (expression);
183
+
184
+ // Compile the new expression
185
+ self->valid = (slre_compile (&self->slre, expression) == 1);
186
+ if (!self->valid)
187
+ self->strerror = self->slre.err_str;
188
+ assert (self->slre.num_caps < MAX_HITS);
189
+
190
+ // zrex_matches takes care of the rest for us
191
+ if (self->valid)
192
+ return zrex_matches (self, text);
193
+ else
194
+ return false;
195
+ }
196
+
197
+
198
+ // --------------------------------------------------------------------------
199
+ // Returns number of hits from last zrex_matches or zrex_eq. If the text
200
+ // matched, returns 1 plus the number of capture groups. If the text did
201
+ // not match, returns zero. To retrieve individual capture groups, call
202
+ // zrex_hit ().
203
+
204
+ int
205
+ zrex_hits (zrex_t *self)
206
+ {
207
+ assert (self);
208
+ return self->hits;
209
+ }
210
+
211
+
212
+ // --------------------------------------------------------------------------
213
+ // Returns the Nth capture group from the last expression match, where
214
+ // N is 0 to the value returned by zrex_hits(). Capture group 0 is the
215
+ // whole matching string. Sequence 1 is the first capture group, if any,
216
+ // and so on.
217
+
218
+ const char *
219
+ zrex_hit (zrex_t *self, uint index)
220
+ {
221
+ assert (self);
222
+ if (index < self->hits)
223
+ return self->hit [index];
224
+ else
225
+ return NULL;
226
+ }
227
+
228
+
229
+ // --------------------------------------------------------------------------
230
+ // Fetches hits into string variables provided by caller; this makes for
231
+ // nicer code than accessing hits by index. Caller should not modify nor
232
+ // free the returned values. Returns number of strings returned. This
233
+ // method starts at hit 1, i.e. first capture group, as hit 0 is always
234
+ // the original matched string.
235
+
236
+ int
237
+ zrex_fetch (zrex_t *self, const char **string_p, ...)
238
+ {
239
+ assert (self);
240
+ va_list args;
241
+ va_start (args, string_p);
242
+ uint index = 0;
243
+ while (string_p) {
244
+ *string_p = zrex_hit (self, ++index);
245
+ string_p = va_arg (args, const char **);
246
+ }
247
+ va_end (args);
248
+ return index;
249
+ }
250
+
251
+
252
+ // --------------------------------------------------------------------------
253
+ // Selftest
254
+
255
+ void
256
+ zrex_test (bool verbose)
257
+ {
258
+ printf (" * zrex: ");
259
+
260
+ // @selftest
261
+ // This shows the pattern of matching many lines to a single pattern
262
+ zrex_t *rex = zrex_new ("\\d+-\\d+-\\d+");
263
+ assert (rex);
264
+ assert (zrex_valid (rex));
265
+ bool matches = zrex_matches (rex, "123-456-789");
266
+ assert (matches);
267
+ assert (zrex_hits (rex) == 1);
268
+ assert (streq (zrex_hit (rex, 0), "123-456-789"));
269
+ assert (zrex_hit (rex, 1) == NULL);
270
+ zrex_destroy (&rex);
271
+
272
+ // Here we pick out hits using capture groups
273
+ rex = zrex_new ("(\\d+)-(\\d+)-(\\d+)");
274
+ assert (rex);
275
+ assert (zrex_valid (rex));
276
+ matches = zrex_matches (rex, "123-456-ABC");
277
+ assert (!matches);
278
+ matches = zrex_matches (rex, "123-456-789");
279
+ assert (matches);
280
+ assert (zrex_hits (rex) == 4);
281
+ assert (streq (zrex_hit (rex, 0), "123-456-789"));
282
+ assert (streq (zrex_hit (rex, 1), "123"));
283
+ assert (streq (zrex_hit (rex, 2), "456"));
284
+ assert (streq (zrex_hit (rex, 3), "789"));
285
+ zrex_destroy (&rex);
286
+
287
+ // This shows the pattern of matching one line against many
288
+ // patterns and then handling the case when it hits
289
+ rex = zrex_new (NULL); // No initial pattern
290
+ assert (rex);
291
+ char *input = "Mechanism: CURVE";
292
+ matches = zrex_eq (rex, input, "Version: (.+)");
293
+ assert (!matches);
294
+ assert (zrex_hits (rex) == 0);
295
+ matches = zrex_eq (rex, input, "Mechanism: (.+)");
296
+ assert (matches);
297
+ assert (zrex_hits (rex) == 2);
298
+ const char *mechanism;
299
+ zrex_fetch (rex, &mechanism, NULL);
300
+ assert (streq (zrex_hit (rex, 1), "CURVE"));
301
+ assert (streq (mechanism, "CURVE"));
302
+ zrex_destroy (&rex);
303
+
304
+ #if defined (__WINDOWS__)
305
+ zsys_shutdown();
306
+ #endif
307
+
308
+ // @end
309
+ printf ("OK\n");
310
+ }
@@ -0,0 +1,2207 @@
1
+ /* =========================================================================
2
+ zsock - high-level socket API that hides libzmq contexts and sockets
3
+
4
+ Copyright (c) the Contributors as noted in the AUTHORS file.
5
+ This file is part of CZMQ, the high-level C binding for 0MQ:
6
+ http://czmq.zeromq.org.
7
+
8
+ This Source Code Form is subject to the terms of the Mozilla Public
9
+ License, v. 2.0. If a copy of the MPL was not distributed with this
10
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
11
+ =========================================================================
12
+ */
13
+
14
+ /*
15
+ @header
16
+ The zsock class wraps the libzmq socket handle (a void *) with a proper
17
+ structure that follows the CLASS rules for construction and destruction.
18
+ Some zsock methods take a void * "polymorphic" reference, which can be
19
+ either a zsock_t or a zactor_t reference, or a libzmq void *.
20
+ @discuss
21
+ @end
22
+ */
23
+
24
+ #define ZSOCK_NOCHECK // we are defining the methods here, so don't redirect symbols.
25
+
26
+ #include "czmq_classes.h"
27
+ #include "zsock_option.inc"
28
+
29
+ // zsock_t instances always have this tag as the first 4 octets of
30
+ // their data, which lets us do runtime object typing & validation.
31
+ #define ZSOCK_TAG 0x0004cafe
32
+
33
+ // This port range is defined by IANA for dynamic or private ports
34
+ // We use this when choosing a port for dynamic binding.
35
+ #define DYNAMIC_FIRST 0xc000 // 49152
36
+ #define DYNAMIC_LAST 0xffff // 65535
37
+
38
+ #define ZSOCK_BSEND_MAX_FRAMES 32 // Arbitrary limit, for now
39
+
40
+ // Structure of our class
41
+
42
+ struct _zsock_t {
43
+ uint32_t tag; // Object tag for runtime detection
44
+ void *handle; // The libzmq socket handle
45
+ char *endpoint; // Last bound endpoint, if any
46
+ char *cache; // Holds last zsock_brecv strings
47
+ int type; // Socket type
48
+ size_t cache_size; // Current size of cache
49
+ uint32_t routing_id; // Routing ID for server sockets
50
+ };
51
+
52
+ #ifndef CZMQ_BUILD_DRAFT_API
53
+ CZMQ_PRIVATE zsock_t *
54
+ zsock_new_server_checked (const char *endpoint, const char *filename, size_t line_nbr);
55
+
56
+ CZMQ_PRIVATE zsock_t *
57
+ zsock_new_client_checked (const char *endpoint, const char *filename, size_t line_nbr);
58
+
59
+ CZMQ_PRIVATE zsock_t *
60
+ zsock_new_radio_checked (const char *endpoint, const char *filename, size_t line_nbr);
61
+
62
+ CZMQ_PRIVATE zsock_t *
63
+ zsock_new_dish_checked (const char *endpoint, const char *filename, size_t line_nbr);
64
+
65
+ CZMQ_PRIVATE zsock_t *
66
+ zsock_new_gather_checked (const char *endpoint, const char *filename, size_t line_nbr);
67
+
68
+ CZMQ_PRIVATE zsock_t *
69
+ zsock_new_scatter_checked (const char *endpoint, const char *filename, size_t line_nbr);
70
+ #endif // CZMQ_BUILD_DRAFT_API
71
+
72
+
73
+ // --------------------------------------------------------------------------
74
+ // Create a new socket. This macro passes the caller source and line
75
+ // number so that CZMQ can report socket leaks intelligently. To switch
76
+ // off this checking, which may be costly if you use a LOT of sockets,
77
+ // define ZSOCK_NOCHECK before compiling your code. Returns the new
78
+ // socket, or NULL if the new socket could not be created.
79
+
80
+ zsock_t *
81
+ zsock_new_checked (int type, const char *filename, size_t line_nbr)
82
+ {
83
+ zsock_t *self = (zsock_t *) zmalloc (sizeof (zsock_t));
84
+ assert (self);
85
+ self->tag = ZSOCK_TAG;
86
+ self->type = type;
87
+ self->handle = zsys_socket (type, filename, line_nbr);
88
+ assert (self->handle);
89
+ return self;
90
+ }
91
+
92
+ zsock_t *
93
+ zsock_new (int type)
94
+ {
95
+ return zsock_new_checked (type, NULL, 0);
96
+ }
97
+
98
+
99
+ // --------------------------------------------------------------------------
100
+ // Destroy the socket. You must use this for any socket created via the
101
+ // zsock_new method.
102
+
103
+ void
104
+ zsock_destroy_checked (zsock_t **self_p, const char *filename, size_t line_nbr)
105
+ {
106
+ assert (self_p);
107
+ if (*self_p) {
108
+ zsock_t *self = *self_p;
109
+ assert (zsock_is (self));
110
+ self->tag = 0xDeadBeef;
111
+ int rc = zsys_close (self->handle, filename, line_nbr);
112
+ assert (rc == 0);
113
+ freen (self->endpoint);
114
+ freen (self->cache);
115
+ freen (self);
116
+ *self_p = NULL;
117
+ }
118
+ }
119
+
120
+ void zsock_destroy (zsock_t **self_p)
121
+ {
122
+ zsock_destroy_checked (self_p, NULL, 0);
123
+ }
124
+
125
+
126
+ // --------------------------------------------------------------------------
127
+ // This interface includes some smart constructors, which create sockets with
128
+ // additional set-up. In all of these, the endpoint is NULL, or starts with
129
+ // '@' (bind) or '>' (connect). Multiple endpoints are allowed, separated by
130
+ // commas. If endpoint does not start with '@' or '>', default action depends
131
+ // on socket type.
132
+
133
+ // Create a PUB socket. Default action is bind.
134
+
135
+ zsock_t *
136
+ zsock_new_pub_checked (const char *endpoints, const char *filename, size_t line_nbr)
137
+ {
138
+ zsock_t *sock = zsock_new_checked (ZMQ_PUB, filename, line_nbr);
139
+ if (zsock_attach (sock, endpoints, true))
140
+ zsock_destroy (&sock);
141
+ return sock;
142
+ }
143
+
144
+ zsock_t *
145
+ zsock_new_pub (const char *endpoints)
146
+ {
147
+ return zsock_new_pub_checked (endpoints, NULL, 0);
148
+ }
149
+
150
+
151
+ // --------------------------------------------------------------------------
152
+ // Create a SUB socket, and optionally subscribe to some prefix string. Default
153
+ // action is connect.
154
+
155
+ zsock_t *
156
+ zsock_new_sub_checked (const char *endpoints, const char *subscribe, const char *filename, size_t line_nbr)
157
+ {
158
+ zsock_t *sock = zsock_new_checked (ZMQ_SUB, filename, line_nbr);
159
+ if (zsock_attach (sock, endpoints, false) == 0) {
160
+ if (subscribe)
161
+ zsock_set_subscribe (sock, subscribe);
162
+ }
163
+ else
164
+ zsock_destroy (&sock);
165
+ return sock;
166
+ }
167
+
168
+ zsock_t *
169
+ zsock_new_sub (const char *endpoints, const char *subscribe)
170
+ {
171
+ return zsock_new_sub_checked (endpoints, subscribe, NULL, 0);
172
+ }
173
+
174
+
175
+ // --------------------------------------------------------------------------
176
+ // Create a REQ socket. Default action is connect.
177
+
178
+ zsock_t *
179
+ zsock_new_req_checked (const char *endpoints, const char *filename, size_t line_nbr)
180
+ {
181
+ zsock_t *sock = zsock_new_checked (ZMQ_REQ, filename, line_nbr);
182
+ if (zsock_attach (sock, endpoints, false))
183
+ zsock_destroy (&sock);
184
+ return sock;
185
+ }
186
+
187
+ zsock_t *
188
+ zsock_new_req (const char *endpoints)
189
+ {
190
+ return zsock_new_req_checked (endpoints, NULL, 0);
191
+ }
192
+
193
+
194
+ // --------------------------------------------------------------------------
195
+ // Create a REP socket. Default action is bind.
196
+
197
+ zsock_t *
198
+ zsock_new_rep_checked (const char *endpoints, const char *filename, size_t line_nbr)
199
+ {
200
+ zsock_t *sock = zsock_new_checked (ZMQ_REP, filename, line_nbr);
201
+ if (zsock_attach (sock, endpoints, true))
202
+ zsock_destroy (&sock);
203
+ return sock;
204
+ }
205
+
206
+ zsock_t *
207
+ zsock_new_rep (const char *endpoints)
208
+ {
209
+ return zsock_new_rep_checked (endpoints, NULL, 0);
210
+ }
211
+
212
+
213
+ // --------------------------------------------------------------------------
214
+ // Create a DEALER socket. Default action is connect.
215
+
216
+ zsock_t *
217
+ zsock_new_dealer_checked (const char *endpoints, const char *filename, size_t line_nbr)
218
+ {
219
+ zsock_t *sock = zsock_new_checked (ZMQ_DEALER, filename, line_nbr);
220
+ if (zsock_attach (sock, endpoints, false))
221
+ zsock_destroy (&sock);
222
+ return sock;
223
+ }
224
+
225
+ zsock_t *
226
+ zsock_new_dealer (const char *endpoints)
227
+ {
228
+ return zsock_new_dealer_checked (endpoints, NULL, 0);
229
+ }
230
+
231
+
232
+ // --------------------------------------------------------------------------
233
+ // Create a ROUTER socket. Default action is bind.
234
+
235
+ zsock_t *
236
+ zsock_new_router_checked (const char *endpoints, const char *filename, size_t line_nbr)
237
+ {
238
+ zsock_t *sock = zsock_new_checked (ZMQ_ROUTER, filename, line_nbr);
239
+ if (zsock_attach (sock, endpoints, true))
240
+ zsock_destroy (&sock);
241
+ return sock;
242
+ }
243
+
244
+ zsock_t *
245
+ zsock_new_router (const char *endpoints)
246
+ {
247
+ return zsock_new_router_checked (endpoints, NULL, 0);
248
+ }
249
+
250
+
251
+ // --------------------------------------------------------------------------
252
+ // Create a PUSH socket. Default action is connect.
253
+
254
+ zsock_t *
255
+ zsock_new_push_checked (const char *endpoints, const char *filename, size_t line_nbr)
256
+ {
257
+ zsock_t *sock = zsock_new_checked (ZMQ_PUSH, filename, line_nbr);
258
+ if (zsock_attach (sock, endpoints, false))
259
+ zsock_destroy (&sock);
260
+ return sock;
261
+ }
262
+
263
+ zsock_t *
264
+ zsock_new_push (const char *endpoints)
265
+ {
266
+ return zsock_new_push_checked(endpoints, NULL, 0);
267
+ }
268
+
269
+
270
+ // --------------------------------------------------------------------------
271
+ // Create a PULL socket. Default action is bind.
272
+
273
+ zsock_t *
274
+ zsock_new_pull_checked (const char *endpoints, const char *filename, size_t line_nbr)
275
+ {
276
+ zsock_t *sock = zsock_new_checked (ZMQ_PULL, filename, line_nbr);
277
+ if (zsock_attach (sock, endpoints, true))
278
+ zsock_destroy (&sock);
279
+ return sock;
280
+ }
281
+
282
+ zsock_t *
283
+ zsock_new_pull (const char *endpoints)
284
+ {
285
+ return zsock_new_pull_checked (endpoints, NULL, 0);
286
+ }
287
+
288
+
289
+ // --------------------------------------------------------------------------
290
+ // Create an XPUB socket. Default action is bind.
291
+
292
+ zsock_t *
293
+ zsock_new_xpub_checked (const char *endpoints, const char *filename, size_t line_nbr)
294
+ {
295
+ #if defined ZMQ_XPUB
296
+ zsock_t *sock = zsock_new_checked (ZMQ_XPUB, filename, line_nbr);
297
+ if (zsock_attach (sock, endpoints, true))
298
+ zsock_destroy (&sock);
299
+ return sock;
300
+ #else
301
+ return NULL; // Not implemented
302
+ #endif
303
+ }
304
+
305
+ zsock_t *
306
+ zsock_new_xpub (const char *endpoints)
307
+ {
308
+ return zsock_new_xpub_checked (endpoints, NULL, 0);
309
+ }
310
+
311
+
312
+ // --------------------------------------------------------------------------
313
+ // Create an XSUB socket. Default action is connect.
314
+
315
+ zsock_t *
316
+ zsock_new_xsub_checked (const char *endpoints, const char *filename, size_t line_nbr)
317
+ {
318
+ #if defined ZMQ_XSUB
319
+ zsock_t *sock = zsock_new_checked (ZMQ_XSUB, filename, line_nbr);
320
+ if (zsock_attach (sock, endpoints, false))
321
+ zsock_destroy (&sock);
322
+ return sock;
323
+ #else
324
+ return NULL; // Not implemented
325
+ #endif
326
+ }
327
+
328
+ zsock_t *
329
+ zsock_new_xsub (const char *endpoints)
330
+ {
331
+ return zsock_new_xsub_checked (endpoints, NULL, 0);
332
+ }
333
+
334
+
335
+ // --------------------------------------------------------------------------
336
+ // Create a PAIR socket. Default action is connect.
337
+
338
+ zsock_t *
339
+ zsock_new_pair_checked (const char *endpoints, const char *filename, size_t line_nbr)
340
+ {
341
+ zsock_t *sock = zsock_new_checked (ZMQ_PAIR, filename, line_nbr);
342
+ if (zsock_attach (sock, endpoints, false))
343
+ zsock_destroy (&sock);
344
+ return sock;
345
+ }
346
+
347
+ zsock_t *
348
+ zsock_new_pair (const char *endpoints)
349
+ {
350
+ return zsock_new_pair_checked (endpoints, NULL, 0);
351
+ }
352
+
353
+
354
+ // --------------------------------------------------------------------------
355
+ // Create a STREAM socket. Default action is connect.
356
+
357
+ zsock_t *
358
+ zsock_new_stream_checked (const char *endpoints, const char *filename, size_t line_nbr)
359
+ {
360
+ #if defined ZMQ_STREAM
361
+ zsock_t *sock = zsock_new_checked (ZMQ_STREAM, filename, line_nbr);
362
+ if (zsock_attach (sock, endpoints, false))
363
+ zsock_destroy (&sock);
364
+ return sock;
365
+ #else
366
+ return NULL; // Not implemented
367
+ #endif
368
+ }
369
+
370
+ zsock_t *
371
+ zsock_new_stream (const char *endpoints)
372
+ {
373
+ return zsock_new_stream_checked (endpoints, NULL, 0);
374
+ }
375
+
376
+ // --------------------------------------------------------------------------
377
+ // Create a SERVER socket. Default action is bind.
378
+
379
+ zsock_t *
380
+ zsock_new_server_checked (const char *endpoints, const char *filename, size_t line_nbr)
381
+ {
382
+ #if defined ZMQ_SERVER
383
+ zsock_t *sock = zsock_new_checked (ZMQ_SERVER, filename, line_nbr);
384
+ if (zsock_attach (sock, endpoints, true))
385
+ zsock_destroy (&sock);
386
+ return sock;
387
+ #else
388
+ return NULL;
389
+ #endif
390
+ }
391
+
392
+ zsock_t *
393
+ zsock_new_server (const char *endpoints)
394
+ {
395
+ return zsock_new_server_checked (endpoints, NULL, 0);
396
+ }
397
+
398
+ // --------------------------------------------------------------------------
399
+ // Create a CLIENT socket. Default action is connect.
400
+
401
+ zsock_t *
402
+ zsock_new_client_checked (const char *endpoints, const char *filename, size_t line_nbr)
403
+ {
404
+ #if defined ZMQ_CLIENT
405
+ zsock_t *sock = zsock_new_checked (ZMQ_CLIENT, filename, line_nbr);
406
+ if (zsock_attach (sock, endpoints, false))
407
+ zsock_destroy (&sock);
408
+ return sock;
409
+ #else
410
+ return NULL;
411
+ #endif
412
+ }
413
+
414
+ zsock_t *
415
+ zsock_new_client (const char *endpoints)
416
+ {
417
+ return zsock_new_client_checked (endpoints, NULL, 0);
418
+ }
419
+
420
+
421
+ // --------------------------------------------------------------------------
422
+ // Create a RADIO socket. Default action is bind.
423
+
424
+ zsock_t *
425
+ zsock_new_radio_checked (const char *endpoints, const char *filename, size_t line_nbr)
426
+ {
427
+ #if defined ZMQ_RADIO
428
+ zsock_t *sock = zsock_new_checked (ZMQ_RADIO, filename, line_nbr);
429
+ if (zsock_attach (sock, endpoints, true))
430
+ zsock_destroy (&sock);
431
+ return sock;
432
+ #else
433
+ return NULL;
434
+ #endif
435
+ }
436
+
437
+ zsock_t *
438
+ zsock_new_radio (const char *endpoints)
439
+ {
440
+ return zsock_new_radio_checked (endpoints, NULL, 0);
441
+ }
442
+
443
+
444
+ // --------------------------------------------------------------------------
445
+ // Create a DISH socket. Default action is connect.
446
+
447
+ zsock_t *
448
+ zsock_new_dish_checked (const char *endpoints, const char *filename, size_t line_nbr)
449
+ {
450
+ #if defined ZMQ_DISH
451
+ zsock_t *sock = zsock_new_checked (ZMQ_DISH, filename, line_nbr);
452
+ if (zsock_attach (sock, endpoints, false))
453
+ zsock_destroy (&sock);
454
+ return sock;
455
+ #else
456
+ return NULL;
457
+ #endif
458
+ }
459
+
460
+ zsock_t *
461
+ zsock_new_dish (const char *endpoints)
462
+ {
463
+ return zsock_new_dish_checked (endpoints, NULL, 0);
464
+ }
465
+
466
+
467
+ // --------------------------------------------------------------------------
468
+ // Create a GATHER socket. Default action is bind.
469
+
470
+ zsock_t *
471
+ zsock_new_gather_checked (const char *endpoints, const char *filename, size_t line_nbr)
472
+ {
473
+ #if defined ZMQ_GATHER
474
+ zsock_t *sock = zsock_new_checked (ZMQ_GATHER, filename, line_nbr);
475
+ if (zsock_attach (sock, endpoints, true))
476
+ zsock_destroy (&sock);
477
+ return sock;
478
+ #else
479
+ return NULL;
480
+ #endif
481
+ }
482
+
483
+ zsock_t *
484
+ zsock_new_gather (const char *endpoints)
485
+ {
486
+ return zsock_new_gather_checked (endpoints, NULL, 0);
487
+ }
488
+
489
+
490
+ // --------------------------------------------------------------------------
491
+ // Create a scatter socket. Default action is connect.
492
+
493
+ zsock_t *
494
+ zsock_new_scatter_checked (const char *endpoints, const char *filename, size_t line_nbr)
495
+ {
496
+ #if defined ZMQ_SCATTER
497
+ zsock_t *sock = zsock_new_checked (ZMQ_SCATTER, filename, line_nbr);
498
+ if (zsock_attach (sock, endpoints, false))
499
+ zsock_destroy (&sock);
500
+ return sock;
501
+ #else
502
+ return NULL;
503
+ #endif
504
+ }
505
+
506
+ zsock_t *
507
+ zsock_new_scatter (const char *endpoints)
508
+ {
509
+ return zsock_new_scatter_checked (endpoints, NULL, 0);
510
+ }
511
+
512
+
513
+ // --------------------------------------------------------------------------
514
+ // Bind a socket to a formatted endpoint. For tcp:// endpoints, supports
515
+ // ephemeral ports, if you specify the port number as "*". By default
516
+ // zsock uses the IANA designated range from C000 (49152) to FFFF (65535).
517
+ // To override this range, follow the "*" with "[first-last]". Either or
518
+ // both first and last may be empty. To bind to a random port within the
519
+ // range, use "!" in place of "*".
520
+ //
521
+ // Examples:
522
+ // tcp://127.0.0.1:* bind to first free port from C000 up
523
+ // tcp://127.0.0.1:! bind to random port from C000 to FFFF
524
+ // tcp://127.0.0.1:*[60000-] bind to first free port from 60000 up
525
+ // tcp://127.0.0.1:![-60000] bind to random port from C000 to 60000
526
+ // tcp://127.0.0.1:![55000-55999] bind to random port from 55000-55999
527
+ //
528
+ // On success, returns the actual port number used, for tcp:// endpoints,
529
+ // and 0 for other transports. On failure, returns -1. Note that when using
530
+ // ephemeral ports, a port may be reused by different services without
531
+ // clients being aware. Protocols that run on ephemeral ports should take
532
+ // this into account.
533
+
534
+ int
535
+ zsock_bind (zsock_t *self, const char *format, ...)
536
+ {
537
+ assert (self);
538
+ assert (zsock_is (self));
539
+
540
+ // Expand format to get full endpoint
541
+ va_list argptr;
542
+ va_start (argptr, format);
543
+ char *endpoint = zsys_vprintf (format, argptr);
544
+ va_end (argptr);
545
+ if (!endpoint)
546
+ return -1;
547
+ int rc;
548
+
549
+ // If tcp:// endpoint, parse to get or make port number
550
+ zrex_t *rex = zrex_new (NULL);
551
+ if (zrex_eq (rex, endpoint, "^tcp://.*:(\\d+)$")) {
552
+ assert (zrex_hits (rex) == 2);
553
+ int port = atoi (zrex_hit (rex, 1));
554
+ #if defined (HAVE_LIBSYSTEMD) && (ZMQ_VERSION >= ZMQ_MAKE_VERSION (4, 2, 0))
555
+ if (zsys_auto_use_fd ()) {
556
+ int last_handle = SD_LISTEN_FDS_START + sd_listen_fds (0);
557
+ int handle;
558
+ for (handle = SD_LISTEN_FDS_START; handle < last_handle; ++handle)
559
+ if (sd_is_socket_inet (handle, AF_UNSPEC, SOCK_STREAM, 1,
560
+ (uint16_t) port) > 0) {
561
+ zsock_set_use_fd (self, handle);
562
+ break;
563
+ }
564
+ }
565
+ #endif
566
+ if (zmq_bind (self->handle, endpoint) == 0)
567
+ rc = port;
568
+ else
569
+ rc = -1;
570
+ }
571
+ else
572
+ if (zrex_eq (rex, endpoint, "^(tcp://.*):([*!])(\\[(\\d+)?-(\\d+)?\\])?$")) {
573
+ assert (zrex_hits (rex) == 6);
574
+ const char *hostname, *opcode, *group, *first_str, *last_str;
575
+ zrex_fetch (rex, &hostname, &opcode, &group, &first_str, &last_str, NULL);
576
+
577
+ int first = *first_str? atoi (first_str): DYNAMIC_FIRST;
578
+ int last = *last_str? atoi (last_str): DYNAMIC_LAST;
579
+
580
+ // This is how many times we'll try before giving up
581
+ int attempts = last - first + 1;
582
+
583
+ // If operator is '*', take first available port.
584
+ // If operator is '!', take a random leap into our port space; we'll
585
+ // still scan sequentially to make sure we find a free slot rapidly.
586
+ int port = first;
587
+ if (streq (opcode, "!"))
588
+ port += randof (attempts);
589
+
590
+ rc = -1; // Assume we don't succeed
591
+ while (rc == -1 && attempts--) {
592
+ zstr_free (&endpoint);
593
+ endpoint = zsys_sprintf ("%s:%d", hostname, port);
594
+ if (!endpoint)
595
+ break;
596
+ if (zmq_bind (self->handle, endpoint) == 0)
597
+ rc = port;
598
+ if (++port > last)
599
+ port = first;
600
+ }
601
+ }
602
+ else {
603
+ #if defined (HAVE_LIBSYSTEMD) && (ZMQ_VERSION >= ZMQ_MAKE_VERSION (4, 2, 0))
604
+ if (zsys_auto_use_fd () && zrex_eq (rex, endpoint, "^ipc://(.*)$")) {
605
+ assert (zrex_hits (rex) == 2);
606
+ const char *sock_path;
607
+ zrex_fetch (rex, &sock_path, NULL);
608
+
609
+ int last_handle = SD_LISTEN_FDS_START + sd_listen_fds (0);
610
+ int handle;
611
+ for (handle = SD_LISTEN_FDS_START; handle < last_handle; ++handle)
612
+ if (sd_is_socket_unix (handle, SOCK_STREAM, 1, sock_path, 0) > 0) {
613
+ zsock_set_use_fd (self, handle);
614
+ break;
615
+ }
616
+ }
617
+ #endif
618
+ rc = zmq_bind (self->handle, endpoint);
619
+ }
620
+
621
+ // Store successful endpoint for later reference
622
+ if (rc >= 0) {
623
+ zstr_free (&self->endpoint);
624
+ self->endpoint = endpoint;
625
+ }
626
+ else
627
+ zstr_free (&endpoint);
628
+
629
+ zrex_destroy (&rex);
630
+ return rc;
631
+ }
632
+
633
+
634
+ // --------------------------------------------------------------------------
635
+ // Returns last bound endpoint, if any.
636
+
637
+ const char *
638
+ zsock_endpoint (zsock_t *self)
639
+ {
640
+ assert (self);
641
+ return self->endpoint;
642
+ }
643
+
644
+
645
+ // --------------------------------------------------------------------------
646
+ // Unbind a socket from a formatted endpoint.
647
+ // Returns 0 if OK, -1 if the endpoint was invalid or the function
648
+ // isn't supported.
649
+
650
+ int
651
+ zsock_unbind (zsock_t *self, const char *format, ...)
652
+ {
653
+ assert (self);
654
+ assert (zsock_is (self));
655
+
656
+ #if (ZMQ_VERSION >= ZMQ_MAKE_VERSION (3, 2, 0))
657
+ // Expand format to get full endpoint
658
+ va_list argptr;
659
+ va_start (argptr, format);
660
+ char *endpoint = zsys_vprintf (format, argptr);
661
+ va_end (argptr);
662
+ if (!endpoint)
663
+ return -1;
664
+
665
+ int rc = zmq_unbind (self->handle, endpoint);
666
+ zstr_free (&endpoint);
667
+ return rc;
668
+ #else
669
+ return -1;
670
+ #endif
671
+ }
672
+
673
+
674
+ // --------------------------------------------------------------------------
675
+ // Connect a socket to a formatted endpoint
676
+ // Returns 0 if the endpoint is valid, -1 if the connect failed.
677
+
678
+ int
679
+ zsock_connect (zsock_t *self, const char *format, ...)
680
+ {
681
+ assert (self);
682
+ assert (zsock_is (self));
683
+
684
+ // Expand format to get full endpoint
685
+ va_list argptr;
686
+ va_start (argptr, format);
687
+ char *endpoint = zsys_vprintf (format, argptr);
688
+ va_end (argptr);
689
+ if (!endpoint)
690
+ return -1;
691
+ int rc = zmq_connect (self->handle, endpoint);
692
+
693
+ #if (ZMQ_VERSION < ZMQ_MAKE_VERSION (4, 0, 0))
694
+ int retries = 4;
695
+ while (rc == -1 && zmq_errno () == ECONNREFUSED && retries) {
696
+ // This bruteforces a synchronization between connecting and
697
+ // binding threads on ZeroMQ v3.2 and earlier, where the bind
698
+ // MUST happen before the connect on inproc transports.
699
+ zclock_sleep (250);
700
+ rc = zmq_connect (self->handle, endpoint);
701
+ retries--;
702
+ }
703
+ #endif
704
+ zstr_free (&endpoint);
705
+ return rc;
706
+ }
707
+
708
+
709
+ // --------------------------------------------------------------------------
710
+ // Disconnect a socket from a formatted endpoint
711
+ // Returns 0 if disconnection is complete -1 if the disconnection failed.
712
+
713
+ int
714
+ zsock_disconnect (zsock_t *self, const char *format, ...)
715
+ {
716
+ assert (self);
717
+ assert (zsock_is (self));
718
+
719
+ #if (ZMQ_VERSION >= ZMQ_MAKE_VERSION (3, 2, 0))
720
+ // Expand format to get full endpoint
721
+ va_list argptr;
722
+ va_start (argptr, format);
723
+ char *endpoint = zsys_vprintf (format, argptr);
724
+ va_end (argptr);
725
+ if (!endpoint)
726
+ return -1;
727
+ int rc = zmq_disconnect (self->handle, endpoint);
728
+ zstr_free (&endpoint);
729
+ return rc;
730
+ #else
731
+ return -1;
732
+ #endif
733
+ }
734
+
735
+
736
+ // --------------------------------------------------------------------------
737
+ // Attach a socket to zero or more endpoints. If endpoints is not null,
738
+ // parses as list of ZeroMQ endpoints, separated by commas, and prefixed by
739
+ // '@' (to bind the socket) or '>' (to attach the socket). Returns 0 if all
740
+ // endpoints were valid, or -1 if there was a syntax error. If the endpoint
741
+ // does not start with '@' or '>', the serverish argument defines whether
742
+ // it is used to bind (serverish = true) or connect (serverish = false).
743
+
744
+ int
745
+ zsock_attach (zsock_t *self, const char *endpoints, bool serverish)
746
+ {
747
+ assert (self);
748
+ if (!endpoints)
749
+ return 0;
750
+
751
+ // We hold each individual endpoint here
752
+ char endpoint [256];
753
+ while (*endpoints) {
754
+ const char *delimiter = strchr (endpoints, ',');
755
+ if (!delimiter)
756
+ delimiter = endpoints + strlen (endpoints);
757
+ if (delimiter - endpoints > 255)
758
+ return -1;
759
+ memcpy (endpoint, endpoints, delimiter - endpoints);
760
+ endpoint [delimiter - endpoints] = 0;
761
+
762
+ int rc;
763
+ if (endpoint [0] == '@')
764
+ rc = zsock_bind (self, "%s", endpoint + 1);
765
+ else
766
+ if (endpoint [0] == '>')
767
+ rc = zsock_connect (self, "%s", endpoint + 1);
768
+ else
769
+ if (serverish)
770
+ rc = zsock_bind (self, "%s", endpoint);
771
+ else
772
+ rc = zsock_connect (self, "%s", endpoint);
773
+
774
+ if (rc == -1)
775
+ return -1; // Bad endpoint syntax
776
+
777
+ if (*delimiter == 0)
778
+ break;
779
+ endpoints = delimiter + 1;
780
+ }
781
+ return 0;
782
+ }
783
+
784
+
785
+ // --------------------------------------------------------------------------
786
+ // Returns socket type as printable constant string.
787
+
788
+ const char *
789
+ zsock_type_str (zsock_t *self)
790
+ {
791
+ assert (self);
792
+ return zsys_sockname (self->type);
793
+ }
794
+
795
+
796
+ // --------------------------------------------------------------------------
797
+ // Send a 'picture' message to the socket (or actor). The picture is a
798
+ // string that defines the type of each frame. This makes it easy to send
799
+ // a complex multiframe message in one call. The picture can contain any
800
+ // of these characters, each corresponding to one or two arguments:
801
+ //
802
+ // i = int (signed)
803
+ // 1 = uint8_t
804
+ // 2 = uint16_t
805
+ // 4 = uint32_t
806
+ // 8 = uint64_t
807
+ // s = char *
808
+ // b = byte *, int (2 arguments)
809
+ // c = zchunk_t *
810
+ // f = zframe_t *
811
+ // h = zhashx_t *
812
+ // U = zuuid_t *
813
+ // p = void * (sends the pointer value, only meaningful over inproc)
814
+ // m = zmsg_t * (sends all frames in the zmsg)
815
+ // z = sends zero-sized frame (0 arguments)
816
+ // u = uint (deprecated)
817
+ //
818
+ // Note that s, b, c, and f are encoded the same way and the choice is
819
+ // offered as a convenience to the sender, which may or may not already
820
+ // have data in a zchunk or zframe. Does not change or take ownership of
821
+ // any arguments. Returns 0 if successful, -1 if sending failed for any
822
+ // reason.
823
+
824
+ int
825
+ zsock_send (void *self, const char *picture, ...)
826
+ {
827
+ va_list argptr;
828
+ va_start (argptr, picture);
829
+ int rc = zsock_vsend (self, picture, argptr);
830
+ va_end (argptr);
831
+ return rc;
832
+ }
833
+
834
+
835
+ // --------------------------------------------------------------------------
836
+ // Send a 'picture' message to the socket (or actor). This is a va_list
837
+ // version of zsock_send (), so please consult its documentation for the
838
+ // details.
839
+
840
+ int
841
+ zsock_vsend (void *self, const char *picture, va_list argptr)
842
+ {
843
+ assert (self);
844
+ assert (picture);
845
+
846
+ zmsg_t *msg = zmsg_new ();
847
+ while (*picture) {
848
+ if (*picture == 'i')
849
+ zmsg_addstrf (msg, "%d", va_arg (argptr, int));
850
+ else
851
+ if (*picture == '1')
852
+ zmsg_addstrf (msg, "%" PRIu8, (uint8_t) va_arg (argptr, int));
853
+ else
854
+ if (*picture == '2')
855
+ zmsg_addstrf (msg, "%" PRIu16, (uint16_t) va_arg (argptr, int));
856
+ else
857
+ if (*picture == '4')
858
+ zmsg_addstrf (msg, "%" PRIu32, va_arg (argptr, uint32_t));
859
+ else
860
+ if (*picture == '8')
861
+ zmsg_addstrf (msg, "%" PRIu64, va_arg (argptr, uint64_t));
862
+ else
863
+ if (*picture == 'u') // Deprecated, use 4 or 8 instead
864
+ zmsg_addstrf (msg, "%ud", va_arg (argptr, uint));
865
+ else
866
+ if (*picture == 's')
867
+ zmsg_addstr (msg, va_arg (argptr, char *));
868
+ else
869
+ if (*picture == 'b') {
870
+ // Note function arguments may be expanded in reverse order,
871
+ // so we cannot use va_arg macro twice in a single call
872
+ byte *data = va_arg (argptr, byte *);
873
+ zmsg_addmem (msg, data, va_arg (argptr, int));
874
+ }
875
+ else
876
+ if (*picture == 'c') {
877
+ zchunk_t *chunk = va_arg (argptr, zchunk_t *);
878
+ assert (zchunk_is (chunk));
879
+ zmsg_addmem (msg, zchunk_data (chunk), zchunk_size (chunk));
880
+ }
881
+ else
882
+ if (*picture == 'f') {
883
+ zframe_t *frame = va_arg (argptr, zframe_t *);
884
+ assert (zframe_is (frame));
885
+ zmsg_addmem (msg, zframe_data (frame), zframe_size (frame));
886
+ }
887
+ else
888
+ if (*picture == 'U') {
889
+ zuuid_t *uuid = va_arg (argptr, zuuid_t *);
890
+ zmsg_addmem (msg, zuuid_data (uuid), zuuid_size (uuid));
891
+ }
892
+ else
893
+ if (*picture == 'p') {
894
+ void *pointer = va_arg (argptr, void *);
895
+ zmsg_addmem (msg, &pointer, sizeof (void *));
896
+ }
897
+ else
898
+ if (*picture == 'h') {
899
+ zhashx_t *hash = va_arg (argptr, zhashx_t *);
900
+ zframe_t *frame = zhashx_pack (hash);
901
+ zmsg_append (msg, &frame);
902
+ }
903
+ else
904
+ if (*picture == 'm') {
905
+ zframe_t *frame;
906
+ zmsg_t *zmsg = va_arg (argptr, zmsg_t *);
907
+ for (frame = zmsg_first (zmsg); frame;
908
+ frame = zmsg_next (zmsg) ) {
909
+ zframe_t *frame_dup = zframe_dup (frame);
910
+ zmsg_append (msg, &frame_dup);
911
+ }
912
+ }
913
+ else
914
+ if (*picture == 'z')
915
+ zmsg_addmem (msg, NULL, 0);
916
+ else {
917
+ zsys_error ("zsock: invalid picture element '%c'", *picture);
918
+ assert (false);
919
+ }
920
+ picture++;
921
+ }
922
+
923
+ int rc = zmsg_send (&msg, self);
924
+ if (rc != 0)
925
+ zmsg_destroy (&msg);
926
+
927
+ return rc;
928
+ }
929
+
930
+
931
+ // --------------------------------------------------------------------------
932
+ // Receive a 'picture' message to the socket (or actor). See zsock_send for
933
+ // the format and meaning of the picture. Returns the picture elements into
934
+ // a series of pointers as provided by the caller:
935
+ //
936
+ // i = int * (stores signed integer)
937
+ // 1 = uint8_t * (stores 8-bit unsigned integer)
938
+ // 2 = uint16_t * (stores 16-bit unsigned integer)
939
+ // 4 = uint32_t * (stores 32-bit unsigned integer)
940
+ // 8 = uint64_t * (stores 64-bit unsigned integer)
941
+ // s = char ** (allocates new string)
942
+ // b = byte **, size_t * (2 arguments) (allocates memory)
943
+ // c = zchunk_t ** (creates zchunk)
944
+ // f = zframe_t ** (creates zframe)
945
+ // h = zhashx_t ** (creates zhashx)
946
+ // U = zuuid_t * (creates a zuuid with the data)
947
+ // p = void ** (stores pointer)
948
+ // m = zmsg_t ** (creates a zmsg with the remaing frames)
949
+ // z = null, asserts empty frame (0 arguments)
950
+ // u = uint * (stores unsigned integer, deprecated)
951
+ //
952
+ // Note that zsock_recv creates the returned objects, and the caller must
953
+ // destroy them when finished with them. The supplied pointers do not need
954
+ // to be initialized. Returns 0 if successful, or -1 if it failed to recv
955
+ // a message, in which case the pointers are not modified. When message
956
+ // frames are truncated (a short message), sets return values to zero/null.
957
+ // If an argument pointer is NULL, does not store any value (skips it).
958
+ // An 'n' picture matches an empty frame; if the message does not match,
959
+ // the method will return -1.
960
+
961
+ int
962
+ zsock_recv (void *self, const char *picture, ...)
963
+ {
964
+ va_list argptr;
965
+ va_start (argptr, picture);
966
+ int rc = zsock_vrecv (self, picture, argptr);
967
+ va_end (argptr);
968
+ return rc;
969
+ }
970
+
971
+
972
+ // Receive a 'picture' message from the socket (or actor). This is a
973
+ // va_list version of zsock_recv (), so please consult its documentation
974
+ // for the details.
975
+
976
+ int
977
+ zsock_vrecv (void *self, const char *picture, va_list argptr)
978
+ {
979
+ assert (self);
980
+ assert (picture);
981
+ zmsg_t *msg = zmsg_recv (self);
982
+ if (!msg)
983
+ return -1; // Interrupted
984
+
985
+ // Filter a signal that may come from a dying actor
986
+ if (zmsg_signal (msg) >= 0) {
987
+ zmsg_destroy (&msg);
988
+ return -1;
989
+ }
990
+ // Now parse message according to picture argument
991
+ int rc = 0;
992
+ while (*picture) {
993
+ if (*picture == 'i') {
994
+ char *string = zmsg_popstr (msg);
995
+ int *int_p = va_arg (argptr, int *);
996
+ if (int_p)
997
+ *int_p = string? atoi (string): 0;
998
+ freen (string);
999
+ }
1000
+ else
1001
+ if (*picture == '1') {
1002
+ char *string = zmsg_popstr (msg);
1003
+ uint8_t *uint8_p = va_arg (argptr, uint8_t *);
1004
+ if (uint8_p)
1005
+ *uint8_p = string? (uint8_t) atoi (string): 0;
1006
+ freen (string);
1007
+ }
1008
+ else
1009
+ if (*picture == '2') {
1010
+ char *string = zmsg_popstr (msg);
1011
+ uint16_t *uint16_p = va_arg (argptr, uint16_t *);
1012
+ if (uint16_p)
1013
+ *uint16_p = string? (uint16_t) atol (string): 0;
1014
+ freen (string);
1015
+ }
1016
+ else
1017
+ if (*picture == '4') {
1018
+ char *string = zmsg_popstr (msg);
1019
+ uint32_t *uint32_p = va_arg (argptr, uint32_t *);
1020
+ if (uint32_p)
1021
+ *uint32_p = string? (uint32_t) strtoul (string, NULL, 10): 0;
1022
+ freen (string);
1023
+ }
1024
+ else
1025
+ if (*picture == '8') {
1026
+ char *string = zmsg_popstr (msg);
1027
+ uint64_t *uint64_p = va_arg (argptr, uint64_t *);
1028
+ if (uint64_p)
1029
+ *uint64_p = string? (uint64_t) strtoull (string, NULL, 10): 0;
1030
+ freen (string);
1031
+ }
1032
+ else
1033
+ if (*picture == 'u') { // Deprecated, use 4 or 8 instead
1034
+ char *string = zmsg_popstr (msg);
1035
+ uint *uint_p = va_arg (argptr, uint *);
1036
+ if (uint_p)
1037
+ *uint_p = string? (uint) strtoul (string, NULL, 10): 0;
1038
+ freen (string);
1039
+ }
1040
+ else
1041
+ if (*picture == 's') {
1042
+ char *string = zmsg_popstr (msg);
1043
+ char **string_p = va_arg (argptr, char **);
1044
+ if (string_p)
1045
+ *string_p = string;
1046
+ else
1047
+ freen (string);
1048
+ }
1049
+ else
1050
+ if (*picture == 'b') {
1051
+ zframe_t *frame = zmsg_pop (msg);
1052
+ byte **data_p = va_arg (argptr, byte **);
1053
+ size_t *size = va_arg (argptr, size_t *);
1054
+ if (data_p) {
1055
+ if (frame) {
1056
+ *size = zframe_size (frame);
1057
+ *data_p = (byte *) malloc (*size);
1058
+ memcpy (*data_p, zframe_data (frame), *size);
1059
+ }
1060
+ else {
1061
+ *data_p = NULL;
1062
+ *size = 0;
1063
+ }
1064
+ }
1065
+ zframe_destroy (&frame);
1066
+ }
1067
+ else
1068
+ if (*picture == 'c') {
1069
+ zframe_t *frame = zmsg_pop (msg);
1070
+ zchunk_t **chunk_p = va_arg (argptr, zchunk_t **);
1071
+ if (chunk_p) {
1072
+ if (frame)
1073
+ *chunk_p = zchunk_new (zframe_data (frame), zframe_size (frame));
1074
+ else
1075
+ *chunk_p = NULL;
1076
+ }
1077
+ zframe_destroy (&frame);
1078
+ }
1079
+ else
1080
+ if (*picture == 'f') {
1081
+ zframe_t *frame = zmsg_pop (msg);
1082
+ zframe_t **frame_p = va_arg (argptr, zframe_t **);
1083
+ if (frame_p)
1084
+ *frame_p = frame;
1085
+ else
1086
+ zframe_destroy (&frame);
1087
+ }
1088
+ else
1089
+ if (*picture == 'U') {
1090
+ zframe_t *frame = zmsg_pop (msg);
1091
+ zuuid_t **uuid_p = va_arg (argptr, zuuid_t **);
1092
+ if (uuid_p) {
1093
+ if (frame) {
1094
+ *uuid_p = zuuid_new ();
1095
+ zuuid_set (*uuid_p, zframe_data (frame));
1096
+ }
1097
+ else
1098
+ *uuid_p = NULL;
1099
+ }
1100
+ zframe_destroy (&frame);
1101
+ }
1102
+ else
1103
+ if (*picture == 'p') {
1104
+ zframe_t *frame = zmsg_pop (msg);
1105
+ void **pointer_p = va_arg (argptr, void **);
1106
+ if (pointer_p) {
1107
+ if (frame) {
1108
+ if (zframe_size (frame) == sizeof (void *))
1109
+ *pointer_p = *((void **) zframe_data (frame));
1110
+ else
1111
+ rc = -1;
1112
+ }
1113
+ else
1114
+ *pointer_p = NULL;
1115
+ }
1116
+ zframe_destroy (&frame);
1117
+ }
1118
+ else
1119
+ if (*picture == 'h') {
1120
+ zframe_t *frame = zmsg_pop (msg);
1121
+ zhashx_t **hash_p = va_arg (argptr, zhashx_t **);
1122
+ if (hash_p) {
1123
+ if (frame)
1124
+ *hash_p = zhashx_unpack (frame);
1125
+ else
1126
+ *hash_p = NULL;
1127
+ }
1128
+ zframe_destroy (&frame);
1129
+ }
1130
+ else
1131
+ if (*picture == 'm') {
1132
+ zmsg_t **zmsg_p = va_arg (argptr, zmsg_t **);
1133
+ if (zmsg_p) {
1134
+ *zmsg_p = zmsg_new ();
1135
+ zframe_t *frame;
1136
+ while ((frame = zmsg_pop (msg)))
1137
+ zmsg_append (*zmsg_p, &frame);
1138
+ }
1139
+ }
1140
+ else
1141
+ if (*picture == 'z') {
1142
+ zframe_t *frame = zmsg_pop (msg);
1143
+ if (frame && zframe_size (frame) != 0)
1144
+ rc = -1;
1145
+ zframe_destroy (&frame);
1146
+ }
1147
+ else {
1148
+ zsys_error ("zsock: invalid picture element '%c'", *picture);
1149
+ assert (false);
1150
+ }
1151
+ picture++;
1152
+ }
1153
+ zmsg_destroy (&msg);
1154
+ return rc;
1155
+ }
1156
+
1157
+
1158
+ // --------------------------------------------------------------------------
1159
+ // Network data encoding macros that we use in bsend/brecv
1160
+
1161
+ // Put a 1-byte number to the frame
1162
+ #define PUT_NUMBER1(host) { \
1163
+ *(byte *) needle = (host); \
1164
+ needle++; \
1165
+ }
1166
+
1167
+ // Put a 2-byte number to the frame
1168
+ #define PUT_NUMBER2(host) { \
1169
+ needle [0] = (byte) (((host) >> 8) & 255); \
1170
+ needle [1] = (byte) (((host)) & 255); \
1171
+ needle += 2; \
1172
+ }
1173
+
1174
+ // Put a 4-byte number to the frame
1175
+ #define PUT_NUMBER4(host) { \
1176
+ needle [0] = (byte) (((host) >> 24) & 255); \
1177
+ needle [1] = (byte) (((host) >> 16) & 255); \
1178
+ needle [2] = (byte) (((host) >> 8) & 255); \
1179
+ needle [3] = (byte) (((host)) & 255); \
1180
+ needle += 4; \
1181
+ }
1182
+
1183
+ // Put a 8-byte number to the frame
1184
+ #define PUT_NUMBER8(host) { \
1185
+ needle [0] = (byte) (((host) >> 56) & 255); \
1186
+ needle [1] = (byte) (((host) >> 48) & 255); \
1187
+ needle [2] = (byte) (((host) >> 40) & 255); \
1188
+ needle [3] = (byte) (((host) >> 32) & 255); \
1189
+ needle [4] = (byte) (((host) >> 24) & 255); \
1190
+ needle [5] = (byte) (((host) >> 16) & 255); \
1191
+ needle [6] = (byte) (((host) >> 8) & 255); \
1192
+ needle [7] = (byte) (((host)) & 255); \
1193
+ needle += 8; \
1194
+ }
1195
+
1196
+ // Get a 1-byte number from the frame
1197
+ #define GET_NUMBER1(host) { \
1198
+ if (needle + 1 > ceiling) \
1199
+ goto malformed; \
1200
+ (host) = *(byte *) needle; \
1201
+ needle++; \
1202
+ }
1203
+
1204
+ // Get a 2-byte number from the frame
1205
+ #define GET_NUMBER2(host) { \
1206
+ if (needle + 2 > ceiling) \
1207
+ goto malformed; \
1208
+ (host) = ((uint16_t) (needle [0]) << 8) \
1209
+ + (uint16_t) (needle [1]); \
1210
+ needle += 2; \
1211
+ }
1212
+
1213
+ // Get a 4-byte number from the frame
1214
+ #define GET_NUMBER4(host) { \
1215
+ if (needle + 4 > ceiling) \
1216
+ goto malformed; \
1217
+ (host) = ((uint32_t) (needle [0]) << 24) \
1218
+ + ((uint32_t) (needle [1]) << 16) \
1219
+ + ((uint32_t) (needle [2]) << 8) \
1220
+ + (uint32_t) (needle [3]); \
1221
+ needle += 4; \
1222
+ }
1223
+
1224
+ // Get a 8-byte number from the frame
1225
+ #define GET_NUMBER8(host) { \
1226
+ if (needle + 8 > ceiling) \
1227
+ goto malformed; \
1228
+ (host) = ((uint64_t) (needle [0]) << 56) \
1229
+ + ((uint64_t) (needle [1]) << 48) \
1230
+ + ((uint64_t) (needle [2]) << 40) \
1231
+ + ((uint64_t) (needle [3]) << 32) \
1232
+ + ((uint64_t) (needle [4]) << 24) \
1233
+ + ((uint64_t) (needle [5]) << 16) \
1234
+ + ((uint64_t) (needle [6]) << 8) \
1235
+ + (uint64_t) (needle [7]); \
1236
+ needle += 8; \
1237
+ }
1238
+
1239
+
1240
+ // --------------------------------------------------------------------------
1241
+ // Send a binary encoded 'picture' message to the socket (or actor). This
1242
+ // method is similar to zsock_send, except the arguments are encoded in a
1243
+ // binary format that is compatible with zproto, and is designed to reduce
1244
+ // memory allocations. The pattern argument is a string that defines the
1245
+ // type of each argument. Supports these argument types:
1246
+ //
1247
+ // pattern C type zproto type:
1248
+ // 1 uint8_t type = "number" size = "1"
1249
+ // 2 uint16_t type = "number" size = "2"
1250
+ // 4 uint32_t type = "number" size = "3"
1251
+ // 8 uint64_t type = "number" size = "4"
1252
+ // s char *, 0-255 chars type = "string"
1253
+ // S char *, 0-2^32-1 chars type = "longstr"
1254
+ // c zchunk_t * type = "chunk"
1255
+ // f zframe_t * type = "frame"
1256
+ // u zuuid_t * type = "uuid"
1257
+ // m zmsg_t * type = "msg"
1258
+ // p void *, sends pointer value, only over inproc
1259
+ //
1260
+ // Does not change or take ownership of any arguments. Returns 0 if
1261
+ // successful, -1 if sending failed for any reason.
1262
+
1263
+ int
1264
+ zsock_bsend (void *self, const char *picture, ...)
1265
+ {
1266
+ assert (self);
1267
+ assert (picture);
1268
+
1269
+ // Pass 1: calculate total size of data frame
1270
+ size_t frame_size = 0;
1271
+ zframe_t *frames [ZSOCK_BSEND_MAX_FRAMES]; // Non-data frames to send
1272
+ size_t nbr_frames = 0; // Size of this table
1273
+ va_list argptr;
1274
+ va_start (argptr, picture);
1275
+ const char *picptr = picture;
1276
+ while (*picptr) {
1277
+ if (*picptr == '1') {
1278
+ va_arg (argptr, int);
1279
+ frame_size += 1;
1280
+ }
1281
+ else
1282
+ if (*picptr == '2') {
1283
+ va_arg (argptr, int);
1284
+ frame_size += 2;
1285
+ }
1286
+ else
1287
+ if (*picptr == '4') {
1288
+ va_arg (argptr, uint32_t);
1289
+ frame_size += 4;
1290
+ }
1291
+ else
1292
+ if (*picptr == '8') {
1293
+ va_arg (argptr, uint64_t);
1294
+ frame_size += 8;
1295
+ }
1296
+ else
1297
+ if (*picptr == 's') {
1298
+ char *string = va_arg (argptr, char *);
1299
+ frame_size += 1 + (string? strlen (string): 0);
1300
+ }
1301
+ else
1302
+ if (*picptr == 'S') {
1303
+ char *string = va_arg (argptr, char *);
1304
+ frame_size += 4 + (string? strlen (string): 0);
1305
+ }
1306
+ else
1307
+ if (*picptr == 'c') {
1308
+ zchunk_t *chunk = va_arg (argptr, zchunk_t *);
1309
+ frame_size += 4 + (chunk? zchunk_size (chunk): 0);
1310
+ }
1311
+ else
1312
+ if (*picptr == 'p') {
1313
+ va_arg (argptr, void *);
1314
+ frame_size += sizeof (void *);
1315
+ }
1316
+ else
1317
+ if (*picptr == 'f') {
1318
+ zframe_t *frame = va_arg (argptr, zframe_t *);
1319
+ assert (nbr_frames < ZSOCK_BSEND_MAX_FRAMES - 1);
1320
+ frames [nbr_frames++] = frame;
1321
+ }
1322
+ else
1323
+ if (*picptr == 'u') {
1324
+ zuuid_t *uuid = va_arg (argptr, zuuid_t *);
1325
+ frame_size += zuuid_size (uuid);
1326
+ }
1327
+ else
1328
+ if (*picptr == 'm') {
1329
+ if (picptr [1]) {
1330
+ zsys_error ("zsock_bsend: 'm' (zmsg) only valid at end of picptr");
1331
+ assert (false);
1332
+ }
1333
+ zmsg_t *msg = va_arg (argptr, zmsg_t *);
1334
+ if (msg) {
1335
+ zframe_t *frame = zmsg_first (msg);
1336
+ while (frame) {
1337
+ assert (nbr_frames < ZSOCK_BSEND_MAX_FRAMES - 1);
1338
+ frames [nbr_frames++] = frame;
1339
+ frame = zmsg_next (msg);
1340
+ }
1341
+ }
1342
+ else
1343
+ frames [nbr_frames++] = zframe_new_empty ();
1344
+ }
1345
+ else {
1346
+ zsys_error ("zsock_bsend: invalid picptr element '%c'", *picptr);
1347
+ assert (false);
1348
+ }
1349
+ picptr++;
1350
+ }
1351
+ va_end (argptr);
1352
+
1353
+ // Pass 2: encode data into data frame
1354
+ zmq_msg_t msg;
1355
+ zmq_msg_init_size (&msg, frame_size);
1356
+ byte *needle = (byte *) zmq_msg_data (&msg);
1357
+
1358
+ // Set routing id if self is zsock
1359
+ #if defined ZMQ_SERVER
1360
+ if (zsock_is (self) && zsock_routing_id ((zsock_t *)self) != 0)
1361
+ zmq_msg_set_routing_id (&msg, zsock_routing_id ((zsock_t *)self));
1362
+ #endif
1363
+
1364
+ va_start (argptr, picture);
1365
+ picptr = picture;
1366
+ while (*picptr) {
1367
+ if (*picptr == '1') {
1368
+ int number1 = va_arg (argptr, int);
1369
+ PUT_NUMBER1 (number1);
1370
+ }
1371
+ else
1372
+ if (*picptr == '2') {
1373
+ int number2 = va_arg (argptr, int);
1374
+ PUT_NUMBER2 (number2);
1375
+ }
1376
+ else
1377
+ if (*picptr == '4') {
1378
+ uint32_t number4 = va_arg (argptr, uint32_t);
1379
+ PUT_NUMBER4 (number4);
1380
+ }
1381
+ else
1382
+ if (*picptr == '8') {
1383
+ uint64_t number8 = va_arg (argptr, uint64_t);
1384
+ PUT_NUMBER8 (number8);
1385
+ }
1386
+ else
1387
+ if (*picptr == 'p') {
1388
+ void *pointer = va_arg (argptr, void *);
1389
+ memcpy (needle, &pointer, sizeof (void *));
1390
+ needle += sizeof (void *);
1391
+ }
1392
+ else
1393
+ if (*picptr == 's') {
1394
+ char *string = va_arg (argptr, char *);
1395
+ if (!string)
1396
+ string = "";
1397
+ size_t string_size = strlen (string);
1398
+ PUT_NUMBER1 ((byte) string_size);
1399
+ memcpy (needle, string, string_size);
1400
+ needle += string_size;
1401
+ }
1402
+ else
1403
+ if (*picptr == 'S') {
1404
+ char *string = va_arg (argptr, char *);
1405
+ if (!string)
1406
+ string = "";
1407
+ size_t string_size = strlen (string);
1408
+ PUT_NUMBER4 (string_size);
1409
+ memcpy (needle, string, string_size);
1410
+ needle += string_size;
1411
+ }
1412
+ else
1413
+ if (*picptr == 'c') {
1414
+ zchunk_t *chunk = va_arg (argptr, zchunk_t *);
1415
+ if (chunk) {
1416
+ PUT_NUMBER4 (zchunk_size (chunk));
1417
+ memcpy (needle, zchunk_data (chunk), zchunk_size (chunk));
1418
+ needle += zchunk_size (chunk);
1419
+ }
1420
+ }
1421
+ else
1422
+ if (*picptr == 'u') {
1423
+ zuuid_t *uuid = va_arg (argptr, zuuid_t *);
1424
+ if (uuid) {
1425
+ memcpy (needle, zuuid_data (uuid), zuuid_size (uuid));
1426
+ needle += zuuid_size (uuid);
1427
+ }
1428
+ }
1429
+ picptr++;
1430
+ }
1431
+ va_end (argptr);
1432
+
1433
+ // Now send the data frame
1434
+ void *handle = zsock_resolve (self);
1435
+ int rc = zmq_msg_send (&msg, handle, nbr_frames? ZMQ_SNDMORE: 0);
1436
+ if (rc >= 0) {
1437
+ // Now send any additional frames
1438
+ unsigned int frame_nbr;
1439
+ for (frame_nbr = 0; frame_nbr < nbr_frames; frame_nbr++) {
1440
+ bool more = frame_nbr < nbr_frames - 1;
1441
+ rc = zframe_send (&frames [frame_nbr], self,
1442
+ ZFRAME_REUSE + (more? ZFRAME_MORE: 0));
1443
+ if (rc == -1)
1444
+ break;
1445
+ }
1446
+ }
1447
+ return rc >= 0? 0: -1;
1448
+ }
1449
+
1450
+
1451
+ // --------------------------------------------------------------------------
1452
+ // Receive a binary encoded 'picture' message from the socket (or actor).
1453
+ // This method is similar to zsock_recv, except the arguments are encoded
1454
+ // in a binary format that is compatible with zproto, and is designed to
1455
+ // reduce memory allocations. The pattern argument is a string that defines
1456
+ // the type of each argument. See zsock_bsend for the supported argument
1457
+ // types. All arguments must be pointers; this call sets them to point to
1458
+ // values held on a per-socket basis.
1459
+ // For types 1, 2, 4 and 8 the caller must allocate the memory itself before
1460
+ // calling zsock_brecv.
1461
+ // For types S, the caller must free the value once finished with it, as
1462
+ // zsock_brecv will allocate the buffer.
1463
+ // For type s, the caller must not free the value as it is stored in a
1464
+ // local cache for performance purposes.
1465
+ // For types c, f, u and m the caller must call the appropriate destructor
1466
+ // depending on the object as zsock_brecv will create new objects.
1467
+ // For type p the caller must coordinate with the sender, as it is just a
1468
+ // pointer value being passed.
1469
+
1470
+ // This is the largest size we allow for an incoming longstr or chunk (1M)
1471
+ #define MAX_ALLOC_SIZE 1024 * 1024
1472
+
1473
+ int
1474
+ zsock_brecv (void *selfish, const char *picture, ...)
1475
+ {
1476
+ assert (selfish); // Kind of self
1477
+ assert (picture);
1478
+
1479
+ zmq_msg_t msg;
1480
+ zmq_msg_init (&msg);
1481
+ if (zmq_msg_recv (&msg, zsock_resolve (selfish), 0) == -1)
1482
+ return -1; // Interrupted
1483
+
1484
+ // If we don't have a string cache, create one now with arbitrary
1485
+ // value; this will grow if needed. Do not use an initial size less
1486
+ // than 256, or cache expansion will not work properly.
1487
+ zsock_t *self = (zsock_t *) selfish;
1488
+ if (zactor_is (selfish))
1489
+ self = zactor_sock ((zactor_t *) selfish);
1490
+
1491
+ if (!self->cache) {
1492
+ self->cache = (char *) malloc (512);
1493
+ self->cache_size = 512;
1494
+ }
1495
+ // Last received strings are cached per socket
1496
+ uint cache_used = 0;
1497
+ byte *needle = (byte *) zmq_msg_data (&msg);
1498
+ byte *ceiling = needle + zmq_msg_size (&msg);
1499
+
1500
+ // If selfish is zsock get routing id from msg
1501
+ #if defined ZMQ_SERVER
1502
+ if (zsock_is (selfish) && zsock_type (self) == ZMQ_SERVER)
1503
+ zsock_set_routing_id (self, zmq_msg_routing_id (&msg));
1504
+ #endif
1505
+
1506
+ va_list argptr;
1507
+ va_start (argptr, picture);
1508
+ const char *picptr = picture;
1509
+ while (*picptr) {
1510
+ if (*picptr == '1') {
1511
+ uint8_t *number1_p = va_arg (argptr, uint8_t *);
1512
+ GET_NUMBER1 (*number1_p);
1513
+ }
1514
+ else
1515
+ if (*picptr == '2') {
1516
+ uint16_t *number2_p = va_arg (argptr, uint16_t *);
1517
+ GET_NUMBER2 (*number2_p);
1518
+ }
1519
+ else
1520
+ if (*picptr == '4') {
1521
+ uint32_t *number4_p = va_arg (argptr, uint32_t *);
1522
+ GET_NUMBER4 (*number4_p);
1523
+ }
1524
+ else
1525
+ if (*picptr == '8') {
1526
+ uint64_t *number8_p = va_arg (argptr, uint64_t *);
1527
+ GET_NUMBER8 (*number8_p);
1528
+ }
1529
+ else
1530
+ if (*picptr == 'p') {
1531
+ void **pointer_p = va_arg (argptr, void **);
1532
+ memcpy (pointer_p, needle, sizeof (void *));
1533
+ needle += sizeof (void *);
1534
+ }
1535
+ else
1536
+ if (*picptr == 's') {
1537
+ char **string_p = va_arg (argptr, char **);
1538
+ uint string_size;
1539
+ GET_NUMBER1 (string_size);
1540
+ if (needle + string_size > ceiling)
1541
+ goto malformed;
1542
+ // Expand cache if we need to; string is guaranteed to fit into
1543
+ // expansion space
1544
+ if (cache_used + string_size > self->cache_size) {
1545
+ puts ("REALLOC");
1546
+ self->cache_size *= 2;
1547
+ self->cache = (char *) realloc (self->cache, self->cache_size);
1548
+ assert (self->cache);
1549
+ }
1550
+ *string_p = self->cache + cache_used;
1551
+ memcpy (*string_p, needle, string_size);
1552
+ cache_used += string_size;
1553
+ self->cache [cache_used++] = 0;
1554
+ needle += string_size;
1555
+ }
1556
+ else
1557
+ if (*picptr == 'S') {
1558
+ char **string_p = va_arg (argptr, char **);
1559
+ size_t string_size;
1560
+ GET_NUMBER4 (string_size);
1561
+ if (string_size > MAX_ALLOC_SIZE
1562
+ || needle + string_size > (ceiling))
1563
+ goto malformed;
1564
+ *string_p = (char *) malloc (string_size + 1);
1565
+ assert (string_p);
1566
+ memcpy (*string_p, needle, string_size);
1567
+ (*string_p) [string_size] = 0;
1568
+ needle += string_size;
1569
+ }
1570
+ else
1571
+ if (*picptr == 'c') {
1572
+ zchunk_t **chunk_p = va_arg (argptr, zchunk_t **);
1573
+ size_t chunk_size;
1574
+ GET_NUMBER4 (chunk_size);
1575
+ if (chunk_size > MAX_ALLOC_SIZE
1576
+ || needle + chunk_size > (ceiling))
1577
+ goto malformed;
1578
+ *chunk_p = zchunk_new (needle, chunk_size);
1579
+ needle += chunk_size;
1580
+ }
1581
+ else
1582
+ if (*picptr == 'u') {
1583
+ zuuid_t **uuid_p = va_arg (argptr, zuuid_t **);
1584
+ *uuid_p = zuuid_new ();
1585
+ if (zuuid_size (*uuid_p) > MAX_ALLOC_SIZE
1586
+ || needle + zuuid_size (*uuid_p) > (ceiling))
1587
+ goto malformed;
1588
+ zuuid_set (*uuid_p, needle);
1589
+ needle += zuuid_size (*uuid_p);
1590
+ }
1591
+ else
1592
+ if (*picptr == 'f') {
1593
+ zframe_t **frame_p = va_arg (argptr, zframe_t **);
1594
+ // Get next frame off socket
1595
+ if (!zsock_rcvmore (self))
1596
+ goto malformed;
1597
+ *frame_p = zframe_recv (self);
1598
+ }
1599
+ else
1600
+ if (*picptr == 'm') {
1601
+ if (picptr [1]) {
1602
+ zsys_error ("zsock_brecv: 'm' (zmsg) only valid at end of picptr");
1603
+ assert (false);
1604
+ }
1605
+ zmsg_t **msg_p = va_arg (argptr, zmsg_t **);
1606
+ // Get zero or more remaining frames
1607
+ if (!zsock_rcvmore (self))
1608
+ goto malformed;
1609
+ *msg_p = zmsg_recv (self);
1610
+ }
1611
+ else {
1612
+ zsys_error ("zsock_brecv: invalid picptr element '%c'", *picptr);
1613
+ assert (false);
1614
+ }
1615
+ picptr++;
1616
+ }
1617
+ va_end (argptr);
1618
+ zmq_msg_close (&msg);
1619
+ return 0;
1620
+
1621
+ // Error return
1622
+ malformed:
1623
+ zmq_msg_close (&msg);
1624
+ return -1; // Invalid message
1625
+ }
1626
+
1627
+
1628
+ // --------------------------------------------------------------------------
1629
+ // Return socket routing ID if any. This returns 0 if the socket is not
1630
+ // of type ZMQ_SERVER or if no request was already received on it.
1631
+
1632
+ uint32_t
1633
+ zsock_routing_id (zsock_t *self)
1634
+ {
1635
+ return self->routing_id;
1636
+ }
1637
+
1638
+
1639
+ // --------------------------------------------------------------------------
1640
+ // Set routing ID on socket. The socket MUST be of type ZMQ_SERVER.
1641
+ // This will be used when sending messages on the socket via the zsock API.
1642
+
1643
+ void
1644
+ zsock_set_routing_id (zsock_t *self, uint32_t routing_id)
1645
+ {
1646
+ assert (self);
1647
+ self->routing_id = routing_id;
1648
+ }
1649
+
1650
+
1651
+ // --------------------------------------------------------------------------
1652
+ // Set socket to use unbounded pipes (HWM=0); use this in cases when you are
1653
+ // totally certain the message volume can fit in memory. This method works
1654
+ // across all versions of ZeroMQ. Takes a polymorphic socket reference.
1655
+
1656
+ void
1657
+ zsock_set_unbounded (void *self)
1658
+ {
1659
+ #if (ZMQ_VERSION_MAJOR == 2)
1660
+ zsock_set_hwm (self, 0);
1661
+ #else
1662
+ zsock_set_sndhwm (self, 0);
1663
+ zsock_set_rcvhwm (self, 0);
1664
+ #endif
1665
+ }
1666
+
1667
+ // --------------------------------------------------------------------------
1668
+ // Send a signal over a socket. A signal is a short message carrying a
1669
+ // success/failure code (by convention, 0 means OK). Signals are encoded
1670
+ // to be distinguishable from "normal" messages. Accepts a zsock_t or a
1671
+ // zactor_t argument, and returns 0 if successful, -1 if the signal could
1672
+ // not be sent. Takes a polymorphic socket reference.
1673
+
1674
+ int
1675
+ zsock_signal (void *self, byte status)
1676
+ {
1677
+ assert (self);
1678
+ zmsg_t *msg = zmsg_new_signal (status);
1679
+ if (zmsg_send (&msg, self) < 0) {
1680
+ zmsg_destroy (&msg);
1681
+ return -1;
1682
+ }
1683
+ else
1684
+ return 0;
1685
+ }
1686
+
1687
+
1688
+ // --------------------------------------------------------------------------
1689
+ // Wait on a signal. Use this to coordinate between threads, over pipe
1690
+ // pairs. Blocks until the signal is received. Returns -1 on error, 0 or
1691
+ // greater on success. Accepts a zsock_t or a zactor_t as argument.
1692
+ // Takes a polymorphic socket reference.
1693
+
1694
+ int
1695
+ zsock_wait (void *self)
1696
+ {
1697
+ assert (self);
1698
+
1699
+ // Loop and discard messages until we get a signal value or interrupt.
1700
+ while (true) {
1701
+ zmsg_t *msg = zmsg_recv (self);
1702
+ if (!msg)
1703
+ return -1;
1704
+ int rc = zmsg_signal (msg);
1705
+ zmsg_destroy (&msg);
1706
+ if (rc >= 0)
1707
+ return rc;
1708
+ }
1709
+ return -1;
1710
+ }
1711
+
1712
+
1713
+ // --------------------------------------------------------------------------
1714
+ // If there is a partial message still waiting on the socket, remove and
1715
+ // discard it. This is useful when reading partial messages, to get specific
1716
+ // message types.
1717
+
1718
+ void
1719
+ zsock_flush (void *self)
1720
+ {
1721
+ if (zsock_rcvmore (self)) {
1722
+ zmsg_t *msg = zmsg_recv (self);
1723
+ zmsg_destroy (&msg);
1724
+ }
1725
+ }
1726
+
1727
+
1728
+ // --------------------------------------------------------------------------
1729
+ // Join a group for the RADIO-DISH pattern. Call only on ZMQ_DISH.
1730
+ // Returns 0 if OK, -1 if failed.
1731
+
1732
+ int
1733
+ zsock_join (void *self, const char *group)
1734
+ {
1735
+ assert (self);
1736
+ #ifdef ZMQ_DISH
1737
+ return zmq_join (zsock_resolve (self), group);
1738
+ #else
1739
+ errno = EINVAL;
1740
+ return -1;
1741
+ #endif
1742
+ }
1743
+
1744
+
1745
+ // --------------------------------------------------------------------------
1746
+ // Leave a group for the RADIO-DISH pattern. Call only on ZMQ_DISH.
1747
+ // Returns 0 if OK, -1 if failed.
1748
+
1749
+ int
1750
+ zsock_leave (void *self, const char *group)
1751
+ {
1752
+ assert (self);
1753
+ #ifdef ZMQ_DISH
1754
+ return zmq_leave (zsock_resolve (self), group);
1755
+ #else
1756
+ errno = EINVAL;
1757
+ return -1;
1758
+ #endif
1759
+ }
1760
+
1761
+
1762
+ // --------------------------------------------------------------------------
1763
+ // Probe the supplied object, and report if it looks like a zsock_t.
1764
+ // Takes a polymorphic socket reference.
1765
+
1766
+ bool
1767
+ zsock_is (void *self)
1768
+ {
1769
+ assert (self);
1770
+ return ((zsock_t *) self)->tag == ZSOCK_TAG;
1771
+ }
1772
+
1773
+
1774
+ // --------------------------------------------------------------------------
1775
+ // Probe the supplied 'self' pointer. Takes a polymorphic socket reference.
1776
+ // If self is a zactor_t, zsock_t, or libzmq socket handle, returns the
1777
+ // libzmq socket handle. If self is a valid file descriptor, returns NULL.
1778
+ // Else returns self as-is.
1779
+
1780
+ void *
1781
+ zsock_resolve (void *self)
1782
+ {
1783
+ assert (self);
1784
+ if (zactor_is (self))
1785
+ return zactor_resolve (self);
1786
+
1787
+ if (zsock_is (self))
1788
+ return ((zsock_t *) self)->handle;
1789
+
1790
+ // Check if we have a valid ZMQ socket by probing the socket type
1791
+ int type;
1792
+ size_t option_len = sizeof (int);
1793
+ if (zmq_getsockopt (self, ZMQ_TYPE, &type, &option_len) == 0)
1794
+ return self;
1795
+
1796
+ // Check if self is a valid FD or socket FD
1797
+ // TODO: this code should move to zsys_isfd () as we don't like
1798
+ // non-portable code outside of that class.
1799
+ int sock_type = -1;
1800
+ #if defined (__WINDOWS__)
1801
+ int sock_type_size = sizeof (int);
1802
+ int rc = getsockopt (*(SOCKET *) self, SOL_SOCKET, SO_TYPE, (char *) &sock_type, &sock_type_size);
1803
+ if (rc == 0)
1804
+ return NULL; // It's a socket descriptor
1805
+ #else
1806
+ socklen_t sock_type_size = sizeof (socklen_t);
1807
+ int rc = getsockopt (*(SOCKET *) self, SOL_SOCKET, SO_TYPE, (char *) &sock_type, &sock_type_size);
1808
+ if (rc == 0 || (rc == -1 && errno == ENOTSOCK))
1809
+ return NULL; // It's a socket FD or FD
1810
+ #endif
1811
+ // Socket appears to be something else, return it as-is
1812
+ return self;
1813
+ }
1814
+
1815
+
1816
+ // We use the gossip messages for some test cases
1817
+ #include "zgossip_msg.h"
1818
+
1819
+ // --------------------------------------------------------------------------
1820
+ // Selftest
1821
+
1822
+ void
1823
+ zsock_test (bool verbose)
1824
+ {
1825
+ printf (" * zsock: ");
1826
+ if (verbose)
1827
+ printf ("\n");
1828
+
1829
+ // @selftest
1830
+ zsock_t *writer = zsock_new (ZMQ_PUSH);
1831
+ assert (writer);
1832
+ int port = zsock_bind (writer, "tcp://127.0.0.1:*");
1833
+ assert (port != -1);
1834
+ assert (zsock_resolve (writer) != writer);
1835
+ assert (streq (zsock_type_str (writer), "PUSH"));
1836
+
1837
+ int rc;
1838
+ #if (ZMQ_VERSION >= ZMQ_MAKE_VERSION (3, 2, 0))
1839
+ // Check unbind
1840
+ rc = zsock_unbind (writer, "tcp://127.0.0.1:%d", port);
1841
+ assert (rc == 0);
1842
+
1843
+ // In some cases and especially when running under Valgrind, doing
1844
+ // a bind immediately after an unbind causes an EADDRINUSE error.
1845
+ // Even a short sleep allows the OS to release the port for reuse.
1846
+ zclock_sleep (100);
1847
+
1848
+ // Bind again
1849
+ rc = zsock_bind (writer, "tcp://127.0.0.1:%d", port);
1850
+ assert (rc == port);
1851
+ char endpoint [40];
1852
+ sprintf (endpoint, "tcp://127.0.0.1:%d", port);
1853
+ assert (streq (zsock_endpoint (writer), endpoint));
1854
+ #endif
1855
+
1856
+ zsock_t *reader = zsock_new (ZMQ_PULL);
1857
+ assert (reader);
1858
+ rc = zsock_connect (reader, "tcp://127.0.0.1:%d", port);
1859
+ assert (rc != -1);
1860
+ assert (zsock_resolve (reader) != reader);
1861
+ assert (streq (zsock_type_str (reader), "PULL"));
1862
+
1863
+ // Basic Hello, World
1864
+ zstr_send (writer, "Hello, World");
1865
+ zmsg_t *msg = zmsg_recv (reader);
1866
+ assert (msg);
1867
+ char *string = zmsg_popstr (msg);
1868
+ assert (streq (string, "Hello, World"));
1869
+ freen (string);
1870
+ zmsg_destroy (&msg);
1871
+
1872
+ // Test resolve libzmq socket
1873
+ #if (ZMQ_VERSION >= ZMQ_MAKE_VERSION (3, 2, 0))
1874
+ void *zmq_ctx = zmq_ctx_new ();
1875
+ #else
1876
+ void *zmq_ctx = zmq_ctx_new (1);
1877
+ #endif
1878
+ assert (zmq_ctx);
1879
+ void *zmq_sock = zmq_socket (zmq_ctx, ZMQ_PUB);
1880
+ assert (zmq_sock);
1881
+ assert (zsock_resolve (zmq_sock) == zmq_sock);
1882
+ zmq_close (zmq_sock);
1883
+ zmq_ctx_term (zmq_ctx);
1884
+
1885
+ // Test resolve zsock
1886
+ zsock_t *resolve = zsock_new_pub("@tcp://127.0.0.1:*");
1887
+ assert (resolve);
1888
+ assert (zsock_resolve (resolve) == resolve->handle);
1889
+ zsock_destroy (&resolve);
1890
+
1891
+ // Test resolve FD
1892
+ SOCKET fd = zsock_fd (reader);
1893
+ assert (zsock_resolve ((void *) &fd) == NULL);
1894
+
1895
+ // Test binding to ephemeral ports, sequential and random
1896
+ port = zsock_bind (writer, "tcp://127.0.0.1:*");
1897
+ assert (port >= DYNAMIC_FIRST && port <= DYNAMIC_LAST);
1898
+ port = zsock_bind (writer, "tcp://127.0.0.1:*[50000-]");
1899
+ assert (port >= 50000 && port <= DYNAMIC_LAST);
1900
+ port = zsock_bind (writer, "tcp://127.0.0.1:*[-50001]");
1901
+ assert (port >= DYNAMIC_FIRST && port <= 50001);
1902
+ port = zsock_bind (writer, "tcp://127.0.0.1:*[60000-60500]");
1903
+ assert (port >= 60000 && port <= 60500);
1904
+
1905
+ port = zsock_bind (writer, "tcp://127.0.0.1:!");
1906
+ assert (port >= DYNAMIC_FIRST && port <= DYNAMIC_LAST);
1907
+ port = zsock_bind (writer, "tcp://127.0.0.1:![50000-]");
1908
+ assert (port >= 50000 && port <= DYNAMIC_LAST);
1909
+ port = zsock_bind (writer, "tcp://127.0.0.1:![-50001]");
1910
+ assert (port >= DYNAMIC_FIRST && port <= 50001);
1911
+ port = zsock_bind (writer, "tcp://127.0.0.1:![60000-60500]");
1912
+ assert (port >= 60000 && port <= 60500);
1913
+
1914
+ // Test zsock_attach method
1915
+ zsock_t *server = zsock_new (ZMQ_DEALER);
1916
+ assert (server);
1917
+ rc = zsock_attach (server, "@inproc://myendpoint,tcp://127.0.0.1:*,inproc://others", true);
1918
+ assert (rc == 0);
1919
+ rc = zsock_attach (server, "", false);
1920
+ assert (rc == 0);
1921
+ rc = zsock_attach (server, NULL, true);
1922
+ assert (rc == 0);
1923
+ rc = zsock_attach (server, ">a,@b, c,, ", false);
1924
+ assert (rc == -1);
1925
+ zsock_destroy (&server);
1926
+
1927
+ // Test zsock_endpoint method
1928
+ rc = zsock_bind (writer, "inproc://test.%s", "writer");
1929
+ assert (rc == 0);
1930
+ assert (streq (zsock_endpoint (writer), "inproc://test.writer"));
1931
+
1932
+ // Test error state when connecting to an invalid socket type
1933
+ // ('txp://' instead of 'tcp://', typo intentional)
1934
+ rc = zsock_connect (reader, "txp://127.0.0.1:5560");
1935
+ assert (rc == -1);
1936
+
1937
+ // Test signal/wait methods
1938
+ rc = zsock_signal (writer, 123);
1939
+ assert (rc == 0);
1940
+ rc = zsock_wait (reader);
1941
+ assert (rc == 123);
1942
+
1943
+ // Test zsock_send/recv pictures
1944
+ uint8_t number1 = 123;
1945
+ uint16_t number2 = 123 * 123;
1946
+ uint32_t number4 = 123 * 123;
1947
+ number4 *= 123;
1948
+ uint32_t number4_MAX = UINT32_MAX;
1949
+ uint64_t number8 = 123 * 123;
1950
+ number8 *= 123;
1951
+ number8 *= 123;
1952
+ uint64_t number8_MAX = UINT64_MAX;
1953
+
1954
+ zchunk_t *chunk = zchunk_new ("HELLO", 5);
1955
+ assert (chunk);
1956
+ zframe_t *frame = zframe_new ("WORLD", 5);
1957
+ assert (frame);
1958
+ zhashx_t *hash = zhashx_new ();
1959
+ assert (hash);
1960
+ zuuid_t *uuid = zuuid_new ();
1961
+ assert (uuid);
1962
+ zhashx_set_destructor (hash, (zhashx_destructor_fn *) zstr_free);
1963
+ zhashx_set_duplicator (hash, (zhashx_duplicator_fn *) strdup);
1964
+ zhashx_insert (hash, "1", "value A");
1965
+ zhashx_insert (hash, "2", "value B");
1966
+ char *original = "pointer";
1967
+
1968
+ // Test zsock_recv into each supported type
1969
+ zsock_send (writer, "i124488zsbcfUhp",
1970
+ -12345, number1, number2, number4, number4_MAX,
1971
+ number8, number8_MAX,
1972
+ "This is a string", "ABCDE", 5,
1973
+ chunk, frame, uuid, hash, original);
1974
+ char *uuid_str = strdup (zuuid_str (uuid));
1975
+ zchunk_destroy (&chunk);
1976
+ zframe_destroy (&frame);
1977
+ zuuid_destroy (&uuid);
1978
+ zhashx_destroy (&hash);
1979
+
1980
+ int integer;
1981
+ byte *data;
1982
+ size_t size;
1983
+ char *pointer;
1984
+ number8_MAX = number8 = number4_MAX = number4 = number2 = number1 = 0ULL;
1985
+ rc = zsock_recv (reader, "i124488zsbcfUhp",
1986
+ &integer, &number1, &number2, &number4, &number4_MAX,
1987
+ &number8, &number8_MAX, &string, &data, &size, &chunk,
1988
+ &frame, &uuid, &hash, &pointer);
1989
+ assert (rc == 0);
1990
+ assert (integer == -12345);
1991
+ assert (number1 == 123);
1992
+ assert (number2 == 123 * 123);
1993
+ assert (number4 == 123 * 123 * 123);
1994
+ assert (number4_MAX == UINT32_MAX);
1995
+ assert (number8 == 123 * 123 * 123 * 123);
1996
+ assert (number8_MAX == UINT64_MAX);
1997
+ assert (streq (string, "This is a string"));
1998
+ assert (memcmp (data, "ABCDE", 5) == 0);
1999
+ assert (size == 5);
2000
+ assert (memcmp (zchunk_data (chunk), "HELLO", 5) == 0);
2001
+ assert (zchunk_size (chunk) == 5);
2002
+ assert (streq (uuid_str, zuuid_str (uuid)));
2003
+ assert (memcmp (zframe_data (frame), "WORLD", 5) == 0);
2004
+ assert (zframe_size (frame) == 5);
2005
+ char *value = (char *) zhashx_lookup (hash, "1");
2006
+ assert (streq (value, "value A"));
2007
+ value = (char *) zhashx_lookup (hash, "2");
2008
+ assert (streq (value, "value B"));
2009
+ assert (original == pointer);
2010
+ freen (string);
2011
+ freen (data);
2012
+ freen (uuid_str);
2013
+ zframe_destroy (&frame);
2014
+ zchunk_destroy (&chunk);
2015
+ zhashx_destroy (&hash);
2016
+ zuuid_destroy (&uuid);
2017
+
2018
+ // Test zsock_recv of short message; this lets us return a failure
2019
+ // with a status code and then nothing else; the receiver will get
2020
+ // the status code and NULL/zero for all other values
2021
+ zsock_send (writer, "i", -1);
2022
+ zsock_recv (reader, "izsbcfp",
2023
+ &integer, &string, &data, &size, &chunk, &frame, &pointer);
2024
+ assert (integer == -1);
2025
+ assert (string == NULL);
2026
+ assert (data == NULL);
2027
+ assert (size == 0);
2028
+ assert (chunk == NULL);
2029
+ assert (frame == NULL);
2030
+ assert (pointer == NULL);
2031
+
2032
+ msg = zmsg_new ();
2033
+ zmsg_addstr (msg, "frame 1");
2034
+ zmsg_addstr (msg, "frame 2");
2035
+ zsock_send (writer, "szm", "header", msg);
2036
+ zmsg_destroy (&msg);
2037
+
2038
+ zsock_recv (reader, "szm", &string, &msg);
2039
+
2040
+ assert (streq ("header", string));
2041
+ assert (zmsg_size (msg) == 2);
2042
+ assert (zframe_streq (zmsg_first (msg), "frame 1"));
2043
+ assert (zframe_streq (zmsg_next (msg), "frame 2"));
2044
+ zstr_free (&string);
2045
+ zmsg_destroy (&msg);
2046
+
2047
+ // Test zsock_recv with null arguments
2048
+ chunk = zchunk_new ("HELLO", 5);
2049
+ assert (chunk);
2050
+ frame = zframe_new ("WORLD", 5);
2051
+ assert (frame);
2052
+ zsock_send (writer, "izsbcfp",
2053
+ -12345, "This is a string", "ABCDE", 5, chunk, frame, original);
2054
+ zframe_destroy (&frame);
2055
+ zchunk_destroy (&chunk);
2056
+ zsock_recv (reader, "izsbcfp", &integer, NULL, NULL, NULL, &chunk, NULL, NULL);
2057
+ assert (integer == -12345);
2058
+ assert (memcmp (zchunk_data (chunk), "HELLO", 5) == 0);
2059
+ assert (zchunk_size (chunk) == 5);
2060
+ zchunk_destroy (&chunk);
2061
+
2062
+ // Test zsock_bsend/brecv pictures with binary encoding
2063
+ frame = zframe_new ("Hello", 5);
2064
+ chunk = zchunk_new ("World", 5);
2065
+
2066
+ msg = zmsg_new ();
2067
+ zmsg_addstr (msg, "Hello");
2068
+ zmsg_addstr (msg, "World");
2069
+
2070
+ zsock_bsend (writer, "1248sSpcfm",
2071
+ number1, number2, number4, number8,
2072
+ "Hello, World",
2073
+ "Goodbye cruel World!",
2074
+ original,
2075
+ chunk, frame, msg);
2076
+ zchunk_destroy (&chunk);
2077
+ zframe_destroy (&frame);
2078
+ zmsg_destroy (&msg);
2079
+
2080
+ number8 = number4 = number2 = number1 = 0;
2081
+ char *longstr;
2082
+ zsock_brecv (reader, "1248sSpcfm",
2083
+ &number1, &number2, &number4, &number8,
2084
+ &string, &longstr,
2085
+ &pointer,
2086
+ &chunk, &frame, &msg);
2087
+ assert (number1 == 123);
2088
+ assert (number2 == 123 * 123);
2089
+ assert (number4 == 123 * 123 * 123);
2090
+ assert (number8 == 123 * 123 * 123 * 123);
2091
+ assert (streq (string, "Hello, World"));
2092
+ assert (streq (longstr, "Goodbye cruel World!"));
2093
+ assert (pointer == original);
2094
+ zstr_free (&longstr);
2095
+ zchunk_destroy (&chunk);
2096
+ zframe_destroy (&frame);
2097
+ zmsg_destroy (&msg);
2098
+
2099
+ #ifdef ZMQ_SERVER
2100
+
2101
+ // Test zsock_bsend/brecv pictures with binary encoding on SERVER and CLIENT sockets
2102
+ server = zsock_new (ZMQ_SERVER);
2103
+ assert (server);
2104
+ port = zsock_bind (server, "tcp://127.0.0.1:*");
2105
+ assert (port != -1);
2106
+ zsock_t* client = zsock_new (ZMQ_CLIENT);
2107
+ assert (client);
2108
+ rc = zsock_connect (client, "tcp://127.0.0.1:%d", port);
2109
+ assert (rc != -1);
2110
+
2111
+ // From client to server
2112
+ chunk = zchunk_new ("World", 5);
2113
+ zsock_bsend (client, "1248sSpc",
2114
+ number1, number2, number4, number8,
2115
+ "Hello, World",
2116
+ "Goodbye cruel World!",
2117
+ original,
2118
+ chunk);
2119
+ zchunk_destroy (&chunk);
2120
+
2121
+ number8 = number4 = number2 = number1 = 0;
2122
+ zsock_brecv (server, "1248sSpc",
2123
+ &number1, &number2, &number4, &number8,
2124
+ &string, &longstr,
2125
+ &pointer,
2126
+ &chunk);
2127
+ assert (number1 == 123);
2128
+ assert (number2 == 123 * 123);
2129
+ assert (number4 == 123 * 123 * 123);
2130
+ assert (number8 == 123 * 123 * 123 * 123);
2131
+ assert (streq (string, "Hello, World"));
2132
+ assert (streq (longstr, "Goodbye cruel World!"));
2133
+ assert (pointer == original);
2134
+ assert (zsock_routing_id (server));
2135
+ zstr_free (&longstr);
2136
+ zchunk_destroy (&chunk);
2137
+
2138
+ // From server to client
2139
+ chunk = zchunk_new ("World", 5);
2140
+ zsock_bsend (server, "1248sSpc",
2141
+ number1, number2, number4, number8,
2142
+ "Hello, World",
2143
+ "Goodbye cruel World!",
2144
+ original,
2145
+ chunk);
2146
+ zchunk_destroy (&chunk);
2147
+
2148
+ number8 = number4 = number2 = number1 = 0;
2149
+ zsock_brecv (client, "1248sSpc",
2150
+ &number1, &number2, &number4, &number8,
2151
+ &string, &longstr,
2152
+ &pointer,
2153
+ &chunk);
2154
+ assert (number1 == 123);
2155
+ assert (number2 == 123 * 123);
2156
+ assert (number4 == 123 * 123 * 123);
2157
+ assert (number8 == 123 * 123 * 123 * 123);
2158
+ assert (streq (string, "Hello, World"));
2159
+ assert (streq (longstr, "Goodbye cruel World!"));
2160
+ assert (pointer == original);
2161
+ assert (zsock_routing_id (client) == 0);
2162
+ zstr_free (&longstr);
2163
+ zchunk_destroy (&chunk);
2164
+
2165
+ zsock_destroy (&client);
2166
+ zsock_destroy (&server);
2167
+
2168
+ #endif
2169
+
2170
+ #ifdef ZMQ_SCATTER
2171
+
2172
+ zsock_t* gather = zsock_new_gather ("inproc://test-gather-scatter");
2173
+ assert (gather);
2174
+ zsock_t* scatter = zsock_new_scatter ("inproc://test-gather-scatter");
2175
+ assert (scatter);
2176
+
2177
+ rc = zstr_send (scatter, "HELLO");
2178
+ assert (rc == 0);
2179
+
2180
+ char* message;
2181
+ message = zstr_recv (gather);
2182
+ assert (streq(message, "HELLO"));
2183
+ zstr_free (&message);
2184
+
2185
+ zsock_destroy (&gather);
2186
+ zsock_destroy (&scatter);
2187
+
2188
+ #endif
2189
+
2190
+ // Check that we can send a zproto format message
2191
+ zsock_bsend (writer, "1111sS4", 0xAA, 0xA0, 0x02, 0x01, "key", "value", 1234);
2192
+ zgossip_msg_t *gossip = zgossip_msg_new ();
2193
+ zgossip_msg_recv (gossip, reader);
2194
+ assert (zgossip_msg_id (gossip) == ZGOSSIP_MSG_PUBLISH);
2195
+ zgossip_msg_destroy (&gossip);
2196
+
2197
+ zsock_destroy (&reader);
2198
+ zsock_destroy (&writer);
2199
+
2200
+ // @end
2201
+ printf ("OK\n");
2202
+ zsock_option_test (verbose);
2203
+
2204
+ #if defined (__WINDOWS__)
2205
+ zsys_shutdown();
2206
+ #endif
2207
+ }