options.cpp 22 KB
Newer Older
1
/*
2
    Copyright (c) 2007-2014 Contributors as noted in the AUTHORS file
3 4 5 6

    This file is part of 0MQ.

    0MQ is free software; you can redistribute it and/or modify it under
7
    the terms of the GNU Lesser General Public License as published by
8 9 10 11 12 13
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    0MQ is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU Lesser General Public License for more details.
15

16
    You should have received a copy of the GNU Lesser General Public License
17 18 19
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

20 21
#include <string.h>

22
#include "options.hpp"
23
#include "err.hpp"
24
#include "../include/zmq_utils.h"
25 26

zmq::options_t::options_t () :
27 28
    sndhwm (1000),
    rcvhwm (1000),
malosek's avatar
malosek committed
29
    affinity (0),
30
    identity_size (0),
31
    rate (100),
32
    recovery_ivl (10000),
33
    multicast_hops (1),
34 35
    sndbuf (0),
    rcvbuf (0),
36
    tos (0),
37
    type (-1),
38
    linger (-1),
39
    reconnect_ivl (100),
40
    reconnect_ivl_max (0),
41
    backlog (100),
42
    maxmsgsize (-1),
43 44
    rcvtimeo (-1),
    sndtimeo (-1),
Pieter Hintjens's avatar
Pieter Hintjens committed
45
    ipv6 (0),
46
    immediate (0),
47
    filter (false),
48
    recv_identity (false),
Martin Hurton's avatar
Martin Hurton committed
49
    raw_sock (false),
50 51 52 53
    tcp_keepalive (-1),
    tcp_keepalive_cnt (-1),
    tcp_keepalive_idle (-1),
    tcp_keepalive_intvl (-1),
54
    mechanism (ZMQ_NULL),
55
    as_server (0),
56
    gss_plaintext (false),
danielkr's avatar
danielkr committed
57
    socket_id (0),
58 59
    conflate (false),
    handshake_ivl (30000)
60 61
{
}
62 63 64 65

int zmq::options_t::setsockopt (int option_, const void *optval_,
    size_t optvallen_)
{
66 67
    bool is_int = (optvallen_ == sizeof (int));
    int value = is_int? *((int *) optval_): 0;
68
#if defined (ZMQ_ACT_MILITANT)
69
    bool malformed = true;          //  Did caller pass a bad option value?
70
#endif
71
    switch (option_) {
72
        case ZMQ_SNDHWM:
73
            if (is_int && value >= 0) {
74
                sndhwm = value;
75 76
                return 0;
            }
77
            break;
78

79
        case ZMQ_RCVHWM:
80
            if (is_int && value >= 0) {
81
                rcvhwm = value;
82 83
                return 0;
            }
84
            break;
85

86
        case ZMQ_AFFINITY:
87
            if (optvallen_ == sizeof (uint64_t)) {
88
                affinity = *((uint64_t*) optval_);
89 90
                return 0;
            }
91 92 93
            break;

        case ZMQ_IDENTITY:
94 95
            //  Identity is any binary string from 1 to 255 octets
            if (optvallen_ > 0 && optvallen_ < 256) {
96 97
                identity_size = optvallen_;
                memcpy (identity, optval_, identity_size);
98
                return 0;
99 100
            }
            break;
101

102
        case ZMQ_RATE:
103
            if (is_int && value > 0) {
104
                rate = value;
105 106
                return 0;
            }
107
            break;
108

109
        case ZMQ_RECOVERY_IVL:
110
            if (is_int && value >= 0) {
111
                recovery_ivl = value;
112 113 114
                return 0;
            }
            break;
115

116
        case ZMQ_SNDBUF:
117
            if (is_int && value >= 0) {
118
                sndbuf = value;
119 120
                return 0;
            }
121
            break;
122

123
        case ZMQ_RCVBUF:
124
            if (is_int && value >= 0) {
125
                rcvbuf = value;
126 127
                return 0;
            }
128
            break;
129

130 131 132 133 134 135 136
        case ZMQ_TOS:
            if (is_int && value >= 0) {
                tos = value;
                return 0;
            }
            break;

137
        case ZMQ_LINGER:
138
            if (is_int && value >= -1) {
139
                linger = value;
140 141
                return 0;
            }
142
            break;
143

144
        case ZMQ_RECONNECT_IVL:
145
            if (is_int && value >= -1) {
146
                reconnect_ivl = value;
147 148
                return 0;
            }
149
            break;
150

151
        case ZMQ_RECONNECT_IVL_MAX:
152
            if (is_int && value >= 0) {
153
                reconnect_ivl_max = value;
154 155
                return 0;
            }
156
            break;
157

158
        case ZMQ_BACKLOG:
159
            if (is_int && value >= 0) {
160
                backlog = value;
161 162
                return 0;
            }
163
            break;
164

165
        case ZMQ_MAXMSGSIZE:
166
            if (optvallen_ == sizeof (int64_t)) {
167
                maxmsgsize = *((int64_t *) optval_);
168 169
                return 0;
            }
170
            break;
171

172
        case ZMQ_MULTICAST_HOPS:
173
            if (is_int && value > 0) {
174
                multicast_hops = value;
175 176
                return 0;
            }
177
            break;
178

179
        case ZMQ_RCVTIMEO:
180
            if (is_int && value >= -1) {
181
                rcvtimeo = value;
182 183
                return 0;
            }
184
            break;
185

186
        case ZMQ_SNDTIMEO:
187
            if (is_int && value >= -1) {
188
                sndtimeo = value;
189 190
                return 0;
            }
191
            break;
192

Pieter Hintjens's avatar
Pieter Hintjens committed
193
        /*  Deprecated in favor of ZMQ_IPV6  */
