laag-libczmq 4.1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }