diff --git a/src/router.cpp b/src/router.cpp index 8c5bbffd..c008e5d6 100644 --- a/src/router.cpp +++ b/src/router.cpp @@ -68,27 +68,42 @@ void zmq::router_t::xattach_pipe (pipe_t *pipe_, bool icanhasall_) int zmq::router_t::xsetsockopt (int option_, const void *optval_, size_t optvallen_) { - if (option_ != ZMQ_ROUTER_MANDATORY - && option_ != ZMQ_ROUTER_RAW) { - errno = EINVAL; - return -1; + bool is_int = (optvallen_ == sizeof (int)); + int value = is_int? *((int *) optval_): 0; + + switch (option_) { + case ZMQ_ROUTER_RAW: + if (is_int && value >= 0) { + raw_sock = value; + if (raw_sock) { + options.recv_identity = false; + options.raw_sock = true; + } + return 0; + } + // DEBUGGING PROBLEM WITH TRAVIS CI + printf ("E: invalid option value (int=%d value=%d)\n", is_int, value); + break; + + case ZMQ_ROUTER_MANDATORY: + if (is_int && value >= 0) { + mandatory = value; + return 0; + } + // DEBUGGING PROBLEM WITH TRAVIS CI + printf ("E: invalid option value (int=%d value=%d)\n", is_int, value); + break; + + default: + break; } - if (optvallen_ != sizeof (int) || *static_cast (optval_) < 0) { - errno = EINVAL; - return -1; - } - if (option_ == ZMQ_ROUTER_RAW) { - raw_sock = (*static_cast (optval_) != 0); - if (raw_sock) { - options.recv_identity = false; - options.raw_sock = true; - } - } - else - mandatory = (*static_cast (optval_) != 0); - return 0; + // DEBUGGING PROBLEM WITH TRAVIS CI + printf ("E: invalid option (option=%d)\n", option_); + errno = EINVAL; + return -1; } + void zmq::router_t::xterminated (pipe_t *pipe_) { std::set ::iterator it = anonymous_pipes.find (pipe_);