194
        case ZMQ_IPV4ONLY:
195
            if (is_int && (value == 0 || value == 1)) {
196
                ipv6 = (value == 0);
197 198
                return 0;
            }
199
            break;
200

201 202
        /*  To replace the somewhat surprising IPV4ONLY */
        case ZMQ_IPV6:
203
            if (is_int && (value == 0 || value == 1)) {
204
                ipv6 = (value != 0);
205 206
                return 0;
            }
207
            break;
208

209 210 211 212 213 214 215 216 217 218 219 220 221
        case ZMQ_SOCKS_PROXY:
            if (optval_ == NULL && optvallen_ == 0) {
                socks_proxy_address.clear ();
                return 0;
            }
            else
            if (optval_ != NULL && optvallen_ > 0 ) {
                socks_proxy_address =
                    std::string ((const char *) optval_, optvallen_);
                return 0;
            }
            break;

222
        case ZMQ_TCP_KEEPALIVE:
223
            if (is_int && (value == -1 || value == 0 || value == 1)) {
224
                tcp_keepalive = value;
225 226
                return 0;
            }
227
            break;
228

229
        case ZMQ_TCP_KEEPALIVE_CNT:
230
            if (is_int && (value == -1 || value >= 0)) {
231
                tcp_keepalive_cnt = value;
232 233
                return 0;
            }
234
            break;
235

236
        case ZMQ_TCP_KEEPALIVE_IDLE:
237
            if (is_int && (value == -1 || value >= 0)) {
238
                tcp_keepalive_idle = value;
239 240
                return 0;
            }
241
            break;
242

243
        case ZMQ_TCP_KEEPALIVE_INTVL:
244
            if (is_int && (value == -1 || value >= 0)) {
245
                tcp_keepalive_intvl = value;
246 247
                return 0;
            }
248
            break;
249

250
        case ZMQ_IMMEDIATE:
251
            if (is_int && (value == 0 || value == 1)) {
252
                immediate = value;
253 254
                return 0;
            }
255
            break;
256

257
        case ZMQ_TCP_ACCEPT_FILTER:
258
            if (optvallen_ == 0 && optval_ == NULL) {
259
                tcp_accept_filters.clear ();
260 261
                return 0;
            }
262
            else
263
            if (optvallen_ > 0 && optvallen_ < 256 && optval_ != NULL && *((const char*) optval_) != 0) {
264
                std::string filter_str ((const char *) optval_, optvallen_);
265
                tcp_address_mask_t mask;
Pieter Hintjens's avatar
Pieter Hintjens committed
266
                int rc = mask.resolve (filter_str.c_str (), ipv6);
267
                if (rc == 0) {
268
                    tcp_accept_filters.push_back (mask);
269 270 271 272
                    return 0;
                }
            }
            break;
273

274
#       if defined ZMQ_HAVE_SO_PEERCRED || defined ZMQ_HAVE_LOCAL_PEERCRED
275
        case ZMQ_IPC_FILTER_UID:
