diff --git a/doc/zmq_getsockopt.txt b/doc/zmq_getsockopt.txt index 3548c39c..e7ccd4a9 100644 --- a/doc/zmq_getsockopt.txt +++ b/doc/zmq_getsockopt.txt @@ -456,7 +456,7 @@ Default value:: -1 (leave to OS default) Applicable socket types:: all, when using TCP transports. ZMQ_MONITOR: Registers a callback for socket state changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Registers a callback function / event sink for changes in underlying socket state. The default value of `NULL` means no monitor callback function. diff --git a/src/options.cpp b/src/options.cpp index 8fb47a35..d24834c1 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -325,7 +325,7 @@ int zmq::options_t::setsockopt (int option_, const void *optval_, errno = EINVAL; return -1; } - monitor = ((zmq_monitor_fn*) optval_); + monitor = *((zmq_monitor_fn**) &optval_); return 0; } } @@ -550,8 +550,8 @@ int zmq::options_t::getsockopt (int option_, void *optval_, size_t *optvallen_) errno = EINVAL; return -1; } - ((zmq_monitor_fn*) optval_) = monitor; - *optvallen_ = sizeof (void *); + *((zmq_monitor_fn**) &optval_) = monitor; + *optvallen_ = sizeof (zmq_monitor_fn*); return 0; } diff --git a/src/session_base.cpp b/src/session_base.cpp index 2ada9707..681b1455 100644 --- a/src/session_base.cpp +++ b/src/session_base.cpp @@ -20,6 +20,8 @@ along with this program. If not, see . */ +#include + #include "session_base.hpp" #include "socket_base.hpp" #include "i_engine.hpp" diff --git a/tests/test_monitor.cpp b/tests/test_monitor.cpp index 6822803d..28197e15 100644 --- a/tests/test_monitor.cpp +++ b/tests/test_monitor.cpp @@ -99,16 +99,18 @@ int main (int argc, char *argv []) assert (rep); // Expects failure - invalid size - rc = zmq_setsockopt (rep, ZMQ_MONITOR, (void *)listening_sock_monitor, 20); + zmq_monitor_fn *monitor; + monitor = listening_sock_monitor; + + rc = zmq_setsockopt (rep, ZMQ_MONITOR, *(void **)&monitor, 20); assert (rc == -1); assert (errno == EINVAL); - rc = zmq_setsockopt (rep, ZMQ_MONITOR, (void *)listening_sock_monitor, sizeof (void *)); + rc = zmq_setsockopt (rep, ZMQ_MONITOR, *(void **)&monitor, sizeof (void *)); assert (rc == 0); - void *monitor; size_t sz = sizeof (void *); - rc = zmq_getsockopt (rep, ZMQ_MONITOR, monitor, &sz); + rc = zmq_getsockopt (rep, ZMQ_MONITOR, &monitor, &sz); assert (rc == 0); assert (monitor == listening_sock_monitor); @@ -116,7 +118,7 @@ int main (int argc, char *argv []) rc = zmq_setsockopt (rep, ZMQ_MONITOR, NULL, 0); assert (rc == 0); - rc = zmq_getsockopt (rep, ZMQ_MONITOR, monitor, &sz); + rc = zmq_getsockopt (rep, ZMQ_MONITOR, &monitor, &sz); assert (rc == 0); assert (monitor == listening_sock_monitor); @@ -126,7 +128,8 @@ int main (int argc, char *argv []) void *req = zmq_socket (ctx, ZMQ_REQ); assert (req); - rc = zmq_setsockopt (req, ZMQ_MONITOR, (void *)connecting_sock_monitor, sizeof (void *)); + monitor = connecting_sock_monitor; + rc = zmq_setsockopt (req, ZMQ_MONITOR, *(void **)&monitor, sizeof (void *)); assert (rc == 0); rc = zmq_connect (req, "tcp://127.0.0.1:5560");