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.
- checksums.yaml +7 -0
- data/.gitignore +57 -0
- data/LICENSE.txt +373 -0
- data/README.org +34 -0
- data/ext/laag/libczmq/extconf.rb +24 -0
- data/laag-libczmq.gemspec +21 -0
- data/lib/laag/libczmq.rb +30 -0
- data/vendor/github.com/zeromq/czmq/.editorconfig +19 -0
- data/vendor/github.com/zeromq/czmq/.gitattributes +5 -0
- data/vendor/github.com/zeromq/czmq/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- data/vendor/github.com/zeromq/czmq/.gitignore +137 -0
- data/vendor/github.com/zeromq/czmq/.travis.yml +126 -0
- data/vendor/github.com/zeromq/czmq/AUTHORS +69 -0
- data/vendor/github.com/zeromq/czmq/CMakeLists.txt +653 -0
- data/vendor/github.com/zeromq/czmq/CONTRIBUTING.md +19 -0
- data/vendor/github.com/zeromq/czmq/Dockerfile +29 -0
- data/vendor/github.com/zeromq/czmq/Findlibsodium.cmake +47 -0
- data/vendor/github.com/zeromq/czmq/Findlibzmq.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/Findlz4.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/Findsystemd.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/Finduuid.cmake +49 -0
- data/vendor/github.com/zeromq/czmq/INSTALL.cygwin +13 -0
- data/vendor/github.com/zeromq/czmq/ISSUES.cygwin +6 -0
- data/vendor/github.com/zeromq/czmq/Jenkinsfile +439 -0
- data/vendor/github.com/zeromq/czmq/LICENSE +373 -0
- data/vendor/github.com/zeromq/czmq/Makefile.am +70 -0
- data/vendor/github.com/zeromq/czmq/NEWS +823 -0
- data/vendor/github.com/zeromq/czmq/README.cygwin +23 -0
- data/vendor/github.com/zeromq/czmq/README.md +9345 -0
- data/vendor/github.com/zeromq/czmq/README.txt +512 -0
- data/vendor/github.com/zeromq/czmq/Vagrantfile +49 -0
- data/vendor/github.com/zeromq/czmq/acinclude.m4 +7 -0
- data/vendor/github.com/zeromq/czmq/api/zactor.api +77 -0
- data/vendor/github.com/zeromq/czmq/api/zargs.api +110 -0
- data/vendor/github.com/zeromq/czmq/api/zarmour.api +103 -0
- data/vendor/github.com/zeromq/czmq/api/zcert.api +128 -0
- data/vendor/github.com/zeromq/czmq/api/zcertstore.api +80 -0
- data/vendor/github.com/zeromq/czmq/api/zchunk.api +171 -0
- data/vendor/github.com/zeromq/czmq/api/zclock.api +43 -0
- data/vendor/github.com/zeromq/czmq/api/zconfig.api +205 -0
- data/vendor/github.com/zeromq/czmq/api/zdigest.api +45 -0
- data/vendor/github.com/zeromq/czmq/api/zdir.api +124 -0
- data/vendor/github.com/zeromq/czmq/api/zdir_patch.api +62 -0
- data/vendor/github.com/zeromq/czmq/api/zfile.api +157 -0
- data/vendor/github.com/zeromq/czmq/api/zframe.api +157 -0
- data/vendor/github.com/zeromq/czmq/api/zgossip_msg.api +104 -0
- data/vendor/github.com/zeromq/czmq/api/zhash.api +184 -0
- data/vendor/github.com/zeromq/czmq/api/zhashx.api +295 -0
- data/vendor/github.com/zeromq/czmq/api/ziflist.api +73 -0
- data/vendor/github.com/zeromq/czmq/api/zlist.api +158 -0
- data/vendor/github.com/zeromq/czmq/api/zlistx.api +220 -0
- data/vendor/github.com/zeromq/czmq/api/zloop.api +176 -0
- data/vendor/github.com/zeromq/czmq/api/zmsg.api +250 -0
- data/vendor/github.com/zeromq/czmq/api/zpoller.api +71 -0
- data/vendor/github.com/zeromq/czmq/api/zproc.api +247 -0
- data/vendor/github.com/zeromq/czmq/api/zsock.api +412 -0
- data/vendor/github.com/zeromq/czmq/api/zsock_option.api +847 -0
- data/vendor/github.com/zeromq/czmq/api/zstr.api +119 -0
- data/vendor/github.com/zeromq/czmq/api/zsys.api +490 -0
- data/vendor/github.com/zeromq/czmq/api/ztimerset.api +69 -0
- data/vendor/github.com/zeromq/czmq/api/ztrie.api +80 -0
- data/vendor/github.com/zeromq/czmq/api/zuuid.api +82 -0
- data/vendor/github.com/zeromq/czmq/appveyor.yml +73 -0
- data/vendor/github.com/zeromq/czmq/autogen.sh +52 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/CMakeLists.txt +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/Findczmq.cmake +47 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/README.md +130 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/android/CMakeLists.txt +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/android/android_toolchain.cmake +52 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/android/build.sh +68 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/build.gradle +151 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/ci_build.sh +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradlew +164 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/gradlew.bat +90 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/configure.bat +93 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/platform.h +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Common.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DLL.props +16 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Debug.props +29 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugDEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugDLL.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLIB.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugLTCG.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/DebugSEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/EXE.props +17 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/LIB.props +16 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/LTCG.props +13 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Link.props +21 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Messages.props +15 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Output.props +30 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Release.props +41 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseDEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseDLL.props +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLIB.props +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseLTCG.props +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/ReleaseSEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/Win32.props +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/properties/x64.props +23 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/resource.h +14 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/resource.rc +94 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2010/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2012/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2013/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/build.bat +48 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/call_javah.bat +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/czmq.sln +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.props +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.vcxproj +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/msvc/vs2015/libczmqjni/libczmqjni.vcxproj.filters +210 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/settings.gradle +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zarmour.c +132 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zcert.c +188 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zcertstore.c +69 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zchunk.c +191 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zclock.c +54 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zconfig.c +252 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zdigest.c +66 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zdir.c +116 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_ZdirPatch.c +88 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zfile.c +186 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zframe.c +199 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zhash.c +174 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zhashx.c +175 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ziflist.c +112 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zlist.c +135 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zlistx.c +189 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zloop.c +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zmsg.c +261 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zpoller.c +74 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zproc.c +278 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zsock.c +1310 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zstr.c +108 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zsys.c +445 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ztimerset.c +68 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Ztrie.c +86 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/c/org_zeromq_czmq_Zuuid.c +125 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zarmour.java +148 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zcert.java +178 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zcertstore.java +94 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zchunk.java +204 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zclock.java +67 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zconfig.java +253 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zdigest.java +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zdir.java +159 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/ZdirPatch.java +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zfile.java +217 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zframe.java +212 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zhash.java +223 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zhashx.java +248 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ziflist.java +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zlist.java +171 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zlistx.java +247 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zloop.java +134 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zmsg.java +308 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zpoller.java +105 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zproc.java +331 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zsock.java +1556 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zstr.java +117 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zsys.java +534 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ztimerset.java +87 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Ztrie.java +102 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/main/java/org/zeromq/czmq/Zuuid.java +127 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZarmourTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZcertTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZcertstoreTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZchunkTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZclockTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZconfigTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdigestTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdirPatchTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZdirTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZfileTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZframeTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZhashTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZhashxTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZiflistTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZlistTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZlistxTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZloopTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZmsgTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZpollerTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZprocTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZsockTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZstrTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZsysTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZtimersetTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZtrieTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/jni/src/test/java/org/zeromq/czmq/ZuuidTest.java +25 -0
- data/vendor/github.com/zeromq/czmq/bindings/lua_ffi/czmq_ffi.lua +4079 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/.gitignore +10 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/.prebuildrc +2 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/README.md +4373 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.cc +8324 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.gyp +49 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/binding.h +952 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/build.sh +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/index.js +39 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/package.json +26 -0
- data/vendor/github.com/zeromq/czmq/bindings/nodejs/test_binding.js +32 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/ci_build.sh +59 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/czmq/__init__.py +3 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/czmq/_czmq_ctypes.py +8344 -0
- data/vendor/github.com/zeromq/czmq/bindings/python/test.py +1078 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/README.md +28 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zactor.py +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zargs.py +133 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zarmour.py +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zcert.py +132 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zcertstore.py +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zchunk.py +192 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zclock.py +59 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zconfig.py +211 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zdigest.py +64 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zdir.py +144 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/ZdirPatch.py +79 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zfile.py +185 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zframe.py +160 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zhash.py +197 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zhashx.py +271 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ziflist.py +103 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zlist.py +176 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zlistx.py +235 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zloop.py +171 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zmsg.py +250 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zpoller.py +89 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zproc.py +287 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zsock.py +1283 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zstr.py +123 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zsys.py +532 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ztimerset.py +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Ztrie.py +93 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/Zuuid.py +100 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/__init__.py +33 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/_cdefs.inc +4081 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/build.py +345 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/cdefs.py +4086 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/dlopen.py +33 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/czmq_cffi/utils.py +50 -0
- data/vendor/github.com/zeromq/czmq/bindings/python_cffi/setup.py +23 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/README.md +157 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/Rakefile +34 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/qml_czmq_bindings.pro +136 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZactor.cpp +88 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZactor.h +86 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZargs.cpp +121 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZargs.h +105 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZarmour.cpp +135 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZarmour.h +108 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcert.cpp +166 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcert.h +122 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcertstore.cpp +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZcertstore.h +93 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZchunk.cpp +214 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZchunk.h +149 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZclock.cpp +67 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZclock.h +77 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZconfig.cpp +255 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZconfig.h +165 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdigest.cpp +70 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdigest.h +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdir.cpp +158 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdir.h +134 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdirPatch.cpp +89 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZdirPatch.h +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZfile.cpp +204 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZfile.h +152 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZframe.cpp +200 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZframe.h +143 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhash.cpp +219 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhash.h +174 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhashx.cpp +308 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZhashx.h +225 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZiflist.cpp +111 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZiflist.h +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlist.cpp +184 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlist.h +148 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlistx.cpp +244 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZlistx.h +184 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZloop.cpp +177 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZloop.h +149 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZmsg.cpp +313 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZmsg.h +209 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZpoller.cpp +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZpoller.h +97 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZproc.cpp +296 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZproc.h +211 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsock.cpp +1471 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsock.h +882 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZstr.cpp +137 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZstr.h +120 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsys.cpp +541 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZsys.h +373 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtimerset.cpp +84 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtimerset.h +86 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtrie.cpp +101 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZtrie.h +95 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZuuid.cpp +116 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/QmlZuuid.h +99 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/qml_czmq_plugin.h +174 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/src/qmldir +2 -0
- data/vendor/github.com/zeromq/czmq/bindings/qml/test/tst_QmlCZMQ.qml +16 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/README.md +87 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/buildlib/buildlib.pro +36 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/common.pri +20 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/config.pri +1 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/qczmq.pro +13 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/selftest/main.cpp +57 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/selftest/selftest.pro +19 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qczmq.h +96 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qczmq.pri +81 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzactor.cpp +98 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzactor.h +61 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzargs.cpp +130 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzargs.h +72 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzarmour.cpp +162 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzarmour.h +83 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcert.cpp +191 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcert.h +97 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcertstore.cpp +105 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzcertstore.h +68 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzchunk.cpp +250 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzchunk.h +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzclock.cpp +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzclock.h +52 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzconfig.cpp +292 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzconfig.h +140 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdigest.cpp +80 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdigest.h +53 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdir.cpp +176 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdir.h +109 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdirpatch.cpp +101 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzdirpatch.h +59 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzfile.cpp +243 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzfile.h +127 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzframe.cpp +231 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzframe.h +118 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhash.cpp +250 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhash.h +149 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhashx.cpp +350 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzhashx.h +200 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qziflist.cpp +133 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qziflist.h +71 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlist.cpp +220 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlist.h +123 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlistx.cpp +296 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzlistx.h +159 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzloop.cpp +211 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzloop.h +124 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzmsg.cpp +354 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzmsg.h +184 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzpoller.cpp +100 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzpoller.h +67 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzproc.cpp +365 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzproc.h +186 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsock.cpp +1719 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsock.h +815 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzstr.cpp +128 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzstr.h +78 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsys.cpp +600 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzsys.h +321 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztimerset.cpp +98 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztimerset.h +61 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztrie.cpp +117 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qztrie.h +70 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzuuid.cpp +135 -0
- data/vendor/github.com/zeromq/czmq/bindings/qt/src/qzuuid.h +74 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/Rakefile +8 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi.rb +875 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/version.rb +15 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zactor.rb +219 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zargs.rb +259 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zarmour.rb +286 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zcert.rb +304 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zcertstore.rb +224 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zchunk.rb +388 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zclock.rb +140 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zconfig.rb +462 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdigest.rb +156 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdir.rb +283 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zdir_patch.rb +194 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zfile.rb +361 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zframe.rb +360 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zhash.rb +386 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zhashx.rb +617 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ziflist.rb +219 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zlist.rb +365 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zlistx.rb +478 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zloop.rb +396 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zmsg.rb +515 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zpoller.rb +194 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zproc.rb +497 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zsock.rb +4673 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zstr.rb +242 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zsys.rb +836 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ztimerset.rb +203 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/ztrie.rb +221 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/lib/czmq/ffi/zuuid.rb +227 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/spec/ffi_spec.rb +15 -0
- data/vendor/github.com/zeromq/czmq/bindings/ruby/spec/spec_helper.rb +8 -0
- data/vendor/github.com/zeromq/czmq/builds/android/android_build_helper.sh +298 -0
- data/vendor/github.com/zeromq/czmq/builds/android/build.sh +94 -0
- data/vendor/github.com/zeromq/czmq/builds/android/ci_build.sh +41 -0
- data/vendor/github.com/zeromq/czmq/builds/check_zproject/ci_build.sh +52 -0
- data/vendor/github.com/zeromq/czmq/builds/check_zproto/ci_build.sh +23 -0
- data/vendor/github.com/zeromq/czmq/builds/cmake/ci_build.sh +93 -0
- data/vendor/github.com/zeromq/czmq/builds/cygwin/Makefile.cygwin +32 -0
- data/vendor/github.com/zeromq/czmq/builds/docs/ci_build.sh +24 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/.gitignore +5 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/README.md +33 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/platform.h +46 -0
- data/vendor/github.com/zeromq/czmq/builds/gyp/project.gyp +195 -0
- data/vendor/github.com/zeromq/czmq/builds/mingw32/Makefile.mingw32 +33 -0
- data/vendor/github.com/zeromq/czmq/builds/mingw32/platform.h +0 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/configure.bat +93 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.bat +14 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.nuspec +92 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.targets +128 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/nuget/package.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/platform.h +1 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Common.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DLL.props +16 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Debug.props +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugDEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugDLL.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLIB.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugLTCG.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/DebugSEXE.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/EXE.props +17 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/LIB.props +16 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/LTCG.props +13 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Link.props +21 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Messages.props +15 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Output.props +30 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Release.props +41 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseDEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseDLL.props +19 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLIB.props +19 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseLTCG.props +19 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/ReleaseSEXE.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/Win32.props +20 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/properties/x64.props +23 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/resource.h +14 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/resource.rc +94 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2008/czmq/czmq.sln +65 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2008/czmq/czmq.vcproj +1411 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2010/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2012/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2013/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/build.bat +129 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq.import.props +59 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq.sln +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq_selftest/czmq_selftest.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/czmq_selftest/czmq_selftest.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.import.xml +29 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.props +81 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.vcxproj +215 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/libczmq/libczmq.vcxproj.filters +203 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/test_randof/test_randof.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/test_randof/test_randof.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zmakecert/zmakecert.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zmakecert/zmakecert.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zsp/zsp.props +75 -0
- data/vendor/github.com/zeromq/czmq/builds/msvc/vs2015/zsp/zsp.vcxproj +146 -0
- data/vendor/github.com/zeromq/czmq/builds/nuget/czmq.autobuild +49 -0
- data/vendor/github.com/zeromq/czmq/builds/nuget/readme.nuget +18 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/.gitignore +8 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/README.md +62 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/build.sh +142 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/build_image.sh +32 -0
- data/vendor/github.com/zeromq/czmq/builds/rpi/prepare_img.sh +111 -0
- data/vendor/github.com/zeromq/czmq/builds/stable_zmq/ci_build.sh +62 -0
- data/vendor/github.com/zeromq/czmq/builds/valgrind/ci_build.sh +43 -0
- data/vendor/github.com/zeromq/czmq/ci_build.sh +317 -0
- data/vendor/github.com/zeromq/czmq/ci_deploy.sh +29 -0
- data/vendor/github.com/zeromq/czmq/ci_deploy_obs.sh +23 -0
- data/vendor/github.com/zeromq/czmq/configure.ac +856 -0
- data/vendor/github.com/zeromq/czmq/doc/.gitignore +91 -0
- data/vendor/github.com/zeromq/czmq/doc/Makefile.am +222 -0
- data/vendor/github.com/zeromq/czmq/doc/asciidoc.conf +64 -0
- data/vendor/github.com/zeromq/czmq/doc/czmq.adoc +51 -0
- data/vendor/github.com/zeromq/czmq/doc/czmq.txt +380 -0
- data/vendor/github.com/zeromq/czmq/doc/mkman +217 -0
- data/vendor/github.com/zeromq/czmq/doc/mkmans +15 -0
- data/vendor/github.com/zeromq/czmq/doc/wdput +43 -0
- data/vendor/github.com/zeromq/czmq/examples/security/LICENSE +18 -0
- data/vendor/github.com/zeromq/czmq/examples/security/README.txt +9 -0
- data/vendor/github.com/zeromq/czmq/examples/security/grasslands.c +32 -0
- data/vendor/github.com/zeromq/czmq/examples/security/hello.c +13 -0
- data/vendor/github.com/zeromq/czmq/examples/security/ironhouse.c +64 -0
- data/vendor/github.com/zeromq/czmq/examples/security/ironhouse2.c +123 -0
- data/vendor/github.com/zeromq/czmq/examples/security/ironhouse2_v2.c +107 -0
- data/vendor/github.com/zeromq/czmq/examples/security/passwords +2 -0
- data/vendor/github.com/zeromq/czmq/examples/security/stonehouse.c +59 -0
- data/vendor/github.com/zeromq/czmq/examples/security/strawhouse.c +49 -0
- data/vendor/github.com/zeromq/czmq/examples/security/woodhouse.c +47 -0
- data/vendor/github.com/zeromq/czmq/images/README_1.png +0 -0
- data/vendor/github.com/zeromq/czmq/include/.gitignore +1 -0
- data/vendor/github.com/zeromq/czmq/include/czmq.h +39 -0
- data/vendor/github.com/zeromq/czmq/include/czmq_library.h +190 -0
- data/vendor/github.com/zeromq/czmq/include/czmq_prelude.h +735 -0
- data/vendor/github.com/zeromq/czmq/include/test_zgossip.h +44 -0
- data/vendor/github.com/zeromq/czmq/include/zactor.h +94 -0
- data/vendor/github.com/zeromq/czmq/include/zargs.h +134 -0
- data/vendor/github.com/zeromq/czmq/include/zarmour.h +114 -0
- data/vendor/github.com/zeromq/czmq/include/zauth.h +100 -0
- data/vendor/github.com/zeromq/czmq/include/zbeacon.h +86 -0
- data/vendor/github.com/zeromq/czmq/include/zcert.h +133 -0
- data/vendor/github.com/zeromq/czmq/include/zcertstore.h +101 -0
- data/vendor/github.com/zeromq/czmq/include/zchunk.h +163 -0
- data/vendor/github.com/zeromq/czmq/include/zclock.h +73 -0
- data/vendor/github.com/zeromq/czmq/include/zconfig.h +199 -0
- data/vendor/github.com/zeromq/czmq/include/zdigest.h +65 -0
- data/vendor/github.com/zeromq/czmq/include/zdir.h +149 -0
- data/vendor/github.com/zeromq/czmq/include/zdir_patch.h +82 -0
- data/vendor/github.com/zeromq/czmq/include/zfile.h +185 -0
- data/vendor/github.com/zeromq/czmq/include/zframe.h +177 -0
- data/vendor/github.com/zeromq/czmq/include/zgossip.h +95 -0
- data/vendor/github.com/zeromq/czmq/include/zhash.h +183 -0
- data/vendor/github.com/zeromq/czmq/include/zhashx.h +279 -0
- data/vendor/github.com/zeromq/czmq/include/ziflist.h +98 -0
- data/vendor/github.com/zeromq/czmq/include/zlist.h +158 -0
- data/vendor/github.com/zeromq/czmq/include/zlistx.h +205 -0
- data/vendor/github.com/zeromq/czmq/include/zloop.h +163 -0
- data/vendor/github.com/zeromq/czmq/include/zmonitor.h +73 -0
- data/vendor/github.com/zeromq/czmq/include/zmsg.h +280 -0
- data/vendor/github.com/zeromq/czmq/include/zpoller.h +87 -0
- data/vendor/github.com/zeromq/czmq/include/zproc.h +270 -0
- data/vendor/github.com/zeromq/czmq/include/zproxy.h +111 -0
- data/vendor/github.com/zeromq/czmq/include/zrex.h +82 -0
- data/vendor/github.com/zeromq/czmq/include/zsock.h +1209 -0
- data/vendor/github.com/zeromq/czmq/include/zstr.h +135 -0
- data/vendor/github.com/zeromq/czmq/include/zsys.h +439 -0
- data/vendor/github.com/zeromq/czmq/include/ztimerset.h +90 -0
- data/vendor/github.com/zeromq/czmq/include/ztrie.h +106 -0
- data/vendor/github.com/zeromq/czmq/include/zuuid.h +96 -0
- data/vendor/github.com/zeromq/czmq/issues/README.md +6 -0
- data/vendor/github.com/zeromq/czmq/issues/c +520 -0
- data/vendor/github.com/zeromq/czmq/issues/issue-407.c +146 -0
- data/vendor/github.com/zeromq/czmq/license.xml +9 -0
- data/vendor/github.com/zeromq/czmq/mkdoc +7 -0
- data/vendor/github.com/zeromq/czmq/model/chkopts.pl +47 -0
- data/vendor/github.com/zeromq/czmq/model/rename_class +42 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/changelog +5 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/compat +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/control +86 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/copyright +13 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.dsc.obs +20 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.install +2 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/czmq.manpages +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/format +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq-dev.install +4 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq-dev.manpages +2 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/libczmq4.install +1 -0
- data/vendor/github.com/zeromq/czmq/packaging/debian/rules +96 -0
- data/vendor/github.com/zeromq/czmq/packaging/dist/gitlog2changelog.py +125 -0
- data/vendor/github.com/zeromq/czmq/packaging/obs/_service +91 -0
- data/vendor/github.com/zeromq/czmq/packaging/redhat/czmq.spec +202 -0
- data/vendor/github.com/zeromq/czmq/project.gyp +121 -0
- data/vendor/github.com/zeromq/czmq/project.xml +99 -0
- data/vendor/github.com/zeromq/czmq/setup.py +9 -0
- data/vendor/github.com/zeromq/czmq/src/.gitignore +20 -0
- data/vendor/github.com/zeromq/czmq/src/.valgrind.supp +33 -0
- data/vendor/github.com/zeromq/czmq/src/CMakeLists-local.txt +22 -0
- data/vendor/github.com/zeromq/czmq/src/Makemodule-local.am +15 -0
- data/vendor/github.com/zeromq/czmq/src/Makemodule.am +353 -0
- data/vendor/github.com/zeromq/czmq/src/czmq_classes.h +388 -0
- data/vendor/github.com/zeromq/czmq/src/czmq_private_selftest.c +40 -0
- data/vendor/github.com/zeromq/czmq/src/czmq_selftest.c +220 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/sha1/sha1.h +76 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/sha1/sha1.inc_c +335 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/slre/readme.txt +83 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/slre/slre.h +92 -0
- data/vendor/github.com/zeromq/czmq/src/foreign/slre/slre.inc_c +660 -0
- data/vendor/github.com/zeromq/czmq/src/libczmq.pc.in +24 -0
- data/vendor/github.com/zeromq/czmq/src/python_cffi.inc +17 -0
- data/vendor/github.com/zeromq/czmq/src/selftest-ro/.gitkeep +0 -0
- data/vendor/github.com/zeromq/czmq/src/selftest.cfg +5 -0
- data/vendor/github.com/zeromq/czmq/src/sockopts.gsl +36 -0
- data/vendor/github.com/zeromq/czmq/src/sockopts.xml +193 -0
- data/vendor/github.com/zeromq/czmq/src/test_randof.c +182 -0
- data/vendor/github.com/zeromq/czmq/src/test_zgossip.c +188 -0
- data/vendor/github.com/zeromq/czmq/src/valgrind.supp +14 -0
- data/vendor/github.com/zeromq/czmq/src/zactor.c +338 -0
- data/vendor/github.com/zeromq/czmq/src/zargs.c +289 -0
- data/vendor/github.com/zeromq/czmq/src/zarmour.c +941 -0
- data/vendor/github.com/zeromq/czmq/src/zauth.c +821 -0
- data/vendor/github.com/zeromq/czmq/src/zbeacon.c +651 -0
- data/vendor/github.com/zeromq/czmq/src/zcert.c +557 -0
- data/vendor/github.com/zeromq/czmq/src/zcertstore.c +407 -0
- data/vendor/github.com/zeromq/czmq/src/zchunk.c +609 -0
- data/vendor/github.com/zeromq/czmq/src/zclock.c +237 -0
- data/vendor/github.com/zeromq/czmq/src/zconfig.c +1369 -0
- data/vendor/github.com/zeromq/czmq/src/zdigest.c +163 -0
- data/vendor/github.com/zeromq/czmq/src/zdir.c +1138 -0
- data/vendor/github.com/zeromq/czmq/src/zdir_patch.c +227 -0
- data/vendor/github.com/zeromq/czmq/src/zfile.c +920 -0
- data/vendor/github.com/zeromq/czmq/src/zframe.c +756 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip.c +689 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip.xml +57 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_engine.inc +1008 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.bnf +43 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.c +688 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.h +127 -0
- data/vendor/github.com/zeromq/czmq/src/zgossip_msg.xml +46 -0
- data/vendor/github.com/zeromq/czmq/src/zhash.c +956 -0
- data/vendor/github.com/zeromq/czmq/src/zhash_primes.inc +329 -0
- data/vendor/github.com/zeromq/czmq/src/zhashx.c +1369 -0
- data/vendor/github.com/zeromq/czmq/src/ziflist.c +517 -0
- data/vendor/github.com/zeromq/czmq/src/zlist.c +634 -0
- data/vendor/github.com/zeromq/czmq/src/zlistx.c +753 -0
- data/vendor/github.com/zeromq/czmq/src/zloop.c +1000 -0
- data/vendor/github.com/zeromq/czmq/src/zmakecert.c +64 -0
- data/vendor/github.com/zeromq/czmq/src/zmonitor.c +447 -0
- data/vendor/github.com/zeromq/czmq/src/zmsg.c +1258 -0
- data/vendor/github.com/zeromq/czmq/src/zpoller.c +397 -0
- data/vendor/github.com/zeromq/czmq/src/zproc.c +1160 -0
- data/vendor/github.com/zeromq/czmq/src/zproxy.c +791 -0
- data/vendor/github.com/zeromq/czmq/src/zrex.c +310 -0
- data/vendor/github.com/zeromq/czmq/src/zsock.c +2207 -0
- data/vendor/github.com/zeromq/czmq/src/zsock_option.gsl +404 -0
- data/vendor/github.com/zeromq/czmq/src/zsock_option.inc +3946 -0
- data/vendor/github.com/zeromq/czmq/src/zsp.c +118 -0
- data/vendor/github.com/zeromq/czmq/src/zstr.c +548 -0
- data/vendor/github.com/zeromq/czmq/src/zsys.c +2225 -0
- data/vendor/github.com/zeromq/czmq/src/ztimerset.c +227 -0
- data/vendor/github.com/zeromq/czmq/src/ztrie.c +809 -0
- data/vendor/github.com/zeromq/czmq/src/zuuid.c +344 -0
- 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
|
+
}
|