276 277 278 279 280 281 282 283 284 285 286
            if (optvallen_ == 0 && optval_ == NULL) {
                ipc_uid_accept_filters.clear ();
                return 0;
            }
            else
            if (optvallen_ == sizeof (uid_t) && optval_ != NULL) {
                ipc_uid_accept_filters.insert (*((uid_t *) optval_));
                return 0;
            }
            break;

287
        case ZMQ_IPC_FILTER_GID:
288 289 290 291 292 293 294 295 296 297 298 299 300
            if (optvallen_ == 0 && optval_ == NULL) {
                ipc_gid_accept_filters.clear ();
                return 0;
            }
            else
            if (optvallen_ == sizeof (gid_t) && optval_ != NULL) {
                ipc_gid_accept_filters.insert (*((gid_t *) optval_));
                return 0;
            }
            break;
#       endif

#       if defined ZMQ_HAVE_SO_PEERCRED
301
        case ZMQ_IPC_FILTER_PID:
302 303 304 305 306 307 308 309 310 311 312 313
            if (optvallen_ == 0 && optval_ == NULL) {
                ipc_pid_accept_filters.clear ();
                return 0;
            }
            else
            if (optvallen_ == sizeof (pid_t) && optval_ != NULL) {
                ipc_pid_accept_filters.insert (*((pid_t *) optval_));
                return 0;
            }
            break;
#       endif

314 315
        case ZMQ_PLAIN_SERVER:
            if (is_int && (value == 0 || value == 1)) {
316
                as_server = value;
317
                mechanism = value? ZMQ_PLAIN: ZMQ_NULL;
318 319 320
                return 0;
            }
            break;
321

322 323 324 325 326 327
        case ZMQ_PLAIN_USERNAME:
            if (optvallen_ == 0 && optval_ == NULL) {
                mechanism = ZMQ_NULL;
                return 0;
            }
            else
328
            if (optvallen_ > 0 && optvallen_ < 256 && optval_ != NULL) {
329
                plain_username.assign ((const char *) optval_, optvallen_);
330
                as_server = 0;
331 332 333 334
                mechanism = ZMQ_PLAIN;
                return 0;
            }
            break;
335

336 337 338 339 340 341
        case ZMQ_PLAIN_PASSWORD:
            if (optvallen_ == 0 && optval_ == NULL) {
                mechanism = ZMQ_NULL;
                return 0;
            }
            else
342
            if (optvallen_ > 0 && optvallen_ < 256 && optval_ != NULL) {
343
                plain_password.assign ((const char *) optval_, optvallen_);
344
                as_server = 0;
345 346
                mechanism = ZMQ_PLAIN;
                return 0;
347
            }
348
            break;
349 350

        case ZMQ_ZAP_DOMAIN:
351
            if (optvallen_ < 256) {
352 353 354 355 356
                zap_domain.assign ((const char *) optval_, optvallen_);
                return 0;
            }
            break;

Pieter Hintjens's avatar
Pieter Hintjens committed
357
        //  If libsodium isn't installed, these options provoke EINVAL
358
#       ifdef HAVE_LIBSODIUM
359
        case ZMQ_CURVE_SERVER:
360
            if (is_int && (value == 0 || value == 1)) {
361
                as_server = value;
362
                mechanism = value? ZMQ_CURVE: ZMQ_NULL;
363 364 365
                return 0;
            }
            break;
366

367 368 369 370 371 372 373 374 375 376 377 378
        case ZMQ_CURVE_PUBLICKEY:
            if (optvallen_ == CURVE_KEYSIZE) {
                memcpy (curve_public_key, optval_, CURVE_KEYSIZE);
                mechanism = ZMQ_CURVE;
                return 0;
            }
            else
            if (optvallen_ == CURVE_KEYSIZE_Z85) {
                zmq_z85_decode (curve_public_key, (char *) optval_);
                mechanism = ZMQ_CURVE;
                return 0;
            }
379
            break;
380

381 382 383 384 385 386 387 388 389 390 391 392
        case ZMQ_CURVE_SECRETKEY:
            if (optvallen_ == CURVE_KEYSIZE) {
                memcpy (curve_secret_key, optval_, CURVE_KEYSIZE);
                mechanism = ZMQ_CURVE;
                return 0;
            }
            else
            if (optvallen_ == CURVE_KEYSIZE_Z85) {
                zmq_z85_decode (curve_secret_key, (char *) optval_);
                mechanism = ZMQ_CURVE;
                return 0;
            }
