diff --git a/src/options.cpp b/src/options.cpp index 330d7ac8..002c9630 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -90,6 +90,35 @@ zmq::options_t::options_t () : #endif } +int zmq::options_t::set_curve_key(uint8_t * destination, const void * optval_, size_t optvallen_) +{ + char * optval = (char *) optval_; + switch (optvallen_) { + + case CURVE_KEYSIZE: + memcpy (destination, optval_, optvallen_); + mechanism = ZMQ_CURVE; + return 0; + + case CURVE_KEYSIZE_Z85: + char z85_key [CURVE_KEYSIZE_Z85 + 1]; + memcpy (z85_key, optval, optvallen_); + z85_key [optvallen_] = 0; + optval = z85_key; + //Intentionall fallthrough + case CURVE_KEYSIZE_Z85 + 1: + if (zmq_z85_decode (destination, optval)) { + mechanism = ZMQ_CURVE; + return 0; + } + break; + + default: + break; + } + return -1; +} + int zmq::options_t::setsockopt (int option_, const void *optval_, size_t optvallen_) { @@ -418,87 +447,19 @@ int zmq::options_t::setsockopt (int option_, const void *optval_, break; case ZMQ_CURVE_PUBLICKEY: - // TODO: refactor repeated code for these three options - // into set_curve_key (destination, optval, optlen) method - // ==> set_curve_key (curve_public_key, optval_, optvallen_); - if (optvallen_ == CURVE_KEYSIZE) { - memcpy (curve_public_key, optval_, CURVE_KEYSIZE); - mechanism = ZMQ_CURVE; + if(0 == set_curve_key(curve_public_key, optval_, optvallen_)) return 0; - } - else - if (optvallen_ == CURVE_KEYSIZE_Z85 + 1) { - if (zmq_z85_decode (curve_public_key, (char *) optval_)) { - mechanism = ZMQ_CURVE; - return 0; - } - } - else - // Deprecated, not symmetrical with zmq_getsockopt - if (optvallen_ == CURVE_KEYSIZE_Z85) { - char z85_key [CURVE_KEYSIZE_Z85 + 1]; - memcpy (z85_key, (char *) optval_, CURVE_KEYSIZE_Z85); - z85_key [CURVE_KEYSIZE_Z85] = 0; - if (zmq_z85_decode (curve_public_key, z85_key)) { - mechanism = ZMQ_CURVE; - return 0; - } - } break; case ZMQ_CURVE_SECRETKEY: - if (optvallen_ == CURVE_KEYSIZE) { - memcpy (curve_secret_key, optval_, CURVE_KEYSIZE); - mechanism = ZMQ_CURVE; + if(0 == set_curve_key(curve_secret_key, optval_, optvallen_)) return 0; - } - else - if (optvallen_ == CURVE_KEYSIZE_Z85 + 1) { - if (zmq_z85_decode (curve_secret_key, (char *) optval_)) { - mechanism = ZMQ_CURVE; - return 0; - } - } - else - // Deprecated, not symmetrical with zmq_getsockopt - if (optvallen_ == CURVE_KEYSIZE_Z85) { - char z85_key [CURVE_KEYSIZE_Z85 + 1]; - memcpy (z85_key, (char *) optval_, CURVE_KEYSIZE_Z85); - z85_key [CURVE_KEYSIZE_Z85] = 0; - if (zmq_z85_decode (curve_secret_key, z85_key)) { - mechanism = ZMQ_CURVE; - return 0; - } - } break; case ZMQ_CURVE_SERVERKEY: - if (optvallen_ == CURVE_KEYSIZE) { - memcpy (curve_server_key, optval_, CURVE_KEYSIZE); - mechanism = ZMQ_CURVE; + if(0 == set_curve_key(curve_server_key, optval_, optvallen_)) as_server = 0; return 0; - } - else - if (optvallen_ == CURVE_KEYSIZE_Z85 + 1) { - if (zmq_z85_decode (curve_server_key, (char *) optval_)) { - mechanism = ZMQ_CURVE; - as_server = 0; - return 0; - } - } - else - // Deprecated, not symmetrical with zmq_getsockopt - if (optvallen_ == CURVE_KEYSIZE_Z85) { - char z85_key [CURVE_KEYSIZE_Z85 + 1]; - memcpy (z85_key, (char *) optval_, CURVE_KEYSIZE_Z85); - z85_key [CURVE_KEYSIZE_Z85] = 0; - if (zmq_z85_decode (curve_server_key, z85_key)) { - mechanism = ZMQ_CURVE; - as_server = 0; - return 0; - } - } break; #endif diff --git a/src/options.hpp b/src/options.hpp index e8efed61..bcf563ef 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -56,6 +56,8 @@ namespace zmq { options_t (); + int set_curve_key(uint8_t * destination, const void * optval_, size_t optvallen_); + int setsockopt (int option_, const void *optval_, size_t optvallen_); int getsockopt (int option_, void *optval_, size_t *optvallen_) const;