Remove zmq from scaffolding stuff in go
This commit is contained in:
parent
fec37dff9a
commit
59975fc349
|
@ -72,7 +72,7 @@ func main() {
|
||||||
logger.SetLevel(logrus.Level(opts.logLevel))
|
logger.SetLevel(logrus.Level(opts.logLevel))
|
||||||
|
|
||||||
log = logger.WithFields(logrus.Fields{
|
log = logger.WithFields(logrus.Fields{
|
||||||
"app": "zmqclient",
|
"app": "RPCclient",
|
||||||
})
|
})
|
||||||
|
|
||||||
// Initialize database
|
// Initialize database
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -8,7 +8,6 @@ require (
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect
|
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect
|
||||||
github.com/jtolds/gls v4.2.1+incompatible // indirect
|
github.com/jtolds/gls v4.2.1+incompatible // indirect
|
||||||
github.com/mattn/go-sqlite3 v1.10.0
|
github.com/mattn/go-sqlite3 v1.10.0
|
||||||
github.com/pebbe/zmq4 v1.0.0
|
|
||||||
github.com/pkg/errors v0.8.0
|
github.com/pkg/errors v0.8.0
|
||||||
github.com/sirupsen/logrus v1.2.0
|
github.com/sirupsen/logrus v1.2.0
|
||||||
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 // indirect
|
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 // indirect
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -40,8 +40,6 @@ github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsO
|
||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/pebbe/zmq4 v1.0.0 h1:D+MSmPpqkL5PSSmnh8g51ogirUCyemThuZzLW7Nrt78=
|
|
||||||
github.com/pebbe/zmq4 v1.0.0/go.mod h1:7N4y5R18zBiu3l0vajMUWQgZyjv464prE8RCyBcmnZM=
|
|
||||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
Copyright (c) 2013-2014, Peter Kleiweg
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
||||||
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
||||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
||||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1,75 +0,0 @@
|
||||||
A Go interface to [ZeroMQ](http://www.zeromq.org/) version 4.
|
|
||||||
|
|
||||||
[](https://goreportcard.com/report/github.com/pebbe/zmq4)
|
|
||||||
[](https://godoc.org/github.com/pebbe/zmq4)
|
|
||||||
|
|
||||||
This requires ZeroMQ version 4.0.1 or above. To use CURVE security in
|
|
||||||
versions prior to 4.2, ZeroMQ must be installed with
|
|
||||||
[libsodium](https://github.com/jedisct1/libsodium) enabled.
|
|
||||||
|
|
||||||
Partial support for ZeroMQ 4.2 DRAFT is available in the alternate
|
|
||||||
version of zmq4 `draft`. The API pertaining to this is subject to
|
|
||||||
change. To use this:
|
|
||||||
|
|
||||||
import (
|
|
||||||
zmq "github.com/pebbe/zmq4/draft"
|
|
||||||
)
|
|
||||||
|
|
||||||
For ZeroMQ version 3, see: http://github.com/pebbe/zmq3
|
|
||||||
|
|
||||||
For ZeroMQ version 2, see: http://github.com/pebbe/zmq2
|
|
||||||
|
|
||||||
Including all examples of [ØMQ - The Guide](http://zguide.zeromq.org/page:all).
|
|
||||||
|
|
||||||
Keywords: zmq, zeromq, 0mq, networks, distributed computing, message passing, fanout, pubsub, pipeline, request-reply
|
|
||||||
|
|
||||||
### See also
|
|
||||||
|
|
||||||
* [Mangos](https://github.com/go-mangos/mangos) — An implementation in pure Go of the SP ("Scalable Protocols") protocols
|
|
||||||
* [go-nanomsg](https://github.com/op/go-nanomsg) — Language bindings for nanomsg in Go
|
|
||||||
* [goczmq](https://github.com/zeromq/goczmq) — A Go interface to CZMQ
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
go get github.com/pebbe/zmq4
|
|
||||||
|
|
||||||
## Docs
|
|
||||||
|
|
||||||
* [package help](http://godoc.org/github.com/pebbe/zmq4)
|
|
||||||
* [wiki](https://github.com/pebbe/zmq4/wiki)
|
|
||||||
|
|
||||||
## API change
|
|
||||||
|
|
||||||
There has been an API change in commit
|
|
||||||
0bc5ab465849847b0556295d9a2023295c4d169e of 2014-06-27, 10:17:55 UTC
|
|
||||||
in the functions `AuthAllow` and `AuthDeny`.
|
|
||||||
|
|
||||||
Old:
|
|
||||||
|
|
||||||
func AuthAllow(addresses ...string)
|
|
||||||
func AuthDeny(addresses ...string)
|
|
||||||
|
|
||||||
New:
|
|
||||||
|
|
||||||
func AuthAllow(domain string, addresses ...string)
|
|
||||||
func AuthDeny(domain string, addresses ...string)
|
|
||||||
|
|
||||||
If `domain` can be parsed as an IP address, it will be interpreted as
|
|
||||||
such, and it and all remaining addresses are added to all domains.
|
|
||||||
|
|
||||||
So this should still work as before:
|
|
||||||
|
|
||||||
zmq.AuthAllow("127.0.0.1", "123.123.123.123")
|
|
||||||
|
|
||||||
But this won't compile:
|
|
||||||
|
|
||||||
a := []string{"127.0.0.1", "123.123.123.123"}
|
|
||||||
zmq.AuthAllow(a...)
|
|
||||||
|
|
||||||
And needs to be rewritten as:
|
|
||||||
|
|
||||||
a := []string{"127.0.0.1", "123.123.123.123"}
|
|
||||||
zmq.AuthAllow("*", a...)
|
|
||||||
|
|
||||||
Furthermore, an address can now be a single IP address, as well as an IP
|
|
||||||
address and mask in CIDR notation, e.g. "123.123.123.0/24".
|
|
|
@ -1,645 +0,0 @@
|
||||||
/*
|
|
||||||
|
|
||||||
This file implements functionality very similar to that of the xauth module in czmq.
|
|
||||||
|
|
||||||
Notable differences in here:
|
|
||||||
|
|
||||||
- domains are supported
|
|
||||||
- domains are used in AuthAllow and AuthDeny too
|
|
||||||
- usernames/passwords are read from memory, not from file
|
|
||||||
- public keys are read from memory, not from file
|
|
||||||
- an address can be a single IP address, or an IP address and mask in CIDR notation
|
|
||||||
- additional functions for configuring server or client socket with a single command
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#if ZMQ_VERSION_MINOR < 2
|
|
||||||
// Version < 4.2.x
|
|
||||||
|
|
||||||
int zmq_curve_public (char *z85_public_key, const char *z85_secret_key) { return 0; }
|
|
||||||
|
|
||||||
#endif // Version < 4.2.x
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const CURVE_ALLOW_ANY = "*"
|
|
||||||
|
|
||||||
var (
|
|
||||||
auth_handler *Socket
|
|
||||||
auth_quit *Socket
|
|
||||||
|
|
||||||
auth_init = false
|
|
||||||
auth_verbose = false
|
|
||||||
|
|
||||||
auth_allow = make(map[string]map[string]bool)
|
|
||||||
auth_deny = make(map[string]map[string]bool)
|
|
||||||
auth_allow_net = make(map[string][]*net.IPNet)
|
|
||||||
auth_deny_net = make(map[string][]*net.IPNet)
|
|
||||||
|
|
||||||
auth_users = make(map[string]map[string]string)
|
|
||||||
|
|
||||||
auth_pubkeys = make(map[string]map[string]bool)
|
|
||||||
|
|
||||||
auth_meta_handler = auth_meta_handler_default
|
|
||||||
)
|
|
||||||
|
|
||||||
func auth_meta_handler_default(version, request_id, domain, address, identity, mechanism string, credentials ...string) (metadata map[string]string) {
|
|
||||||
return map[string]string{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_isIP(addr string) bool {
|
|
||||||
if net.ParseIP(addr) != nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if _, _, err := net.ParseCIDR(addr); err == nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_is_allowed(domain, address string) bool {
|
|
||||||
for _, d := range []string{domain, "*"} {
|
|
||||||
if a, ok := auth_allow[d]; ok {
|
|
||||||
if a[address] {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addr := net.ParseIP(address)
|
|
||||||
if addr != nil {
|
|
||||||
for _, d := range []string{domain, "*"} {
|
|
||||||
if a, ok := auth_allow_net[d]; ok {
|
|
||||||
for _, m := range a {
|
|
||||||
if m.Contains(addr) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_is_denied(domain, address string) bool {
|
|
||||||
for _, d := range []string{domain, "*"} {
|
|
||||||
if a, ok := auth_deny[d]; ok {
|
|
||||||
if a[address] {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addr := net.ParseIP(address)
|
|
||||||
if addr != nil {
|
|
||||||
for _, d := range []string{domain, "*"} {
|
|
||||||
if a, ok := auth_deny_net[d]; ok {
|
|
||||||
for _, m := range a {
|
|
||||||
if m.Contains(addr) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_has_allow(domain string) bool {
|
|
||||||
for _, d := range []string{domain, "*"} {
|
|
||||||
if a, ok := auth_allow[d]; ok {
|
|
||||||
if len(a) > 0 || len(auth_allow_net[d]) > 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_has_deny(domain string) bool {
|
|
||||||
for _, d := range []string{domain, "*"} {
|
|
||||||
if a, ok := auth_deny[d]; ok {
|
|
||||||
if len(a) > 0 || len(auth_deny_net[d]) > 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_do_handler() {
|
|
||||||
for {
|
|
||||||
|
|
||||||
msg, err := auth_handler.RecvMessage(0)
|
|
||||||
if err != nil {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Quitting:", err)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if msg[0] == "QUIT" {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Quitting: received QUIT message")
|
|
||||||
}
|
|
||||||
_, err := auth_handler.SendMessage("QUIT")
|
|
||||||
if err != nil && auth_verbose {
|
|
||||||
log.Println("AUTH: Quitting: bouncing QUIT message:", err)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
version := msg[0]
|
|
||||||
if version != "1.0" {
|
|
||||||
panic("AUTH: version != 1.0")
|
|
||||||
}
|
|
||||||
|
|
||||||
request_id := msg[1]
|
|
||||||
domain := msg[2]
|
|
||||||
address := msg[3]
|
|
||||||
identity := msg[4]
|
|
||||||
mechanism := msg[5]
|
|
||||||
credentials := msg[6:]
|
|
||||||
|
|
||||||
username := ""
|
|
||||||
password := ""
|
|
||||||
client_key := ""
|
|
||||||
if mechanism == "PLAIN" {
|
|
||||||
username = msg[6]
|
|
||||||
password = msg[7]
|
|
||||||
} else if mechanism == "CURVE" {
|
|
||||||
s := msg[6]
|
|
||||||
if len(s) != 32 {
|
|
||||||
panic("AUTH: len(client_key) != 32")
|
|
||||||
}
|
|
||||||
client_key = Z85encode(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
allowed := false
|
|
||||||
denied := false
|
|
||||||
|
|
||||||
if auth_has_allow(domain) {
|
|
||||||
if auth_is_allowed(domain, address) {
|
|
||||||
allowed = true
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: PASSED (whitelist) domain=%q address=%q\n", domain, address)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
denied = true
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: DENIED (not in whitelist) domain=%q address=%q\n", domain, address)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if auth_has_deny(domain) {
|
|
||||||
if auth_is_denied(domain, address) {
|
|
||||||
denied = true
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: DENIED (blacklist) domain=%q address=%q\n", domain, address)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
allowed = true
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: PASSED (not in blacklist) domain=%q address=%q\n", domain, address)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mechanism-specific checks
|
|
||||||
if !denied {
|
|
||||||
if mechanism == "NULL" && !allowed {
|
|
||||||
// For NULL, we allow if the address wasn't blacklisted
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: ALLOWED (NULL)\n")
|
|
||||||
}
|
|
||||||
allowed = true
|
|
||||||
} else if mechanism == "PLAIN" {
|
|
||||||
// For PLAIN, even a whitelisted address must authenticate
|
|
||||||
allowed = authenticate_plain(domain, username, password)
|
|
||||||
} else if mechanism == "CURVE" {
|
|
||||||
// For CURVE, even a whitelisted address must authenticate
|
|
||||||
allowed = authenticate_curve(domain, client_key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if allowed {
|
|
||||||
m := auth_meta_handler(version, request_id, domain, address, identity, mechanism, credentials...)
|
|
||||||
user_id := ""
|
|
||||||
if uid, ok := m["User-Id"]; ok {
|
|
||||||
user_id = uid
|
|
||||||
delete(m, "User-Id")
|
|
||||||
}
|
|
||||||
metadata := make([]byte, 0)
|
|
||||||
for key, value := range m {
|
|
||||||
if len(key) < 256 {
|
|
||||||
metadata = append(metadata, auth_meta_blob(key, value)...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
auth_handler.SendMessage(version, request_id, "200", "OK", user_id, metadata)
|
|
||||||
} else {
|
|
||||||
auth_handler.SendMessage(version, request_id, "400", "NO ACCESS", "", "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err := auth_handler.Close()
|
|
||||||
if err != nil && auth_verbose {
|
|
||||||
log.Println("AUTH: Quitting: Close:", err)
|
|
||||||
}
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Quit")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func authenticate_plain(domain, username, password string) bool {
|
|
||||||
for _, dom := range []string{domain, "*"} {
|
|
||||||
if m, ok := auth_users[dom]; ok {
|
|
||||||
if m[username] == password {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: ALLOWED (PLAIN) domain=%q username=%q password=%q\n", dom, username, password)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: DENIED (PLAIN) domain=%q username=%q password=%q\n", domain, username, password)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func authenticate_curve(domain, client_key string) bool {
|
|
||||||
for _, dom := range []string{domain, "*"} {
|
|
||||||
if m, ok := auth_pubkeys[dom]; ok {
|
|
||||||
if m[CURVE_ALLOW_ANY] {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: ALLOWED (CURVE any client) domain=%q\n", dom)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if m[client_key] {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: ALLOWED (CURVE) domain=%q client_key=%q\n", dom, client_key)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: DENIED (CURVE) domain=%q client_key=%q\n", domain, client_key)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start authentication.
|
|
||||||
//
|
|
||||||
// Note that until you add policies, all incoming NULL connections are allowed
|
|
||||||
// (classic ZeroMQ behaviour), and all PLAIN and CURVE connections are denied.
|
|
||||||
func AuthStart() (err error) {
|
|
||||||
if auth_init {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Already running")
|
|
||||||
}
|
|
||||||
return errors.New("Auth is already running")
|
|
||||||
}
|
|
||||||
|
|
||||||
auth_handler, err = NewSocket(REP)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
auth_handler.SetLinger(0)
|
|
||||||
err = auth_handler.Bind("inproc://zeromq.zap.01")
|
|
||||||
if err != nil {
|
|
||||||
auth_handler.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
auth_quit, err = NewSocket(REQ)
|
|
||||||
if err != nil {
|
|
||||||
auth_handler.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
auth_quit.SetLinger(0)
|
|
||||||
err = auth_quit.Connect("inproc://zeromq.zap.01")
|
|
||||||
if err != nil {
|
|
||||||
auth_handler.Close()
|
|
||||||
auth_quit.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
go auth_do_handler()
|
|
||||||
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Starting")
|
|
||||||
}
|
|
||||||
|
|
||||||
auth_init = true
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop authentication.
|
|
||||||
func AuthStop() {
|
|
||||||
if !auth_init {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Not running, can't stop")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Stopping")
|
|
||||||
}
|
|
||||||
_, err := auth_quit.SendMessageDontwait("QUIT")
|
|
||||||
if err != nil && auth_verbose {
|
|
||||||
log.Println("AUTH: Stopping: SendMessageDontwait(\"QUIT\"):", err)
|
|
||||||
}
|
|
||||||
_, err = auth_quit.RecvMessage(0)
|
|
||||||
if err != nil && auth_verbose {
|
|
||||||
log.Println("AUTH: Stopping: RecvMessage:", err)
|
|
||||||
}
|
|
||||||
err = auth_quit.Close()
|
|
||||||
if err != nil && auth_verbose {
|
|
||||||
log.Println("AUTH: Stopping: Close:", err)
|
|
||||||
}
|
|
||||||
if auth_verbose {
|
|
||||||
log.Println("AUTH: Stopped")
|
|
||||||
}
|
|
||||||
|
|
||||||
auth_init = false
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow (whitelist) some addresses for a domain.
|
|
||||||
//
|
|
||||||
// An address can be a single IP address, or an IP address and mask in CIDR notation.
|
|
||||||
//
|
|
||||||
// For NULL, all clients from these addresses will be accepted.
|
|
||||||
//
|
|
||||||
// For PLAIN and CURVE, they will be allowed to continue with authentication.
|
|
||||||
//
|
|
||||||
// You can call this method multiple times to whitelist multiple IP addresses.
|
|
||||||
//
|
|
||||||
// If you whitelist a single address for a domain, any non-whitelisted addresses
|
|
||||||
// for that domain are treated as blacklisted.
|
|
||||||
//
|
|
||||||
// Use domain "*" for all domains.
|
|
||||||
//
|
|
||||||
// For backward compatibility: if domain can be parsed as an IP address, it will be
|
|
||||||
// interpreted as another address, and it and all remaining addresses will be added
|
|
||||||
// to all domains.
|
|
||||||
func AuthAllow(domain string, addresses ...string) {
|
|
||||||
if auth_isIP(domain) {
|
|
||||||
auth_allow_for_domain("*", domain)
|
|
||||||
auth_allow_for_domain("*", addresses...)
|
|
||||||
} else {
|
|
||||||
auth_allow_for_domain(domain, addresses...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_allow_for_domain(domain string, addresses ...string) {
|
|
||||||
if _, ok := auth_allow[domain]; !ok {
|
|
||||||
auth_allow[domain] = make(map[string]bool)
|
|
||||||
auth_allow_net[domain] = make([]*net.IPNet, 0)
|
|
||||||
}
|
|
||||||
for _, address := range addresses {
|
|
||||||
if _, ipnet, err := net.ParseCIDR(address); err == nil {
|
|
||||||
auth_allow_net[domain] = append(auth_allow_net[domain], ipnet)
|
|
||||||
} else if net.ParseIP(address) != nil {
|
|
||||||
auth_allow[domain][address] = true
|
|
||||||
} else {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: Allow for domain %q: %q is not a valid address or network\n", domain, address)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deny (blacklist) some addresses for a domain.
|
|
||||||
//
|
|
||||||
// An address can be a single IP address, or an IP address and mask in CIDR notation.
|
|
||||||
//
|
|
||||||
// For all security mechanisms, this rejects the connection without any further authentication.
|
|
||||||
//
|
|
||||||
// Use either a whitelist for a domain, or a blacklist for a domain, not both.
|
|
||||||
// If you define both a whitelist and a blacklist for a domain, only the whitelist takes effect.
|
|
||||||
//
|
|
||||||
// Use domain "*" for all domains.
|
|
||||||
//
|
|
||||||
// For backward compatibility: if domain can be parsed as an IP address, it will be
|
|
||||||
// interpreted as another address, and it and all remaining addresses will be added
|
|
||||||
// to all domains.
|
|
||||||
func AuthDeny(domain string, addresses ...string) {
|
|
||||||
if auth_isIP(domain) {
|
|
||||||
auth_deny_for_domain("*", domain)
|
|
||||||
auth_deny_for_domain("*", addresses...)
|
|
||||||
} else {
|
|
||||||
auth_deny_for_domain(domain, addresses...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_deny_for_domain(domain string, addresses ...string) {
|
|
||||||
if _, ok := auth_deny[domain]; !ok {
|
|
||||||
auth_deny[domain] = make(map[string]bool)
|
|
||||||
auth_deny_net[domain] = make([]*net.IPNet, 0)
|
|
||||||
}
|
|
||||||
for _, address := range addresses {
|
|
||||||
if _, ipnet, err := net.ParseCIDR(address); err == nil {
|
|
||||||
auth_deny_net[domain] = append(auth_deny_net[domain], ipnet)
|
|
||||||
} else if net.ParseIP(address) != nil {
|
|
||||||
auth_deny[domain][address] = true
|
|
||||||
} else {
|
|
||||||
if auth_verbose {
|
|
||||||
log.Printf("AUTH: Deny for domain %q: %q is not a valid address or network\n", domain, address)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a user for PLAIN authentication for a given domain.
|
|
||||||
//
|
|
||||||
// Set `domain` to "*" to apply to all domains.
|
|
||||||
func AuthPlainAdd(domain, username, password string) {
|
|
||||||
if _, ok := auth_users[domain]; !ok {
|
|
||||||
auth_users[domain] = make(map[string]string)
|
|
||||||
}
|
|
||||||
auth_users[domain][username] = password
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove users from PLAIN authentication for a given domain.
|
|
||||||
func AuthPlainRemove(domain string, usernames ...string) {
|
|
||||||
if u, ok := auth_users[domain]; ok {
|
|
||||||
for _, username := range usernames {
|
|
||||||
delete(u, username)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove all users from PLAIN authentication for a given domain.
|
|
||||||
func AuthPlainRemoveAll(domain string) {
|
|
||||||
delete(auth_users, domain)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add public user keys for CURVE authentication for a given domain.
|
|
||||||
//
|
|
||||||
// To cover all domains, use "*".
|
|
||||||
//
|
|
||||||
// Public keys are in Z85 printable text format.
|
|
||||||
//
|
|
||||||
// To allow all client keys without checking, specify CURVE_ALLOW_ANY for the key.
|
|
||||||
func AuthCurveAdd(domain string, pubkeys ...string) {
|
|
||||||
if _, ok := auth_pubkeys[domain]; !ok {
|
|
||||||
auth_pubkeys[domain] = make(map[string]bool)
|
|
||||||
}
|
|
||||||
for _, key := range pubkeys {
|
|
||||||
auth_pubkeys[domain][key] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove user keys from CURVE authentication for a given domain.
|
|
||||||
func AuthCurveRemove(domain string, pubkeys ...string) {
|
|
||||||
if p, ok := auth_pubkeys[domain]; ok {
|
|
||||||
for _, pubkey := range pubkeys {
|
|
||||||
delete(p, pubkey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove all user keys from CURVE authentication for a given domain.
|
|
||||||
func AuthCurveRemoveAll(domain string) {
|
|
||||||
delete(auth_pubkeys, domain)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable verbose tracing of commands and activity.
|
|
||||||
func AuthSetVerbose(verbose bool) {
|
|
||||||
auth_verbose = verbose
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This function sets the metadata handler that is called by the ZAP
|
|
||||||
handler to retrieve key/value properties that should be set on reply
|
|
||||||
messages in case of a status code "200" (succes).
|
|
||||||
|
|
||||||
Default properties are `Socket-Type`, which is already set, and
|
|
||||||
`Identity` and `User-Id` that are empty by default. The last two can be
|
|
||||||
set, and more properties can be added.
|
|
||||||
|
|
||||||
The `User-Id` property is used for the `user id` frame of the reply
|
|
||||||
message. All other properties are stored in the `metadata` frame of the
|
|
||||||
reply message.
|
|
||||||
|
|
||||||
The default handler returns an empty map.
|
|
||||||
|
|
||||||
For the meaning of the handler arguments, and other details, see:
|
|
||||||
http://rfc.zeromq.org/spec:27#toc10
|
|
||||||
*/
|
|
||||||
func AuthSetMetadataHandler(
|
|
||||||
handler func(
|
|
||||||
version, request_id, domain, address, identity, mechanism string, credentials ...string) (metadata map[string]string)) {
|
|
||||||
auth_meta_handler = handler
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This encodes a key/value pair into the format used by a ZAP handler.
|
|
||||||
|
|
||||||
Returns an error if key is more then 255 characters long.
|
|
||||||
*/
|
|
||||||
func AuthMetaBlob(key, value string) (blob []byte, err error) {
|
|
||||||
if len(key) > 255 {
|
|
||||||
return []byte{}, errors.New("Key too long")
|
|
||||||
}
|
|
||||||
return auth_meta_blob(key, value), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func auth_meta_blob(name, value string) []byte {
|
|
||||||
l1 := len(name)
|
|
||||||
l2 := len(value)
|
|
||||||
b := make([]byte, l1+l2+5)
|
|
||||||
b[0] = byte(l1)
|
|
||||||
b[l1+1] = byte(l2 >> 24 & 255)
|
|
||||||
b[l1+2] = byte(l2 >> 16 & 255)
|
|
||||||
b[l1+3] = byte(l2 >> 8 & 255)
|
|
||||||
b[l1+4] = byte(l2 & 255)
|
|
||||||
copy(b[1:], []byte(name))
|
|
||||||
copy(b[5+l1:], []byte(value))
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
//. Additional functions for configuring server or client socket with a single command
|
|
||||||
|
|
||||||
// Set NULL server role.
|
|
||||||
func (server *Socket) ServerAuthNull(domain string) error {
|
|
||||||
err := server.SetPlainServer(0)
|
|
||||||
if err == nil {
|
|
||||||
err = server.SetZapDomain(domain)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set PLAIN server role.
|
|
||||||
func (server *Socket) ServerAuthPlain(domain string) error {
|
|
||||||
err := server.SetPlainServer(1)
|
|
||||||
if err == nil {
|
|
||||||
err = server.SetZapDomain(domain)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set CURVE server role.
|
|
||||||
func (server *Socket) ServerAuthCurve(domain, secret_key string) error {
|
|
||||||
err := server.SetCurveServer(1)
|
|
||||||
if err == nil {
|
|
||||||
err = server.SetCurveSecretkey(secret_key)
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
err = server.SetZapDomain(domain)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set PLAIN client role.
|
|
||||||
func (client *Socket) ClientAuthPlain(username, password string) error {
|
|
||||||
err := client.SetPlainUsername(username)
|
|
||||||
if err == nil {
|
|
||||||
err = client.SetPlainPassword(password)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set CURVE client role.
|
|
||||||
func (client *Socket) ClientAuthCurve(server_public_key, client_public_key, client_secret_key string) error {
|
|
||||||
err := client.SetCurveServerkey(server_public_key)
|
|
||||||
if err == nil {
|
|
||||||
err = client.SetCurvePublickey(client_public_key)
|
|
||||||
}
|
|
||||||
if err == nil {
|
|
||||||
client.SetCurveSecretkey(client_secret_key)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper function to derive z85 public key from secret key
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
func AuthCurvePublic(z85SecretKey string) (z85PublicKey string, err error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return "", ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
secret := C.CString(z85SecretKey)
|
|
||||||
defer C.free(unsafe.Pointer(secret))
|
|
||||||
public := C.CString(strings.Repeat(" ", 41))
|
|
||||||
defer C.free(unsafe.Pointer(public))
|
|
||||||
if i, err := C.zmq_curve_public(public, secret); int(i) != 0 {
|
|
||||||
return "", errget(err)
|
|
||||||
}
|
|
||||||
z85PublicKey = C.GoString(public)
|
|
||||||
return z85PublicKey, nil
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
#include "zmq4.h"
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sets the scheduling policy for internal context’s thread pool.
|
|
||||||
|
|
||||||
This option requires ZeroMQ version 4.1, and is not available on Windows.
|
|
||||||
|
|
||||||
Supported values for this option can be found in sched.h file, or at
|
|
||||||
http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
|
|
||||||
|
|
||||||
This option only applies before creating any sockets on the context.
|
|
||||||
|
|
||||||
Default value: -1
|
|
||||||
|
|
||||||
Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
|
|
||||||
Returns ErrorNotImplementedWindows on Windows
|
|
||||||
*/
|
|
||||||
func (ctx *Context) SetThreadSchedPolicy(n int) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return setOption(ctx, C.ZMQ_THREAD_SCHED_POLICY, n)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sets scheduling priority for internal context’s thread pool.
|
|
||||||
|
|
||||||
This option requires ZeroMQ version 4.1, and is not available on Windows.
|
|
||||||
|
|
||||||
Supported values for this option depend on chosen scheduling policy.
|
|
||||||
Details can be found in sched.h file, or at
|
|
||||||
http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
|
|
||||||
|
|
||||||
This option only applies before creating any sockets on the context.
|
|
||||||
|
|
||||||
Default value: -1
|
|
||||||
|
|
||||||
Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
|
|
||||||
Returns ErrorNotImplementedWindows on Windows
|
|
||||||
*/
|
|
||||||
func (ctx *Context) SetThreadPriority(n int) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return setOption(ctx, C.ZMQ_THREAD_PRIORITY, n)
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sets the scheduling policy for internal context’s thread pool.
|
|
||||||
|
|
||||||
This option requires ZeroMQ version 4.1, and is not available on Windows.
|
|
||||||
|
|
||||||
Supported values for this option can be found in sched.h file, or at
|
|
||||||
http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
|
|
||||||
|
|
||||||
This option only applies before creating any sockets on the context.
|
|
||||||
|
|
||||||
Default value: -1
|
|
||||||
|
|
||||||
Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
|
|
||||||
Returns ErrorNotImplementedWindows on Windows
|
|
||||||
*/
|
|
||||||
func (ctx *Context) SetThreadSchedPolicy(n int) error {
|
|
||||||
return ErrorNotImplementedWindows
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sets scheduling priority for internal context’s thread pool.
|
|
||||||
|
|
||||||
This option requires ZeroMQ version 4.1, and is not available on Windows.
|
|
||||||
|
|
||||||
Supported values for this option depend on chosen scheduling policy.
|
|
||||||
Details can be found in sched.h file, or at
|
|
||||||
http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html
|
|
||||||
|
|
||||||
This option only applies before creating any sockets on the context.
|
|
||||||
|
|
||||||
Default value: -1
|
|
||||||
|
|
||||||
Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
|
|
||||||
Returns ErrorNotImplementedWindows on Windows
|
|
||||||
*/
|
|
||||||
func (ctx *Context) SetThreadPriority(n int) error {
|
|
||||||
return ErrorNotImplementedWindows
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
A Go interface to ZeroMQ (zmq, 0mq) version 4.
|
|
||||||
|
|
||||||
For ZeroMQ version 3, see: http://github.com/pebbe/zmq3
|
|
||||||
|
|
||||||
For ZeroMQ version 2, see: http://github.com/pebbe/zmq2
|
|
||||||
|
|
||||||
http://www.zeromq.org/
|
|
||||||
|
|
||||||
See also the wiki: https://github.com/pebbe/zmq4/wiki
|
|
||||||
|
|
||||||
A note on the use of a context:
|
|
||||||
|
|
||||||
This package provides a default context. This is what will be used by
|
|
||||||
the functions without a context receiver, that create a socket or
|
|
||||||
manipulate the context. Package developers that import this package
|
|
||||||
should probably not use the default context with its associated
|
|
||||||
functions, but create their own context(s). See: type Context.
|
|
||||||
*/
|
|
||||||
package zmq4
|
|
|
@ -1,5 +0,0 @@
|
||||||
/*
|
|
||||||
|
|
||||||
You need CGO_ENABLED=1 to build this package
|
|
||||||
|
|
||||||
*/
|
|
|
@ -1,92 +0,0 @@
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"syscall"
|
|
||||||
)
|
|
||||||
|
|
||||||
// An Errno is an unsigned number describing an error condition as returned by a call to ZeroMQ.
|
|
||||||
// It implements the error interface.
|
|
||||||
// The number is either a standard system error, or an error defined by the C library of ZeroMQ.
|
|
||||||
type Errno uintptr
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Error conditions defined by the C library of ZeroMQ.
|
|
||||||
|
|
||||||
// On Windows platform some of the standard POSIX errnos are not defined.
|
|
||||||
EADDRINUSE = Errno(C.EADDRINUSE)
|
|
||||||
EADDRNOTAVAIL = Errno(C.EADDRNOTAVAIL)
|
|
||||||
EAFNOSUPPORT = Errno(C.EAFNOSUPPORT)
|
|
||||||
ECONNABORTED = Errno(C.ECONNABORTED)
|
|
||||||
ECONNREFUSED = Errno(C.ECONNREFUSED)
|
|
||||||
ECONNRESET = Errno(C.ECONNRESET)
|
|
||||||
EHOSTUNREACH = Errno(C.EHOSTUNREACH)
|
|
||||||
EINPROGRESS = Errno(C.EINPROGRESS)
|
|
||||||
EMSGSIZE = Errno(C.EMSGSIZE)
|
|
||||||
ENETDOWN = Errno(C.ENETDOWN)
|
|
||||||
ENETRESET = Errno(C.ENETRESET)
|
|
||||||
ENETUNREACH = Errno(C.ENETUNREACH)
|
|
||||||
ENOBUFS = Errno(C.ENOBUFS)
|
|
||||||
ENOTCONN = Errno(C.ENOTCONN)
|
|
||||||
ENOTSOCK = Errno(C.ENOTSOCK)
|
|
||||||
ENOTSUP = Errno(C.ENOTSUP)
|
|
||||||
EPROTONOSUPPORT = Errno(C.EPROTONOSUPPORT)
|
|
||||||
ETIMEDOUT = Errno(C.ETIMEDOUT)
|
|
||||||
|
|
||||||
// Native 0MQ error codes.
|
|
||||||
EFSM = Errno(C.EFSM)
|
|
||||||
EMTHREAD = Errno(C.EMTHREAD)
|
|
||||||
ENOCOMPATPROTO = Errno(C.ENOCOMPATPROTO)
|
|
||||||
ETERM = Errno(C.ETERM)
|
|
||||||
)
|
|
||||||
|
|
||||||
func errget(err error) error {
|
|
||||||
eno, ok := err.(syscall.Errno)
|
|
||||||
if ok {
|
|
||||||
return Errno(eno)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return Errno as string.
|
|
||||||
func (errno Errno) Error() string {
|
|
||||||
if errno >= C.ZMQ_HAUSNUMERO {
|
|
||||||
return C.GoString(C.zmq_strerror(C.int(errno)))
|
|
||||||
}
|
|
||||||
return syscall.Errno(errno).Error()
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Convert error to Errno.
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
|
|
||||||
switch AsErrno(err) {
|
|
||||||
|
|
||||||
case zmq.Errno(syscall.EINTR):
|
|
||||||
// standard system error
|
|
||||||
|
|
||||||
// call was interrupted
|
|
||||||
|
|
||||||
case zmq.ETERM:
|
|
||||||
// error defined by ZeroMQ
|
|
||||||
|
|
||||||
// context was terminated
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
See also: examples/interrupt.go
|
|
||||||
*/
|
|
||||||
func AsErrno(err error) Errno {
|
|
||||||
if eno, ok := err.(Errno); ok {
|
|
||||||
return eno
|
|
||||||
}
|
|
||||||
if eno, ok := err.(syscall.Errno); ok {
|
|
||||||
return Errno(eno)
|
|
||||||
}
|
|
||||||
return Errno(0)
|
|
||||||
}
|
|
|
@ -1,187 +0,0 @@
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Return type for (*Poller)Poll
|
|
||||||
type Polled struct {
|
|
||||||
Socket *Socket // socket with matched event(s)
|
|
||||||
Events State // actual matched event(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Poller struct {
|
|
||||||
items []C.zmq_pollitem_t
|
|
||||||
socks []*Socket
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new Poller
|
|
||||||
func NewPoller() *Poller {
|
|
||||||
return &Poller{
|
|
||||||
items: make([]C.zmq_pollitem_t, 0),
|
|
||||||
socks: make([]*Socket, 0),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add items to the poller
|
|
||||||
//
|
|
||||||
// Events is a bitwise OR of zmq.POLLIN and zmq.POLLOUT
|
|
||||||
//
|
|
||||||
// Returns the id of the item, which can be used as a handle to
|
|
||||||
// (*Poller)Update and as an index into the result of (*Poller)PollAll
|
|
||||||
func (p *Poller) Add(soc *Socket, events State) int {
|
|
||||||
var item C.zmq_pollitem_t
|
|
||||||
item.socket = soc.soc
|
|
||||||
item.fd = 0
|
|
||||||
item.events = C.short(events)
|
|
||||||
p.items = append(p.items, item)
|
|
||||||
p.socks = append(p.socks, soc)
|
|
||||||
return len(p.items) - 1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the events mask of a socket in the poller
|
|
||||||
//
|
|
||||||
// Replaces the Poller's bitmask for the specified id with the events parameter passed
|
|
||||||
//
|
|
||||||
// Returns the previous value, or ErrorNoSocket if the id was out of range
|
|
||||||
func (p *Poller) Update(id int, events State) (previous State, err error) {
|
|
||||||
if id >= 0 && id < len(p.items) {
|
|
||||||
previous = State(p.items[id].events)
|
|
||||||
p.items[id].events = C.short(events)
|
|
||||||
return previous, nil
|
|
||||||
}
|
|
||||||
return 0, ErrorNoSocket
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the events mask of a socket in the poller
|
|
||||||
//
|
|
||||||
// Replaces the Poller's bitmask for the specified socket with the events parameter passed
|
|
||||||
//
|
|
||||||
// Returns the previous value, or ErrorNoSocket if the socket didn't match
|
|
||||||
func (p *Poller) UpdateBySocket(soc *Socket, events State) (previous State, err error) {
|
|
||||||
for id, s := range p.socks {
|
|
||||||
if s == soc {
|
|
||||||
previous = State(p.items[id].events)
|
|
||||||
p.items[id].events = C.short(events)
|
|
||||||
return previous, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, ErrorNoSocket
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove a socket from the poller
|
|
||||||
//
|
|
||||||
// Returns ErrorNoSocket if the id was out of range
|
|
||||||
func (p *Poller) Remove(id int) error {
|
|
||||||
if id >= 0 && id < len(p.items) {
|
|
||||||
if id == len(p.items)-1 {
|
|
||||||
p.items = p.items[:id]
|
|
||||||
p.socks = p.socks[:id]
|
|
||||||
} else {
|
|
||||||
p.items = append(p.items[:id], p.items[id+1:]...)
|
|
||||||
p.socks = append(p.socks[:id], p.socks[id+1:]...)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return ErrorNoSocket
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove a socket from the poller
|
|
||||||
//
|
|
||||||
// Returns ErrorNoSocket if the socket didn't match
|
|
||||||
func (p *Poller) RemoveBySocket(soc *Socket) error {
|
|
||||||
for id, s := range p.socks {
|
|
||||||
if s == soc {
|
|
||||||
return p.Remove(id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ErrorNoSocket
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Input/output multiplexing
|
|
||||||
|
|
||||||
If timeout < 0, wait forever until a matching event is detected
|
|
||||||
|
|
||||||
Only sockets with matching socket events are returned in the list.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
poller := zmq.NewPoller()
|
|
||||||
poller.Add(socket0, zmq.POLLIN)
|
|
||||||
poller.Add(socket1, zmq.POLLIN)
|
|
||||||
// Process messages from both sockets
|
|
||||||
for {
|
|
||||||
sockets, _ := poller.Poll(-1)
|
|
||||||
for _, socket := range sockets {
|
|
||||||
switch s := socket.Socket; s {
|
|
||||||
case socket0:
|
|
||||||
msg, _ := s.Recv(0)
|
|
||||||
// Process msg
|
|
||||||
case socket1:
|
|
||||||
msg, _ := s.Recv(0)
|
|
||||||
// Process msg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
func (p *Poller) Poll(timeout time.Duration) ([]Polled, error) {
|
|
||||||
return p.poll(timeout, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is like (*Poller)Poll, but it returns a list of all sockets,
|
|
||||||
in the same order as they were added to the poller,
|
|
||||||
not just those sockets that had an event.
|
|
||||||
|
|
||||||
For each socket in the list, you have to check the Events field
|
|
||||||
to see if there was actually an event.
|
|
||||||
|
|
||||||
When error is not nil, the return list contains no sockets.
|
|
||||||
*/
|
|
||||||
func (p *Poller) PollAll(timeout time.Duration) ([]Polled, error) {
|
|
||||||
return p.poll(timeout, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Poller) poll(timeout time.Duration, all bool) ([]Polled, error) {
|
|
||||||
lst := make([]Polled, 0, len(p.items))
|
|
||||||
|
|
||||||
for _, soc := range p.socks {
|
|
||||||
if !soc.opened {
|
|
||||||
return lst, ErrorSocketClosed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t := timeout
|
|
||||||
if t > 0 {
|
|
||||||
t = t / time.Millisecond
|
|
||||||
}
|
|
||||||
if t < 0 {
|
|
||||||
t = -1
|
|
||||||
}
|
|
||||||
rv, err := C.zmq_poll(&p.items[0], C.int(len(p.items)), C.long(t))
|
|
||||||
if rv < 0 {
|
|
||||||
return lst, errget(err)
|
|
||||||
}
|
|
||||||
for i, it := range p.items {
|
|
||||||
if all || it.events&it.revents != 0 {
|
|
||||||
lst = append(lst, Polled{p.socks[i], State(it.revents)})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lst, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Poller as string.
|
|
||||||
func (p *Poller) String() string {
|
|
||||||
str := make([]string, 0)
|
|
||||||
for i, poll := range p.items {
|
|
||||||
str = append(str, fmt.Sprintf("%v%v", p.socks[i], State(poll.events)))
|
|
||||||
}
|
|
||||||
return fmt.Sprint("Poller", str)
|
|
||||||
}
|
|
|
@ -1,194 +0,0 @@
|
||||||
package zmq4
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type reactor_socket struct {
|
|
||||||
e State
|
|
||||||
f func(State) error
|
|
||||||
}
|
|
||||||
|
|
||||||
type reactor_channel struct {
|
|
||||||
ch <-chan interface{}
|
|
||||||
f func(interface{}) error
|
|
||||||
limit int
|
|
||||||
}
|
|
||||||
|
|
||||||
type Reactor struct {
|
|
||||||
sockets map[*Socket]*reactor_socket
|
|
||||||
channels map[uint64]*reactor_channel
|
|
||||||
p *Poller
|
|
||||||
idx uint64
|
|
||||||
remove []uint64
|
|
||||||
verbose bool
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Create a reactor to mix the handling of sockets and channels (timers or other channels).
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
reactor := zmq.NewReactor()
|
|
||||||
reactor.AddSocket(socket1, zmq.POLLIN, socket1_handler)
|
|
||||||
reactor.AddSocket(socket2, zmq.POLLIN, socket2_handler)
|
|
||||||
reactor.AddChannelTime(time.Tick(time.Second), 1, ticker_handler)
|
|
||||||
reactor.Run(time.Second)
|
|
||||||
*/
|
|
||||||
func NewReactor() *Reactor {
|
|
||||||
r := &Reactor{
|
|
||||||
sockets: make(map[*Socket]*reactor_socket),
|
|
||||||
channels: make(map[uint64]*reactor_channel),
|
|
||||||
p: NewPoller(),
|
|
||||||
remove: make([]uint64, 0),
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add socket handler to the reactor.
|
|
||||||
//
|
|
||||||
// You can have only one handler per socket. Adding a second one will remove the first.
|
|
||||||
//
|
|
||||||
// The handler receives the socket state as an argument: POLLIN, POLLOUT, or both.
|
|
||||||
func (r *Reactor) AddSocket(soc *Socket, events State, handler func(State) error) {
|
|
||||||
r.RemoveSocket(soc)
|
|
||||||
r.sockets[soc] = &reactor_socket{e: events, f: handler}
|
|
||||||
r.p.Add(soc, events)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove a socket handler from the reactor.
|
|
||||||
func (r *Reactor) RemoveSocket(soc *Socket) {
|
|
||||||
if _, ok := r.sockets[soc]; ok {
|
|
||||||
delete(r.sockets, soc)
|
|
||||||
// rebuild poller
|
|
||||||
r.p = NewPoller()
|
|
||||||
for s, props := range r.sockets {
|
|
||||||
r.p.Add(s, props.e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add channel handler to the reactor.
|
|
||||||
//
|
|
||||||
// Returns id of added handler, that can be used later to remove it.
|
|
||||||
//
|
|
||||||
// If limit is positive, at most this many items will be handled in each run through the main loop,
|
|
||||||
// otherwise it will process as many items as possible.
|
|
||||||
//
|
|
||||||
// The handler function receives the value received from the channel.
|
|
||||||
func (r *Reactor) AddChannel(ch <-chan interface{}, limit int, handler func(interface{}) error) (id uint64) {
|
|
||||||
r.idx++
|
|
||||||
id = r.idx
|
|
||||||
r.channels[id] = &reactor_channel{ch: ch, f: handler, limit: limit}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function wraps AddChannel, using a channel of type time.Time instead of type interface{}.
|
|
||||||
func (r *Reactor) AddChannelTime(ch <-chan time.Time, limit int, handler func(interface{}) error) (id uint64) {
|
|
||||||
ch2 := make(chan interface{})
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
a, ok := <-ch
|
|
||||||
if !ok {
|
|
||||||
close(ch2)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
ch2 <- a
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return r.AddChannel(ch2, limit, handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove a channel from the reactor.
|
|
||||||
//
|
|
||||||
// Closed channels are removed automatically.
|
|
||||||
func (r *Reactor) RemoveChannel(id uint64) {
|
|
||||||
r.remove = append(r.remove, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Reactor) SetVerbose(verbose bool) {
|
|
||||||
r.verbose = verbose
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run the reactor.
|
|
||||||
//
|
|
||||||
// The interval determines the time-out on the polling of sockets.
|
|
||||||
// Interval must be positive if there are channels.
|
|
||||||
// If there are no channels, you can set interval to -1.
|
|
||||||
//
|
|
||||||
// The run alternates between polling/handling sockets (using the interval as timeout),
|
|
||||||
// and reading/handling channels. The reading of channels is without time-out: if there
|
|
||||||
// is no activity on any channel, the run continues to poll sockets immediately.
|
|
||||||
//
|
|
||||||
// The run exits when any handler returns an error, returning that same error.
|
|
||||||
func (r *Reactor) Run(interval time.Duration) (err error) {
|
|
||||||
for {
|
|
||||||
|
|
||||||
// process requests to remove channels
|
|
||||||
for _, id := range r.remove {
|
|
||||||
delete(r.channels, id)
|
|
||||||
}
|
|
||||||
r.remove = r.remove[0:0]
|
|
||||||
|
|
||||||
CHANNELS:
|
|
||||||
for id, ch := range r.channels {
|
|
||||||
limit := ch.limit
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case val, ok := <-ch.ch:
|
|
||||||
if !ok {
|
|
||||||
if r.verbose {
|
|
||||||
fmt.Printf("Reactor(%p) removing closed channel %d\n", r, id)
|
|
||||||
}
|
|
||||||
r.RemoveChannel(id)
|
|
||||||
continue CHANNELS
|
|
||||||
}
|
|
||||||
if r.verbose {
|
|
||||||
fmt.Printf("Reactor(%p) channel %d: %q\n", r, id, val)
|
|
||||||
}
|
|
||||||
err = ch.f(val)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if ch.limit > 0 {
|
|
||||||
limit--
|
|
||||||
if limit == 0 {
|
|
||||||
continue CHANNELS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
continue CHANNELS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(r.channels) > 0 && interval < 0 {
|
|
||||||
return errors.New("There are channels, but polling time-out is infinite")
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(r.sockets) == 0 {
|
|
||||||
if len(r.channels) == 0 {
|
|
||||||
return errors.New("No sockets to poll, no channels to read")
|
|
||||||
}
|
|
||||||
time.Sleep(interval)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
polled, e := r.p.Poll(interval)
|
|
||||||
if e != nil {
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
for _, item := range polled {
|
|
||||||
if r.verbose {
|
|
||||||
fmt.Printf("Reactor(%p) %v\n", r, item)
|
|
||||||
}
|
|
||||||
err = r.sockets[item.Socket].f(item.Events)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
|
@ -1,648 +0,0 @@
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "zmq4.h"
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (soc *Socket) getString(opt C.int, bufsize int) (string, error) {
|
|
||||||
if !soc.opened {
|
|
||||||
return "", ErrorSocketClosed
|
|
||||||
}
|
|
||||||
value := make([]byte, bufsize)
|
|
||||||
size := C.size_t(bufsize)
|
|
||||||
if i, err := C.zmq_getsockopt(soc.soc, opt, unsafe.Pointer(&value[0]), &size); i != 0 {
|
|
||||||
return "", errget(err)
|
|
||||||
}
|
|
||||||
return strings.TrimRight(string(value[:int(size)]), "\x00"), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) getStringRaw(opt C.int, bufsize int) (string, error) {
|
|
||||||
if !soc.opened {
|
|
||||||
return "", ErrorSocketClosed
|
|
||||||
}
|
|
||||||
value := make([]byte, bufsize)
|
|
||||||
size := C.size_t(bufsize)
|
|
||||||
if i, err := C.zmq_getsockopt(soc.soc, opt, unsafe.Pointer(&value[0]), &size); i != 0 {
|
|
||||||
return "", errget(err)
|
|
||||||
}
|
|
||||||
return string(value[:int(size)]), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) getInt(opt C.int) (int, error) {
|
|
||||||
if !soc.opened {
|
|
||||||
return 0, ErrorSocketClosed
|
|
||||||
}
|
|
||||||
value := C.int(0)
|
|
||||||
size := C.size_t(unsafe.Sizeof(value))
|
|
||||||
if i, err := C.zmq_getsockopt(soc.soc, opt, unsafe.Pointer(&value), &size); i != 0 {
|
|
||||||
return 0, errget(err)
|
|
||||||
}
|
|
||||||
return int(value), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) getInt64(opt C.int) (int64, error) {
|
|
||||||
if !soc.opened {
|
|
||||||
return 0, ErrorSocketClosed
|
|
||||||
}
|
|
||||||
value := C.int64_t(0)
|
|
||||||
size := C.size_t(unsafe.Sizeof(value))
|
|
||||||
if i, err := C.zmq_getsockopt(soc.soc, opt, unsafe.Pointer(&value), &size); i != 0 {
|
|
||||||
return 0, errget(err)
|
|
||||||
}
|
|
||||||
return int64(value), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) getUInt64(opt C.int) (uint64, error) {
|
|
||||||
if !soc.opened {
|
|
||||||
return 0, ErrorSocketClosed
|
|
||||||
}
|
|
||||||
value := C.uint64_t(0)
|
|
||||||
size := C.size_t(unsafe.Sizeof(value))
|
|
||||||
if i, err := C.zmq_getsockopt(soc.soc, opt, unsafe.Pointer(&value), &size); i != 0 {
|
|
||||||
return 0, errget(err)
|
|
||||||
}
|
|
||||||
return uint64(value), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TYPE: Retrieve socket type
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc43
|
|
||||||
func (soc *Socket) GetType() (Type, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_TYPE)
|
|
||||||
return Type(v), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVMORE: More message data parts to follow
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc30
|
|
||||||
func (soc *Socket) GetRcvmore() (bool, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_RCVMORE)
|
|
||||||
return v != 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SNDHWM: Retrieves high water mark for outbound messages
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc36
|
|
||||||
func (soc *Socket) GetSndhwm() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_SNDHWM)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVHWM: Retrieve high water mark for inbound messages
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc29
|
|
||||||
func (soc *Socket) GetRcvhwm() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_RCVHWM)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_AFFINITY: Retrieve I/O thread affinity
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc3
|
|
||||||
func (soc *Socket) GetAffinity() (uint64, error) {
|
|
||||||
return soc.getUInt64(C.ZMQ_AFFINITY)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_IDENTITY: Retrieve socket identity
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc15
|
|
||||||
func (soc *Socket) GetIdentity() (string, error) {
|
|
||||||
return soc.getString(C.ZMQ_IDENTITY, 256)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RATE: Retrieve multicast data rate
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc27
|
|
||||||
func (soc *Socket) GetRate() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_RATE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RECOVERY_IVL: Get multicast recovery interval
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc34
|
|
||||||
func (soc *Socket) GetRecoveryIvl() (time.Duration, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_RECOVERY_IVL)
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SNDBUF: Retrieve kernel transmit buffer size
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc35
|
|
||||||
func (soc *Socket) GetSndbuf() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_SNDBUF)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVBUF: Retrieve kernel receive buffer size
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc28
|
|
||||||
func (soc *Socket) GetRcvbuf() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_RCVBUF)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_LINGER: Retrieve linger period for socket shutdown
|
|
||||||
//
|
|
||||||
// Returns time.Duration(-1) for infinite
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc20
|
|
||||||
func (soc *Socket) GetLinger() (time.Duration, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_LINGER)
|
|
||||||
if v < 0 {
|
|
||||||
return time.Duration(-1), err
|
|
||||||
}
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RECONNECT_IVL: Retrieve reconnection interval
|
|
||||||
//
|
|
||||||
// Returns time.Duration(-1) for no reconnection
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc32
|
|
||||||
func (soc *Socket) GetReconnectIvl() (time.Duration, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_RECONNECT_IVL)
|
|
||||||
if v < 0 {
|
|
||||||
return time.Duration(-1), err
|
|
||||||
}
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RECONNECT_IVL_MAX: Retrieve maximum reconnection interval
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc33
|
|
||||||
func (soc *Socket) GetReconnectIvlMax() (time.Duration, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_RECONNECT_IVL_MAX)
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_BACKLOG: Retrieve maximum length of the queue of outstanding connections
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc4
|
|
||||||
func (soc *Socket) GetBacklog() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_BACKLOG)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MAXMSGSIZE: Maximum acceptable inbound message size
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc21
|
|
||||||
func (soc *Socket) GetMaxmsgsize() (int64, error) {
|
|
||||||
return soc.getInt64(C.ZMQ_MAXMSGSIZE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MULTICAST_HOPS: Maximum network hops for multicast packets
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc23
|
|
||||||
func (soc *Socket) GetMulticastHops() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_MULTICAST_HOPS)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVTIMEO: Maximum time before a socket operation returns with EAGAIN
|
|
||||||
//
|
|
||||||
// Returns time.Duration(-1) for infinite
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc31
|
|
||||||
func (soc *Socket) GetRcvtimeo() (time.Duration, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_RCVTIMEO)
|
|
||||||
if v < 0 {
|
|
||||||
return time.Duration(-1), err
|
|
||||||
}
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SNDTIMEO: Maximum time before a socket operation returns with EAGAIN
|
|
||||||
//
|
|
||||||
// Returns time.Duration(-1) for infinite
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc37
|
|
||||||
func (soc *Socket) GetSndtimeo() (time.Duration, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_SNDTIMEO)
|
|
||||||
if v < 0 {
|
|
||||||
return time.Duration(-1), err
|
|
||||||
}
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_IPV6: Retrieve IPv6 socket status
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc18
|
|
||||||
func (soc *Socket) GetIpv6() (bool, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_IPV6)
|
|
||||||
return v != 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_IMMEDIATE: Retrieve attach-on-connect value
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc16
|
|
||||||
func (soc *Socket) GetImmediate() (bool, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_IMMEDIATE)
|
|
||||||
return v != 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_FD: Retrieve file descriptor associated with the socket
|
|
||||||
// see socketget_unix.go and socketget_windows.go
|
|
||||||
|
|
||||||
// ZMQ_EVENTS: Retrieve socket event state
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc8
|
|
||||||
func (soc *Socket) GetEvents() (State, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_EVENTS)
|
|
||||||
return State(v), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_LAST_ENDPOINT: Retrieve the last endpoint set
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc19
|
|
||||||
func (soc *Socket) GetLastEndpoint() (string, error) {
|
|
||||||
return soc.getString(C.ZMQ_LAST_ENDPOINT, 1024)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE: Override SO_KEEPALIVE socket option
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc38
|
|
||||||
func (soc *Socket) GetTcpKeepalive() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_TCP_KEEPALIVE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE_IDLE: Override TCP_KEEPCNT(or TCP_KEEPALIVE on some OS)
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc40
|
|
||||||
func (soc *Socket) GetTcpKeepaliveIdle() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_TCP_KEEPALIVE_IDLE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE_CNT: Override TCP_KEEPCNT socket option
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc39
|
|
||||||
func (soc *Socket) GetTcpKeepaliveCnt() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_TCP_KEEPALIVE_CNT)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE_INTVL: Override TCP_KEEPINTVL socket option
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc41
|
|
||||||
func (soc *Socket) GetTcpKeepaliveIntvl() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_TCP_KEEPALIVE_INTVL)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MECHANISM: Retrieve current security mechanism
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc22
|
|
||||||
func (soc *Socket) GetMechanism() (Mechanism, error) {
|
|
||||||
v, err := soc.getInt(C.ZMQ_MECHANISM)
|
|
||||||
return Mechanism(v), err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PLAIN_SERVER: Retrieve current PLAIN server role
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc25
|
|
||||||
func (soc *Socket) GetPlainServer() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_PLAIN_SERVER)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PLAIN_USERNAME: Retrieve current PLAIN username
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc26
|
|
||||||
func (soc *Socket) GetPlainUsername() (string, error) {
|
|
||||||
s, err := soc.getString(C.ZMQ_PLAIN_USERNAME, 1024)
|
|
||||||
if n := len(s); n > 0 && s[n-1] == 0 {
|
|
||||||
s = s[:n-1]
|
|
||||||
}
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PLAIN_PASSWORD: Retrieve current password
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc24
|
|
||||||
func (soc *Socket) GetPlainPassword() (string, error) {
|
|
||||||
s, err := soc.getString(C.ZMQ_PLAIN_PASSWORD, 1024)
|
|
||||||
if n := len(s); n > 0 && s[n-1] == 0 {
|
|
||||||
s = s[:n-1]
|
|
||||||
}
|
|
||||||
return s, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_PUBLICKEY: Retrieve current CURVE public key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc5
|
|
||||||
func (soc *Socket) GetCurvePublickeyRaw() (string, error) {
|
|
||||||
return soc.getStringRaw(C.ZMQ_CURVE_PUBLICKEY, 32)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_PUBLICKEY: Retrieve current CURVE public key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc5
|
|
||||||
func (soc *Socket) GetCurvePublickeykeyZ85() (string, error) {
|
|
||||||
return soc.getString(C.ZMQ_CURVE_PUBLICKEY, 41)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SECRETKEY: Retrieve current CURVE secret key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc6
|
|
||||||
func (soc *Socket) GetCurveSecretkeyRaw() (string, error) {
|
|
||||||
return soc.getStringRaw(C.ZMQ_CURVE_SECRETKEY, 32)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SECRETKEY: Retrieve current CURVE secret key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc6
|
|
||||||
func (soc *Socket) GetCurveSecretkeyZ85() (string, error) {
|
|
||||||
return soc.getString(C.ZMQ_CURVE_SECRETKEY, 41)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SERVERKEY: Retrieve current CURVE server key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc7
|
|
||||||
func (soc *Socket) GetCurveServerkeyRaw() (string, error) {
|
|
||||||
return soc.getStringRaw(C.ZMQ_CURVE_SERVERKEY, 32)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SERVERKEY: Retrieve current CURVE server key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc7
|
|
||||||
func (soc *Socket) GetCurveServerkeyZ85() (string, error) {
|
|
||||||
return soc.getString(C.ZMQ_CURVE_SERVERKEY, 41)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_ZAP_DOMAIN: Retrieve RFC 27 authentication domain
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc44
|
|
||||||
func (soc *Socket) GetZapDomain() (string, error) {
|
|
||||||
return soc.getString(C.ZMQ_ZAP_DOMAIN, 1024)
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// New in ZeroMQ 4.1.0
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// + : yes
|
|
||||||
// D : deprecated
|
|
||||||
// o : setsockopt only
|
|
||||||
// implemented documented test
|
|
||||||
// ZMQ_ROUTER_HANDOVER o
|
|
||||||
// ZMQ_TOS + +
|
|
||||||
// ZMQ_IPC_FILTER_PID D
|
|
||||||
// ZMQ_IPC_FILTER_UID D
|
|
||||||
// ZMQ_IPC_FILTER_GID D
|
|
||||||
// ZMQ_CONNECT_RID o
|
|
||||||
// ZMQ_GSSAPI_SERVER + +
|
|
||||||
// ZMQ_GSSAPI_PRINCIPAL + +
|
|
||||||
// ZMQ_GSSAPI_SERVICE_PRINCIPAL + +
|
|
||||||
// ZMQ_GSSAPI_PLAINTEXT + +
|
|
||||||
// ZMQ_HANDSHAKE_IVL + +
|
|
||||||
// ZMQ_SOCKS_PROXY +
|
|
||||||
// ZMQ_XPUB_NODROP o?
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// ZMQ_TOS: Retrieve the Type-of-Service socket override status
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc42
|
|
||||||
func (soc *Socket) GetTos() (int, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return 0, ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.getInt(C.ZMQ_TOS)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CONNECT_RID: SET ONLY
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_SERVER: Retrieve current GSSAPI server role
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc12
|
|
||||||
func (soc *Socket) GetGssapiServer() (bool, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return false, ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_GSSAPI_SERVER)
|
|
||||||
return v != 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_PRINCIPAL: Retrieve the name of the GSSAPI principal
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc11
|
|
||||||
func (soc *Socket) GetGssapiPrincipal() (string, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return "", ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.getString(C.ZMQ_GSSAPI_PRINCIPAL, 1024)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_SERVICE_PRINCIPAL: Retrieve the name of the GSSAPI service principal
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc13
|
|
||||||
func (soc *Socket) GetGssapiServicePrincipal() (string, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return "", ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.getString(C.ZMQ_GSSAPI_SERVICE_PRINCIPAL, 1024)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_PLAINTEXT: Retrieve GSSAPI plaintext or encrypted status
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc10
|
|
||||||
func (soc *Socket) GetGssapiPlaintext() (bool, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return false, ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_GSSAPI_PLAINTEXT)
|
|
||||||
return v != 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_HANDSHAKE_IVL: Retrieve maximum handshake interval
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc14
|
|
||||||
func (soc *Socket) GetHandshakeIvl() (time.Duration, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return time.Duration(0), ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_HANDSHAKE_IVL)
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SOCKS_PROXY: NOT DOCUMENTED
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
func (soc *Socket) GetSocksProxy() (string, error) {
|
|
||||||
if minor < 1 {
|
|
||||||
return "", ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.getString(C.ZMQ_SOCKS_PROXY, 1024)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_XPUB_NODROP: SET ONLY? (not documented)
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// New in ZeroMQ 4.2.0
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// + : yes
|
|
||||||
// o : setsockopt only
|
|
||||||
// implemented documented test
|
|
||||||
// ZMQ_BLOCKY
|
|
||||||
// ZMQ_XPUB_MANUAL o
|
|
||||||
// ZMQ_XPUB_WELCOME_MSG o
|
|
||||||
// ZMQ_STREAM_NOTIFY o
|
|
||||||
// ZMQ_INVERT_MATCHING + +
|
|
||||||
// ZMQ_HEARTBEAT_IVL o
|
|
||||||
// ZMQ_HEARTBEAT_TTL o
|
|
||||||
// ZMQ_HEARTBEAT_TIMEOUT o
|
|
||||||
// ZMQ_XPUB_VERBOSER o
|
|
||||||
// ZMQ_CONNECT_TIMEOUT + +
|
|
||||||
// ZMQ_TCP_MAXRT + +
|
|
||||||
// ZMQ_THREAD_SAFE + +
|
|
||||||
// ZMQ_MULTICAST_MAXTPDU + +
|
|
||||||
// ZMQ_VMCI_BUFFER_SIZE + +
|
|
||||||
// ZMQ_VMCI_BUFFER_MIN_SIZE + +
|
|
||||||
// ZMQ_VMCI_BUFFER_MAX_SIZE + +
|
|
||||||
// ZMQ_VMCI_CONNECT_TIMEOUT + +
|
|
||||||
// ZMQ_USE_FD + +
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// ZMQ_BLOCKY doesn't look like a socket option
|
|
||||||
|
|
||||||
// ZMQ_INVERT_MATCHING: Retrieve inverted filtering status
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc18
|
|
||||||
func (soc *Socket) GetInvertMatching() (int, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return 0, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.getInt(C.ZMQ_INVERT_MATCHING)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CONNECT_TIMEOUT: Retrieve connect() timeout
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc5
|
|
||||||
func (soc *Socket) GetConnectTimeout() (time.Duration, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return time.Duration(0), ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_CONNECT_TIMEOUT)
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_MAXRT: Retrieve Max TCP Retransmit Timeout
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc44
|
|
||||||
func (soc *Socket) GetTcpMaxrt() (time.Duration, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return time.Duration(0), ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_TCP_MAXRT)
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_THREAD_SAFE: Retrieve socket thread safety
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc45
|
|
||||||
func (soc *Socket) GetThreadSafe() (bool, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return false, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_THREAD_SAFE)
|
|
||||||
return v != 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MULTICAST_MAXTPDU: Maximum transport data unit size for multicast packets
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc26
|
|
||||||
func (soc *Socket) GetMulticastMaxtpdu() (int, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return 0, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.getInt(C.ZMQ_MULTICAST_MAXTPDU)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_BUFFER_SIZE: Retrieve buffer size of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc49
|
|
||||||
func (soc *Socket) GetVmciBufferSize() (uint64, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return 0, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.getUInt64(C.ZMQ_VMCI_BUFFER_SIZE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_BUFFER_MIN_SIZE: Retrieve min buffer size of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc50
|
|
||||||
func (soc *Socket) GetVmciBufferMinSize() (uint64, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return 0, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.getUInt64(C.ZMQ_VMCI_BUFFER_MIN_SIZE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_BUFFER_MAX_SIZE: Retrieve max buffer size of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc51
|
|
||||||
func (soc *Socket) GetVmciBufferMaxSize() (uint64, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return 0, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.getUInt64(C.ZMQ_VMCI_BUFFER_MAX_SIZE)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_CONNECT_TIMEOUT: Retrieve connection timeout of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc52
|
|
||||||
func (soc *Socket) GetVmciConnectTimeout() (time.Duration, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return time.Duration(0), ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
v, err := soc.getInt(C.ZMQ_VMCI_CONNECT_TIMEOUT)
|
|
||||||
return time.Duration(v) * time.Millisecond, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_USE_FD: Retrieve the pre-allocated socket file descriptor
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc29
|
|
||||||
func (soc *Socket) Getusefd() (int, error) {
|
|
||||||
if minor < 2 {
|
|
||||||
return 0, ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.getInt(C.ZMQ_USE_FD)
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
// +build !windows
|
|
||||||
|
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// ZMQ_FD: Retrieve file descriptor associated with the socket
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc9
|
|
||||||
func (soc *Socket) GetFd() (int, error) {
|
|
||||||
return soc.getInt(C.ZMQ_FD)
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
ZMQ_FD: Retrieve file descriptor associated with the socket
|
|
||||||
|
|
||||||
See: http://api.zeromq.org/4-1:zmq-getsockopt#toc9
|
|
||||||
*/
|
|
||||||
func (soc *Socket) GetFd() (uintptr, error) {
|
|
||||||
value := C.SOCKET(0)
|
|
||||||
size := C.size_t(unsafe.Sizeof(value))
|
|
||||||
if i, err := C.zmq_getsockopt(soc.soc, C.ZMQ_FD, unsafe.Pointer(&value), &size); i != 0 {
|
|
||||||
return uintptr(0), errget(err)
|
|
||||||
}
|
|
||||||
return uintptr(value), nil
|
|
||||||
}
|
|
|
@ -1,800 +0,0 @@
|
||||||
package zmq4
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <zmq.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "zmq4.h"
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (soc *Socket) setString(opt C.int, s string) error {
|
|
||||||
if !soc.opened {
|
|
||||||
return ErrorSocketClosed
|
|
||||||
}
|
|
||||||
cs := C.CString(s)
|
|
||||||
defer C.free(unsafe.Pointer(cs))
|
|
||||||
if i, err := C.zmq_setsockopt(soc.soc, opt, unsafe.Pointer(cs), C.size_t(len(s))); i != 0 {
|
|
||||||
return errget(err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) setNullString(opt C.int) error {
|
|
||||||
if !soc.opened {
|
|
||||||
return ErrorSocketClosed
|
|
||||||
}
|
|
||||||
if i, err := C.zmq_setsockopt(soc.soc, opt, nil, 0); i != 0 {
|
|
||||||
return errget(err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) setInt(opt C.int, value int) error {
|
|
||||||
if !soc.opened {
|
|
||||||
return ErrorSocketClosed
|
|
||||||
}
|
|
||||||
val := C.int(value)
|
|
||||||
if i, err := C.zmq_setsockopt(soc.soc, opt, unsafe.Pointer(&val), C.size_t(unsafe.Sizeof(val))); i != 0 {
|
|
||||||
return errget(err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) setInt64(opt C.int, value int64) error {
|
|
||||||
if !soc.opened {
|
|
||||||
return ErrorSocketClosed
|
|
||||||
}
|
|
||||||
val := C.int64_t(value)
|
|
||||||
if i, err := C.zmq_setsockopt(soc.soc, opt, unsafe.Pointer(&val), C.size_t(unsafe.Sizeof(val))); i != 0 {
|
|
||||||
return errget(err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) setUInt64(opt C.int, value uint64) error {
|
|
||||||
if !soc.opened {
|
|
||||||
return ErrorSocketClosed
|
|
||||||
}
|
|
||||||
val := C.uint64_t(value)
|
|
||||||
if i, err := C.zmq_setsockopt(soc.soc, opt, unsafe.Pointer(&val), C.size_t(unsafe.Sizeof(val))); i != 0 {
|
|
||||||
return errget(err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SNDHWM: Set high water mark for outbound messages
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc39
|
|
||||||
func (soc *Socket) SetSndhwm(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_SNDHWM, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVHWM: Set high water mark for inbound messages
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc28
|
|
||||||
func (soc *Socket) SetRcvhwm(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_RCVHWM, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_AFFINITY: Set I/O thread affinity
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc3
|
|
||||||
func (soc *Socket) SetAffinity(value uint64) error {
|
|
||||||
return soc.setUInt64(C.ZMQ_AFFINITY, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SUBSCRIBE: Establish message filter
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc41
|
|
||||||
func (soc *Socket) SetSubscribe(filter string) error {
|
|
||||||
return soc.setString(C.ZMQ_SUBSCRIBE, filter)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_UNSUBSCRIBE: Remove message filter
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc47
|
|
||||||
func (soc *Socket) SetUnsubscribe(filter string) error {
|
|
||||||
return soc.setString(C.ZMQ_UNSUBSCRIBE, filter)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_IDENTITY: Set socket identity
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc16
|
|
||||||
func (soc *Socket) SetIdentity(value string) error {
|
|
||||||
return soc.setString(C.ZMQ_IDENTITY, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RATE: Set multicast data rate
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc26
|
|
||||||
func (soc *Socket) SetRate(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_RATE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RECOVERY_IVL: Set multicast recovery interval
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc32
|
|
||||||
func (soc *Socket) SetRecoveryIvl(value time.Duration) error {
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_RECOVERY_IVL, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SNDBUF: Set kernel transmit buffer size
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc38
|
|
||||||
func (soc *Socket) SetSndbuf(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_SNDBUF, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVBUF: Set kernel receive buffer size
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc27
|
|
||||||
func (soc *Socket) SetRcvbuf(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_RCVBUF, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_LINGER: Set linger period for socket shutdown
|
|
||||||
//
|
|
||||||
// For infinite, use -1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc19
|
|
||||||
func (soc *Socket) SetLinger(value time.Duration) error {
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
if value == -1 {
|
|
||||||
val = -1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_LINGER, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RECONNECT_IVL: Set reconnection interval
|
|
||||||
//
|
|
||||||
// For no reconnection, use -1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc30
|
|
||||||
func (soc *Socket) SetReconnectIvl(value time.Duration) error {
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
if value == -1 {
|
|
||||||
val = -1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_RECONNECT_IVL, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RECONNECT_IVL_MAX: Set maximum reconnection interval
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc31
|
|
||||||
func (soc *Socket) SetReconnectIvlMax(value time.Duration) error {
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_RECONNECT_IVL_MAX, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_BACKLOG: Set maximum length of the queue of outstanding connections
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc4
|
|
||||||
func (soc *Socket) SetBacklog(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_BACKLOG, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MAXMSGSIZE: Maximum acceptable inbound message size
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc20
|
|
||||||
func (soc *Socket) SetMaxmsgsize(value int64) error {
|
|
||||||
return soc.setInt64(C.ZMQ_MAXMSGSIZE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MULTICAST_HOPS: Maximum network hops for multicast packets
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc21
|
|
||||||
func (soc *Socket) SetMulticastHops(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_MULTICAST_HOPS, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_RCVTIMEO: Maximum time before a recv operation returns with EAGAIN
|
|
||||||
//
|
|
||||||
// For infinite, use -1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc29
|
|
||||||
func (soc *Socket) SetRcvtimeo(value time.Duration) error {
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
if value == -1 {
|
|
||||||
val = -1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_RCVTIMEO, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SNDTIMEO: Maximum time before a send operation returns with EAGAIN
|
|
||||||
//
|
|
||||||
// For infinite, use -1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc40
|
|
||||||
func (soc *Socket) SetSndtimeo(value time.Duration) error {
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
if value == -1 {
|
|
||||||
val = -1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_SNDTIMEO, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_IPV6: Enable IPv6 on socket
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc18
|
|
||||||
func (soc *Socket) SetIpv6(value bool) error {
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_IPV6, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_IMMEDIATE: Queue messages only to completed connections
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc17
|
|
||||||
func (soc *Socket) SetImmediate(value bool) error {
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_IMMEDIATE, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_ROUTER_MANDATORY: accept only routable messages on ROUTER sockets
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc36
|
|
||||||
func (soc *Socket) SetRouterMandatory(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_ROUTER_MANDATORY, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_ROUTER_RAW: switch ROUTER socket to raw mode
|
|
||||||
//
|
|
||||||
// This option is deprecated since ZeroMQ version 4.1, please use ZMQ_STREAM sockets instead.
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc37
|
|
||||||
func (soc *Socket) SetRouterRaw(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_ROUTER_RAW, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PROBE_ROUTER: bootstrap connections to ROUTER sockets
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc25
|
|
||||||
func (soc *Socket) SetProbeRouter(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_PROBE_ROUTER, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_XPUB_VERBOSE: provide all subscription messages on XPUB sockets
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc48
|
|
||||||
func (soc *Socket) SetXpubVerbose(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_XPUB_VERBOSE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_REQ_CORRELATE: match replies with requests
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc33
|
|
||||||
func (soc *Socket) SetReqCorrelate(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_REQ_CORRELATE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_REQ_RELAXED: relax strict alternation between request and reply
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc34
|
|
||||||
func (soc *Socket) SetReqRelaxed(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_REQ_RELAXED, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE: Override SO_KEEPALIVE socket option
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc42
|
|
||||||
func (soc *Socket) SetTcpKeepalive(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_TCP_KEEPALIVE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE_IDLE: Override TCP_KEEPCNT(or TCP_KEEPALIVE on some OS)
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc44
|
|
||||||
func (soc *Socket) SetTcpKeepaliveIdle(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_TCP_KEEPALIVE_IDLE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE_CNT: Override TCP_KEEPCNT socket option
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc43
|
|
||||||
func (soc *Socket) SetTcpKeepaliveCnt(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_TCP_KEEPALIVE_CNT, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_KEEPALIVE_INTVL: Override TCP_KEEPINTVL socket option
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc45
|
|
||||||
func (soc *Socket) SetTcpKeepaliveIntvl(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_TCP_KEEPALIVE_INTVL, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_ACCEPT_FILTER: Assign filters to allow new TCP connections
|
|
||||||
//
|
|
||||||
// This option is deprecated since ZeroMQ version 4.1, please use authentication via
|
|
||||||
// the ZAP API and IP address whitelisting / blacklisting.
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc50
|
|
||||||
func (soc *Socket) SetTcpAcceptFilter(filter string) error {
|
|
||||||
if len(filter) == 0 {
|
|
||||||
return soc.setNullString(C.ZMQ_TCP_ACCEPT_FILTER)
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_TCP_ACCEPT_FILTER, filter)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PLAIN_SERVER: Set PLAIN server role
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc23
|
|
||||||
func (soc *Socket) SetPlainServer(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_PLAIN_SERVER, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PLAIN_USERNAME: Set PLAIN security username
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc24
|
|
||||||
func (soc *Socket) SetPlainUsername(username string) error {
|
|
||||||
if len(username) == 0 {
|
|
||||||
return soc.setNullString(C.ZMQ_PLAIN_USERNAME)
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_PLAIN_USERNAME, username)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_PLAIN_PASSWORD: Set PLAIN security password
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc22
|
|
||||||
func (soc *Socket) SetPlainPassword(password string) error {
|
|
||||||
if len(password) == 0 {
|
|
||||||
return soc.setNullString(C.ZMQ_PLAIN_PASSWORD)
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_PLAIN_PASSWORD, password)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SERVER: Set CURVE server role
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc9
|
|
||||||
func (soc *Socket) SetCurveServer(value int) error {
|
|
||||||
return soc.setInt(C.ZMQ_CURVE_SERVER, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_PUBLICKEY: Set CURVE public key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc7
|
|
||||||
func (soc *Socket) SetCurvePublickey(key string) error {
|
|
||||||
return soc.setString(C.ZMQ_CURVE_PUBLICKEY, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SECRETKEY: Set CURVE secret key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc8
|
|
||||||
func (soc *Socket) SetCurveSecretkey(key string) error {
|
|
||||||
return soc.setString(C.ZMQ_CURVE_SECRETKEY, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CURVE_SERVERKEY: Set CURVE server key
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc10
|
|
||||||
func (soc *Socket) SetCurveServerkey(key string) error {
|
|
||||||
return soc.setString(C.ZMQ_CURVE_SERVERKEY, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_ZAP_DOMAIN: Set RFC 27 authentication domain
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc49
|
|
||||||
func (soc *Socket) SetZapDomain(domain string) error {
|
|
||||||
return soc.setString(C.ZMQ_ZAP_DOMAIN, domain)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CONFLATE: Keep only last message
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc6
|
|
||||||
func (soc *Socket) SetConflate(value bool) error {
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_CONFLATE, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// New in ZeroMQ 4.1.0
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// + : yes
|
|
||||||
// D : deprecated
|
|
||||||
// implemented documented test
|
|
||||||
// ZMQ_ROUTER_HANDOVER + +
|
|
||||||
// ZMQ_TOS + +
|
|
||||||
// ZMQ_IPC_FILTER_PID D
|
|
||||||
// ZMQ_IPC_FILTER_UID D
|
|
||||||
// ZMQ_IPC_FILTER_GID D
|
|
||||||
// ZMQ_CONNECT_RID + +
|
|
||||||
// ZMQ_GSSAPI_SERVER + +
|
|
||||||
// ZMQ_GSSAPI_PRINCIPAL + +
|
|
||||||
// ZMQ_GSSAPI_SERVICE_PRINCIPAL + +
|
|
||||||
// ZMQ_GSSAPI_PLAINTEXT + +
|
|
||||||
// ZMQ_HANDSHAKE_IVL + +
|
|
||||||
// ZMQ_SOCKS_PROXY +
|
|
||||||
// ZMQ_XPUB_NODROP +
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// ZMQ_ROUTER_HANDOVER: handle duplicate client identities on ROUTER sockets
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc35
|
|
||||||
func (soc *Socket) SetRouterHandover(value bool) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_ROUTER_HANDOVER, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TOS: Set the Type-of-Service on socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc46
|
|
||||||
func (soc *Socket) SetTos(value int) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_TOS, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CONNECT_RID: Assign the next outbound connection id
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc5
|
|
||||||
func (soc *Socket) SetConnectRid(value string) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
if value == "" {
|
|
||||||
return soc.setNullString(C.ZMQ_CONNECT_RID)
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_CONNECT_RID, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_SERVER: Set GSSAPI server role
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc13
|
|
||||||
func (soc *Socket) SetGssapiServer(value bool) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_GSSAPI_SERVER, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_PRINCIPAL: Set name of GSSAPI principal
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc12
|
|
||||||
func (soc *Socket) SetGssapiPrincipal(value string) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_GSSAPI_PRINCIPAL, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_SERVICE_PRINCIPAL: Set name of GSSAPI service principal
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc14
|
|
||||||
func (soc *Socket) SetGssapiServicePrincipal(value string) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_GSSAPI_SERVICE_PRINCIPAL, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_GSSAPI_PLAINTEXT: Disable GSSAPI encryption
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc11
|
|
||||||
func (soc *Socket) SetGssapiPlaintext(value bool) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_GSSAPI_PLAINTEXT, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_HANDSHAKE_IVL: Set maximum handshake interval
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-1:zmq-setsockopt#toc15
|
|
||||||
func (soc *Socket) SetHandshakeIvl(value time.Duration) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_HANDSHAKE_IVL, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_SOCKS_PROXY: NOT DOCUMENTED
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
func (soc *Socket) SetSocksProxy(value string) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
if value == "" {
|
|
||||||
return soc.setNullString(C.ZMQ_SOCKS_PROXY)
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_SOCKS_PROXY, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Available since ZeroMQ 4.1, documented since ZeroMQ 4.2
|
|
||||||
|
|
||||||
// ZMQ_XPUB_NODROP: do not silently drop messages if SENDHWM is reached
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc60
|
|
||||||
func (soc *Socket) SetXpubNodrop(value bool) error {
|
|
||||||
if minor < 1 {
|
|
||||||
return ErrorNotImplemented41
|
|
||||||
}
|
|
||||||
val := 0
|
|
||||||
if value {
|
|
||||||
val = 1
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_XPUB_NODROP, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// New in ZeroMQ 4.2.0
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// + : yes
|
|
||||||
// o : getsockopt only
|
|
||||||
// implemented documented test
|
|
||||||
// ZMQ_BLOCKY
|
|
||||||
// ZMQ_XPUB_MANUAL + +
|
|
||||||
// ZMQ_XPUB_WELCOME_MSG + +
|
|
||||||
// ZMQ_STREAM_NOTIFY + +
|
|
||||||
// ZMQ_INVERT_MATCHING + +
|
|
||||||
// ZMQ_HEARTBEAT_IVL + +
|
|
||||||
// ZMQ_HEARTBEAT_TTL + +
|
|
||||||
// ZMQ_HEARTBEAT_TIMEOUT + +
|
|
||||||
// ZMQ_XPUB_VERBOSER + +
|
|
||||||
// ZMQ_CONNECT_TIMEOUT + +
|
|
||||||
// ZMQ_TCP_MAXRT + +
|
|
||||||
// ZMQ_THREAD_SAFE o
|
|
||||||
// ZMQ_MULTICAST_MAXTPDU + +
|
|
||||||
// ZMQ_VMCI_BUFFER_SIZE + +
|
|
||||||
// ZMQ_VMCI_BUFFER_MIN_SIZE + +
|
|
||||||
// ZMQ_VMCI_BUFFER_MAX_SIZE + +
|
|
||||||
// ZMQ_VMCI_CONNECT_TIMEOUT + +
|
|
||||||
// ZMQ_USE_FD + +
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// ZMQ_XPUB_MANUAL: change the subscription handling to manual
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc59
|
|
||||||
func (soc *Socket) SetXpubManual(value int) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_XPUB_MANUAL, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_XPUB_WELCOME_MSG: set welcome message that will be received by subscriber when connecting
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc61
|
|
||||||
func (soc *Socket) SetXpubWelcomeMsg(value string) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
if value == "" {
|
|
||||||
return soc.setNullString(C.ZMQ_XPUB_WELCOME_MSG)
|
|
||||||
}
|
|
||||||
return soc.setString(C.ZMQ_XPUB_WELCOME_MSG, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_STREAM_NOTIFY: send connect and disconnect notifications
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc48
|
|
||||||
func (soc *Socket) SetStreamNotify(value int) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_STREAM_NOTIFY, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_INVERT_MATCHING: Invert message filtering
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc22
|
|
||||||
func (soc *Socket) SetInvertMatching(value int) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_INVERT_MATCHING, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_HEARTBEAT_IVL: Set interval between sending ZMTP heartbeats
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc17
|
|
||||||
func (soc *Socket) SetHeartbeatIvl(value time.Duration) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_HEARTBEAT_IVL, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_HEARTBEAT_TTL: Set the TTL value for ZMTP heartbeats
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc19
|
|
||||||
func (soc *Socket) SetHeartbeatTtl(value time.Duration) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_HEARTBEAT_TTL, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_HEARTBEAT_TIMEOUT: Set timeout for ZMTP heartbeats
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc18
|
|
||||||
func (soc *Socket) SetHeartbeatTimeout(value time.Duration) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_HEARTBEAT_TIMEOUT, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_XPUB_VERBOSER: pass subscribe and unsubscribe messages on XPUB socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc58
|
|
||||||
func (soc *Socket) SetXpubVerboser(value int) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_XPUB_VERBOSER, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_CONNECT_TIMEOUT: Set connect() timeout
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc7
|
|
||||||
func (soc *Socket) SetConnectTimeout(value time.Duration) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_CONNECT_TIMEOUT, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_TCP_MAXRT: Set TCP Maximum Retransmit Timeout
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc54
|
|
||||||
func (soc *Socket) SetTcpMaxrt(value time.Duration) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_TCP_MAXRT, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_MULTICAST_MAXTPDU: Maximum transport data unit size for multicast packets
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc27
|
|
||||||
func (soc *Socket) SetMulticastMaxtpdu(value int) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_MULTICAST_MAXTPDU, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_BUFFER_SIZE: Set buffer size of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc68
|
|
||||||
func (soc *Socket) SetVmciBufferSize(value uint64) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setUInt64(C.ZMQ_VMCI_BUFFER_SIZE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_BUFFER_MIN_SIZE: Set min buffer size of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc69
|
|
||||||
func (soc *Socket) SetVmciBufferMinSize(value uint64) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setUInt64(C.ZMQ_VMCI_BUFFER_MIN_SIZE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_BUFFER_MAX_SIZE: Set max buffer size of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc70
|
|
||||||
func (soc *Socket) SetVmciBufferMaxSize(value uint64) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setUInt64(C.ZMQ_VMCI_BUFFER_MAX_SIZE, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_VMCI_CONNECT_TIMEOUT: Set connection timeout of the VMCI socket
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc71
|
|
||||||
func (soc *Socket) SetVmciConnectTimeout(value time.Duration) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
val := int(value / time.Millisecond)
|
|
||||||
return soc.setInt(C.ZMQ_VMCI_CONNECT_TIMEOUT, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ZMQ_USE_FD: Set the pre-allocated socket file descriptor
|
|
||||||
//
|
|
||||||
// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
|
|
||||||
//
|
|
||||||
// See: http://api.zeromq.org/4-2:zmq-setsockopt#toc31
|
|
||||||
func (soc *Socket) SetUseFd(value int) error {
|
|
||||||
if minor < 2 {
|
|
||||||
return ErrorNotImplemented42
|
|
||||||
}
|
|
||||||
return soc.setInt(C.ZMQ_USE_FD, value)
|
|
||||||
}
|
|
|
@ -1,206 +0,0 @@
|
||||||
package zmq4
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
Send multi-part message on socket.
|
|
||||||
|
|
||||||
Any `[]string' or `[][]byte' is split into separate `string's or `[]byte's
|
|
||||||
|
|
||||||
Any other part that isn't a `string' or `[]byte' is converted
|
|
||||||
to `string' with `fmt.Sprintf("%v", part)'.
|
|
||||||
|
|
||||||
Returns total bytes sent.
|
|
||||||
*/
|
|
||||||
func (soc *Socket) SendMessage(parts ...interface{}) (total int, err error) {
|
|
||||||
return soc.sendMessage(0, parts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Like SendMessage(), but adding the DONTWAIT flag.
|
|
||||||
*/
|
|
||||||
func (soc *Socket) SendMessageDontwait(parts ...interface{}) (total int, err error) {
|
|
||||||
return soc.sendMessage(DONTWAIT, parts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (soc *Socket) sendMessage(dontwait Flag, parts ...interface{}) (total int, err error) {
|
|
||||||
|
|
||||||
var last int
|
|
||||||
PARTS:
|
|
||||||
for last = len(parts) - 1; last >= 0; last-- {
|
|
||||||
switch t := parts[last].(type) {
|
|
||||||
case []string:
|
|
||||||
if len(t) > 0 {
|
|
||||||
break PARTS
|
|
||||||
}
|
|
||||||
case [][]byte:
|
|
||||||
if len(t) > 0 {
|
|
||||||
break PARTS
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break PARTS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
opt := SNDMORE | dontwait
|
|
||||||
for i := 0; i <= last; i++ {
|
|
||||||
if i == last {
|
|
||||||
opt = dontwait
|
|
||||||
}
|
|
||||||
switch t := parts[i].(type) {
|
|
||||||
case []string:
|
|
||||||
opt = SNDMORE | dontwait
|
|
||||||
n := len(t) - 1
|
|
||||||
for j, s := range t {
|
|
||||||
if j == n && i == last {
|
|
||||||
opt = dontwait
|
|
||||||
}
|
|
||||||
c, e := soc.Send(s, opt)
|
|
||||||
if e == nil {
|
|
||||||
total += c
|
|
||||||
} else {
|
|
||||||
return -1, e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case [][]byte:
|
|
||||||
opt = SNDMORE | dontwait
|
|
||||||
n := len(t) - 1
|
|
||||||
for j, b := range t {
|
|
||||||
if j == n && i == last {
|
|
||||||
opt = dontwait
|
|
||||||
}
|
|
||||||
c, e := soc.SendBytes(b, opt)
|
|
||||||
if e == nil {
|
|
||||||
total += c
|
|
||||||
} else {
|
|
||||||
return -1, e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case string:
|
|
||||||
c, e := soc.Send(t, opt)
|
|
||||||
if e == nil {
|
|
||||||
total += c
|
|
||||||
} else {
|
|
||||||
return -1, e
|
|
||||||
}
|
|
||||||
case []byte:
|
|
||||||
c, e := soc.SendBytes(t, opt)
|
|
||||||
if e == nil {
|
|
||||||
total += c
|
|
||||||
} else {
|
|
||||||
return -1, e
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
c, e := soc.Send(fmt.Sprintf("%v", t), opt)
|
|
||||||
if e == nil {
|
|
||||||
total += c
|
|
||||||
} else {
|
|
||||||
return -1, e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Receive parts as message from socket.
|
|
||||||
|
|
||||||
Returns last non-nil error code.
|
|
||||||
*/
|
|
||||||
func (soc *Socket) RecvMessage(flags Flag) (msg []string, err error) {
|
|
||||||
msg = make([]string, 0)
|
|
||||||
for {
|
|
||||||
s, e := soc.Recv(flags)
|
|
||||||
if e == nil {
|
|
||||||
msg = append(msg, s)
|
|
||||||
} else {
|
|
||||||
return msg[0:0], e
|
|
||||||
}
|
|
||||||
more, e := soc.GetRcvmore()
|
|
||||||
if e == nil {
|
|
||||||
if !more {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return msg[0:0], e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Receive parts as message from socket.
|
|
||||||
|
|
||||||
Returns last non-nil error code.
|
|
||||||
*/
|
|
||||||
func (soc *Socket) RecvMessageBytes(flags Flag) (msg [][]byte, err error) {
|
|
||||||
msg = make([][]byte, 0)
|
|
||||||
for {
|
|
||||||
b, e := soc.RecvBytes(flags)
|
|
||||||
if e == nil {
|
|
||||||
msg = append(msg, b)
|
|
||||||
} else {
|
|
||||||
return msg[0:0], e
|
|
||||||
}
|
|
||||||
more, e := soc.GetRcvmore()
|
|
||||||
if e == nil {
|
|
||||||
if !more {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return msg[0:0], e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Receive parts as message from socket, including metadata.
|
|
||||||
|
|
||||||
Metadata is picked from the first message part.
|
|
||||||
|
|
||||||
For details about metadata, see RecvWithMetadata().
|
|
||||||
|
|
||||||
Returns last non-nil error code.
|
|
||||||
*/
|
|
||||||
func (soc *Socket) RecvMessageWithMetadata(flags Flag, properties ...string) (msg []string, metadata map[string]string, err error) {
|
|
||||||
b, p, err := soc.RecvMessageBytesWithMetadata(flags, properties...)
|
|
||||||
m := make([]string, len(b))
|
|
||||||
for i, bt := range b {
|
|
||||||
m[i] = string(bt)
|
|
||||||
}
|
|
||||||
return m, p, err
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Receive parts as message from socket, including metadata.
|
|
||||||
|
|
||||||
Metadata is picked from the first message part.
|
|
||||||
|
|
||||||
For details about metadata, see RecvBytesWithMetadata().
|
|
||||||
|
|
||||||
Returns last non-nil error code.
|
|
||||||
*/
|
|
||||||
func (soc *Socket) RecvMessageBytesWithMetadata(flags Flag, properties ...string) (msg [][]byte, metadata map[string]string, err error) {
|
|
||||||
bb := make([][]byte, 0)
|
|
||||||
b, p, err := soc.RecvBytesWithMetadata(flags, properties...)
|
|
||||||
if err != nil {
|
|
||||||
return bb, p, err
|
|
||||||
}
|
|
||||||
for {
|
|
||||||
bb = append(bb, b)
|
|
||||||
|
|
||||||
var more bool
|
|
||||||
more, err = soc.GetRcvmore()
|
|
||||||
if err != nil || !more {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
b, err = soc.RecvBytes(flags)
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return bb, p, err
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,62 +0,0 @@
|
||||||
#if ZMQ_VERSION_MAJOR != 4
|
|
||||||
|
|
||||||
#error "You need ZeroMQ version 4 to build this"
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ZMQ_VERSION_MINOR < 1
|
|
||||||
|
|
||||||
#define ZMQ_CONNECT_RID -1
|
|
||||||
#define ZMQ_GSSAPI -1
|
|
||||||
#define ZMQ_GSSAPI_PLAINTEXT -1
|
|
||||||
#define ZMQ_GSSAPI_PRINCIPAL -1
|
|
||||||
#define ZMQ_GSSAPI_SERVER -1
|
|
||||||
#define ZMQ_GSSAPI_SERVICE_PRINCIPAL -1
|
|
||||||
#define ZMQ_HANDSHAKE_IVL -1
|
|
||||||
#define ZMQ_IPC_FILTER_GID -1
|
|
||||||
#define ZMQ_IPC_FILTER_PID -1
|
|
||||||
#define ZMQ_IPC_FILTER_UID -1
|
|
||||||
#define ZMQ_ROUTER_HANDOVER -1
|
|
||||||
#define ZMQ_SOCKS_PROXY -1
|
|
||||||
#define ZMQ_THREAD_PRIORITY -1
|
|
||||||
#define ZMQ_THREAD_SCHED_POLICY -1
|
|
||||||
#define ZMQ_TOS -1
|
|
||||||
#define ZMQ_XPUB_NODROP -1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ZMQ_VERSION_MINOR < 2
|
|
||||||
|
|
||||||
#define ZMQ_MAX_MSGSZ -1
|
|
||||||
|
|
||||||
#define ZMQ_BLOCKY -1
|
|
||||||
#define ZMQ_XPUB_MANUAL -1
|
|
||||||
#define ZMQ_XPUB_WELCOME_MSG -1
|
|
||||||
#define ZMQ_STREAM_NOTIFY -1
|
|
||||||
#define ZMQ_INVERT_MATCHING -1
|
|
||||||
#define ZMQ_HEARTBEAT_IVL -1
|
|
||||||
#define ZMQ_HEARTBEAT_TTL -1
|
|
||||||
#define ZMQ_HEARTBEAT_TIMEOUT -1
|
|
||||||
#define ZMQ_XPUB_VERBOSER -1
|
|
||||||
#define ZMQ_CONNECT_TIMEOUT -1
|
|
||||||
#define ZMQ_TCP_MAXRT -1
|
|
||||||
#define ZMQ_THREAD_SAFE -1
|
|
||||||
#define ZMQ_MULTICAST_MAXTPDU -1
|
|
||||||
#define ZMQ_VMCI_BUFFER_SIZE -1
|
|
||||||
#define ZMQ_VMCI_BUFFER_MIN_SIZE -1
|
|
||||||
#define ZMQ_VMCI_BUFFER_MAX_SIZE -1
|
|
||||||
#define ZMQ_VMCI_CONNECT_TIMEOUT -1
|
|
||||||
#define ZMQ_USE_FD -1
|
|
||||||
|
|
||||||
#define ZMQ_GROUP_MAX_LENGTH -1
|
|
||||||
|
|
||||||
#define ZMQ_POLLPRI -1
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ZMQ_ROUTING_ID
|
|
||||||
#define ZMQ_ROUTING_ID ZMQ_IDENTITY
|
|
||||||
#endif
|
|
||||||
#ifndef ZMQ_CONNECT_ROUTING_ID
|
|
||||||
#define ZMQ_CONNECT_ROUTING_ID ZMQ_CONNECT_RID
|
|
||||||
#endif
|
|
|
@ -26,8 +26,6 @@ github.com/golang/protobuf/ptypes/timestamp
|
||||||
github.com/konsorten/go-windows-terminal-sequences
|
github.com/konsorten/go-windows-terminal-sequences
|
||||||
# github.com/mattn/go-sqlite3 v1.10.0
|
# github.com/mattn/go-sqlite3 v1.10.0
|
||||||
github.com/mattn/go-sqlite3
|
github.com/mattn/go-sqlite3
|
||||||
# github.com/pebbe/zmq4 v1.0.0
|
|
||||||
github.com/pebbe/zmq4
|
|
||||||
# github.com/pkg/errors v0.8.0
|
# github.com/pkg/errors v0.8.0
|
||||||
github.com/pkg/errors
|
github.com/pkg/errors
|
||||||
# github.com/sirupsen/logrus v1.2.0
|
# github.com/sirupsen/logrus v1.2.0
|
||||||
|
|
Loading…
Reference in New Issue