393 394
            break;

395 396 397 398 399 400 401 402 403 404 405 406 407 408
        case ZMQ_CURVE_SERVERKEY:
            if (optvallen_ == CURVE_KEYSIZE) {
                memcpy (curve_server_key, optval_, CURVE_KEYSIZE);
                as_server = 0;
                mechanism = ZMQ_CURVE;
                return 0;
            }
            else
            if (optvallen_ == CURVE_KEYSIZE_Z85) {
                zmq_z85_decode (curve_server_key, (char *) optval_);
                as_server = 0;
                mechanism = ZMQ_CURVE;
                return 0;
            }
409
            break;
410
#       endif
411
 
danielkr's avatar
danielkr committed
412 413 414 415 416 417
        case ZMQ_CONFLATE:
            if (is_int && (value == 0 || value == 1)) {
                conflate = (value != 0);
                return 0;
            }
            break;
418 419 420 421 422 423 424 425 426
	
        case ZMQ_GSSAPI_SERVER:
            if (is_int && (value == 0 || value == 1)) {
                as_server = value;
                mechanism = ZMQ_GSSAPI;
                return 0;
            }
            break;
		
Chris Busbey's avatar
Chris Busbey committed
427
        case ZMQ_GSSAPI_PRINCIPAL:
428
            if (optvallen_ > 0 && optvallen_ < 256 && optval_ != NULL) {
Chris Busbey's avatar
Chris Busbey committed
429
                gss_principal.assign ((const char *) optval_, optvallen_);
430 431 432 433 434
                mechanism = ZMQ_GSSAPI;
                return 0;
            }
            break;

Chris Busbey's avatar
Chris Busbey committed
435
        case ZMQ_GSSAPI_SERVICE_PRINCIPAL:
436
            if (optvallen_ > 0 && optvallen_ < 256 && optval_ != NULL) {
Chris Busbey's avatar
Chris Busbey committed
437
                gss_service_principal.assign ((const char *) optval_, optvallen_);
438
                mechanism = ZMQ_GSSAPI;
Chris Busbey's avatar
Chris Busbey committed
439
                as_server = 0;
440 441 442
                return 0;
            }
            break;
danielkr's avatar
danielkr committed
443

444 445 446 447 448 449 450
        case ZMQ_GSSAPI_PLAINTEXT:
            if (is_int && (value == 0 || value == 1)) {
                gss_plaintext = (value != 0);
                return 0;
            }
            break;
	
451 452 453 454 455 456 457
        case ZMQ_HANDSHAKE_IVL:
            if (is_int && value >= 0) {
                handshake_ivl = value;
                return 0;
            }
            break;

danielkr's avatar
danielkr committed
458
        default:
459
#if defined (ZMQ_ACT_MILITANT)
460 461 462 463 464
            //  There are valid scenarios for probing with unknown socket option
            //  values, e.g. to check if security is enabled or not. This will not
            //  provoke a militant assert. However, passing bad values to a valid
            //  socket option will, if ZMQ_ACT_MILITANT is defined.
            malformed = false;
465
#endif
danielkr's avatar
danielkr committed
466
            break;
467
    }
468 469 470 471 472 473 474
#if defined (ZMQ_ACT_MILITANT)
    //  There is no valid use case for passing an error back to the application
    //  when it sent malformed arguments to a socket option. Use ./configure
    //  --with-militant to enable this checking.
    if (malformed)
        zmq_assert (false);
#endif
475 476
    errno = EINVAL;
    return -1;
477
}
478 479 480

