options.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include "precompiled.hpp"
4 #include <string.h>
5 #include <limits.h>
6 #include <set>
7 
8 #include "options.hpp"
9 #include "err.hpp"
10 #include "macros.hpp"
11 
12 #ifndef ZMQ_HAVE_WINDOWS
13 #include <net/if.h>
14 #endif
15 
16 #if defined IFNAMSIZ
17 #define BINDDEVSIZ IFNAMSIZ
18 #else
19 #define BINDDEVSIZ 16
20 #endif
21 
22 static int sockopt_invalid ()
23 {
24 #if defined(ZMQ_ACT_MILITANT)
25  zmq_assert (false);
26 #endif
27  errno = EINVAL;
28  return -1;
29 }
30 
31 int zmq::do_getsockopt (void *const optval_,
32  size_t *const optvallen_,
33  const std::string &value_)
34 {
35  return do_getsockopt (optval_, optvallen_, value_.c_str (),
36  value_.size () + 1);
37 }
38 
39 int zmq::do_getsockopt (void *const optval_,
40  size_t *const optvallen_,
41  const void *value_,
42  const size_t value_len_)
43 {
44  // TODO behaviour is inconsistent with options_t::getsockopt; there, an
45  // *exact* length match is required except for string-like (but not the
46  // CURVE keys!) (and therefore null-ing remaining memory is a no-op, see
47  // comment below)
48  if (*optvallen_ < value_len_) {
49  return sockopt_invalid ();
50  }
51  memcpy (optval_, value_, value_len_);
52  // TODO why is the remaining memory null-ed?
53  memset (static_cast<char *> (optval_) + value_len_, 0,
54  *optvallen_ - value_len_);
55  *optvallen_ = value_len_;
56  return 0;
57 }
58 
59 #ifdef ZMQ_HAVE_CURVE
60 static int do_getsockopt_curve_key (void *const optval_,
61  const size_t *const optvallen_,
62  const uint8_t (&curve_key_)[CURVE_KEYSIZE])
63 {
64  if (*optvallen_ == CURVE_KEYSIZE) {
65  memcpy (optval_, curve_key_, CURVE_KEYSIZE);
66  return 0;
67  }
68  if (*optvallen_ == CURVE_KEYSIZE_Z85 + 1) {
69  zmq_z85_encode (static_cast<char *> (optval_), curve_key_,
71  return 0;
72  }
73  return sockopt_invalid ();
74 }
75 #endif
76 
77 template <typename T>
78 static int do_setsockopt (const void *const optval_,
79  const size_t optvallen_,
80  T *const out_value_)
81 {
82  if (optvallen_ == sizeof (T)) {
83  memcpy (out_value_, optval_, sizeof (T));
84  return 0;
85  }
86  return sockopt_invalid ();
87 }
88 
89 int zmq::do_setsockopt_int_as_bool_strict (const void *const optval_,
90  const size_t optvallen_,
91  bool *const out_value_)
92 {
93  // TODO handling of values other than 0 or 1 is not consistent,
94  // here it is disallowed, but for other options such as
95  // ZMQ_ROUTER_RAW any positive value is accepted
96  int value = -1;
97  if (do_setsockopt (optval_, optvallen_, &value) == -1)
98  return -1;
99  if (value == 0 || value == 1) {
100  *out_value_ = (value != 0);
101  return 0;
102  }
103  return sockopt_invalid ();
104 }
105 
106 int zmq::do_setsockopt_int_as_bool_relaxed (const void *const optval_,
107  const size_t optvallen_,
108  bool *const out_value_)
109 {
110  int value = -1;
111  if (do_setsockopt (optval_, optvallen_, &value) == -1)
112  return -1;
113  *out_value_ = (value != 0);
114  return 0;
115 }
116 
117 static int
118 do_setsockopt_string_allow_empty_strict (const void *const optval_,
119  const size_t optvallen_,
120  std::string *const out_value_,
121  const size_t max_len_)
122 {
123  // TODO why is optval_ != NULL not allowed in case of optvallen_== 0?
124  // TODO why are empty strings allowed for some socket options, but not for others?
125  if (optval_ == NULL && optvallen_ == 0) {
126  out_value_->clear ();
127  return 0;
128  }
129  if (optval_ != NULL && optvallen_ > 0 && optvallen_ <= max_len_) {
130  out_value_->assign (static_cast<const char *> (optval_), optvallen_);
131  return 0;
132  }
133  return sockopt_invalid ();
134 }
135 
136 static int
137 do_setsockopt_string_allow_empty_relaxed (const void *const optval_,
138  const size_t optvallen_,
139  std::string *const out_value_,
140  const size_t max_len_)
141 {
142  // TODO use either do_setsockopt_string_allow_empty_relaxed or
143  // do_setsockopt_string_allow_empty_strict everywhere
144  if (optvallen_ > 0 && optvallen_ <= max_len_) {
145  out_value_->assign (static_cast<const char *> (optval_), optvallen_);
146  return 0;
147  }
148  return sockopt_invalid ();
149 }
150 
151 template <typename T>
152 static int do_setsockopt_set (const void *const optval_,
153  const size_t optvallen_,
154  std::set<T> *const set_)
155 {
156  if (optvallen_ == 0 && optval_ == NULL) {
157  set_->clear ();
158  return 0;
159  }
160  if (optvallen_ == sizeof (T) && optval_ != NULL) {
161  set_->insert (*(static_cast<const T *> (optval_)));
162  return 0;
163  }
164  return sockopt_invalid ();
165 }
166 
167 // TODO why is 1000 a sensible default?
168 const int default_hwm = 1000;
169 
171  sndhwm (default_hwm),
172  rcvhwm (default_hwm),
173  affinity (0),
174  routing_id_size (0),
175  rate (100),
176  recovery_ivl (10000),
177  multicast_hops (1),
178  multicast_maxtpdu (1500),
179  sndbuf (-1),
180  rcvbuf (-1),
181  tos (0),
182  priority (0),
183  type (-1),
184  linger (-1),
185  connect_timeout (0),
186  tcp_maxrt (0),
187  reconnect_stop (0),
188  reconnect_ivl (100),
189  reconnect_ivl_max (0),
190  backlog (100),
191  maxmsgsize (-1),
192  rcvtimeo (-1),
193  sndtimeo (-1),
194  ipv6 (false),
195  immediate (0),
196  filter (false),
197  invert_matching (false),
198  recv_routing_id (false),
199  raw_socket (false),
200  raw_notify (true),
201  tcp_keepalive (-1),
202  tcp_keepalive_cnt (-1),
203  tcp_keepalive_idle (-1),
204  tcp_keepalive_intvl (-1),
205  mechanism (ZMQ_NULL),
206  as_server (0),
207  gss_principal_nt (ZMQ_GSSAPI_NT_HOSTBASED),
208  gss_service_principal_nt (ZMQ_GSSAPI_NT_HOSTBASED),
209  gss_plaintext (false),
210  socket_id (0),
211  conflate (false),
212  handshake_ivl (30000),
213  connected (false),
214  heartbeat_ttl (0),
215  heartbeat_interval (0),
216  heartbeat_timeout (-1),
217  use_fd (-1),
218  zap_enforce_domain (false),
219  loopback_fastpath (false),
220  multicast_loop (true),
221  in_batch_size (8192),
222  out_batch_size (8192),
223  zero_copy (true),
224  router_notify (0),
225  monitor_event_version (1),
226  wss_trust_system (false),
227  hello_msg (),
228  can_send_hello_msg (false),
229  disconnect_msg (),
230  can_recv_disconnect_msg (false),
231  hiccup_msg (),
232  can_recv_hiccup_msg (false),
233  norm_mode (ZMQ_NORM_CC),
234  norm_unicast_nacks (false),
235  norm_buffer_size (2048),
236  norm_segment_size (1400),
237  norm_block_size (16),
238  norm_num_parity (4),
239  norm_num_autoparity (0),
240  norm_push_enable (false),
241  busy_poll (0)
242 {
243  memset (curve_public_key, 0, CURVE_KEYSIZE);
244  memset (curve_secret_key, 0, CURVE_KEYSIZE);
245  memset (curve_server_key, 0, CURVE_KEYSIZE);
246 #if defined ZMQ_HAVE_VMCI
247  vmci_buffer_size = 0;
248  vmci_buffer_min_size = 0;
249  vmci_buffer_max_size = 0;
250  vmci_connect_timeout = -1;
251 #endif
252 }
253 
254 int zmq::options_t::set_curve_key (uint8_t *destination_,
255  const void *optval_,
256  size_t optvallen_)
257 {
258  switch (optvallen_) {
259  case CURVE_KEYSIZE:
260  memcpy (destination_, optval_, optvallen_);
261  mechanism = ZMQ_CURVE;
262  return 0;
263 
264  case CURVE_KEYSIZE_Z85 + 1: {
265  const std::string s (static_cast<const char *> (optval_),
266  optvallen_);
267 
268  if (zmq_z85_decode (destination_, s.c_str ())) {
269  mechanism = ZMQ_CURVE;
270  return 0;
271  }
272  break;
273  }
274 
275  case CURVE_KEYSIZE_Z85:
276  char z85_key[CURVE_KEYSIZE_Z85 + 1];
277  memcpy (z85_key, reinterpret_cast<const char *> (optval_),
278  optvallen_);
279  z85_key[CURVE_KEYSIZE_Z85] = 0;
280  if (zmq_z85_decode (destination_, z85_key)) {
281  mechanism = ZMQ_CURVE;
282  return 0;
283  }
284  break;
285 
286  default:
287  break;
288  }
289  return -1;
290 }
291 
293 
294 int zmq::options_t::setsockopt (int option_,
295  const void *optval_,
296  size_t optvallen_)
297 {
298  const bool is_int = (optvallen_ == sizeof (int));
299  int value = 0;
300  if (is_int)
301  memcpy (&value, optval_, sizeof (int));
302 #if defined(ZMQ_ACT_MILITANT)
303  bool malformed = true; // Did caller pass a bad option value?
304 #endif
305 
306  switch (option_) {
307  case ZMQ_SNDHWM:
308  if (is_int && value >= 0) {
309  sndhwm = value;
310  return 0;
311  }
312  break;
313 
314  case ZMQ_RCVHWM:
315  if (is_int && value >= 0) {
316  rcvhwm = value;
317  return 0;
318  }
319  break;
320 
321  case ZMQ_AFFINITY:
322  return do_setsockopt (optval_, optvallen_, &affinity);
323 
324  case ZMQ_ROUTING_ID:
325  // Routing id is any binary string from 1 to 255 octets
326  if (optvallen_ > 0 && optvallen_ <= UCHAR_MAX) {
327  routing_id_size = static_cast<unsigned char> (optvallen_);
328  memcpy (routing_id, optval_, routing_id_size);
329  return 0;
330  }
331  break;
332 
333  case ZMQ_RATE:
334  if (is_int && value > 0) {
335  rate = value;
336  return 0;
337  }
338  break;
339 
340  case ZMQ_RECOVERY_IVL:
341  if (is_int && value >= 0) {
342  recovery_ivl = value;
343  return 0;
344  }
345  break;
346 
347  case ZMQ_SNDBUF:
348  if (is_int && value >= -1) {
349  sndbuf = value;
350  return 0;
351  }
352  break;
353 
354  case ZMQ_RCVBUF:
355  if (is_int && value >= -1) {
356  rcvbuf = value;
357  return 0;
358  }
359  break;
360 
361  case ZMQ_TOS:
362  if (is_int && value >= 0) {
363  tos = value;
364  return 0;
365  }
366  break;
367 
368  case ZMQ_LINGER:
369  if (is_int && value >= -1) {
370  linger.store (value);
371  return 0;
372  }
373  break;
374 
375  case ZMQ_CONNECT_TIMEOUT:
376  if (is_int && value >= 0) {
377  connect_timeout = value;
378  return 0;
379  }
380  break;
381 
382  case ZMQ_TCP_MAXRT:
383  if (is_int && value >= 0) {
384  tcp_maxrt = value;
385  return 0;
386  }
387  break;
388 
389  case ZMQ_RECONNECT_STOP:
390  if (is_int) {
391  reconnect_stop = value;
392  return 0;
393  }
394  break;
395 
396  case ZMQ_RECONNECT_IVL:
397  if (is_int && value >= -1) {
398  reconnect_ivl = value;
399  return 0;
400  }
401  break;
402 
404  if (is_int && value >= 0) {
405  reconnect_ivl_max = value;
406  return 0;
407  }
408  break;
409 
410  case ZMQ_BACKLOG:
411  if (is_int && value >= 0) {
412  backlog = value;
413  return 0;
414  }
415  break;
416 
417  case ZMQ_MAXMSGSIZE:
418  return do_setsockopt (optval_, optvallen_, &maxmsgsize);
419 
420  case ZMQ_MULTICAST_HOPS:
421  if (is_int && value > 0) {
422  multicast_hops = value;
423  return 0;
424  }
425  break;
426 
428  if (is_int && value > 0) {
429  multicast_maxtpdu = value;
430  return 0;
431  }
432  break;
433 
434  case ZMQ_RCVTIMEO:
435  if (is_int && value >= -1) {
436  rcvtimeo = value;
437  return 0;
438  }
439  break;
440 
441  case ZMQ_SNDTIMEO:
442  if (is_int && value >= -1) {
443  sndtimeo = value;
444  return 0;
445  }
446  break;
447 
448  /* Deprecated in favor of ZMQ_IPV6 */
449  case ZMQ_IPV4ONLY: {
450  bool value;
451  const int rc =
452  do_setsockopt_int_as_bool_strict (optval_, optvallen_, &value);
453  if (rc == 0)
454  ipv6 = !value;
455  return rc;
456  }
457 
458  /* To replace the somewhat surprising IPV4ONLY */
459  case ZMQ_IPV6:
460  return do_setsockopt_int_as_bool_strict (optval_, optvallen_,
461  &ipv6);
462 
463  case ZMQ_SOCKS_PROXY:
465  optval_, optvallen_, &socks_proxy_address, SIZE_MAX);
466 
467  case ZMQ_SOCKS_USERNAME:
468  /* Make empty string or NULL equivalent. */
469  if (optval_ == NULL || optvallen_ == 0) {
470  socks_proxy_username.clear ();
471  return 0;
472  } else {
474  optval_, optvallen_, &socks_proxy_username, 255);
475  }
476  case ZMQ_SOCKS_PASSWORD:
477  /* Make empty string or NULL equivalent. */
478  if (optval_ == NULL || optvallen_ == 0) {
479  socks_proxy_password.clear ();
480  return 0;
481  } else {
483  optval_, optvallen_, &socks_proxy_password, 255);
484  }
485  case ZMQ_TCP_KEEPALIVE:
486  if (is_int && (value == -1 || value == 0 || value == 1)) {
487  tcp_keepalive = value;
488  return 0;
489  }
490  break;
491 
493  if (is_int && (value == -1 || value >= 0)) {
494  tcp_keepalive_cnt = value;
495  return 0;
496  }
497  break;
498 
500  if (is_int && (value == -1 || value >= 0)) {
501  tcp_keepalive_idle = value;
502  return 0;
503  }
504  break;
505 
507  if (is_int && (value == -1 || value >= 0)) {
508  tcp_keepalive_intvl = value;
509  return 0;
510  }
511  break;
512 
513  case ZMQ_IMMEDIATE:
514  // TODO why is immediate not bool (and called non_immediate, as its meaning appears to be reversed)
515  if (is_int && (value == 0 || value == 1)) {
516  immediate = value;
517  return 0;
518  }
519  break;
520 
521  case ZMQ_TCP_ACCEPT_FILTER: {
522  std::string filter_str;
524  optval_, optvallen_, &filter_str, UCHAR_MAX);
525  if (rc == 0) {
526  if (filter_str.empty ()) {
527  tcp_accept_filters.clear ();
528  } else {
530  rc = mask.resolve (filter_str.c_str (), ipv6);
531  if (rc == 0) {
532  tcp_accept_filters.push_back (mask);
533  }
534  }
535  }
536  return rc;
537  }
538 
539 #if defined ZMQ_HAVE_SO_PEERCRED || defined ZMQ_HAVE_LOCAL_PEERCRED
540  case ZMQ_IPC_FILTER_UID:
541  return do_setsockopt_set (optval_, optvallen_,
542  &ipc_uid_accept_filters);
543 
544 
545  case ZMQ_IPC_FILTER_GID:
546  return do_setsockopt_set (optval_, optvallen_,
547  &ipc_gid_accept_filters);
548 #endif
549 
550 #if defined ZMQ_HAVE_SO_PEERCRED
551  case ZMQ_IPC_FILTER_PID:
552  return do_setsockopt_set (optval_, optvallen_,
553  &ipc_pid_accept_filters);
554 #endif
555 
556  case ZMQ_PLAIN_SERVER:
557  if (is_int && (value == 0 || value == 1)) {
558  as_server = value;
559  mechanism = value ? ZMQ_PLAIN : ZMQ_NULL;
560  return 0;
561  }
562  break;
563 
564  case ZMQ_PLAIN_USERNAME:
565  if (optvallen_ == 0 && optval_ == NULL) {
566  mechanism = ZMQ_NULL;
567  return 0;
568  } else if (optvallen_ > 0 && optvallen_ <= UCHAR_MAX
569  && optval_ != NULL) {
570  plain_username.assign (static_cast<const char *> (optval_),
571  optvallen_);
572  as_server = 0;
573  mechanism = ZMQ_PLAIN;
574  return 0;
575  }
576  break;
577 
578  case ZMQ_PLAIN_PASSWORD:
579  if (optvallen_ == 0 && optval_ == NULL) {
580  mechanism = ZMQ_NULL;
581  return 0;
582  } else if (optvallen_ > 0 && optvallen_ <= UCHAR_MAX
583  && optval_ != NULL) {
584  plain_password.assign (static_cast<const char *> (optval_),
585  optvallen_);
586  as_server = 0;
587  mechanism = ZMQ_PLAIN;
588  return 0;
589  }
590  break;
591 
592  case ZMQ_ZAP_DOMAIN:
594  optval_, optvallen_, &zap_domain, UCHAR_MAX);
595 
596  // If curve encryption isn't built, these options provoke EINVAL
597 #ifdef ZMQ_HAVE_CURVE
598  case ZMQ_CURVE_SERVER:
599  if (is_int && (value == 0 || value == 1)) {
600  as_server = value;
601  mechanism = value ? ZMQ_CURVE : ZMQ_NULL;
602  return 0;
603  }
604  break;
605 
606  case ZMQ_CURVE_PUBLICKEY:
607  if (0 == set_curve_key (curve_public_key, optval_, optvallen_)) {
608  return 0;
609  }
610  break;
611 
612  case ZMQ_CURVE_SECRETKEY:
613  if (0 == set_curve_key (curve_secret_key, optval_, optvallen_)) {
614  return 0;
615  }
616  break;
617 
618  case ZMQ_CURVE_SERVERKEY:
619  if (0 == set_curve_key (curve_server_key, optval_, optvallen_)) {
620  as_server = 0;
621  return 0;
622  }
623  break;
624 #endif
625 
626  case ZMQ_CONFLATE:
627  return do_setsockopt_int_as_bool_strict (optval_, optvallen_,
628  &conflate);
629 
630  // If libgssapi isn't installed, these options provoke EINVAL
631 #ifdef HAVE_LIBGSSAPI_KRB5
632  case ZMQ_GSSAPI_SERVER:
633  if (is_int && (value == 0 || value == 1)) {
634  as_server = value;
635  mechanism = ZMQ_GSSAPI;
636  return 0;
637  }
638  break;
639 
641  if (optvallen_ > 0 && optvallen_ <= UCHAR_MAX && optval_ != NULL) {
642  gss_principal.assign ((const char *) optval_, optvallen_);
643  mechanism = ZMQ_GSSAPI;
644  return 0;
645  }
646  break;
647 
649  if (optvallen_ > 0 && optvallen_ <= UCHAR_MAX && optval_ != NULL) {
650  gss_service_principal.assign ((const char *) optval_,
651  optvallen_);
652  mechanism = ZMQ_GSSAPI;
653  as_server = 0;
654  return 0;
655  }
656  break;
657 
659  return do_setsockopt_int_as_bool_strict (optval_, optvallen_,
660  &gss_plaintext);
661 
663  if (is_int
667  gss_principal_nt = value;
668  return 0;
669  }
670  break;
671 
673  if (is_int
677  gss_service_principal_nt = value;
678  return 0;
679  }
680  break;
681 #endif
682 
683  case ZMQ_HANDSHAKE_IVL:
684  if (is_int && value >= 0) {
685  handshake_ivl = value;
686  return 0;
687  }
688  break;
689 
690  case ZMQ_INVERT_MATCHING:
691  return do_setsockopt_int_as_bool_relaxed (optval_, optvallen_,
692  &invert_matching);
693 
694  case ZMQ_HEARTBEAT_IVL:
695  if (is_int && value >= 0) {
696  heartbeat_interval = value;
697  return 0;
698  }
699  break;
700 
701  case ZMQ_HEARTBEAT_TTL:
702  // Convert this to deciseconds from milliseconds
704  if (is_int && value >= 0 && value <= UINT16_MAX) {
705  heartbeat_ttl = static_cast<uint16_t> (value);
706  return 0;
707  }
708  break;
709 
711  if (is_int && value >= 0) {
712  heartbeat_timeout = value;
713  return 0;
714  }
715  break;
716 
717 #ifdef ZMQ_HAVE_VMCI
719  return do_setsockopt (optval_, optvallen_, &vmci_buffer_size);
720 
722  return do_setsockopt (optval_, optvallen_, &vmci_buffer_min_size);
723 
725  return do_setsockopt (optval_, optvallen_, &vmci_buffer_max_size);
726 
728  return do_setsockopt (optval_, optvallen_, &vmci_connect_timeout);
729 #endif
730 
731  case ZMQ_USE_FD:
732  if (is_int && value >= -1) {
733  use_fd = value;
734  return 0;
735  }
736  break;
737 
738  case ZMQ_BINDTODEVICE:
740  optval_, optvallen_, &bound_device, BINDDEVSIZ);
741 
743  return do_setsockopt_int_as_bool_relaxed (optval_, optvallen_,
744  &zap_enforce_domain);
745 
747  return do_setsockopt_int_as_bool_relaxed (optval_, optvallen_,
748  &loopback_fastpath);
749 
750  case ZMQ_METADATA:
751  if (optvallen_ > 0 && !is_int) {
752  const std::string s (static_cast<const char *> (optval_),
753  optvallen_);
754  const size_t pos = s.find (':');
755  if (pos != std::string::npos && pos != 0
756  && pos != s.length () - 1) {
757  const std::string key = s.substr (0, pos);
758  if (key.compare (0, 2, "X-") == 0
759  && key.length () <= UCHAR_MAX) {
760  std::string val = s.substr (pos + 1, s.length ());
761  app_metadata.insert (
762  std::pair<std::string, std::string> (key, val));
763  return 0;
764  }
765  }
766  }
767  errno = EINVAL;
768  return -1;
769 
770  case ZMQ_MULTICAST_LOOP:
771  return do_setsockopt_int_as_bool_relaxed (optval_, optvallen_,
772  &multicast_loop);
773 
774 #ifdef ZMQ_BUILD_DRAFT_API
775  case ZMQ_IN_BATCH_SIZE:
776  if (is_int && value > 0) {
777  in_batch_size = value;
778  return 0;
779  }
780  break;
781 
782  case ZMQ_OUT_BATCH_SIZE:
783  if (is_int && value > 0) {
784  out_batch_size = value;
785  return 0;
786  }
787  break;
788 
789  case ZMQ_BUSY_POLL:
790  if (is_int) {
791  busy_poll = value;
792  return 0;
793  }
794  break;
795 #ifdef ZMQ_HAVE_WSS
796  case ZMQ_WSS_KEY_PEM:
797  // TODO: check if valid certificate
798  wss_key_pem = std::string ((char *) optval_, optvallen_);
799  return 0;
800  case ZMQ_WSS_CERT_PEM:
801  // TODO: check if valid certificate
802  wss_cert_pem = std::string ((char *) optval_, optvallen_);
803  return 0;
804  case ZMQ_WSS_TRUST_PEM:
805  // TODO: check if valid certificate
806  wss_trust_pem = std::string ((char *) optval_, optvallen_);
807  return 0;
808  case ZMQ_WSS_HOSTNAME:
809  wss_hostname = std::string ((char *) optval_, optvallen_);
810  return 0;
812  return do_setsockopt_int_as_bool_strict (optval_, optvallen_,
813  &wss_trust_system);
814 #endif
815 
816 #ifdef ZMQ_HAVE_NORM
817  case ZMQ_NORM_MODE:
818  if (is_int && value >= 0 && value <= 4) {
819  norm_mode = value;
820  return 0;
821  }
822  break;
823 
825  return do_setsockopt_int_as_bool_strict (optval_, optvallen_,
826  &norm_unicast_nacks);
827 
829  if (is_int && value > 0) {
830  norm_buffer_size = value;
831  return 0;
832  }
833  break;
834 
836  if (is_int && value > 0) {
837  norm_segment_size = value;
838  return 0;
839  }
840  break;
841 
842  case ZMQ_NORM_BLOCK_SIZE:
843  if (is_int && value > 0 && value <= 255) {
844  norm_block_size = value;
845  return 0;
846  }
847  break;
848 
849  case ZMQ_NORM_NUM_PARITY:
850  if (is_int && value >= 0 && value < 255) {
851  norm_num_parity = value;
852  return 0;
853  }
854  break;
855 
857  if (is_int && value >= 0 && value < 255) {
858  norm_num_autoparity = value;
859  return 0;
860  }
861  break;
862 
863  case ZMQ_NORM_PUSH:
864  return do_setsockopt_int_as_bool_strict (optval_, optvallen_,
865  &norm_push_enable);
866 #endif //ZMQ_HAVE_NORM
867 
868  case ZMQ_HELLO_MSG:
869  if (optvallen_ > 0) {
870  unsigned char *bytes = (unsigned char *) optval_;
871  hello_msg =
872  std::vector<unsigned char> (bytes, bytes + optvallen_);
873  } else {
874  hello_msg = std::vector<unsigned char> ();
875  }
876 
877  return 0;
878 
879  case ZMQ_DISCONNECT_MSG:
880  if (optvallen_ > 0) {
881  unsigned char *bytes = (unsigned char *) optval_;
882  disconnect_msg =
883  std::vector<unsigned char> (bytes, bytes + optvallen_);
884  } else {
885  disconnect_msg = std::vector<unsigned char> ();
886  }
887 
888  return 0;
889 
890  case ZMQ_PRIORITY:
891  if (is_int && value >= 0) {
892  priority = value;
893  return 0;
894  }
895  break;
896 
897  case ZMQ_HICCUP_MSG:
898  if (optvallen_ > 0) {
899  unsigned char *bytes = (unsigned char *) optval_;
900  hiccup_msg =
901  std::vector<unsigned char> (bytes, bytes + optvallen_);
902  } else {
903  hiccup_msg = std::vector<unsigned char> ();
904  }
905 
906  return 0;
907 
908 
909 #endif
910 
911  default:
912 #if defined(ZMQ_ACT_MILITANT)
913  // There are valid scenarios for probing with unknown socket option
914  // values, e.g. to check if security is enabled or not. This will not
915  // provoke a militant assert. However, passing bad values to a valid
916  // socket option will, if ZMQ_ACT_MILITANT is defined.
917  malformed = false;
918 #endif
919  break;
920  }
921 
922  // TODO mechanism should either be set explicitly, or determined when
923  // connecting. currently, it depends on the order of setsockopt calls
924  // if there is some inconsistency, which is confusing. in addition,
925  // the assumed or set mechanism should be queryable (as a socket option)
926 
927 #if defined(ZMQ_ACT_MILITANT)
928  // There is no valid use case for passing an error back to the application
929  // when it sent malformed arguments to a socket option. Use ./configure
930  // --with-militant to enable this checking.
931  if (malformed)
932  zmq_assert (false);
933 #endif
934  errno = EINVAL;
935  return -1;
936 }
937 
938 int zmq::options_t::getsockopt (int option_,
939  void *optval_,
940  size_t *optvallen_) const
941 {
942  const bool is_int = (*optvallen_ == sizeof (int));
943  int *value = static_cast<int *> (optval_);
944 #if defined(ZMQ_ACT_MILITANT)
945  bool malformed = true; // Did caller pass a bad option value?
946 #endif
947 
948  switch (option_) {
949  case ZMQ_SNDHWM:
950  if (is_int) {
951  *value = sndhwm;
952  return 0;
953  }
954  break;
955 
956  case ZMQ_RCVHWM:
957  if (is_int) {
958  *value = rcvhwm;
959  return 0;
960  }
961  break;
962 
963  case ZMQ_AFFINITY:
964  if (*optvallen_ == sizeof (uint64_t)) {
965  *(static_cast<uint64_t *> (optval_)) = affinity;
966  return 0;
967  }
968  break;
969 
970  case ZMQ_ROUTING_ID:
971  return do_getsockopt (optval_, optvallen_, routing_id,
972  routing_id_size);
973 
974  case ZMQ_RATE:
975  if (is_int) {
976  *value = rate;
977  return 0;
978  }
979  break;
980 
981  case ZMQ_RECOVERY_IVL:
982  if (is_int) {
983  *value = recovery_ivl;
984  return 0;
985  }
986  break;
987 
988  case ZMQ_SNDBUF:
989  if (is_int) {
990  *value = sndbuf;
991  return 0;
992  }
993  break;
994 
995  case ZMQ_RCVBUF:
996  if (is_int) {
997  *value = rcvbuf;
998  return 0;
999  }
1000  break;
1001 
1002  case ZMQ_TOS:
1003  if (is_int) {
1004  *value = tos;
1005  return 0;
1006  }
1007  break;
1008 
1009  case ZMQ_TYPE:
1010  if (is_int) {
1011  *value = type;
1012  return 0;
1013  }
1014  break;
1015 
1016  case ZMQ_LINGER:
1017  if (is_int) {
1018  *value = linger.load ();
1019  return 0;
1020  }
1021  break;
1022 
1023  case ZMQ_CONNECT_TIMEOUT:
1024  if (is_int) {
1025  *value = connect_timeout;
1026  return 0;
1027  }
1028  break;
1029 
1030  case ZMQ_TCP_MAXRT:
1031  if (is_int) {
1032  *value = tcp_maxrt;
1033  return 0;
1034  }
1035  break;
1036 
1037  case ZMQ_RECONNECT_STOP:
1038  if (is_int) {
1039  *value = reconnect_stop;
1040  return 0;
1041  }
1042  break;
1043 
1044  case ZMQ_RECONNECT_IVL:
1045  if (is_int) {
1046  *value = reconnect_ivl;
1047  return 0;
1048  }
1049  break;
1050 
1051  case ZMQ_RECONNECT_IVL_MAX:
1052  if (is_int) {
1053  *value = reconnect_ivl_max;
1054  return 0;
1055  }
1056  break;
1057 
1058  case ZMQ_BACKLOG:
1059  if (is_int) {
1060  *value = backlog;
1061  return 0;
1062  }
1063  break;
1064 
1065  case ZMQ_MAXMSGSIZE:
1066  if (*optvallen_ == sizeof (int64_t)) {
1067  *(static_cast<int64_t *> (optval_)) = maxmsgsize;
1068  *optvallen_ = sizeof (int64_t);
1069  return 0;
1070  }
1071  break;
1072 
1073  case ZMQ_MULTICAST_HOPS:
1074  if (is_int) {
1075  *value = multicast_hops;
1076  return 0;
1077  }
1078  break;
1079 
1080  case ZMQ_MULTICAST_MAXTPDU:
1081  if (is_int) {
1082  *value = multicast_maxtpdu;
1083  return 0;
1084  }
1085  break;
1086 
1087  case ZMQ_RCVTIMEO:
1088  if (is_int) {
1089  *value = rcvtimeo;
1090  return 0;
1091  }
1092  break;
1093 
1094  case ZMQ_SNDTIMEO:
1095  if (is_int) {
1096  *value = sndtimeo;
1097  return 0;
1098  }
1099  break;
1100 
1101  case ZMQ_IPV4ONLY:
1102  if (is_int) {
1103  *value = 1 - ipv6;
1104  return 0;
1105  }
1106  break;
1107 
1108  case ZMQ_IPV6:
1109  if (is_int) {
1110  *value = ipv6;
1111  return 0;
1112  }
1113  break;
1114 
1115  case ZMQ_IMMEDIATE:
1116  if (is_int) {
1117  *value = immediate;
1118  return 0;
1119  }
1120  break;
1121 
1122  case ZMQ_SOCKS_PROXY:
1123  return do_getsockopt (optval_, optvallen_, socks_proxy_address);
1124 
1125  case ZMQ_SOCKS_USERNAME:
1126  return do_getsockopt (optval_, optvallen_, socks_proxy_username);
1127 
1128  case ZMQ_SOCKS_PASSWORD:
1129  return do_getsockopt (optval_, optvallen_, socks_proxy_password);
1130 
1131  case ZMQ_TCP_KEEPALIVE:
1132  if (is_int) {
1133  *value = tcp_keepalive;
1134  return 0;
1135  }
1136  break;
1137 
1138  case ZMQ_TCP_KEEPALIVE_CNT:
1139  if (is_int) {
1140  *value = tcp_keepalive_cnt;
1141  return 0;
1142  }
1143  break;
1144 
1146  if (is_int) {
1147  *value = tcp_keepalive_idle;
1148  return 0;
1149  }
1150  break;
1151 
1153  if (is_int) {
1154  *value = tcp_keepalive_intvl;
1155  return 0;
1156  }
1157  break;
1158 
1159  case ZMQ_MECHANISM:
1160  if (is_int) {
1161  *value = mechanism;
1162  return 0;
1163  }
1164  break;
1165 
1166  case ZMQ_PLAIN_SERVER:
1167  if (is_int) {
1168  *value = as_server && mechanism == ZMQ_PLAIN;
1169  return 0;
1170  }
1171  break;
1172 
1173  case ZMQ_PLAIN_USERNAME:
1174  return do_getsockopt (optval_, optvallen_, plain_username);
1175 
1176  case ZMQ_PLAIN_PASSWORD:
1177  return do_getsockopt (optval_, optvallen_, plain_password);
1178 
1179  case ZMQ_ZAP_DOMAIN:
1180  return do_getsockopt (optval_, optvallen_, zap_domain);
1181 
1182  // If curve encryption isn't built, these options provoke EINVAL
1183 #ifdef ZMQ_HAVE_CURVE
1184  case ZMQ_CURVE_SERVER:
1185  if (is_int) {
1186  *value = as_server && mechanism == ZMQ_CURVE;
1187  return 0;
1188  }
1189  break;
1190 
1191  case ZMQ_CURVE_PUBLICKEY:
1192  return do_getsockopt_curve_key (optval_, optvallen_,
1193  curve_public_key);
1194 
1195  case ZMQ_CURVE_SECRETKEY:
1196  return do_getsockopt_curve_key (optval_, optvallen_,
1197  curve_secret_key);
1198 
1199  case ZMQ_CURVE_SERVERKEY:
1200  return do_getsockopt_curve_key (optval_, optvallen_,
1201  curve_server_key);
1202 #endif
1203 
1204  case ZMQ_CONFLATE:
1205  if (is_int) {
1206  *value = conflate;
1207  return 0;
1208  }
1209  break;
1210 
1211  // If libgssapi isn't installed, these options provoke EINVAL
1212 #ifdef HAVE_LIBGSSAPI_KRB5
1213  case ZMQ_GSSAPI_SERVER:
1214  if (is_int) {
1215  *value = as_server && mechanism == ZMQ_GSSAPI;
1216  return 0;
1217  }
1218  break;
1219 
1220  case ZMQ_GSSAPI_PRINCIPAL:
1221  return do_getsockopt (optval_, optvallen_, gss_principal);
1222 
1224  return do_getsockopt (optval_, optvallen_, gss_service_principal);
1225 
1226  case ZMQ_GSSAPI_PLAINTEXT:
1227  if (is_int) {
1228  *value = gss_plaintext;
1229  return 0;
1230  }
1231  break;
1232 
1234  if (is_int) {
1235  *value = gss_principal_nt;
1236  return 0;
1237  }
1238  break;
1240  if (is_int) {
1241  *value = gss_service_principal_nt;
1242  return 0;
1243  }
1244  break;
1245 #endif
1246 
1247  case ZMQ_HANDSHAKE_IVL:
1248  if (is_int) {
1249  *value = handshake_ivl;
1250  return 0;
1251  }
1252  break;
1253 
1254  case ZMQ_INVERT_MATCHING:
1255  if (is_int) {
1256  *value = invert_matching;
1257  return 0;
1258  }
1259  break;
1260 
1261  case ZMQ_HEARTBEAT_IVL:
1262  if (is_int) {
1263  *value = heartbeat_interval;
1264  return 0;
1265  }
1266  break;
1267 
1268  case ZMQ_HEARTBEAT_TTL:
1269  if (is_int) {
1270  // Convert the internal deciseconds value to milliseconds
1271  *value = heartbeat_ttl * 100;
1272  return 0;
1273  }
1274  break;
1275 
1276  case ZMQ_HEARTBEAT_TIMEOUT:
1277  if (is_int) {
1278  *value = heartbeat_timeout;
1279  return 0;
1280  }
1281  break;
1282 
1283  case ZMQ_USE_FD:
1284  if (is_int) {
1285  *value = use_fd;
1286  return 0;
1287  }
1288  break;
1289 
1290  case ZMQ_BINDTODEVICE:
1291  return do_getsockopt (optval_, optvallen_, bound_device);
1292 
1294  if (is_int) {
1295  *value = zap_enforce_domain;
1296  return 0;
1297  }
1298  break;
1299 
1300  case ZMQ_LOOPBACK_FASTPATH:
1301  if (is_int) {
1302  *value = loopback_fastpath;
1303  return 0;
1304  }
1305  break;
1306 
1307  case ZMQ_MULTICAST_LOOP:
1308  if (is_int) {
1309  *value = multicast_loop;
1310  return 0;
1311  }
1312  break;
1313 
1314 #ifdef ZMQ_BUILD_DRAFT_API
1315  case ZMQ_ROUTER_NOTIFY:
1316  if (is_int) {
1317  *value = router_notify;
1318  return 0;
1319  }
1320  break;
1321 
1322  case ZMQ_IN_BATCH_SIZE:
1323  if (is_int) {
1324  *value = in_batch_size;
1325  return 0;
1326  }
1327  break;
1328 
1329  case ZMQ_OUT_BATCH_SIZE:
1330  if (is_int) {
1331  *value = out_batch_size;
1332  return 0;
1333  }
1334  break;
1335 
1336  case ZMQ_PRIORITY:
1337  if (is_int) {
1338  *value = priority;
1339  return 0;
1340  }
1341  break;
1342 
1343  case ZMQ_BUSY_POLL:
1344  if (is_int) {
1345  *value = busy_poll;
1346  }
1347  break;
1348 
1349 #ifdef ZMQ_HAVE_NORM
1350  case ZMQ_NORM_MODE:
1351  if (is_int) {
1352  *value = norm_mode;
1353  return 0;
1354  }
1355  break;
1356 
1357  case ZMQ_NORM_UNICAST_NACK:
1358  if (is_int) {
1359  *value = norm_unicast_nacks;
1360  return 0;
1361  }
1362  break;
1363 
1364  case ZMQ_NORM_BUFFER_SIZE:
1365  if (is_int) {
1366  *value = norm_buffer_size;
1367  return 0;
1368  }
1369  break;
1370 
1371  case ZMQ_NORM_SEGMENT_SIZE:
1372  if (is_int) {
1373  *value = norm_segment_size;
1374  return 0;
1375  }
1376  break;
1377 
1378  case ZMQ_NORM_BLOCK_SIZE:
1379  if (is_int) {
1380  *value = norm_block_size;
1381  return 0;
1382  }
1383  break;
1384 
1385  case ZMQ_NORM_NUM_PARITY:
1386  if (is_int) {
1387  *value = norm_num_parity;
1388  return 0;
1389  }
1390  break;
1391 
1393  if (is_int) {
1394  *value = norm_num_autoparity;
1395  return 0;
1396  }
1397  break;
1398 
1399  case ZMQ_NORM_PUSH:
1400  if (is_int) {
1401  *value = norm_push_enable;
1402  return 0;
1403  }
1404  break;
1405 #endif //ZMQ_HAVE_NORM
1406 
1407 #endif
1408 
1409 
1410  default:
1411 #if defined(ZMQ_ACT_MILITANT)
1412  malformed = false;
1413 #endif
1414  break;
1415  }
1416 #if defined(ZMQ_ACT_MILITANT)
1417  if (malformed)
1418  zmq_assert (false);
1419 #endif
1420  errno = EINVAL;
1421  return -1;
1422 }
ZMQ_METADATA
#define ZMQ_METADATA
Definition: zmq_draft.h:27
ZMQ_RECONNECT_STOP
#define ZMQ_RECONNECT_STOP
Definition: zmq_draft.h:41
ZMQ_RCVBUF
#define ZMQ_RCVBUF
Definition: zmq.h:283
ZMQ_SOCKS_PASSWORD
#define ZMQ_SOCKS_PASSWORD
Definition: zmq_draft.h:32
ZMQ_WSS_HOSTNAME
#define ZMQ_WSS_HOSTNAME
Definition: zmq_draft.h:38
ZMQ_NORM_BLOCK_SIZE
#define ZMQ_NORM_BLOCK_SIZE
Definition: zmq_draft.h:53
do_setsockopt_string_allow_empty_strict
static int do_setsockopt_string_allow_empty_strict(const void *const optval_, const size_t optvallen_, std::string *const out_value_, const size_t max_len_)
Definition: options.cpp:118
ZMQ_GSSAPI_NT_KRB5_PRINCIPAL
#define ZMQ_GSSAPI_NT_KRB5_PRINCIPAL
Definition: zmq.h:393
BINDDEVSIZ
#define BINDDEVSIZ
Definition: options.cpp:19
zmq::options_t::curve_server_key
uint8_t curve_server_key[CURVE_KEYSIZE]
Definition: options.hpp:187
ZMQ_OUT_BATCH_SIZE
#define ZMQ_OUT_BATCH_SIZE
Definition: zmq_draft.h:34
ZMQ_CURVE
#define ZMQ_CURVE
Definition: zmq.h:364
ZMQ_GSSAPI_NT_USER_NAME
#define ZMQ_GSSAPI_NT_USER_NAME
Definition: zmq.h:392
ZMQ_IPC_FILTER_UID
#define ZMQ_IPC_FILTER_UID
Definition: zmq.h:375
ZMQ_HEARTBEAT_IVL
#define ZMQ_HEARTBEAT_IVL
Definition: zmq.h:336
zmq::options_t::curve_public_key
uint8_t curve_public_key[CURVE_KEYSIZE]
Definition: options.hpp:185
ZMQ_NORM_NUM_AUTOPARITY
#define ZMQ_NORM_NUM_AUTOPARITY
Definition: zmq_draft.h:55
zmq_z85_decode
ZMQ_EXPORT uint8_t * zmq_z85_decode(uint8_t *dest_, const char *string_)
Definition: zmq_utils.cpp:135
ZMQ_TCP_ACCEPT_FILTER
#define ZMQ_TCP_ACCEPT_FILTER
Definition: zmq.h:373
ZMQ_PLAIN_USERNAME
#define ZMQ_PLAIN_USERNAME
Definition: zmq.h:310
zmq::tcp_address_mask_t
Definition: tcp_address.hpp:48
NULL
NULL
Definition: test_security_zap.cpp:405
ZMQ_AFFINITY
#define ZMQ_AFFINITY
Definition: zmq.h:276
ZMQ_PRIORITY
#define ZMQ_PRIORITY
Definition: zmq_draft.h:44
ZMQ_USE_FD
#define ZMQ_USE_FD
Definition: zmq.h:348
ZMQ_ZAP_ENFORCE_DOMAIN
#define ZMQ_ZAP_ENFORCE_DOMAIN
Definition: zmq_draft.h:25
EINVAL
#define EINVAL
Definition: errno.hpp:25
ZMQ_GSSAPI_PRINCIPAL_NAMETYPE
#define ZMQ_GSSAPI_PRINCIPAL_NAMETYPE
Definition: zmq.h:349
ZMQ_TOS
#define ZMQ_TOS
Definition: zmq.h:322
s
XmlRpcServer s
zmq::do_setsockopt_int_as_bool_strict
int do_setsockopt_int_as_bool_strict(const void *optval_, size_t optvallen_, bool *out_value_)
Definition: options.cpp:89
ZMQ_PLAIN_SERVER
#define ZMQ_PLAIN_SERVER
Definition: zmq.h:309
ZMQ_CURVE_SECRETKEY
#define ZMQ_CURVE_SECRETKEY
Definition: zmq.h:314
ZMQ_RECOVERY_IVL
#define ZMQ_RECOVERY_IVL
Definition: zmq.h:281
ZMQ_TYPE
#define ZMQ_TYPE
Definition: zmq.h:287
ZMQ_VMCI_BUFFER_MIN_SIZE
#define ZMQ_VMCI_BUFFER_MIN_SIZE
Definition: zmq.h:345
precompiled.hpp
ZMQ_PLAIN_PASSWORD
#define ZMQ_PLAIN_PASSWORD
Definition: zmq.h:311
ZMQ_CURVE_SERVERKEY
#define ZMQ_CURVE_SERVERKEY
Definition: zmq.h:315
zmq_assert
#define zmq_assert(x)
Definition: err.hpp:102
ZMQ_WSS_CERT_PEM
#define ZMQ_WSS_CERT_PEM
Definition: zmq_draft.h:36
ZMQ_CONNECT_TIMEOUT
#define ZMQ_CONNECT_TIMEOUT
Definition: zmq.h:340
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
zmq::do_getsockopt
int do_getsockopt(void *optval_, size_t *optvallen_, const void *value_, size_t value_len_)
Definition: options.cpp:39
errno
int errno
ZMQ_MULTICAST_LOOP
#define ZMQ_MULTICAST_LOOP
Definition: zmq_draft.h:28
do_setsockopt_set
static int do_setsockopt_set(const void *const optval_, const size_t optvallen_, std::set< T > *const set_)
Definition: options.cpp:152
ZMQ_IPC_FILTER_PID
#define ZMQ_IPC_FILTER_PID
Definition: zmq.h:374
ZMQ_HEARTBEAT_TIMEOUT
#define ZMQ_HEARTBEAT_TIMEOUT
Definition: zmq.h:338
T
#define T(upbtypeconst, upbtype, ctype, default_value)
zmq::do_setsockopt_int_as_bool_relaxed
int do_setsockopt_int_as_bool_relaxed(const void *optval_, size_t optvallen_, bool *out_value_)
Definition: options.cpp:106
bytes
uint8 bytes[10]
Definition: coded_stream_unittest.cc:153
ZMQ_LOOPBACK_FASTPATH
#define ZMQ_LOOPBACK_FASTPATH
Definition: zmq_draft.h:26
ZMQ_NORM_SEGMENT_SIZE
#define ZMQ_NORM_SEGMENT_SIZE
Definition: zmq_draft.h:52
ZMQ_VMCI_BUFFER_MAX_SIZE
#define ZMQ_VMCI_BUFFER_MAX_SIZE
Definition: zmq.h:346
ZMQ_HICCUP_MSG
#define ZMQ_HICCUP_MSG
Definition: zmq_draft.h:46
ZMQ_IMMEDIATE
#define ZMQ_IMMEDIATE
Definition: zmq.h:304
ZMQ_TCP_KEEPALIVE_INTVL
#define ZMQ_TCP_KEEPALIVE_INTVL
Definition: zmq.h:303
UINT16_MAX
#define UINT16_MAX
Definition: test_heartbeats.cpp:23
raw_socket
int raw_socket
Definition: test_heartbeats.cpp:13
ZMQ_RECONNECT_IVL_MAX
#define ZMQ_RECONNECT_IVL_MAX
Definition: zmq.h:291
ZMQ_PLAIN
#define ZMQ_PLAIN
Definition: zmq.h:363
do_setsockopt_string_allow_empty_relaxed
static int do_setsockopt_string_allow_empty_relaxed(const void *const optval_, const size_t optvallen_, std::string *const out_value_, const size_t max_len_)
Definition: options.cpp:137
ZMQ_WSS_KEY_PEM
#define ZMQ_WSS_KEY_PEM
Definition: zmq_draft.h:35
ZMQ_WSS_TRUST_SYSTEM
#define ZMQ_WSS_TRUST_SYSTEM
Definition: zmq_draft.h:39
deciseconds_per_millisecond
const int deciseconds_per_millisecond
Definition: options.cpp:292
ZMQ_VMCI_CONNECT_TIMEOUT
#define ZMQ_VMCI_CONNECT_TIMEOUT
Definition: zmq.h:347
ZMQ_RCVHWM
#define ZMQ_RCVHWM
Definition: zmq.h:294
zmq::options_t::curve_secret_key
uint8_t curve_secret_key[CURVE_KEYSIZE]
Definition: options.hpp:186
CURVE_KEYSIZE_Z85
#define CURVE_KEYSIZE_Z85
Definition: options.hpp:30
macros.hpp
zmq_z85_encode
ZMQ_EXPORT char * zmq_z85_encode(char *dest_, const uint8_t *data_, size_t size_)
Definition: zmq_utils.cpp:101
ZMQ_SNDTIMEO
#define ZMQ_SNDTIMEO
Definition: zmq.h:297
do_setsockopt
static int do_setsockopt(const void *const optval_, const size_t optvallen_, T *const out_value_)
Definition: options.cpp:78
mask
GLint GLuint mask
Definition: glcorearb.h:2789
ZMQ_IN_BATCH_SIZE
#define ZMQ_IN_BATCH_SIZE
Definition: zmq_draft.h:33
zmq::options_t::set_curve_key
int set_curve_key(uint8_t *destination_, const void *optval_, size_t optvallen_)
Definition: options.cpp:254
ZMQ_NORM_MODE
#define ZMQ_NORM_MODE
Definition: zmq_draft.h:49
ZMQ_NORM_PUSH
#define ZMQ_NORM_PUSH
Definition: zmq_draft.h:56
ZMQ_TCP_KEEPALIVE_IDLE
#define ZMQ_TCP_KEEPALIVE_IDLE
Definition: zmq.h:302
ZMQ_DISCONNECT_MSG
#define ZMQ_DISCONNECT_MSG
Definition: zmq_draft.h:43
ZMQ_IPV4ONLY
#define ZMQ_IPV4ONLY
Definition: zmq.h:377
ZMQ_HELLO_MSG
#define ZMQ_HELLO_MSG
Definition: zmq_draft.h:42
ZMQ_GSSAPI_NT_HOSTBASED
#define ZMQ_GSSAPI_NT_HOSTBASED
Definition: zmq.h:391
ZMQ_GSSAPI
#define ZMQ_GSSAPI
Definition: zmq.h:365
zmq::options_t::setsockopt
int setsockopt(int option_, const void *optval_, size_t optvallen_)
Definition: options.cpp:294
ZMQ_RATE
#define ZMQ_RATE
Definition: zmq.h:280
ZMQ_INVERT_MATCHING
#define ZMQ_INVERT_MATCHING
Definition: zmq.h:335
ZMQ_GSSAPI_SERVICE_PRINCIPAL
#define ZMQ_GSSAPI_SERVICE_PRINCIPAL
Definition: zmq.h:326
ZMQ_MULTICAST_MAXTPDU
#define ZMQ_MULTICAST_MAXTPDU
Definition: zmq.h:343
ZMQ_BINDTODEVICE
#define ZMQ_BINDTODEVICE
Definition: zmq.h:351
zmq::options_t::options_t
options_t()
Definition: options.cpp:170
ZMQ_MECHANISM
#define ZMQ_MECHANISM
Definition: zmq.h:308
ZMQ_VMCI_BUFFER_SIZE
#define ZMQ_VMCI_BUFFER_SIZE
Definition: zmq.h:344
key
const SETUP_TEARDOWN_TESTCONTEXT char * key
Definition: test_wss_transport.cpp:10
sockopt_invalid
static int sockopt_invalid()
Definition: options.cpp:22
ZMQ_BUSY_POLL
#define ZMQ_BUSY_POLL
Definition: zmq_draft.h:45
ZMQ_SOCKS_PROXY
#define ZMQ_SOCKS_PROXY
Definition: zmq.h:329
ZMQ_GSSAPI_PRINCIPAL
#define ZMQ_GSSAPI_PRINCIPAL
Definition: zmq.h:325
ZMQ_TCP_KEEPALIVE
#define ZMQ_TCP_KEEPALIVE
Definition: zmq.h:300
ZMQ_HEARTBEAT_TTL
#define ZMQ_HEARTBEAT_TTL
Definition: zmq.h:337
ZMQ_ZAP_DOMAIN
#define ZMQ_ZAP_DOMAIN
Definition: zmq.h:320
default_hwm
const int default_hwm
Definition: options.cpp:168
ZMQ_HANDSHAKE_IVL
#define ZMQ_HANDSHAKE_IVL
Definition: zmq.h:328
value_
int value_
Definition: gmock-matchers_test.cc:571
type
GLenum type
Definition: glcorearb.h:2695
ZMQ_SNDHWM
#define ZMQ_SNDHWM
Definition: zmq.h:293
ZMQ_LINGER
#define ZMQ_LINGER
Definition: zmq.h:288
ZMQ_GSSAPI_SERVER
#define ZMQ_GSSAPI_SERVER
Definition: zmq.h:324
ZMQ_NORM_BUFFER_SIZE
#define ZMQ_NORM_BUFFER_SIZE
Definition: zmq_draft.h:51
ZMQ_RCVTIMEO
#define ZMQ_RCVTIMEO
Definition: zmq.h:296
ZMQ_BACKLOG
#define ZMQ_BACKLOG
Definition: zmq.h:290
filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glcorearb.h:3467
ZMQ_CURVE_SERVER
#define ZMQ_CURVE_SERVER
Definition: zmq.h:312
options.hpp
ZMQ_SNDBUF
#define ZMQ_SNDBUF
Definition: zmq.h:282
ZMQ_NORM_NUM_PARITY
#define ZMQ_NORM_NUM_PARITY
Definition: zmq_draft.h:54
ZMQ_NORM_CC
#define ZMQ_NORM_CC
Definition: zmq_draft.h:60
ZMQ_IPV6
#define ZMQ_IPV6
Definition: zmq.h:307
err.hpp
ZMQ_NULL
#define ZMQ_NULL
Definition: zmq.h:362
ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE
#define ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE
Definition: zmq.h:350
ZMQ_ROUTING_ID
#define ZMQ_ROUTING_ID
Definition: zmq.h:277
true
#define true
Definition: cJSON.c:65
ZMQ_ROUTER_NOTIFY
#define ZMQ_ROUTER_NOTIFY
Definition: zmq_draft.h:29
val
GLuint GLfloat * val
Definition: glcorearb.h:3604
ZMQ_IPC_FILTER_GID
#define ZMQ_IPC_FILTER_GID
Definition: zmq.h:376
ZMQ_RECONNECT_IVL
#define ZMQ_RECONNECT_IVL
Definition: zmq.h:289
ZMQ_GSSAPI_PLAINTEXT
#define ZMQ_GSSAPI_PLAINTEXT
Definition: zmq.h:327
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
ZMQ_MAXMSGSIZE
#define ZMQ_MAXMSGSIZE
Definition: zmq.h:292
ZMQ_NORM_UNICAST_NACK
#define ZMQ_NORM_UNICAST_NACK
Definition: zmq_draft.h:50
CURVE_KEYSIZE
#define CURVE_KEYSIZE
Definition: options.hpp:28
ZMQ_TCP_MAXRT
#define ZMQ_TCP_MAXRT
Definition: zmq.h:341
false
#define false
Definition: cJSON.c:70
ZMQ_TCP_KEEPALIVE_CNT
#define ZMQ_TCP_KEEPALIVE_CNT
Definition: zmq.h:301
ZMQ_CONFLATE
#define ZMQ_CONFLATE
Definition: zmq.h:319
ZMQ_WSS_TRUST_PEM
#define ZMQ_WSS_TRUST_PEM
Definition: zmq_draft.h:37
ZMQ_MULTICAST_HOPS
#define ZMQ_MULTICAST_HOPS
Definition: zmq.h:295
zmq::options_t::getsockopt
int getsockopt(int option_, void *optval_, size_t *optvallen_) const
Definition: options.cpp:938
ZMQ_CURVE_PUBLICKEY
#define ZMQ_CURVE_PUBLICKEY
Definition: zmq.h:313
ZMQ_SOCKS_USERNAME
#define ZMQ_SOCKS_USERNAME
Definition: zmq_draft.h:31


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:57