Backend server for SDL
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

648 lines
18 KiB

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)
}