int zmq::options_t::getsockopt (int option_, void *optval_, size_t *optvallen_)
{
481 482
    bool is_int = (*optvallen_ == sizeof (int));
    int *value = (int *) optval_;
483

484
    switch (option_) {
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
        case ZMQ_SNDHWM:
            if (is_int) {
                *value = sndhwm;
                return 0;
            }
            break;

        case ZMQ_RCVHWM:
            if (is_int) {
                *value = rcvhwm;
                return 0;
            }
            break;

        case ZMQ_AFFINITY:
            if (*optvallen_ == sizeof (uint64_t)) {
                *((uint64_t *) optval_) = affinity;
                return 0;
            }
            break;

        case ZMQ_IDENTITY:
            if (*optvallen_ >= identity_size) {
                memcpy (optval_, identity, identity_size);
                *optvallen_ = identity_size;
                return 0;
            }
            break;

        case ZMQ_RATE:
            if (is_int) {
                *value = rate;
                return 0;
            }
            break;

        case ZMQ_RECOVERY_IVL:
            if (is_int) {
                *value = recovery_ivl;
                return 0;
            }
            break;

        case ZMQ_SNDBUF:
            if (is_int) {
                *value = sndbuf;
                return 0;
            }
            break;

        case ZMQ_RCVBUF:
            if (is_int) {
                *value = rcvbuf;
                return 0;
            }
            break;

542 543 544 545 546 547
        case ZMQ_TOS:
            if (is_int) {
                *value = tos;
                return 0;
            }
            break;
548
            
549 550 551 552 553 554 555 556 557 558 559 560 561
        case ZMQ_TYPE:
            if (is_int) {
                *value = type;
                return 0;
            }
            break;

        case ZMQ_LINGER:
            if (is_int) {
                *value = linger;
                return 0;
            }
            break;
562

563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
        case ZMQ_RECONNECT_IVL:
            if (is_int) {
                *value = reconnect_ivl;
                return 0;
            }
            break;

        case ZMQ_RECONNECT_IVL_MAX:
            if (is_int) {
                *value = reconnect_ivl_max;
                return 0;
            }
            break;

        case ZMQ_BACKLOG:
            if (is_int) {
                *value = backlog;
                return 0;
            }
            break;

        case ZMQ_MAXMSGSIZE:
            if (*optvallen_ == sizeof (int64_t)) {
                *((int64_t *) optval_) = maxmsgsize;
                *optvallen_ = sizeof (int64_t);
                return 0;
            }
            break;

        case ZMQ_MULTICAST_HOPS:
            if (is_int) {
                *value = multicast_hops;
                return 0;
            }
            break;

        case ZMQ_RCVTIMEO:
            if (is_int) {
                *value = rcvtimeo;
                return 0;
            }
            break;

        case ZMQ_SNDTIMEO:
            if (is_int) {
                *value = sndtimeo;
                return 0;
            }
            break;

        case ZMQ_IPV4ONLY:
            if (is_int) {
                *value = 1 - ipv6;
                return 0;
            }
            break;
619

620 621 622 623 624 625 626 627 628 629 630 631 632 633
        case ZMQ_IPV6:
            if (is_int) {
                *value = ipv6;
                return 0;
            }
            break;

        case ZMQ_IMMEDIATE:
            if (is_int) {
                *value = immediate;
                return 0;
            }
            break;

634 635 636 637 638 639 640 641
        case ZMQ_SOCKS_PROXY:
            if (*optvallen_ >= socks_proxy_address.size () + 1) {
                memcpy (optval_, socks_proxy_address.c_str (), socks_proxy_address.size () + 1);
                *optvallen_ = socks_proxy_address.size () + 1;
                return 0;
            }
            break;

642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
        case ZMQ_TCP_KEEPALIVE:
            if (is_int) {
                *value = tcp_keepalive;
                return 0;
            }
            break;

        case ZMQ_TCP_KEEPALIVE_CNT:
            if (is_int) {
                *value = tcp_keepalive_cnt;
                return 0;
            }
            break;

        case ZMQ_TCP_KEEPALIVE_IDLE:
            if (is_int) {
                *value = tcp_keepalive_idle;
                return 0;
            }
            break;

        case ZMQ_TCP_KEEPALIVE_INTVL:
            if (is_int) {
                *value = tcp_keepalive_intvl;
                return 0;
            }
            break;

        case ZMQ_MECHANISM:
            if (is_int) {
                *value = mechanism;
                return 0;
            }
            break;
676

677
        case ZMQ_PLAIN_SERVER:
678
            if (is_int) {
679
                *value = as_server && mechanism == ZMQ_PLAIN;
680 681 682
                return 0;
            }
            break;
683

684 685 686 687 688 689 690
        case ZMQ_PLAIN_USERNAME:
            if (*optvallen_ >= plain_username.size () + 1) {
                memcpy (optval_, plain_username.c_str (), plain_username.size () + 1);
                *optvallen_ = plain_username.size () + 1;
                return 0;
            }
            break;
691

692 693 694 695 696 697 698
        case ZMQ_PLAIN_PASSWORD:
            if (*optvallen_ >= plain_password.size () + 1) {
                memcpy (optval_, plain_password.c_str (), plain_password.size () + 1);
                *optvallen_ = plain_password.size () + 1;
                return 0;
            }
            break;
699 700 701 702 703 704 705 706 707

        case ZMQ_ZAP_DOMAIN:
            if (*optvallen_ >= zap_domain.size () + 1) {
                memcpy (optval_, zap_domain.c_str (), zap_domain.size () + 1);
                *optvallen_ = zap_domain.size () + 1;
                return 0;
            }
            break;

Pieter Hintjens's avatar
Pieter Hintjens committed
708
        //  If libsodium isn't installed, these options provoke EINVAL
709
#       ifdef HAVE_LIBSODIUM
710
        case ZMQ_CURVE_SERVER:
711
            if (is_int) {
712
                *value = as_server && mechanism == ZMQ_CURVE;
713 714 715
                return 0;
            }
            break;
716

717 718 719 720 721 722 723 724 725 726
        case ZMQ_CURVE_PUBLICKEY:
            if (*optvallen_ == CURVE_KEYSIZE) {
                memcpy (optval_, curve_public_key, CURVE_KEYSIZE);
                return 0;
            }
            else
            if (*optvallen_ == CURVE_KEYSIZE_Z85 + 1) {
                zmq_z85_encode ((char *) optval_, curve_public_key, CURVE_KEYSIZE);
                return 0;
            }
727
            break;
728

729 730 731 732 733 734 735 736 737 738
        case ZMQ_CURVE_SECRETKEY:
            if (*optvallen_ == CURVE_KEYSIZE) {
                memcpy (optval_, curve_secret_key, CURVE_KEYSIZE);
                return 0;
            }
            else
            if (*optvallen_ == CURVE_KEYSIZE_Z85 + 1) {
                zmq_z85_encode ((char *) optval_, curve_secret_key, CURVE_KEYSIZE);
                return 0;
            }
739 740
            break;

741 742 743 744 745 746 747 748 749 750
        case ZMQ_CURVE_SERVERKEY:
            if (*optvallen_ == CURVE_KEYSIZE) {
                memcpy (optval_, curve_server_key, CURVE_KEYSIZE);
                return 0;
            }
            else
            if (*optvallen_ == CURVE_KEYSIZE_Z85 + 1) {
                zmq_z85_encode ((char *) optval_, curve_server_key, CURVE_KEYSIZE);
                return 0;
            }
751
            break;
752
#       endif
danielkr's avatar
danielkr committed
753 754 755 756 757 758 759

        case ZMQ_CONFLATE:
            if (is_int) {
                *value = conflate;
                return 0;
            }
            break;
760 761 762 763 764 765 766
 
        case ZMQ_GSSAPI_SERVER:
            if (is_int) {
                *value = as_server && mechanism == ZMQ_GSSAPI;
                return 0;
            }
            break;
767

Chris Busbey's avatar
Chris Busbey committed
768 769 770 771
        case ZMQ_GSSAPI_PRINCIPAL:
            if (*optvallen_ >= gss_principal.size () + 1) {
                memcpy (optval_, gss_principal.c_str (), gss_principal.size () + 1);
                *optvallen_ = gss_principal.size () + 1;
772 773 774
                return 0;
            }
            break;
danielkr's avatar
danielkr committed
775

Chris Busbey's avatar
Chris Busbey committed
776 777 778 779
        case ZMQ_GSSAPI_SERVICE_PRINCIPAL:
            if (*optvallen_ >= gss_service_principal.size () + 1) {
                memcpy (optval_, gss_service_principal.c_str (), gss_service_principal.size () + 1);
                *optvallen_ = gss_service_principal.size () + 1;
780 781 782
                return 0;
            }
            break;
783

784 785 786 787 788 789 790
        case ZMQ_GSSAPI_PLAINTEXT:
            if (is_int) {
                *value = gss_plaintext;
                return 0;
            }
            break;
 
791 792 793 794 795 796
        case ZMQ_HANDSHAKE_IVL:
            if (is_int) {
                *value = handshake_ivl;
                return 0;
            }
            break;
797
    }
798 799 800
    errno = EINVAL;
    return -1;
}