mirror of
https://github.com/zeromq/libzmq.git
synced 2025-10-24 00:49:48 +02:00
Problem: code duplication in getsockopt/setsockopt
Solution: extracted common code into do_getsockopt/do_setsockopt functions
This commit is contained in:
@@ -97,7 +97,6 @@
|
||||
#include "scatter.hpp"
|
||||
#include "dgram.hpp"
|
||||
|
||||
|
||||
bool zmq::socket_base_t::check_tag ()
|
||||
{
|
||||
return tag == 0xbaddecaf;
|
||||
@@ -395,77 +394,41 @@ int zmq::socket_base_t::getsockopt (int option_,
|
||||
}
|
||||
|
||||
if (option_ == ZMQ_RCVMORE) {
|
||||
if (*optvallen_ < sizeof (int)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
memset (optval_, 0, *optvallen_);
|
||||
*((int *) optval_) = rcvmore ? 1 : 0;
|
||||
*optvallen_ = sizeof (int);
|
||||
return 0;
|
||||
return do_getsockopt<int> (optval_, optvallen_, rcvmore ? 1 : 0);
|
||||
}
|
||||
|
||||
if (option_ == ZMQ_FD) {
|
||||
if (*optvallen_ < sizeof (fd_t)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (thread_safe) {
|
||||
// thread safe socket doesn't provide file descriptor
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*((fd_t *) optval_) = ((mailbox_t *) mailbox)->get_fd ();
|
||||
*optvallen_ = sizeof (fd_t);
|
||||
|
||||
return 0;
|
||||
return do_getsockopt<fd_t> (optval_, optvallen_,
|
||||
((mailbox_t *) mailbox)->get_fd ());
|
||||
}
|
||||
|
||||
if (option_ == ZMQ_EVENTS) {
|
||||
if (*optvallen_ < sizeof (int)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
int rc = process_commands (0, false);
|
||||
if (rc != 0 && (errno == EINTR || errno == ETERM)) {
|
||||
return -1;
|
||||
}
|
||||
errno_assert (rc == 0);
|
||||
*((int *) optval_) = 0;
|
||||
if (has_out ())
|
||||
*((int *) optval_) |= ZMQ_POLLOUT;
|
||||
if (has_in ())
|
||||
*((int *) optval_) |= ZMQ_POLLIN;
|
||||
*optvallen_ = sizeof (int);
|
||||
return 0;
|
||||
|
||||
return do_getsockopt<int> (optval_, optvallen_,
|
||||
(has_out () ? ZMQ_POLLOUT : 0)
|
||||
| (has_in () ? ZMQ_POLLIN : 0));
|
||||
}
|
||||
|
||||
if (option_ == ZMQ_LAST_ENDPOINT) {
|
||||
if (*optvallen_ < last_endpoint.size () + 1) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
strncpy (static_cast<char *> (optval_), last_endpoint.c_str (),
|
||||
last_endpoint.size () + 1);
|
||||
*optvallen_ = last_endpoint.size () + 1;
|
||||
return 0;
|
||||
return do_getsockopt (optval_, optvallen_, last_endpoint);
|
||||
}
|
||||
|
||||
if (option_ == ZMQ_THREAD_SAFE) {
|
||||
if (*optvallen_ < sizeof (int)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
memset (optval_, 0, *optvallen_);
|
||||
*((int *) optval_) = thread_safe ? 1 : 0;
|
||||
*optvallen_ = sizeof (int);
|
||||
return 0;
|
||||
return do_getsockopt<int> (optval_, optvallen_, thread_safe ? 1 : 0);
|
||||
}
|
||||
|
||||
int rc = options.getsockopt (option_, optval_, optvallen_);
|
||||
return rc;
|
||||
return options.getsockopt (option_, optval_, optvallen_);
|
||||
}
|
||||
|
||||
int zmq::socket_base_t::join (const char *group_)
|
||||
|
||||
Reference in New Issue
Block a user