1package zmq4
2
3/*
4#include <zmq.h>
5#include <stdint.h>
6#include "zmq4.h"
7*/
8import "C"
9
10import (
11	"strings"
12	"time"
13	"unsafe"
14)
15
16func (soc *Socket) getString(opt C.int, bufsize int) (string, error) {
17	if !soc.opened {
18		return "", ErrorSocketClosed
19	}
20	value := make([]byte, bufsize)
21	size := C.size_t(bufsize)
22	var i C.int
23	var err error
24	for {
25		i, err = C.zmq4_getsockopt(soc.soc, opt, unsafe.Pointer(&value[0]), &size)
26		if i == 0 || !soc.ctx.retry(err) {
27			break
28		}
29	}
30	if i != 0 {
31		return "", errget(err)
32	}
33	return strings.TrimRight(string(value[:int(size)]), "\x00"), nil
34}
35
36func (soc *Socket) getStringRaw(opt C.int, bufsize int) (string, error) {
37	if !soc.opened {
38		return "", ErrorSocketClosed
39	}
40	value := make([]byte, bufsize)
41	size := C.size_t(bufsize)
42	var i C.int
43	var err error
44	for {
45		i, err = C.zmq4_getsockopt(soc.soc, opt, unsafe.Pointer(&value[0]), &size)
46		if i == 0 || !soc.ctx.retry(err) {
47			break
48		}
49	}
50	if i != 0 {
51		return "", errget(err)
52	}
53	return string(value[:int(size)]), nil
54}
55
56func (soc *Socket) getInt(opt C.int) (int, error) {
57	if !soc.opened {
58		return 0, ErrorSocketClosed
59	}
60	value := C.int(0)
61	size := C.size_t(unsafe.Sizeof(value))
62	var i C.int
63	var err error
64	for {
65		i, err = C.zmq4_getsockopt(soc.soc, opt, unsafe.Pointer(&value), &size)
66		if i == 0 || !soc.ctx.retry(err) {
67			break
68		}
69	}
70	if i != 0 {
71		return 0, errget(err)
72	}
73	return int(value), nil
74}
75
76func (soc *Socket) getInt64(opt C.int) (int64, error) {
77	if !soc.opened {
78		return 0, ErrorSocketClosed
79	}
80	value := C.int64_t(0)
81	size := C.size_t(unsafe.Sizeof(value))
82	var i C.int
83	var err error
84	for {
85		i, err = C.zmq4_getsockopt(soc.soc, opt, unsafe.Pointer(&value), &size)
86		if i == 0 || !soc.ctx.retry(err) {
87			break
88		}
89	}
90	if i != 0 {
91		return 0, errget(err)
92	}
93	return int64(value), nil
94}
95
96func (soc *Socket) getUInt64(opt C.int) (uint64, error) {
97	if !soc.opened {
98		return 0, ErrorSocketClosed
99	}
100	value := C.uint64_t(0)
101	size := C.size_t(unsafe.Sizeof(value))
102	var i C.int
103	var err error
104	for {
105		i, err = C.zmq4_getsockopt(soc.soc, opt, unsafe.Pointer(&value), &size)
106		if i == 0 || !soc.ctx.retry(err) {
107			break
108		}
109	}
110	if i != 0 {
111		return 0, errget(err)
112	}
113	return uint64(value), nil
114}
115
116// ZMQ_TYPE: Retrieve socket type
117//
118// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc43
119func (soc *Socket) GetType() (Type, error) {
120	v, err := soc.getInt(C.ZMQ_TYPE)
121	return Type(v), err
122}
123
124// ZMQ_RCVMORE: More message data parts to follow
125//
126// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc30
127func (soc *Socket) GetRcvmore() (bool, error) {
128	v, err := soc.getInt(C.ZMQ_RCVMORE)
129	return v != 0, err
130}
131
132// ZMQ_SNDHWM: Retrieves high water mark for outbound messages
133//
134// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc36
135func (soc *Socket) GetSndhwm() (int, error) {
136	return soc.getInt(C.ZMQ_SNDHWM)
137}
138
139// ZMQ_RCVHWM: Retrieve high water mark for inbound messages
140//
141// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc29
142func (soc *Socket) GetRcvhwm() (int, error) {
143	return soc.getInt(C.ZMQ_RCVHWM)
144}
145
146// ZMQ_AFFINITY: Retrieve I/O thread affinity
147//
148// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc3
149func (soc *Socket) GetAffinity() (uint64, error) {
150	return soc.getUInt64(C.ZMQ_AFFINITY)
151}
152
153// ZMQ_IDENTITY: Retrieve socket identity
154//
155// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc15
156func (soc *Socket) GetIdentity() (string, error) {
157	return soc.getString(C.ZMQ_IDENTITY, 256)
158}
159
160// ZMQ_RATE: Retrieve multicast data rate
161//
162// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc27
163func (soc *Socket) GetRate() (int, error) {
164	return soc.getInt(C.ZMQ_RATE)
165}
166
167// ZMQ_RECOVERY_IVL: Get multicast recovery interval
168//
169// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc34
170func (soc *Socket) GetRecoveryIvl() (time.Duration, error) {
171	v, err := soc.getInt(C.ZMQ_RECOVERY_IVL)
172	return time.Duration(v) * time.Millisecond, err
173}
174
175// ZMQ_SNDBUF: Retrieve kernel transmit buffer size
176//
177// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc35
178func (soc *Socket) GetSndbuf() (int, error) {
179	return soc.getInt(C.ZMQ_SNDBUF)
180}
181
182// ZMQ_RCVBUF: Retrieve kernel receive buffer size
183//
184// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc28
185func (soc *Socket) GetRcvbuf() (int, error) {
186	return soc.getInt(C.ZMQ_RCVBUF)
187}
188
189// ZMQ_LINGER: Retrieve linger period for socket shutdown
190//
191// Returns time.Duration(-1) for infinite
192//
193// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc20
194func (soc *Socket) GetLinger() (time.Duration, error) {
195	v, err := soc.getInt(C.ZMQ_LINGER)
196	if v < 0 {
197		return time.Duration(-1), err
198	}
199	return time.Duration(v) * time.Millisecond, err
200}
201
202// ZMQ_RECONNECT_IVL: Retrieve reconnection interval
203//
204// Returns time.Duration(-1) for no reconnection
205//
206// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc32
207func (soc *Socket) GetReconnectIvl() (time.Duration, error) {
208	v, err := soc.getInt(C.ZMQ_RECONNECT_IVL)
209	if v < 0 {
210		return time.Duration(-1), err
211	}
212	return time.Duration(v) * time.Millisecond, err
213}
214
215// ZMQ_RECONNECT_IVL_MAX: Retrieve maximum reconnection interval
216//
217// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc33
218func (soc *Socket) GetReconnectIvlMax() (time.Duration, error) {
219	v, err := soc.getInt(C.ZMQ_RECONNECT_IVL_MAX)
220	return time.Duration(v) * time.Millisecond, err
221}
222
223// ZMQ_BACKLOG: Retrieve maximum length of the queue of outstanding connections
224//
225// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc4
226func (soc *Socket) GetBacklog() (int, error) {
227	return soc.getInt(C.ZMQ_BACKLOG)
228}
229
230// ZMQ_MAXMSGSIZE: Maximum acceptable inbound message size
231//
232// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc21
233func (soc *Socket) GetMaxmsgsize() (int64, error) {
234	return soc.getInt64(C.ZMQ_MAXMSGSIZE)
235}
236
237// ZMQ_MULTICAST_HOPS: Maximum network hops for multicast packets
238//
239// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc23
240func (soc *Socket) GetMulticastHops() (int, error) {
241	return soc.getInt(C.ZMQ_MULTICAST_HOPS)
242}
243
244// ZMQ_RCVTIMEO: Maximum time before a socket operation returns with EAGAIN
245//
246// Returns time.Duration(-1) for infinite
247//
248// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc31
249func (soc *Socket) GetRcvtimeo() (time.Duration, error) {
250	v, err := soc.getInt(C.ZMQ_RCVTIMEO)
251	if v < 0 {
252		return time.Duration(-1), err
253	}
254	return time.Duration(v) * time.Millisecond, err
255}
256
257// ZMQ_SNDTIMEO: Maximum time before a socket operation returns with EAGAIN
258//
259// Returns time.Duration(-1) for infinite
260//
261// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc37
262func (soc *Socket) GetSndtimeo() (time.Duration, error) {
263	v, err := soc.getInt(C.ZMQ_SNDTIMEO)
264	if v < 0 {
265		return time.Duration(-1), err
266	}
267	return time.Duration(v) * time.Millisecond, err
268}
269
270// ZMQ_IPV6: Retrieve IPv6 socket status
271//
272// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc18
273func (soc *Socket) GetIpv6() (bool, error) {
274	v, err := soc.getInt(C.ZMQ_IPV6)
275	return v != 0, err
276}
277
278// ZMQ_IMMEDIATE: Retrieve attach-on-connect value
279//
280// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc16
281func (soc *Socket) GetImmediate() (bool, error) {
282	v, err := soc.getInt(C.ZMQ_IMMEDIATE)
283	return v != 0, err
284}
285
286// ZMQ_FD: Retrieve file descriptor associated with the socket
287// see socketget_unix.go and socketget_windows.go
288
289// ZMQ_EVENTS: Retrieve socket event state
290//
291// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc8
292func (soc *Socket) GetEvents() (State, error) {
293	v, err := soc.getInt(C.ZMQ_EVENTS)
294	return State(v), err
295}
296
297// ZMQ_LAST_ENDPOINT: Retrieve the last endpoint set
298//
299// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc19
300func (soc *Socket) GetLastEndpoint() (string, error) {
301	return soc.getString(C.ZMQ_LAST_ENDPOINT, 1024)
302}
303
304// ZMQ_TCP_KEEPALIVE: Override SO_KEEPALIVE socket option
305//
306// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc38
307func (soc *Socket) GetTcpKeepalive() (int, error) {
308	return soc.getInt(C.ZMQ_TCP_KEEPALIVE)
309}
310
311// ZMQ_TCP_KEEPALIVE_IDLE: Override TCP_KEEPCNT(or TCP_KEEPALIVE on some OS)
312//
313// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc40
314func (soc *Socket) GetTcpKeepaliveIdle() (int, error) {
315	return soc.getInt(C.ZMQ_TCP_KEEPALIVE_IDLE)
316}
317
318// ZMQ_TCP_KEEPALIVE_CNT: Override TCP_KEEPCNT socket option
319//
320// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc39
321func (soc *Socket) GetTcpKeepaliveCnt() (int, error) {
322	return soc.getInt(C.ZMQ_TCP_KEEPALIVE_CNT)
323}
324
325// ZMQ_TCP_KEEPALIVE_INTVL: Override TCP_KEEPINTVL socket option
326//
327// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc41
328func (soc *Socket) GetTcpKeepaliveIntvl() (int, error) {
329	return soc.getInt(C.ZMQ_TCP_KEEPALIVE_INTVL)
330}
331
332// ZMQ_MECHANISM: Retrieve current security mechanism
333//
334// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc22
335func (soc *Socket) GetMechanism() (Mechanism, error) {
336	v, err := soc.getInt(C.ZMQ_MECHANISM)
337	return Mechanism(v), err
338}
339
340// ZMQ_PLAIN_SERVER: Retrieve current PLAIN server role
341//
342// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc25
343func (soc *Socket) GetPlainServer() (int, error) {
344	return soc.getInt(C.ZMQ_PLAIN_SERVER)
345}
346
347// ZMQ_PLAIN_USERNAME: Retrieve current PLAIN username
348//
349// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc26
350func (soc *Socket) GetPlainUsername() (string, error) {
351	s, err := soc.getString(C.ZMQ_PLAIN_USERNAME, 1024)
352	if n := len(s); n > 0 && s[n-1] == 0 {
353		s = s[:n-1]
354	}
355	return s, err
356}
357
358// ZMQ_PLAIN_PASSWORD: Retrieve current password
359//
360// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc24
361func (soc *Socket) GetPlainPassword() (string, error) {
362	s, err := soc.getString(C.ZMQ_PLAIN_PASSWORD, 1024)
363	if n := len(s); n > 0 && s[n-1] == 0 {
364		s = s[:n-1]
365	}
366	return s, err
367}
368
369// ZMQ_CURVE_PUBLICKEY: Retrieve current CURVE public key
370//
371// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc5
372func (soc *Socket) GetCurvePublickeyRaw() (string, error) {
373	return soc.getStringRaw(C.ZMQ_CURVE_PUBLICKEY, 32)
374}
375
376// ZMQ_CURVE_PUBLICKEY: Retrieve current CURVE public key
377//
378// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc5
379func (soc *Socket) GetCurvePublickeykeyZ85() (string, error) {
380	return soc.getString(C.ZMQ_CURVE_PUBLICKEY, 41)
381}
382
383// ZMQ_CURVE_SECRETKEY: Retrieve current CURVE secret key
384//
385// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc6
386func (soc *Socket) GetCurveSecretkeyRaw() (string, error) {
387	return soc.getStringRaw(C.ZMQ_CURVE_SECRETKEY, 32)
388}
389
390// ZMQ_CURVE_SECRETKEY: Retrieve current CURVE secret key
391//
392// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc6
393func (soc *Socket) GetCurveSecretkeyZ85() (string, error) {
394	return soc.getString(C.ZMQ_CURVE_SECRETKEY, 41)
395}
396
397// ZMQ_CURVE_SERVERKEY: Retrieve current CURVE server key
398//
399// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc7
400func (soc *Socket) GetCurveServerkeyRaw() (string, error) {
401	return soc.getStringRaw(C.ZMQ_CURVE_SERVERKEY, 32)
402}
403
404// ZMQ_CURVE_SERVERKEY: Retrieve current CURVE server key
405//
406// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc7
407func (soc *Socket) GetCurveServerkeyZ85() (string, error) {
408	return soc.getString(C.ZMQ_CURVE_SERVERKEY, 41)
409}
410
411// ZMQ_ZAP_DOMAIN: Retrieve RFC 27 authentication domain
412//
413// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc44
414func (soc *Socket) GetZapDomain() (string, error) {
415	return soc.getString(C.ZMQ_ZAP_DOMAIN, 1024)
416}
417
418////////////////////////////////////////////////////////////////
419//
420// New in ZeroMQ 4.1.0
421//
422////////////////////////////////////////////////////////////////
423//
424// + : yes
425// D : deprecated
426// o : setsockopt only
427//                                implemented  documented test
428// ZMQ_ROUTER_HANDOVER                o
429// ZMQ_TOS                            +           +
430// ZMQ_IPC_FILTER_PID                 D
431// ZMQ_IPC_FILTER_UID                 D
432// ZMQ_IPC_FILTER_GID                 D
433// ZMQ_CONNECT_RID                    o
434// ZMQ_GSSAPI_SERVER                  +           +
435// ZMQ_GSSAPI_PRINCIPAL               +           +
436// ZMQ_GSSAPI_SERVICE_PRINCIPAL       +           +
437// ZMQ_GSSAPI_PLAINTEXT               +           +
438// ZMQ_HANDSHAKE_IVL                  +           +
439// ZMQ_SOCKS_PROXY                    +
440// ZMQ_XPUB_NODROP                    o?
441//
442////////////////////////////////////////////////////////////////
443
444// ZMQ_TOS: Retrieve the Type-of-Service socket override status
445//
446// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
447//
448// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc42
449func (soc *Socket) GetTos() (int, error) {
450	if minor < 1 {
451		return 0, ErrorNotImplemented41
452	}
453	return soc.getInt(C.ZMQ_TOS)
454}
455
456// ZMQ_CONNECT_RID: SET ONLY
457
458// ZMQ_GSSAPI_SERVER: Retrieve current GSSAPI server role
459//
460// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
461//
462// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc12
463func (soc *Socket) GetGssapiServer() (bool, error) {
464	if minor < 1 {
465		return false, ErrorNotImplemented41
466	}
467	v, err := soc.getInt(C.ZMQ_GSSAPI_SERVER)
468	return v != 0, err
469}
470
471// ZMQ_GSSAPI_PRINCIPAL: Retrieve the name of the GSSAPI principal
472//
473// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
474//
475// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc11
476func (soc *Socket) GetGssapiPrincipal() (string, error) {
477	if minor < 1 {
478		return "", ErrorNotImplemented41
479	}
480	return soc.getString(C.ZMQ_GSSAPI_PRINCIPAL, 1024)
481}
482
483// ZMQ_GSSAPI_SERVICE_PRINCIPAL: Retrieve the name of the GSSAPI service principal
484//
485// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
486//
487// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc13
488func (soc *Socket) GetGssapiServicePrincipal() (string, error) {
489	if minor < 1 {
490		return "", ErrorNotImplemented41
491	}
492	return soc.getString(C.ZMQ_GSSAPI_SERVICE_PRINCIPAL, 1024)
493}
494
495// ZMQ_GSSAPI_PLAINTEXT: Retrieve GSSAPI plaintext or encrypted status
496//
497// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
498//
499// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc10
500func (soc *Socket) GetGssapiPlaintext() (bool, error) {
501	if minor < 1 {
502		return false, ErrorNotImplemented41
503	}
504	v, err := soc.getInt(C.ZMQ_GSSAPI_PLAINTEXT)
505	return v != 0, err
506}
507
508// ZMQ_HANDSHAKE_IVL: Retrieve maximum handshake interval
509//
510// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
511//
512// See: http://api.zeromq.org/4-1:zmq-getsockopt#toc14
513func (soc *Socket) GetHandshakeIvl() (time.Duration, error) {
514	if minor < 1 {
515		return time.Duration(0), ErrorNotImplemented41
516	}
517	v, err := soc.getInt(C.ZMQ_HANDSHAKE_IVL)
518	return time.Duration(v) * time.Millisecond, err
519}
520
521// ZMQ_SOCKS_PROXY: NOT DOCUMENTED
522//
523// Returns ErrorNotImplemented41 with ZeroMQ version < 4.1
524//
525func (soc *Socket) GetSocksProxy() (string, error) {
526	if minor < 1 {
527		return "", ErrorNotImplemented41
528	}
529	return soc.getString(C.ZMQ_SOCKS_PROXY, 1024)
530}
531
532// ZMQ_XPUB_NODROP: SET ONLY? (not documented)
533
534////////////////////////////////////////////////////////////////
535//
536// New in ZeroMQ 4.2.0
537//
538////////////////////////////////////////////////////////////////
539//
540// + : yes
541// o : setsockopt only
542//                                implemented  documented test
543// ZMQ_BLOCKY
544// ZMQ_XPUB_MANUAL                      o
545// ZMQ_XPUB_WELCOME_MSG                 o
546// ZMQ_STREAM_NOTIFY                    o
547// ZMQ_INVERT_MATCHING                  +         +
548// ZMQ_HEARTBEAT_IVL                    o
549// ZMQ_HEARTBEAT_TTL                    o
550// ZMQ_HEARTBEAT_TIMEOUT                o
551// ZMQ_XPUB_VERBOSER                    o
552// ZMQ_CONNECT_TIMEOUT                  +         +
553// ZMQ_TCP_MAXRT                        +         +
554// ZMQ_THREAD_SAFE                      +         +
555// ZMQ_MULTICAST_MAXTPDU                +         +
556// ZMQ_VMCI_BUFFER_SIZE                 +         +
557// ZMQ_VMCI_BUFFER_MIN_SIZE             +         +
558// ZMQ_VMCI_BUFFER_MAX_SIZE             +         +
559// ZMQ_VMCI_CONNECT_TIMEOUT             +         +
560// ZMQ_USE_FD                           +         +
561//
562////////////////////////////////////////////////////////////////
563
564// ZMQ_BLOCKY doesn't look like a socket option
565
566// ZMQ_INVERT_MATCHING: Retrieve inverted filtering status
567//
568// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
569//
570// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc18
571func (soc *Socket) GetInvertMatching() (int, error) {
572	if minor < 2 {
573		return 0, ErrorNotImplemented42
574	}
575	return soc.getInt(C.ZMQ_INVERT_MATCHING)
576}
577
578// ZMQ_CONNECT_TIMEOUT: Retrieve connect() timeout
579//
580// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
581//
582// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc5
583func (soc *Socket) GetConnectTimeout() (time.Duration, error) {
584	if minor < 2 {
585		return time.Duration(0), ErrorNotImplemented42
586	}
587	v, err := soc.getInt(C.ZMQ_CONNECT_TIMEOUT)
588	return time.Duration(v) * time.Millisecond, err
589}
590
591// ZMQ_TCP_MAXRT: Retrieve Max TCP Retransmit Timeout
592//
593// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
594//
595// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc44
596func (soc *Socket) GetTcpMaxrt() (time.Duration, error) {
597	if minor < 2 {
598		return time.Duration(0), ErrorNotImplemented42
599	}
600	v, err := soc.getInt(C.ZMQ_TCP_MAXRT)
601	return time.Duration(v) * time.Millisecond, err
602}
603
604// ZMQ_THREAD_SAFE: Retrieve socket thread safety
605//
606// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
607//
608// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc45
609func (soc *Socket) GetThreadSafe() (bool, error) {
610	if minor < 2 {
611		return false, ErrorNotImplemented42
612	}
613	v, err := soc.getInt(C.ZMQ_THREAD_SAFE)
614	return v != 0, err
615}
616
617// ZMQ_MULTICAST_MAXTPDU: Maximum transport data unit size for multicast packets
618//
619// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
620//
621// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc26
622func (soc *Socket) GetMulticastMaxtpdu() (int, error) {
623	if minor < 2 {
624		return 0, ErrorNotImplemented42
625	}
626	return soc.getInt(C.ZMQ_MULTICAST_MAXTPDU)
627}
628
629// ZMQ_VMCI_BUFFER_SIZE: Retrieve buffer size of the VMCI socket
630//
631// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
632//
633// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc49
634func (soc *Socket) GetVmciBufferSize() (uint64, error) {
635	if minor < 2 {
636		return 0, ErrorNotImplemented42
637	}
638	return soc.getUInt64(C.ZMQ_VMCI_BUFFER_SIZE)
639}
640
641// ZMQ_VMCI_BUFFER_MIN_SIZE: Retrieve min buffer size of the VMCI socket
642//
643// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
644//
645// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc50
646func (soc *Socket) GetVmciBufferMinSize() (uint64, error) {
647	if minor < 2 {
648		return 0, ErrorNotImplemented42
649	}
650	return soc.getUInt64(C.ZMQ_VMCI_BUFFER_MIN_SIZE)
651}
652
653// ZMQ_VMCI_BUFFER_MAX_SIZE: Retrieve max buffer size of the VMCI socket
654//
655// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
656//
657// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc51
658func (soc *Socket) GetVmciBufferMaxSize() (uint64, error) {
659	if minor < 2 {
660		return 0, ErrorNotImplemented42
661	}
662	return soc.getUInt64(C.ZMQ_VMCI_BUFFER_MAX_SIZE)
663}
664
665// ZMQ_VMCI_CONNECT_TIMEOUT: Retrieve connection timeout of the VMCI socket
666//
667// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
668//
669// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc52
670func (soc *Socket) GetVmciConnectTimeout() (time.Duration, error) {
671	if minor < 2 {
672		return time.Duration(0), ErrorNotImplemented42
673	}
674	v, err := soc.getInt(C.ZMQ_VMCI_CONNECT_TIMEOUT)
675	return time.Duration(v) * time.Millisecond, err
676}
677
678// ZMQ_USE_FD: Retrieve the pre-allocated socket file descriptor
679//
680// Returns ErrorNotImplemented42 with ZeroMQ version < 4.2
681//
682// See: http://api.zeromq.org/4-2:zmq-getsockopt#toc29
683func (soc *Socket) Getusefd() (int, error) {
684	if minor < 2 {
685		return 0, ErrorNotImplemented42
686	}
687	return soc.getInt(C.ZMQ_USE_FD)
688}
689