Skip to content

Commit e09ac09

Browse files
committed
Fix getting socket options and a warning
1 parent 2afe46e commit e09ac09

File tree

1 file changed

+51
-105
lines changed

1 file changed

+51
-105
lines changed

src/zmq/lib.rs

+51-105
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
#[crate_type = "dylib"];
77
#[crate_type = "rlib"];
88

9-
#[feature(phase)];
9+
#[feature(phase, macro_rules)];
10+
1011
#[phase(syntax, link)]
1112
extern crate log;
1213

@@ -36,7 +37,7 @@ extern {
3637
fn zmq_socket(ctx: Context_, typ: c_int) -> Socket_;
3738
fn zmq_close(socket: Socket_) -> c_int;
3839

39-
fn zmq_getsockopt(socket: Socket_, opt: c_int, optval: *c_void, size: *size_t) -> c_int;
40+
fn zmq_getsockopt(socket: Socket_, opt: c_int, optval: *mut c_void, size: *mut size_t) -> c_int;
4041
fn zmq_setsockopt(socket: Socket_, opt: c_int, optval: *c_void, size: size_t) -> c_int;
4142

4243
fn zmq_bind(socket: Socket_, endpoint: *c_char) -> c_int;
@@ -639,10 +640,10 @@ pub static POLLOUT : i16 = 2i16;
639640
pub static POLLERR : i16 = 4i16;
640641

641642
pub struct PollItem {
642-
socket: Socket_,
643-
fd: c_int,
644-
events: i16,
645-
revents: i16
643+
priv socket: Socket_,
644+
priv fd: c_int,
645+
priv events: i16,
646+
priv revents: i16
646647
}
647648

648649
pub fn poll(items: &mut [PollItem], timeout: i64) -> Result<(), Error> {
@@ -669,78 +670,40 @@ impl fmt::Show for Error {
669670
}
670671
}
671672

672-
fn getsockopt_int(sock: Socket_, opt: c_int) -> Result<int, Error> {
673-
let value = 0u32 as c_int;
674-
let size = mem::size_of::<c_int>() as size_t;
675-
676-
let r = unsafe {
677-
zmq_getsockopt(
678-
sock,
679-
opt,
680-
value as *c_void,
681-
&size)
682-
};
683-
684-
if r == -1i32 { Err(errno_to_error()) } else { Ok(value as int) }
685-
}
686-
687-
fn getsockopt_u32(sock: Socket_, opt: c_int) -> Result<u32, Error> {
688-
let value = 0u32;
689-
let size = mem::size_of::<u32>() as size_t;
690-
691-
let r = unsafe {
692-
zmq_getsockopt(
693-
sock,
694-
opt,
695-
value as *c_void,
696-
&size)
697-
};
698-
699-
if r == -1i32 { Err(errno_to_error()) } else { Ok(value) }
700-
}
701-
702-
fn getsockopt_i64(sock: Socket_, opt: c_int) -> Result<i64, Error> {
703-
let value = 0i64;
704-
let size = mem::size_of::<i64>() as size_t;
705-
706-
let r = unsafe {
707-
zmq_getsockopt(
708-
sock,
709-
opt,
710-
value as *c_void,
711-
&size)
712-
};
713-
714-
if r == -1i32 { Err(errno_to_error()) } else { Ok(value) }
715-
}
716-
717-
fn getsockopt_u64(sock: Socket_, opt: c_int) -> Result<u64, Error> {
718-
let value = 0u64;
719-
let size = mem::size_of::<u64>() as size_t;
720-
721-
let r = unsafe {
722-
zmq_getsockopt(
723-
sock,
724-
opt,
725-
value as *c_void,
726-
&size)
727-
};
673+
macro_rules! getsockopt_num(
674+
($name:ident, $ty:ty) => (
675+
fn $name(sock: Socket_, opt: c_int) -> Result<$ty, Error> {
676+
unsafe {
677+
let value = ptr::mut_null();
678+
let mut size = mem::size_of::<$ty>() as size_t;
679+
680+
if -1 == zmq_getsockopt(sock, opt, value, &mut size) {
681+
Err(errno_to_error())
682+
} else {
683+
Ok(*(value as *$ty))
684+
}
685+
}
686+
}
687+
)
688+
)
728689

729-
if r == -1i32 { Err(errno_to_error()) } else { Ok(value) }
730-
}
690+
getsockopt_num!(getsockopt_int, int)
691+
getsockopt_num!(getsockopt_u32, u32)
692+
getsockopt_num!(getsockopt_i64, i64)
693+
getsockopt_num!(getsockopt_u64, u64)
731694

732695
fn getsockopt_bytes(sock: Socket_, opt: c_int) -> Result<Vec<u8>, Error> {
733-
// The only binary option in zeromq is ZMQ_IDENTITY, which can have
734-
// a max size of 255 bytes.
735-
let size = 255 as size_t;
736-
let mut value = Vec::with_capacity(size as uint);
737-
738696
unsafe {
697+
// The only binary option in zeromq is ZMQ_IDENTITY, which can have
698+
// a max size of 255 bytes.
699+
let mut size = 255 as size_t;
700+
let mut value = Vec::with_capacity(size as uint);
701+
739702
let r = zmq_getsockopt(
740703
sock,
741704
opt,
742-
value.as_ptr() as *c_void,
743-
&size);
705+
value.as_mut_ptr() as *mut c_void,
706+
&mut size);
744707

745708
if r == -1i32 {
746709
Err(errno_to_error())
@@ -751,42 +714,25 @@ fn getsockopt_bytes(sock: Socket_, opt: c_int) -> Result<Vec<u8>, Error> {
751714
}
752715
}
753716

754-
fn setsockopt_int(sock: Socket_, opt: c_int, value: int) -> Result<(), Error> {
755-
let value = value as c_int;
756-
let r = unsafe {
757-
zmq_setsockopt(
758-
sock,
759-
opt,
760-
value as *c_void,
761-
mem::size_of::<c_int>() as size_t)
762-
};
763-
764-
if r == -1i32 { Err(errno_to_error()) } else { Ok(()) }
765-
}
766-
767-
fn setsockopt_i64(sock: Socket_, opt: c_int, value: i64) -> Result<(), Error> {
768-
let r = unsafe {
769-
zmq_setsockopt(
770-
sock,
771-
opt,
772-
value as *c_void,
773-
mem::size_of::<i64>() as size_t)
774-
};
775-
776-
if r == -1i32 { Err(errno_to_error()) } else { Ok(()) }
777-
}
717+
macro_rules! setsockopt_num(
718+
($name:ident, $ty:ty) => (
719+
fn $name(sock: Socket_, opt: c_int, value: $ty) -> Result<(), Error> {
720+
unsafe {
721+
let size = mem::size_of::<$ty>() as size_t;
778722

779-
fn setsockopt_u64(sock: Socket_, opt: c_int, value: u64) -> Result<(), Error> {
780-
let r = unsafe {
781-
zmq_setsockopt(
782-
sock,
783-
opt,
784-
value as *c_void,
785-
mem::size_of::<u64>() as size_t)
786-
};
723+
if -1 == zmq_setsockopt(sock, opt, (&value as *$ty) as *c_void, size) {
724+
Err(errno_to_error())
725+
} else {
726+
Ok(())
727+
}
728+
}
729+
}
730+
)
731+
)
787732

788-
if r == -1i32 { Err(errno_to_error()) } else { Ok(()) }
789-
}
733+
setsockopt_num!(setsockopt_int, int)
734+
setsockopt_num!(setsockopt_i64, i64)
735+
setsockopt_num!(setsockopt_u64, u64)
790736

791737
fn setsockopt_bytes(sock: Socket_, opt: c_int, value: &[u8]) -> Result<(), Error> {
792738
unsafe {

0 commit comments

Comments
 (0)