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,397 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
zpoller - trivial socket poller class
|
|
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
|
+
@header
|
|
15
|
+
The zpoller class provides a minimalist interface to ZeroMQ's zmq_poll
|
|
16
|
+
API, for the very common case of reading from a number of sockets.
|
|
17
|
+
It does not provide polling for output, nor polling on file handles.
|
|
18
|
+
If you need either of these, use the zmq_poll API directly.
|
|
19
|
+
@discuss
|
|
20
|
+
The class implements the poller using the zmq_poller API if that exists,
|
|
21
|
+
else does the work itself.
|
|
22
|
+
@end
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
#include "czmq_classes.h"
|
|
26
|
+
|
|
27
|
+
// Structure of our class
|
|
28
|
+
|
|
29
|
+
struct _zpoller_t {
|
|
30
|
+
#ifdef ZMQ_HAVE_POLLER
|
|
31
|
+
void *zmq_poller; // ZMQ poller structure
|
|
32
|
+
#else
|
|
33
|
+
zlist_t *reader_list; // List of sockets to read from
|
|
34
|
+
zmq_pollitem_t *poll_set; // Current zmq_poll set
|
|
35
|
+
void **poll_readers; // Matching table of socket readers
|
|
36
|
+
size_t poll_size; // Size of poll set
|
|
37
|
+
bool need_rebuild; // Does pollset need rebuilding?
|
|
38
|
+
#endif
|
|
39
|
+
bool expired; // Did poll timer expire?
|
|
40
|
+
bool terminated; // Did poll call end with EINTR?
|
|
41
|
+
bool nonstop; // Don't stop running on Ctrl-C
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
#ifndef ZMQ_HAVE_POLLER
|
|
46
|
+
static int
|
|
47
|
+
s_rebuild_poll_set (zpoller_t *self)
|
|
48
|
+
{
|
|
49
|
+
freen (self->poll_set);
|
|
50
|
+
self->poll_set = NULL;
|
|
51
|
+
freen (self->poll_readers);
|
|
52
|
+
self->poll_readers = NULL;
|
|
53
|
+
|
|
54
|
+
self->poll_size = zlist_size (self->reader_list);
|
|
55
|
+
self->poll_set = (zmq_pollitem_t *)
|
|
56
|
+
zmalloc (self->poll_size * sizeof (zmq_pollitem_t));
|
|
57
|
+
self->poll_readers = (void **) zmalloc (self->poll_size * sizeof (void *));
|
|
58
|
+
if (!self->poll_set || !self->poll_readers)
|
|
59
|
+
return -1;
|
|
60
|
+
|
|
61
|
+
uint reader_nbr = 0;
|
|
62
|
+
void *reader = zlist_first (self->reader_list);
|
|
63
|
+
while (reader) {
|
|
64
|
+
self->poll_readers [reader_nbr] = reader;
|
|
65
|
+
void *socket = zsock_resolve (reader);
|
|
66
|
+
if (socket == NULL) {
|
|
67
|
+
self->poll_set [reader_nbr].socket = NULL;
|
|
68
|
+
self->poll_set [reader_nbr].fd = *(SOCKET *) reader;
|
|
69
|
+
}
|
|
70
|
+
else
|
|
71
|
+
self->poll_set [reader_nbr].socket = socket;
|
|
72
|
+
self->poll_set [reader_nbr].events = ZMQ_POLLIN;
|
|
73
|
+
|
|
74
|
+
reader_nbr++;
|
|
75
|
+
reader = zlist_next (self->reader_list);
|
|
76
|
+
}
|
|
77
|
+
self->need_rebuild = false;
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
#endif
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
// --------------------------------------------------------------------------
|
|
84
|
+
// Create new poller, specifying zero or more readers. The list of
|
|
85
|
+
// readers ends in a NULL. Each reader can be a zsock_t instance, a
|
|
86
|
+
// zactor_t instance, a libzmq socket (void *), or a file handle.
|
|
87
|
+
|
|
88
|
+
zpoller_t *
|
|
89
|
+
zpoller_new (void *reader, ...)
|
|
90
|
+
{
|
|
91
|
+
zpoller_t *self = (zpoller_t *) zmalloc (sizeof (zpoller_t));
|
|
92
|
+
assert (self);
|
|
93
|
+
#ifdef ZMQ_HAVE_POLLER
|
|
94
|
+
self->zmq_poller = zmq_poller_new ();
|
|
95
|
+
assert (self->zmq_poller);
|
|
96
|
+
#else
|
|
97
|
+
self->reader_list = zlist_new ();
|
|
98
|
+
assert (self->reader_list);
|
|
99
|
+
#endif
|
|
100
|
+
va_list args;
|
|
101
|
+
va_start (args, reader);
|
|
102
|
+
while (reader) {
|
|
103
|
+
if (zpoller_add (self, reader)) {
|
|
104
|
+
zpoller_destroy (&self);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
reader = va_arg (args, void *);
|
|
108
|
+
}
|
|
109
|
+
va_end (args);
|
|
110
|
+
return self;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
// --------------------------------------------------------------------------
|
|
115
|
+
// Destroy a poller
|
|
116
|
+
|
|
117
|
+
void
|
|
118
|
+
zpoller_destroy (zpoller_t **self_p)
|
|
119
|
+
{
|
|
120
|
+
assert (self_p);
|
|
121
|
+
if (*self_p) {
|
|
122
|
+
zpoller_t *self = *self_p;
|
|
123
|
+
#ifdef ZMQ_HAVE_POLLER
|
|
124
|
+
zmq_poller_destroy (&self->zmq_poller);
|
|
125
|
+
#else
|
|
126
|
+
zlist_destroy (&self->reader_list);
|
|
127
|
+
freen (self->poll_readers);
|
|
128
|
+
freen (self->poll_set);
|
|
129
|
+
#endif
|
|
130
|
+
freen (self);
|
|
131
|
+
*self_p = NULL;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
// --------------------------------------------------------------------------
|
|
137
|
+
// Add a reader to be polled. Returns 0 if OK, -1 on failure. The reader may
|
|
138
|
+
// be a libzmq void * socket, a zsock_t instance, or a zactor_t instance.
|
|
139
|
+
|
|
140
|
+
int
|
|
141
|
+
zpoller_add (zpoller_t *self, void *reader)
|
|
142
|
+
{
|
|
143
|
+
assert (self);
|
|
144
|
+
assert (reader);
|
|
145
|
+
int rc = 0;
|
|
146
|
+
#ifdef ZMQ_HAVE_POLLER
|
|
147
|
+
void *socket = zsock_resolve (reader);
|
|
148
|
+
if (socket)
|
|
149
|
+
rc = zmq_poller_add (self->zmq_poller, socket, reader, ZMQ_POLLIN);
|
|
150
|
+
else
|
|
151
|
+
rc = zmq_poller_add_fd (self->zmq_poller, *(SOCKET *) reader, reader, ZMQ_POLLIN);
|
|
152
|
+
#else
|
|
153
|
+
zlist_append (self->reader_list, reader);
|
|
154
|
+
self->need_rebuild = true;
|
|
155
|
+
#endif
|
|
156
|
+
return rc;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
// --------------------------------------------------------------------------
|
|
161
|
+
// Remove a reader from the poller; returns 0 if OK, -1 on failure. The reader
|
|
162
|
+
// must have been passed during construction, or in an zpoller_add () call.
|
|
163
|
+
|
|
164
|
+
int
|
|
165
|
+
zpoller_remove (zpoller_t *self, void *reader)
|
|
166
|
+
{
|
|
167
|
+
assert (self);
|
|
168
|
+
assert (reader);
|
|
169
|
+
int rc = 0;
|
|
170
|
+
#ifdef ZMQ_HAVE_POLLER
|
|
171
|
+
void *socket = zsock_resolve (reader);
|
|
172
|
+
if (socket)
|
|
173
|
+
rc = zmq_poller_remove (self->zmq_poller, socket);
|
|
174
|
+
else
|
|
175
|
+
rc = zmq_poller_remove_fd (self->zmq_poller, *(SOCKET *) reader);
|
|
176
|
+
#else
|
|
177
|
+
size_t num_readers_before = zlist_size (self->reader_list);
|
|
178
|
+
zlist_remove (self->reader_list, reader); // won't fail with non-existent reader
|
|
179
|
+
size_t num_readers_after = zlist_size (self->reader_list);
|
|
180
|
+
if (num_readers_before != num_readers_after)
|
|
181
|
+
self->need_rebuild = true;
|
|
182
|
+
else {
|
|
183
|
+
errno = EINVAL;
|
|
184
|
+
rc = -1;
|
|
185
|
+
}
|
|
186
|
+
#endif
|
|
187
|
+
return rc;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
// --------------------------------------------------------------------------
|
|
192
|
+
// By default the poller stops if the process receives a SIGINT or SIGTERM
|
|
193
|
+
// signal. This makes it impossible to shut-down message based architectures
|
|
194
|
+
// like zactors. This method lets you switch off break handling. The default
|
|
195
|
+
// nonstop setting is off (false).
|
|
196
|
+
|
|
197
|
+
void
|
|
198
|
+
zpoller_set_nonstop (zpoller_t *self, bool nonstop)
|
|
199
|
+
{
|
|
200
|
+
assert (self);
|
|
201
|
+
self->nonstop = nonstop;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
// --------------------------------------------------------------------------
|
|
206
|
+
// Poll the registered readers for I/O, return first reader that has input.
|
|
207
|
+
// The reader will be a libzmq void * socket, or a zsock_t or zactor_t
|
|
208
|
+
// instance as specified in zpoller_new/zpoller_add. The timeout should be
|
|
209
|
+
// zero or greater, or -1 to wait indefinitely. Socket priority is defined
|
|
210
|
+
// by their order in the poll list. If you need a balanced poll, use the low
|
|
211
|
+
// level zmq_poll method directly. If the poll call was interrupted (SIGINT),
|
|
212
|
+
// or the ZMQ context was destroyed, or the timeout expired, returns NULL.
|
|
213
|
+
// You can test the actual exit condition by calling zpoller_expired () and
|
|
214
|
+
// zpoller_terminated (). The timeout is in msec.
|
|
215
|
+
|
|
216
|
+
void *
|
|
217
|
+
zpoller_wait (zpoller_t *self, int timeout)
|
|
218
|
+
{
|
|
219
|
+
assert (self);
|
|
220
|
+
self->expired = false;
|
|
221
|
+
if (zsys_interrupted && !self->nonstop) {
|
|
222
|
+
self->terminated = true;
|
|
223
|
+
return NULL;
|
|
224
|
+
}
|
|
225
|
+
else
|
|
226
|
+
self->terminated = false;
|
|
227
|
+
|
|
228
|
+
#ifdef ZMQ_HAVE_POLLER
|
|
229
|
+
zmq_poller_event_t event;
|
|
230
|
+
if (!zmq_poller_wait (self->zmq_poller, &event, timeout * ZMQ_POLL_MSEC))
|
|
231
|
+
return event.user_data;
|
|
232
|
+
else
|
|
233
|
+
if (errno == ETIMEDOUT || errno == EAGAIN)
|
|
234
|
+
self->expired = true;
|
|
235
|
+
else
|
|
236
|
+
if (zsys_interrupted && !self->nonstop)
|
|
237
|
+
self->terminated = true;
|
|
238
|
+
|
|
239
|
+
return NULL;
|
|
240
|
+
#else
|
|
241
|
+
if (self->need_rebuild)
|
|
242
|
+
s_rebuild_poll_set (self);
|
|
243
|
+
int rc = zmq_poll (self->poll_set, (int) self->poll_size, timeout * ZMQ_POLL_MSEC);
|
|
244
|
+
if (rc > 0) {
|
|
245
|
+
uint reader = 0;
|
|
246
|
+
for (reader = 0; reader < self->poll_size; reader++)
|
|
247
|
+
if (self->poll_set [reader].revents & ZMQ_POLLIN)
|
|
248
|
+
return self->poll_readers [reader];
|
|
249
|
+
}
|
|
250
|
+
else
|
|
251
|
+
if (rc == -1 || (zsys_interrupted && !self->nonstop))
|
|
252
|
+
self->terminated = true;
|
|
253
|
+
else
|
|
254
|
+
if (rc == 0)
|
|
255
|
+
self->expired = true;
|
|
256
|
+
|
|
257
|
+
return NULL;
|
|
258
|
+
#endif
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
// --------------------------------------------------------------------------
|
|
263
|
+
// Return true if the last zpoller_wait () call ended because the timeout
|
|
264
|
+
// expired, without any error.
|
|
265
|
+
|
|
266
|
+
bool
|
|
267
|
+
zpoller_expired (zpoller_t *self)
|
|
268
|
+
{
|
|
269
|
+
assert (self);
|
|
270
|
+
return self->expired;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
// --------------------------------------------------------------------------
|
|
275
|
+
// Return true if the last zpoller_wait () call ended because the process
|
|
276
|
+
// was interrupted, or the parent context was destroyed.
|
|
277
|
+
|
|
278
|
+
bool
|
|
279
|
+
zpoller_terminated (zpoller_t *self)
|
|
280
|
+
{
|
|
281
|
+
assert (self);
|
|
282
|
+
return self->terminated;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
// --------------------------------------------------------------------------
|
|
287
|
+
// Self test of this class
|
|
288
|
+
|
|
289
|
+
void
|
|
290
|
+
zpoller_test (bool verbose)
|
|
291
|
+
{
|
|
292
|
+
printf (" * zpoller: ");
|
|
293
|
+
|
|
294
|
+
// @selftest
|
|
295
|
+
// Create a few sockets
|
|
296
|
+
zsock_t *vent = zsock_new (ZMQ_PUSH);
|
|
297
|
+
assert (vent);
|
|
298
|
+
int port_nbr = zsock_bind (vent, "tcp://127.0.0.1:*");
|
|
299
|
+
assert (port_nbr != -1);
|
|
300
|
+
zsock_t *sink = zsock_new (ZMQ_PULL);
|
|
301
|
+
assert (sink);
|
|
302
|
+
int rc = zsock_connect (sink, "tcp://127.0.0.1:%d", port_nbr);
|
|
303
|
+
assert (rc != -1);
|
|
304
|
+
zsock_t *bowl = zsock_new (ZMQ_PULL);
|
|
305
|
+
assert (bowl);
|
|
306
|
+
zsock_t *dish = zsock_new (ZMQ_PULL);
|
|
307
|
+
assert (dish);
|
|
308
|
+
|
|
309
|
+
// Set up poller
|
|
310
|
+
zpoller_t *poller = zpoller_new (bowl, dish, NULL);
|
|
311
|
+
assert (poller);
|
|
312
|
+
|
|
313
|
+
// Add a reader to the existing poller
|
|
314
|
+
rc = zpoller_add (poller, sink);
|
|
315
|
+
assert (rc == 0);
|
|
316
|
+
|
|
317
|
+
zstr_send (vent, "Hello, World");
|
|
318
|
+
|
|
319
|
+
// We expect a message only on the sink
|
|
320
|
+
zsock_t *which = (zsock_t *) zpoller_wait (poller, -1);
|
|
321
|
+
assert (which == sink);
|
|
322
|
+
assert (zpoller_expired (poller) == false);
|
|
323
|
+
assert (zpoller_terminated (poller) == false);
|
|
324
|
+
char *message = zstr_recv (which);
|
|
325
|
+
assert (streq (message, "Hello, World"));
|
|
326
|
+
zstr_free (&message);
|
|
327
|
+
|
|
328
|
+
// Stop polling reader
|
|
329
|
+
rc = zpoller_remove (poller, sink);
|
|
330
|
+
assert (rc == 0);
|
|
331
|
+
|
|
332
|
+
// Removing a non-existent reader shall fail
|
|
333
|
+
rc = zpoller_remove (poller, sink);
|
|
334
|
+
assert (rc == -1);
|
|
335
|
+
assert (errno == EINVAL);
|
|
336
|
+
|
|
337
|
+
// Check we can poll an FD
|
|
338
|
+
rc = zsock_connect (bowl, "tcp://127.0.0.1:%d", port_nbr);
|
|
339
|
+
assert (rc != -1);
|
|
340
|
+
SOCKET fd = zsock_fd (bowl);
|
|
341
|
+
rc = zpoller_add (poller, (void *) &fd);
|
|
342
|
+
assert (rc != -1);
|
|
343
|
+
zstr_send (vent, "Hello again, world");
|
|
344
|
+
assert (zpoller_wait (poller, 500) == &fd);
|
|
345
|
+
|
|
346
|
+
// Check zpoller_set_nonstop ()
|
|
347
|
+
zsys_interrupted = 1;
|
|
348
|
+
zpoller_wait (poller, 0);
|
|
349
|
+
assert (zpoller_terminated (poller));
|
|
350
|
+
zpoller_set_nonstop (poller, true);
|
|
351
|
+
zpoller_wait (poller, 0);
|
|
352
|
+
assert (!zpoller_terminated (poller));
|
|
353
|
+
zsys_interrupted = 0;
|
|
354
|
+
|
|
355
|
+
zpoller_destroy (&poller);
|
|
356
|
+
zsock_destroy (&vent);
|
|
357
|
+
zsock_destroy (&sink);
|
|
358
|
+
zsock_destroy (&bowl);
|
|
359
|
+
zsock_destroy (&dish);
|
|
360
|
+
|
|
361
|
+
#ifdef ZMQ_SERVER
|
|
362
|
+
// Check thread safe sockets
|
|
363
|
+
zpoller_destroy (&poller);
|
|
364
|
+
zsock_t *client = zsock_new (ZMQ_CLIENT);
|
|
365
|
+
assert (client);
|
|
366
|
+
zsock_t *server = zsock_new (ZMQ_SERVER);
|
|
367
|
+
assert (server);
|
|
368
|
+
poller = zpoller_new (client, server, NULL);
|
|
369
|
+
assert (poller);
|
|
370
|
+
port_nbr = zsock_bind (server, "tcp://127.0.0.1:*");
|
|
371
|
+
assert (port_nbr != -1);
|
|
372
|
+
rc = zsock_connect (client, "tcp://127.0.0.1:%d", port_nbr);
|
|
373
|
+
assert (rc != -1);
|
|
374
|
+
|
|
375
|
+
zstr_send (client, "Hello, World");
|
|
376
|
+
|
|
377
|
+
// We expect a message only on the server
|
|
378
|
+
which = (zsock_t *) zpoller_wait (poller, -1);
|
|
379
|
+
assert (which == server);
|
|
380
|
+
assert (zpoller_expired (poller) == false);
|
|
381
|
+
assert (zpoller_terminated (poller) == false);
|
|
382
|
+
message = zstr_recv (which);
|
|
383
|
+
assert (streq (message, "Hello, World"));
|
|
384
|
+
zstr_free (&message);
|
|
385
|
+
|
|
386
|
+
zpoller_destroy (&poller);
|
|
387
|
+
zsock_destroy (&client);
|
|
388
|
+
zsock_destroy (&server);
|
|
389
|
+
#endif
|
|
390
|
+
|
|
391
|
+
#if defined (__WINDOWS__)
|
|
392
|
+
zsys_shutdown();
|
|
393
|
+
#endif
|
|
394
|
+
// @end
|
|
395
|
+
|
|
396
|
+
printf ("OK\n");
|
|
397
|
+
}
|
|
@@ -0,0 +1,1160 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
zproc - process configuration and status
|
|
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
|
+
zproc - process configuration and status, plus unix pipes on steroids
|
|
17
|
+
|
|
18
|
+
WARNING: zproc class have several limitations atm
|
|
19
|
+
* is tested on zmq4 on Linux and OSX.
|
|
20
|
+
* does not work on Windows, where you get empty stubs for most of the methods
|
|
21
|
+
* does not work on libzmq3 and libzmq2. We have experienced stalls and timeouts
|
|
22
|
+
when running tests against such old version
|
|
23
|
+
|
|
24
|
+
Note: zproc is not yet stable, so there are no guarantees regarding API stability.
|
|
25
|
+
Some methods can have weird semantics or strange API.
|
|
26
|
+
|
|
27
|
+
Class zproc run an external process and to use ZeroMQ sockets to communicate
|
|
28
|
+
with it. In other words standard input and outputs MAY be connected with appropriate
|
|
29
|
+
zeromq socket and data flow is managed by zproc itself. This makes zproc
|
|
30
|
+
the best in class way how to run and manage sub processes.
|
|
31
|
+
|
|
32
|
+
Data are sent and received as zframes (zframe_t), so zproc does not try to interpret
|
|
33
|
+
content of the messages in any way. See test example on how to use it.
|
|
34
|
+
|
|
35
|
+
+----------------------------------------+
|
|
36
|
+
| /bin/cat cat /etc/passwd |
|
|
37
|
+
| stdin | stdout | stderr |
|
|
38
|
+
|------||--------||---------------||-----|
|
|
39
|
+
| fd1 fd2 fd3 |
|
|
40
|
+
| ^ v v |
|
|
41
|
+
|zmq://stdin |zmq://stdout |zmq://stderr |
|
|
42
|
+
| [zproc supervisor] |
|
|
43
|
+
+----------------------------------------+
|
|
44
|
+
|
|
45
|
+
----------> zeromq magic here <-----------
|
|
46
|
+
|
|
47
|
+
+----------------------------------------+
|
|
48
|
+
|zmq://stdin |zmq://stdout |zmq://stderr |
|
|
49
|
+
| |
|
|
50
|
+
| consumer |
|
|
51
|
+
| |
|
|
52
|
+
| |
|
|
53
|
+
+----------------------------------------+
|
|
54
|
+
|
|
55
|
+
@discuss
|
|
56
|
+
@end
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
#include "czmq_classes.h"
|
|
60
|
+
|
|
61
|
+
// For getcwd() variants
|
|
62
|
+
#if (defined (WIN32))
|
|
63
|
+
# include <direct.h>
|
|
64
|
+
#else
|
|
65
|
+
# include <unistd.h>
|
|
66
|
+
#endif
|
|
67
|
+
|
|
68
|
+
#define ZPROC_RUNNING -42
|
|
69
|
+
|
|
70
|
+
// ####### internal helpers for zproc #######
|
|
71
|
+
// vvvvvvv vvvvvvv
|
|
72
|
+
typedef struct _zpair_t zpair_t;
|
|
73
|
+
|
|
74
|
+
struct _zpair_t {
|
|
75
|
+
char *endpoint;
|
|
76
|
+
bool write_owned;
|
|
77
|
+
void *write;
|
|
78
|
+
bool read_owned;
|
|
79
|
+
void *read;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
static zpair_t*
|
|
83
|
+
zpair_new (char* endpoint) {
|
|
84
|
+
zpair_t *self = (zpair_t*) zmalloc (sizeof (zpair_t));
|
|
85
|
+
self->endpoint = endpoint;
|
|
86
|
+
return self;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static void
|
|
90
|
+
zpair_destroy (zpair_t **self_p) {
|
|
91
|
+
assert (self_p);
|
|
92
|
+
if (*self_p) {
|
|
93
|
+
zpair_t *self = *self_p;
|
|
94
|
+
if (self->write_owned)
|
|
95
|
+
zsock_destroy ((zsock_t**)&self->write);
|
|
96
|
+
if (self->read_owned)
|
|
97
|
+
zsock_destroy ((zsock_t**)&self->read);
|
|
98
|
+
zstr_free (&self->endpoint);
|
|
99
|
+
freen (self);
|
|
100
|
+
*self_p = NULL;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static void
|
|
105
|
+
zpair_set_read (zpair_t *self, void *sock, bool owned) {
|
|
106
|
+
self->read = sock;
|
|
107
|
+
self->read_owned = owned;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static void
|
|
111
|
+
zpair_set_write (zpair_t *self, void *sock, bool owned) {
|
|
112
|
+
self->write = sock;
|
|
113
|
+
self->write_owned = owned;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static void *
|
|
117
|
+
zpair_read (zpair_t *self) {
|
|
118
|
+
return self->read;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static void *
|
|
122
|
+
zpair_write (zpair_t *self) {
|
|
123
|
+
return self->write;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
static void
|
|
127
|
+
zpair_mkpair (zpair_t *self) {
|
|
128
|
+
self->endpoint[0] = '>';
|
|
129
|
+
self->read = zsock_new_pair (self->endpoint);
|
|
130
|
+
self->read_owned = true;
|
|
131
|
+
self->endpoint [0] = '@';
|
|
132
|
+
self->write = zsock_new_pair (self->endpoint);
|
|
133
|
+
self->write_owned = true;
|
|
134
|
+
self->endpoint [0] = '#';
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static void
|
|
138
|
+
zpair_print (zpair_t *self) {
|
|
139
|
+
assert (self);
|
|
140
|
+
zsys_debug ("pair<%p> {.read = <%p>, .write = <%p>}",
|
|
141
|
+
(void*) self,
|
|
142
|
+
self->read,
|
|
143
|
+
self->write);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static char **
|
|
147
|
+
arr_new (size_t len) {
|
|
148
|
+
// we allocate one entry more, because there must be NULL at the end!
|
|
149
|
+
char **ret = (char**) zmalloc (sizeof (char*) * (len + 1));
|
|
150
|
+
return ret;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
static void
|
|
154
|
+
arr_free (char **self) {
|
|
155
|
+
assert (self);
|
|
156
|
+
char **foo = self;
|
|
157
|
+
while (*self) {
|
|
158
|
+
freen (*(self++));
|
|
159
|
+
}
|
|
160
|
+
freen (foo);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static void
|
|
164
|
+
arr_add_ref (char **self, size_t i, char *s) {
|
|
165
|
+
assert (self);
|
|
166
|
+
self [i] = s;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
static void
|
|
170
|
+
arr_print (char**self) {
|
|
171
|
+
assert (self);
|
|
172
|
+
size_t i = 0;
|
|
173
|
+
while (self [i]) {
|
|
174
|
+
zsys_debug ("%zu:\t%s<%p>", i, self [i], (void*) *self);
|
|
175
|
+
i += 1;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// ^^^^^^^ ^^^^^^^
|
|
180
|
+
// ####### internal helpers for zproc #######
|
|
181
|
+
|
|
182
|
+
struct _zproc_t {
|
|
183
|
+
#if ! defined (__WINDOWS__)
|
|
184
|
+
//TODO: there is no windows port, so lets exclude pid from struct
|
|
185
|
+
// zproc wasn't ported there, so no reason to do so
|
|
186
|
+
pid_t pid;
|
|
187
|
+
#endif
|
|
188
|
+
int return_code;
|
|
189
|
+
bool running;
|
|
190
|
+
bool verbose;
|
|
191
|
+
|
|
192
|
+
zactor_t *actor;
|
|
193
|
+
zloop_t *loop_ref;
|
|
194
|
+
zsock_t *pipe; // destroy actor pipe in a case of execve fail
|
|
195
|
+
int stdinpipe [2]; // stdin pipe
|
|
196
|
+
int stdoutpipe [2]; // stdout pipe
|
|
197
|
+
int stderrpipe [2]; // stderr pipe
|
|
198
|
+
|
|
199
|
+
zpair_t *stdinpair; // stdin socketpair
|
|
200
|
+
zpair_t *stdoutpair; // stdout socketpair
|
|
201
|
+
zpair_t *stderrpair; // stderr socketpair
|
|
202
|
+
|
|
203
|
+
zlistx_t *args; // command line arguments
|
|
204
|
+
zhashx_t *env; // environment
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
zproc_t*
|
|
208
|
+
zproc_new ()
|
|
209
|
+
{
|
|
210
|
+
#if defined (__WINDOWS__)
|
|
211
|
+
zsys_error ("zproc_set_stdin not implemented for Windows");
|
|
212
|
+
return NULL;
|
|
213
|
+
#elif ZMQ_VERSION_MAJOR < 4
|
|
214
|
+
zsys_error ("Cannot use zproc with zmq older than 4");
|
|
215
|
+
return NULL;
|
|
216
|
+
#endif
|
|
217
|
+
int major, minor, patch;
|
|
218
|
+
zsys_version (&major, &minor, &patch);
|
|
219
|
+
if (major < 4) {
|
|
220
|
+
zsys_error ("Cannot use zproc with zmq older than 4");
|
|
221
|
+
return NULL;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
zproc_t *self = (zproc_t*) zmalloc (sizeof (zproc_t));
|
|
225
|
+
self->verbose = false;
|
|
226
|
+
|
|
227
|
+
zuuid_t *uuid = zuuid_new ();
|
|
228
|
+
self->stdinpair = zpair_new (
|
|
229
|
+
zsys_sprintf ("#inproc://zproc-%s-stdin", zuuid_str_canonical (uuid))
|
|
230
|
+
);
|
|
231
|
+
self->stdoutpair = zpair_new (
|
|
232
|
+
zsys_sprintf ("#inproc://zproc-%s-stdout", zuuid_str_canonical (uuid))
|
|
233
|
+
);
|
|
234
|
+
self->stderrpair = zpair_new (
|
|
235
|
+
zsys_sprintf ("#inproc://zproc-%s-stderr", zuuid_str_canonical (uuid))
|
|
236
|
+
);
|
|
237
|
+
zuuid_destroy (&uuid);
|
|
238
|
+
|
|
239
|
+
return self;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
void
|
|
243
|
+
zproc_destroy (zproc_t **self_p) {
|
|
244
|
+
assert (self_p);
|
|
245
|
+
if (*self_p) {
|
|
246
|
+
zproc_t *self = *self_p;
|
|
247
|
+
zproc_wait (self, true);
|
|
248
|
+
zactor_destroy (&self->actor);
|
|
249
|
+
|
|
250
|
+
close (self->stdinpipe [0]);
|
|
251
|
+
close (self->stdinpipe [1]);
|
|
252
|
+
close (self->stdoutpipe [0]);
|
|
253
|
+
close (self->stdoutpipe [1]);
|
|
254
|
+
close (self->stderrpipe [0]);
|
|
255
|
+
close (self->stderrpipe [1]);
|
|
256
|
+
|
|
257
|
+
zpair_destroy (&self->stdinpair);
|
|
258
|
+
zpair_destroy (&self->stdoutpair);
|
|
259
|
+
zpair_destroy (&self->stderrpair);
|
|
260
|
+
|
|
261
|
+
zlistx_destroy (&self->args);
|
|
262
|
+
zhashx_destroy (&self->env);
|
|
263
|
+
freen (self);
|
|
264
|
+
*self_p = NULL;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
void
|
|
269
|
+
zproc_set_args (zproc_t *self, zlistx_t *args) {
|
|
270
|
+
assert (self);
|
|
271
|
+
zlistx_destroy (&self->args);
|
|
272
|
+
self->args = args;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
void
|
|
276
|
+
zproc_set_env (zproc_t *self, zhashx_t *env) {
|
|
277
|
+
assert (self);
|
|
278
|
+
zhashx_destroy (&self->env);
|
|
279
|
+
self->env = env;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
void
|
|
283
|
+
zproc_set_stdin (zproc_t *self, void* socket) {
|
|
284
|
+
assert (self);
|
|
285
|
+
#if defined (__WINDOWS__)
|
|
286
|
+
zsys_error ("zproc_set_stdin not implemented for Windows");
|
|
287
|
+
return;
|
|
288
|
+
#else
|
|
289
|
+
assert (self->stdinpipe [0] == 0);
|
|
290
|
+
int r = pipe (self->stdinpipe);
|
|
291
|
+
assert (r == 0);
|
|
292
|
+
|
|
293
|
+
if (!socket)
|
|
294
|
+
zpair_mkpair (self->stdinpair);
|
|
295
|
+
else
|
|
296
|
+
zpair_set_read (self->stdinpair, socket, false);
|
|
297
|
+
#endif
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
void
|
|
301
|
+
zproc_set_stdout (zproc_t *self, void* socket) {
|
|
302
|
+
assert (self);
|
|
303
|
+
#if defined (__WINDOWS__)
|
|
304
|
+
zsys_error ("zproc_set_stdout not implemented for Windows");
|
|
305
|
+
return;
|
|
306
|
+
#else
|
|
307
|
+
assert (self->stdoutpipe [0] == 0);
|
|
308
|
+
int r = pipe (self->stdoutpipe);
|
|
309
|
+
assert (r == 0);
|
|
310
|
+
|
|
311
|
+
if (!socket)
|
|
312
|
+
zpair_mkpair (self->stdoutpair);
|
|
313
|
+
else
|
|
314
|
+
zpair_set_write (self->stdoutpair, socket, false);
|
|
315
|
+
#endif
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
void
|
|
319
|
+
zproc_set_stderr (zproc_t *self, void* socket) {
|
|
320
|
+
assert (self);
|
|
321
|
+
#if defined (__WINDOWS__)
|
|
322
|
+
zsys_error ("zproc_set_stdout not implemented for Windows");
|
|
323
|
+
return;
|
|
324
|
+
#else
|
|
325
|
+
assert (self->stderrpipe [0] == 0);
|
|
326
|
+
int r = pipe (self->stderrpipe);
|
|
327
|
+
assert (r == 0);
|
|
328
|
+
|
|
329
|
+
if (!socket)
|
|
330
|
+
zpair_mkpair (self->stderrpair);
|
|
331
|
+
else
|
|
332
|
+
zpair_set_write (self->stderrpair, socket, false);
|
|
333
|
+
#endif
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
void*
|
|
337
|
+
zproc_stdin (zproc_t *self) {
|
|
338
|
+
return zpair_write (self->stdinpair);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
void*
|
|
342
|
+
zproc_stdout (zproc_t *self) {
|
|
343
|
+
return zpair_read (self->stdoutpair);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
void*
|
|
347
|
+
zproc_stderr (zproc_t *self) {
|
|
348
|
+
return zpair_read (self->stderrpair);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
int
|
|
352
|
+
zproc_returncode (zproc_t *self) {
|
|
353
|
+
assert (self);
|
|
354
|
+
#if defined (__WINDOWS__)
|
|
355
|
+
zsys_error ("zproc_returncode not implemented on Windows");
|
|
356
|
+
return -1;
|
|
357
|
+
#else
|
|
358
|
+
assert (self->pid);
|
|
359
|
+
zproc_wait (self, false);
|
|
360
|
+
return self->return_code;
|
|
361
|
+
#endif
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
int
|
|
365
|
+
zproc_pid (zproc_t *self) {
|
|
366
|
+
assert (self);
|
|
367
|
+
#if defined (__WINDOWS__)
|
|
368
|
+
zsys_error ("zproc_pid not implemented on Windows");
|
|
369
|
+
return -1;
|
|
370
|
+
#else
|
|
371
|
+
return self->pid;
|
|
372
|
+
#endif
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
static int
|
|
377
|
+
s_fd_in_handler (zloop_t *self, zmq_pollitem_t *item, void *socket)
|
|
378
|
+
{
|
|
379
|
+
#define BUF_SIZE 1024
|
|
380
|
+
byte buf [BUF_SIZE];
|
|
381
|
+
ssize_t r = 1;
|
|
382
|
+
|
|
383
|
+
while (r > 0) {
|
|
384
|
+
r = read (item->fd, buf, BUF_SIZE);
|
|
385
|
+
if (r == -1) {
|
|
386
|
+
zsys_error ("read from fd %d: %s", item->fd, strerror (errno));
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
else
|
|
390
|
+
if (r == 0)
|
|
391
|
+
break;
|
|
392
|
+
zframe_t *frame = zframe_new (buf, r);
|
|
393
|
+
zsock_bsend (socket, "f", frame, NULL);
|
|
394
|
+
zframe_destroy (&frame);
|
|
395
|
+
}
|
|
396
|
+
return 0;
|
|
397
|
+
#undef BUF_SIZE
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
static int
|
|
401
|
+
s_fd_out_handler (zloop_t *self, zmq_pollitem_t *item, void *socket)
|
|
402
|
+
{
|
|
403
|
+
ssize_t r = 1;
|
|
404
|
+
|
|
405
|
+
while (r > 0) {
|
|
406
|
+
|
|
407
|
+
zframe_t *frame;
|
|
408
|
+
r = zsock_brecv (socket, "f", &frame);
|
|
409
|
+
if (r == -1) {
|
|
410
|
+
zsys_error ("read from socket <%p>: %s", socket, strerror (errno));
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
r = write (item->fd, zframe_data (frame), zframe_size (frame));
|
|
415
|
+
zframe_destroy (&frame);
|
|
416
|
+
|
|
417
|
+
if (r == -1) {
|
|
418
|
+
zsys_error ("write to fd %d: %s", item->fd, strerror (errno));
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return 0;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
static int
|
|
426
|
+
s_zproc_addfd (zproc_t *self, int fd, void* socket, int flags) {
|
|
427
|
+
assert (self);
|
|
428
|
+
#if defined (__WINDOWS__)
|
|
429
|
+
zsys_error ("s_zproc_addfd not implemented for Windows");
|
|
430
|
+
return -1;
|
|
431
|
+
#else
|
|
432
|
+
zmq_pollitem_t it = {NULL, fd, flags, 0};
|
|
433
|
+
return zloop_poller (
|
|
434
|
+
self->loop_ref,
|
|
435
|
+
&it,
|
|
436
|
+
flags == ZMQ_POLLIN ? s_fd_in_handler : s_fd_out_handler,
|
|
437
|
+
socket);
|
|
438
|
+
#endif
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
static int
|
|
442
|
+
s_zproc_alive (zloop_t *loop, int timer_id, void *args)
|
|
443
|
+
{
|
|
444
|
+
zproc_t *self = (zproc_t*) args;
|
|
445
|
+
if (zsys_interrupted)
|
|
446
|
+
return -1;
|
|
447
|
+
if (zproc_pid (self) && zproc_running (self))
|
|
448
|
+
return 0;
|
|
449
|
+
return -1;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
static int
|
|
453
|
+
s_zproc_execve (zproc_t *self)
|
|
454
|
+
{
|
|
455
|
+
#if defined(__WINDOWS__)
|
|
456
|
+
zsys_debug ("s_zproc_execve not implemented on Windows");
|
|
457
|
+
return -1;
|
|
458
|
+
#else
|
|
459
|
+
assert (self);
|
|
460
|
+
int r;
|
|
461
|
+
|
|
462
|
+
char *filename = (char*) zlistx_first (self->args);
|
|
463
|
+
self->pid = fork ();
|
|
464
|
+
if (self->pid == 0) {
|
|
465
|
+
|
|
466
|
+
if (self->stdinpipe [0] != 0) {
|
|
467
|
+
int o_flags = fcntl (self->stdinpipe [0], F_GETFL);
|
|
468
|
+
int n_flags = o_flags & (~O_NONBLOCK);
|
|
469
|
+
fcntl (self->stdinpipe [0], F_SETFL, n_flags);
|
|
470
|
+
dup2 (self->stdinpipe [0], STDIN_FILENO);
|
|
471
|
+
close (self->stdinpipe [1]);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// redirect stdout if set_stdout was called
|
|
475
|
+
if (self->stdoutpipe [0] != 0) {
|
|
476
|
+
close (self->stdoutpipe [0]);
|
|
477
|
+
dup2 (self->stdoutpipe [1], STDOUT_FILENO);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// redirect stdout if set_stderr was called
|
|
481
|
+
if (self->stderrpipe [0] != 0) {
|
|
482
|
+
close (self->stderrpipe [0]);
|
|
483
|
+
dup2 (self->stderrpipe [1], STDERR_FILENO);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// build argv for now and use self->args
|
|
487
|
+
char **argv2 = arr_new (zlistx_size (self->args) + 1);
|
|
488
|
+
|
|
489
|
+
size_t i = 0;
|
|
490
|
+
for (char *arg = (char*) zlistx_first (self->args);
|
|
491
|
+
arg != NULL;
|
|
492
|
+
arg = (char*) zlistx_next (self->args)) {
|
|
493
|
+
arr_add_ref (argv2, i, arg);
|
|
494
|
+
i++;
|
|
495
|
+
}
|
|
496
|
+
arr_add_ref (argv2, i, NULL);
|
|
497
|
+
|
|
498
|
+
// build environ for a new process
|
|
499
|
+
char **env = arr_new (zhashx_size (self->env) + 1);
|
|
500
|
+
|
|
501
|
+
i = 0;
|
|
502
|
+
for (char *arg = (char*) zhashx_first (self->env);
|
|
503
|
+
arg != NULL;
|
|
504
|
+
arg = (char*) zhashx_next (self->env)) {
|
|
505
|
+
char *name = (char*) zhashx_cursor (self->env);
|
|
506
|
+
arr_add_ref (env, i, zsys_sprintf ("%s=%s", name, arg));
|
|
507
|
+
i++;
|
|
508
|
+
}
|
|
509
|
+
arr_add_ref (env, i, NULL);
|
|
510
|
+
|
|
511
|
+
r = execve (filename, argv2, env);
|
|
512
|
+
if (r == -1) {
|
|
513
|
+
zsys_error ("fail to run %s: %s", filename, strerror (errno));
|
|
514
|
+
zproc_destroy (&self);
|
|
515
|
+
zsock_destroy (&self->pipe);
|
|
516
|
+
arr_free (argv2);
|
|
517
|
+
exit (errno);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
else
|
|
521
|
+
if (self->pid == -1) {
|
|
522
|
+
zsys_error ("error fork: %s", strerror (errno));
|
|
523
|
+
exit (EXIT_FAILURE);
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
if (self->verbose)
|
|
527
|
+
zsys_debug ("process %s with pid %d started", filename, self->pid);
|
|
528
|
+
|
|
529
|
+
if (self->stdinpipe [0] != 0) {
|
|
530
|
+
s_zproc_addfd (self, self->stdinpipe [1], zpair_read (self->stdinpair), ZMQ_POLLOUT);
|
|
531
|
+
close (self->stdinpipe [0]);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// add a handler for read end of stdout
|
|
535
|
+
if (self->stdoutpipe [1] != 0) {
|
|
536
|
+
s_zproc_addfd (self, self->stdoutpipe [0], zpair_write (self->stdoutpair), ZMQ_POLLIN);
|
|
537
|
+
close(self->stdoutpipe[1]);
|
|
538
|
+
}
|
|
539
|
+
// add a handler for read end of stderr
|
|
540
|
+
if (self->stderrpipe [1] != 0) {
|
|
541
|
+
s_zproc_addfd (self, self->stderrpipe [0], zpair_write (self->stderrpair), ZMQ_POLLIN);
|
|
542
|
+
close(self->stderrpipe[1]);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return 0;
|
|
547
|
+
#endif
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
static int
|
|
551
|
+
s_pipe_handler (zloop_t *loop, zsock_t *pipe, void *args) {
|
|
552
|
+
zproc_t *self = (zproc_t*) args;
|
|
553
|
+
|
|
554
|
+
int ret = 0;
|
|
555
|
+
|
|
556
|
+
zmsg_t *msg = zmsg_recv (pipe);
|
|
557
|
+
char *command = zmsg_popstr (msg);
|
|
558
|
+
if (self->verbose)
|
|
559
|
+
zsys_debug ("API command=%s", command);
|
|
560
|
+
|
|
561
|
+
if (streq (command, "$TERM"))
|
|
562
|
+
ret = -1;
|
|
563
|
+
else
|
|
564
|
+
if (streq (command, "RUN")) {
|
|
565
|
+
|
|
566
|
+
if (zproc_pid (self) > 0) {
|
|
567
|
+
zsys_error ("Can't run command twice!!");
|
|
568
|
+
goto end;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
s_zproc_execve (self);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
end:
|
|
575
|
+
zstr_free(&command);
|
|
576
|
+
zmsg_destroy (&msg);
|
|
577
|
+
|
|
578
|
+
return ret;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
static void
|
|
582
|
+
s_zproc_actor (zsock_t *pipe, void *args)
|
|
583
|
+
{
|
|
584
|
+
|
|
585
|
+
zproc_t *self = (zproc_t*) args;
|
|
586
|
+
zloop_t *loop = zloop_new ();
|
|
587
|
+
assert (loop);
|
|
588
|
+
self->loop_ref = loop;
|
|
589
|
+
self->pipe = pipe;
|
|
590
|
+
|
|
591
|
+
zloop_reader (loop, pipe, s_pipe_handler, (void*) self);
|
|
592
|
+
zloop_timer (loop, 500, 0, s_zproc_alive, (void*) self);
|
|
593
|
+
|
|
594
|
+
zsock_signal (pipe, 0);
|
|
595
|
+
zloop_start (loop);
|
|
596
|
+
zloop_destroy (&loop);
|
|
597
|
+
zsock_signal (pipe, 0);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
int
|
|
601
|
+
zproc_run (zproc_t *self)
|
|
602
|
+
{
|
|
603
|
+
#if defined (__WINDOWS__)
|
|
604
|
+
zsys_error ("zproc not yet implemented for Windows");
|
|
605
|
+
return -1;
|
|
606
|
+
#endif
|
|
607
|
+
assert (self);
|
|
608
|
+
assert (!self->actor);
|
|
609
|
+
|
|
610
|
+
if (!self->args || zlistx_size (self->args) == 0) {
|
|
611
|
+
zsys_error ("No arguments, nothing to run. Call zproc_set_args before");
|
|
612
|
+
return -1;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
self->actor = zactor_new (s_zproc_actor, (void*) self);
|
|
616
|
+
self->running = true;
|
|
617
|
+
self->return_code = ZPROC_RUNNING;
|
|
618
|
+
|
|
619
|
+
zstr_send (self->actor, "RUN");
|
|
620
|
+
return 0;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
int
|
|
624
|
+
zproc_wait (zproc_t *self, bool wait) {
|
|
625
|
+
#if defined (__WINDOWS__)
|
|
626
|
+
zsys_error ("zproc not yet implemented for Windows");
|
|
627
|
+
return -1;
|
|
628
|
+
#else
|
|
629
|
+
assert (self);
|
|
630
|
+
if (!self->pid)
|
|
631
|
+
return 0;
|
|
632
|
+
|
|
633
|
+
if (self->verbose)
|
|
634
|
+
zsys_debug ("zproc_wait [%d]: wait=%s", self->pid, wait ? "true" : "false");
|
|
635
|
+
int status = -1;
|
|
636
|
+
int options = !wait ? WNOHANG : 0;
|
|
637
|
+
if (self->verbose)
|
|
638
|
+
zsys_debug ("zproc_wait [%d]:\t!self->running=%s", self->pid, self->running ? "true" : "false");
|
|
639
|
+
if (!self->running)
|
|
640
|
+
return self->return_code;
|
|
641
|
+
|
|
642
|
+
if (self->verbose)
|
|
643
|
+
zsys_debug ("zproc_wait [%d]:\twaitpid", self->pid);
|
|
644
|
+
int r = waitpid (self->pid, &status, options);
|
|
645
|
+
if (self->verbose)
|
|
646
|
+
zsys_debug ("zproc_wait [%d]:\twaitpid, r=%d", self->pid, r);
|
|
647
|
+
if (!wait && r == 0)
|
|
648
|
+
return self->return_code;
|
|
649
|
+
|
|
650
|
+
if (WIFEXITED(status)) {
|
|
651
|
+
if (self->verbose)
|
|
652
|
+
zsys_debug ("zproc_wait [%d]:\tWIFEXITED", self->pid);
|
|
653
|
+
self->running = false;
|
|
654
|
+
self->return_code = WEXITSTATUS(status);
|
|
655
|
+
}
|
|
656
|
+
else if (WIFSIGNALED(status)) {
|
|
657
|
+
if (self->verbose)
|
|
658
|
+
zsys_debug ("zproc_wait [%d]:\tWIFSIGNALED", self->pid);
|
|
659
|
+
self->running = false;
|
|
660
|
+
self->return_code = - WTERMSIG(status);
|
|
661
|
+
|
|
662
|
+
/*
|
|
663
|
+
if (WCOREDUMP(status)) {
|
|
664
|
+
self->core_dumped = true;
|
|
665
|
+
}
|
|
666
|
+
*/
|
|
667
|
+
}
|
|
668
|
+
if (self->verbose)
|
|
669
|
+
zsys_debug ("zproc_wait [%d]: self->return_code=%d", self->pid, self->return_code);
|
|
670
|
+
return ZPROC_RUNNING;
|
|
671
|
+
#endif
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
bool
|
|
675
|
+
zproc_running (zproc_t *self) {
|
|
676
|
+
assert (self);
|
|
677
|
+
#if defined (__WINDOWS__)
|
|
678
|
+
zsys_debug ("zproc_running not implemented on Windows");
|
|
679
|
+
return false;
|
|
680
|
+
#else
|
|
681
|
+
assert (self->pid);
|
|
682
|
+
return zproc_wait (self, false) == ZPROC_RUNNING;
|
|
683
|
+
#endif
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
void *
|
|
687
|
+
zproc_actor (zproc_t *self) {
|
|
688
|
+
assert (self);
|
|
689
|
+
return self->actor;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
// send a signal to the subprocess
|
|
693
|
+
void
|
|
694
|
+
zproc_kill (zproc_t *self, int signum) {
|
|
695
|
+
assert (self);
|
|
696
|
+
#if defined (__WINDOWS__)
|
|
697
|
+
zsys_debug ("zproc_kill not implemented on Windows");
|
|
698
|
+
return;
|
|
699
|
+
#else
|
|
700
|
+
int r = kill (self->pid, signum);
|
|
701
|
+
if (r != 0)
|
|
702
|
+
zsys_error ("kill of pid=%d failed: %s", self->pid, strerror (errno));
|
|
703
|
+
zproc_wait (self, false);
|
|
704
|
+
#endif
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
void
|
|
708
|
+
zproc_set_verbose (zproc_t *self, bool verbose) {
|
|
709
|
+
assert (self);
|
|
710
|
+
self->verbose = verbose;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
// --------------------------------------------------------------------------
|
|
714
|
+
// Returns CZMQ version as a single 6-digit integer encoding the major
|
|
715
|
+
// version (x 10000), the minor version (x 100) and the patch.
|
|
716
|
+
|
|
717
|
+
int
|
|
718
|
+
zproc_czmq_version (void)
|
|
719
|
+
{
|
|
720
|
+
return CZMQ_VERSION;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
// --------------------------------------------------------------------------
|
|
725
|
+
// Returns true if the process received a SIGINT or SIGTERM signal.
|
|
726
|
+
// It is good practice to use this method to exit any infinite loop
|
|
727
|
+
// processing messages.
|
|
728
|
+
|
|
729
|
+
bool
|
|
730
|
+
zproc_interrupted (void)
|
|
731
|
+
{
|
|
732
|
+
return zsys_interrupted == 1;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// --------------------------------------------------------------------------
|
|
736
|
+
// Returns true if the underlying libzmq supports CURVE security.
|
|
737
|
+
|
|
738
|
+
bool
|
|
739
|
+
zproc_has_curve (void)
|
|
740
|
+
{
|
|
741
|
+
return zsys_has_curve ();
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
// --------------------------------------------------------------------------
|
|
746
|
+
// Return current host name, for use in public tcp:// endpoints.
|
|
747
|
+
// If the host name is not resolvable, returns NULL. The caller is
|
|
748
|
+
// responsible for destroying the return value when finished with it.
|
|
749
|
+
|
|
750
|
+
char *
|
|
751
|
+
zproc_hostname (void)
|
|
752
|
+
{
|
|
753
|
+
return zsys_hostname ();
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
// --------------------------------------------------------------------------
|
|
758
|
+
// Move the current process into the background. The precise effect
|
|
759
|
+
// depends on the operating system. On POSIX boxes, moves to a specified
|
|
760
|
+
// working directory (if specified), closes all file handles, reopens
|
|
761
|
+
// stdin, stdout, and stderr to the null device, and sets the process to
|
|
762
|
+
// ignore SIGHUP. On Windows, does nothing. Returns 0 if OK, -1 if there
|
|
763
|
+
// was an error.
|
|
764
|
+
|
|
765
|
+
void
|
|
766
|
+
zproc_daemonize (const char *workdir)
|
|
767
|
+
{
|
|
768
|
+
zsys_daemonize (workdir);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
// --------------------------------------------------------------------------
|
|
773
|
+
// Drop the process ID into the lockfile, with exclusive lock, and
|
|
774
|
+
// switch the process to the specified group and/or user. Any of the
|
|
775
|
+
// arguments may be null, indicating a no-op. Returns 0 on success,
|
|
776
|
+
// -1 on failure. Note if you combine this with zsys_daemonize, run
|
|
777
|
+
// after, not before that method, or the lockfile will hold the wrong
|
|
778
|
+
// process ID.
|
|
779
|
+
|
|
780
|
+
void
|
|
781
|
+
zproc_run_as (const char *lockfile, const char *group, const char *user)
|
|
782
|
+
{
|
|
783
|
+
zsys_run_as (lockfile, group, user);
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
|
|
787
|
+
// --------------------------------------------------------------------------
|
|
788
|
+
// Configure the number of I/O threads that ZeroMQ will use. A good
|
|
789
|
+
// rule of thumb is one thread per gigabit of traffic in or out. The
|
|
790
|
+
// default is 1, sufficient for most applications. If the environment
|
|
791
|
+
// variable ZSYS_IO_THREADS is defined, that provides the default.
|
|
792
|
+
// Note that this method is valid only before any socket is created.
|
|
793
|
+
|
|
794
|
+
void
|
|
795
|
+
zproc_set_io_threads (size_t io_threads)
|
|
796
|
+
{
|
|
797
|
+
zsys_set_io_threads (io_threads);
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
// --------------------------------------------------------------------------
|
|
802
|
+
// Configure the number of sockets that ZeroMQ will allow. The default
|
|
803
|
+
// is 1024. The actual limit depends on the system, and you can query it
|
|
804
|
+
// by using zsys_socket_limit (). A value of zero means "maximum".
|
|
805
|
+
// Note that this method is valid only before any socket is created.
|
|
806
|
+
|
|
807
|
+
void
|
|
808
|
+
zproc_set_max_sockets (size_t max_sockets)
|
|
809
|
+
{
|
|
810
|
+
zsys_set_max_sockets (max_sockets);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
// --------------------------------------------------------------------------
|
|
815
|
+
// Set network interface name to use for broadcasts, particularly zbeacon.
|
|
816
|
+
// This lets the interface be configured for test environments where required.
|
|
817
|
+
// For example, on Mac OS X, zbeacon cannot bind to 255.255.255.255 which is
|
|
818
|
+
// the default when there is no specified interface. If the environment
|
|
819
|
+
// variable ZSYS_INTERFACE is set, use that as the default interface name.
|
|
820
|
+
// Setting the interface to "*" means "use all available interfaces".
|
|
821
|
+
|
|
822
|
+
void
|
|
823
|
+
zproc_set_biface (const char *value)
|
|
824
|
+
{
|
|
825
|
+
zsys_set_interface (value);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
// --------------------------------------------------------------------------
|
|
830
|
+
// Return network interface to use for broadcasts, or "" if none was set.
|
|
831
|
+
|
|
832
|
+
const char *
|
|
833
|
+
zproc_biface (void)
|
|
834
|
+
{
|
|
835
|
+
return zsys_interface ();
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
// --------------------------------------------------------------------------
|
|
840
|
+
// Set log identity, which is a string that prefixes all log messages sent
|
|
841
|
+
// by this process. The log identity defaults to the environment variable
|
|
842
|
+
// ZSYS_LOGIDENT, if that is set.
|
|
843
|
+
|
|
844
|
+
void
|
|
845
|
+
zproc_set_log_ident (const char *value)
|
|
846
|
+
{
|
|
847
|
+
zsys_set_logident (value);
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
// --------------------------------------------------------------------------
|
|
852
|
+
// Sends log output to a PUB socket bound to the specified endpoint. To
|
|
853
|
+
// collect such log output, create a SUB socket, subscribe to the traffic
|
|
854
|
+
// you care about, and connect to the endpoint. Log traffic is sent as a
|
|
855
|
+
// single string frame, in the same format as when sent to stdout. The
|
|
856
|
+
// log system supports a single sender; multiple calls to this method will
|
|
857
|
+
// bind the same sender to multiple endpoints. To disable the sender, call
|
|
858
|
+
// this method with a null argument.
|
|
859
|
+
|
|
860
|
+
void
|
|
861
|
+
zproc_set_log_sender (const char *endpoint)
|
|
862
|
+
{
|
|
863
|
+
zsys_set_logsender (endpoint);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
// --------------------------------------------------------------------------
|
|
868
|
+
// Enable or disable logging to the system facility (syslog on POSIX boxes,
|
|
869
|
+
// event log on Windows). By default this is disabled.
|
|
870
|
+
|
|
871
|
+
void
|
|
872
|
+
zproc_set_log_system (bool logsystem)
|
|
873
|
+
{
|
|
874
|
+
zsys_set_logsystem (logsystem);
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
// --------------------------------------------------------------------------
|
|
879
|
+
// Log error condition - highest priority
|
|
880
|
+
|
|
881
|
+
void
|
|
882
|
+
zproc_log_error (const char *format, ...)
|
|
883
|
+
{
|
|
884
|
+
va_list argptr;
|
|
885
|
+
va_start (argptr, format);
|
|
886
|
+
char *string = zsys_vprintf (format, argptr);
|
|
887
|
+
va_end (argptr);
|
|
888
|
+
zsys_error (string);
|
|
889
|
+
zstr_free (&string);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
|
|
893
|
+
// --------------------------------------------------------------------------
|
|
894
|
+
// Log warning condition - high priority
|
|
895
|
+
|
|
896
|
+
void
|
|
897
|
+
zproc_log_warning (const char *format, ...)
|
|
898
|
+
{
|
|
899
|
+
va_list argptr;
|
|
900
|
+
va_start (argptr, format);
|
|
901
|
+
char *string = zsys_vprintf (format, argptr);
|
|
902
|
+
va_end (argptr);
|
|
903
|
+
zsys_warning (string);
|
|
904
|
+
zstr_free (&string);
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
// --------------------------------------------------------------------------
|
|
909
|
+
// Log normal, but significant, condition - normal priority
|
|
910
|
+
|
|
911
|
+
void
|
|
912
|
+
zproc_log_notice (const char *format, ...)
|
|
913
|
+
{
|
|
914
|
+
va_list argptr;
|
|
915
|
+
va_start (argptr, format);
|
|
916
|
+
char *string = zsys_vprintf (format, argptr);
|
|
917
|
+
va_end (argptr);
|
|
918
|
+
zsys_notice (string);
|
|
919
|
+
zstr_free (&string);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
|
|
923
|
+
// --------------------------------------------------------------------------
|
|
924
|
+
// Log informational message - low priority
|
|
925
|
+
|
|
926
|
+
void
|
|
927
|
+
zproc_log_info (const char *format, ...)
|
|
928
|
+
{
|
|
929
|
+
va_list argptr;
|
|
930
|
+
va_start (argptr, format);
|
|
931
|
+
char *string = zsys_vprintf (format, argptr);
|
|
932
|
+
va_end (argptr);
|
|
933
|
+
zsys_info (string);
|
|
934
|
+
zstr_free (&string);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
|
|
938
|
+
// --------------------------------------------------------------------------
|
|
939
|
+
// Log debug-level message - lowest priority
|
|
940
|
+
|
|
941
|
+
void
|
|
942
|
+
zproc_log_debug (const char *format, ...)
|
|
943
|
+
{
|
|
944
|
+
va_list argptr;
|
|
945
|
+
va_start (argptr, format);
|
|
946
|
+
char *string = zsys_vprintf (format, argptr);
|
|
947
|
+
va_end (argptr);
|
|
948
|
+
zsys_debug (string);
|
|
949
|
+
zstr_free (&string);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
|
|
953
|
+
// --------------------------------------------------------------------------
|
|
954
|
+
// Self test of this class.
|
|
955
|
+
|
|
956
|
+
void
|
|
957
|
+
zproc_test (bool verbose)
|
|
958
|
+
{
|
|
959
|
+
printf (" * zproc: ");
|
|
960
|
+
|
|
961
|
+
// @selftest
|
|
962
|
+
#if defined (__WINDOWS__)
|
|
963
|
+
printf ("SKIPPED (on Windows)\n");
|
|
964
|
+
return;
|
|
965
|
+
#endif
|
|
966
|
+
#if ZMQ_VERSION_MAJOR < 4
|
|
967
|
+
printf ("SKIPPED (on zmq pre-4)\n");
|
|
968
|
+
return;
|
|
969
|
+
#endif
|
|
970
|
+
int major, minor, patch;
|
|
971
|
+
zsys_version (&major, &minor, &patch);
|
|
972
|
+
if (major < 4) {
|
|
973
|
+
printf ("SKIPPED (on zmq pre-4)\n");
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
// @selftest
|
|
978
|
+
// 0. initialization
|
|
979
|
+
|
|
980
|
+
if (verbose) {
|
|
981
|
+
printf("\n");
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
// find the right binary for current build (in-tree, distcheck, etc.)
|
|
985
|
+
char *file = NULL;
|
|
986
|
+
if (zsys_file_exists ("src/zsp") || zsys_file_exists ("./src/zsp"))
|
|
987
|
+
file = "./src/zsp";
|
|
988
|
+
else
|
|
989
|
+
if (zsys_file_exists ("../zsp"))
|
|
990
|
+
// WHOA: zproc: zproc_test() : current working directory is
|
|
991
|
+
// /home/travis/build/username/czmq/czmq-4.0.3/_build/src/selftest-rw
|
|
992
|
+
file = "../zsp";
|
|
993
|
+
else
|
|
994
|
+
if (zsys_file_exists ("_build/../src/zsp"))
|
|
995
|
+
file = "_build/../src/zsp";
|
|
996
|
+
else
|
|
997
|
+
if (zsys_file_exists ("_build/src/zsp"))
|
|
998
|
+
file = "_build/src/zsp";
|
|
999
|
+
else
|
|
1000
|
+
if (zsys_file_exists ("../_build/src/zsp"))
|
|
1001
|
+
file = "../_build/src/zsp";
|
|
1002
|
+
else
|
|
1003
|
+
if (zsys_file_exists ("../../_build/src/zsp"))
|
|
1004
|
+
file = "../../_build/src/zsp";
|
|
1005
|
+
else
|
|
1006
|
+
if (zsys_file_exists ("_build/sub/src/zsp"))
|
|
1007
|
+
file = "_build/sub/src/zsp";
|
|
1008
|
+
else
|
|
1009
|
+
if (zsys_file_exists ("../_build/sub/src/zsp"))
|
|
1010
|
+
file = "../_build/sub/src/zsp";
|
|
1011
|
+
else
|
|
1012
|
+
if (zsys_file_exists ("../../_build/sub/src/zsp"))
|
|
1013
|
+
file = "../../_build/sub/src/zsp";
|
|
1014
|
+
else
|
|
1015
|
+
if (zsys_file_exists ("zsp") || zsys_file_exists ("./zsp"))
|
|
1016
|
+
file = "./zsp";
|
|
1017
|
+
else
|
|
1018
|
+
if (zsys_file_exists ("../src/zsp"))
|
|
1019
|
+
file = "../src/zsp";
|
|
1020
|
+
|
|
1021
|
+
if (file == NULL || !zsys_file_exists (file)) {
|
|
1022
|
+
zsys_warning ("cannot detect zsp binary, %s does not exist", file ? file : "<null>");
|
|
1023
|
+
|
|
1024
|
+
printf ("SKIPPED (zsp helper not found)\n");
|
|
1025
|
+
|
|
1026
|
+
#if (defined (PATH_MAX))
|
|
1027
|
+
char cwd[PATH_MAX];
|
|
1028
|
+
#else
|
|
1029
|
+
# if (defined (_MAX_PATH))
|
|
1030
|
+
char cwd[_MAX_PATH];
|
|
1031
|
+
# else
|
|
1032
|
+
char cwd[1024];
|
|
1033
|
+
# endif
|
|
1034
|
+
#endif
|
|
1035
|
+
memset (cwd, 0, sizeof (cwd));
|
|
1036
|
+
#if (defined (WIN32))
|
|
1037
|
+
if (_getcwd(cwd, sizeof(cwd)) != NULL)
|
|
1038
|
+
#else
|
|
1039
|
+
if (getcwd(cwd, sizeof(cwd)) != NULL)
|
|
1040
|
+
#endif
|
|
1041
|
+
printf ("zproc_test() : current working directory is %s\n", cwd);
|
|
1042
|
+
|
|
1043
|
+
return;
|
|
1044
|
+
}
|
|
1045
|
+
if (verbose) {
|
|
1046
|
+
zsys_info ("zproc_test() : detected a zsp binary at %s\n", file);
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
// Create new subproc instance
|
|
1050
|
+
zproc_t *self = zproc_new ();
|
|
1051
|
+
zproc_set_verbose (self, verbose);
|
|
1052
|
+
assert (self);
|
|
1053
|
+
// join stdout of the process to zeromq socket
|
|
1054
|
+
// all data will be readable from zproc_stdout socket
|
|
1055
|
+
zproc_set_stdout (self, NULL);
|
|
1056
|
+
|
|
1057
|
+
zlistx_t *args = zlistx_new ();
|
|
1058
|
+
zlistx_add_end (args, file);
|
|
1059
|
+
zlistx_add_end (args, "--stdout");
|
|
1060
|
+
zproc_set_args (self, args);
|
|
1061
|
+
|
|
1062
|
+
zhashx_t *env = zhashx_new ();
|
|
1063
|
+
zhashx_insert (env, "ZSP_MESSAGE", "czmq is great\n");
|
|
1064
|
+
zproc_set_env (self, env);
|
|
1065
|
+
|
|
1066
|
+
// execute the binary. It runs in own actor, which monitor the process and
|
|
1067
|
+
// pass data accross pipes and zeromq sockets
|
|
1068
|
+
if (verbose)
|
|
1069
|
+
zsys_debug("zproc_test() : launching helper '%s'", file );
|
|
1070
|
+
zproc_run (self);
|
|
1071
|
+
zpoller_t *poller = zpoller_new (zproc_stdout (self), NULL);
|
|
1072
|
+
|
|
1073
|
+
// kill the binary, it never ends, but the test must:
|
|
1074
|
+
// termination also flushes the output streams so we can
|
|
1075
|
+
// read them entirely; note that other process runs in
|
|
1076
|
+
// parallel to this thread
|
|
1077
|
+
if (verbose)
|
|
1078
|
+
zsys_debug("zproc_test() : sleeping 4000 msec to gather some output from helper");
|
|
1079
|
+
zclock_sleep (4000);
|
|
1080
|
+
zproc_kill (self, SIGTERM);
|
|
1081
|
+
zproc_wait (self, true);
|
|
1082
|
+
|
|
1083
|
+
// read the content from zproc_stdout - use zpoller and a loop
|
|
1084
|
+
bool stdout_read = false;
|
|
1085
|
+
int64_t zproc_timeout_msec = 10000;
|
|
1086
|
+
int64_t zproc_test_start_msec = zclock_mono();
|
|
1087
|
+
int64_t zproc_test_elapsed_msec = 0;
|
|
1088
|
+
|
|
1089
|
+
while (!zsys_interrupted) {
|
|
1090
|
+
void *which = zpoller_wait (poller, 800);
|
|
1091
|
+
zproc_test_elapsed_msec = zclock_mono() - zproc_test_start_msec;
|
|
1092
|
+
|
|
1093
|
+
if (!which) {
|
|
1094
|
+
if (stdout_read) {
|
|
1095
|
+
if (verbose)
|
|
1096
|
+
zsys_debug("zproc_test() : did not get stdout from helper, but we already have some (%" PRIi64 " msec remaining to retry)", (zproc_timeout_msec - zproc_test_elapsed_msec) );
|
|
1097
|
+
break;
|
|
1098
|
+
}
|
|
1099
|
+
if (zproc_timeout_msec > zproc_test_elapsed_msec) {
|
|
1100
|
+
if (verbose)
|
|
1101
|
+
zsys_debug("zproc_test() : did not get stdout from helper, %" PRIi64 " msec remaining to retry", (zproc_timeout_msec - zproc_test_elapsed_msec) );
|
|
1102
|
+
continue;
|
|
1103
|
+
}
|
|
1104
|
+
// ...else : we've slept a lot and got no response; kill the helper
|
|
1105
|
+
if (verbose)
|
|
1106
|
+
zsys_debug("zproc_test() : did not get stdout from helper, patience expired (%" PRIi64 " msec remaining to retry)", (zproc_timeout_msec - zproc_test_elapsed_msec) );
|
|
1107
|
+
break;
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
if (which == zproc_stdout (self)) {
|
|
1111
|
+
// it suffices for us to have read something
|
|
1112
|
+
// we only check the first frame, others may start with the
|
|
1113
|
+
// expected key string broken mid-way due to alignment etc.,
|
|
1114
|
+
// but we drain the whole incoming queue of stdout frames.
|
|
1115
|
+
zframe_t *frame;
|
|
1116
|
+
zsock_brecv (zproc_stdout (self), "f", &frame);
|
|
1117
|
+
assert (frame);
|
|
1118
|
+
assert (zframe_data (frame));
|
|
1119
|
+
if (!stdout_read) {
|
|
1120
|
+
if (verbose)
|
|
1121
|
+
zsys_debug("zproc_test() : got stdout from helper, %" PRIi64 " msec was remaining to retry", (zproc_timeout_msec - zproc_test_elapsed_msec));
|
|
1122
|
+
assert (!strncmp(
|
|
1123
|
+
"czmq is great\n",
|
|
1124
|
+
(char*) zframe_data (frame),
|
|
1125
|
+
14));
|
|
1126
|
+
stdout_read = true;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
if (verbose)
|
|
1130
|
+
zframe_print (frame, "zproc_test");
|
|
1131
|
+
|
|
1132
|
+
zframe_destroy (&frame);
|
|
1133
|
+
continue;
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
// should not get there
|
|
1137
|
+
if (verbose)
|
|
1138
|
+
zsys_debug("zproc_test() : reached the unreachable point (unexpected zpoller result), %" PRIi64 " msec was remaining to retry", (zproc_timeout_msec - zproc_test_elapsed_msec) );
|
|
1139
|
+
assert (false);
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
assert (stdout_read);
|
|
1143
|
+
zpoller_destroy (&poller);
|
|
1144
|
+
zproc_destroy (&self);
|
|
1145
|
+
// @end
|
|
1146
|
+
|
|
1147
|
+
// to have zpair print and arr print methods
|
|
1148
|
+
zpair_t *pair = zpair_new (strdup ("e"));
|
|
1149
|
+
assert (pair);
|
|
1150
|
+
if (verbose)
|
|
1151
|
+
zpair_print (pair);
|
|
1152
|
+
zpair_destroy (&pair);
|
|
1153
|
+
|
|
1154
|
+
char ** a = arr_new (1);
|
|
1155
|
+
if (verbose)
|
|
1156
|
+
arr_print (a);
|
|
1157
|
+
arr_free (a);
|
|
1158
|
+
|
|
1159
|
+
printf ("OK\n");
|
|
1160
|
+
}
|