6
6
#[ crate_type = "dylib" ] ;
7
7
#[ crate_type = "rlib" ] ;
8
8
9
- #[ feature( phase) ] ;
9
+ #[ feature( phase, macro_rules) ] ;
10
+
10
11
#[ phase( syntax, link) ]
11
12
extern crate log;
12
13
@@ -36,7 +37,7 @@ extern {
36
37
fn zmq_socket ( ctx : Context_ , typ : c_int ) -> Socket_ ;
37
38
fn zmq_close ( socket : Socket_ ) -> c_int ;
38
39
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 ;
40
41
fn zmq_setsockopt ( socket : Socket_ , opt : c_int , optval : * c_void , size : size_t ) -> c_int ;
41
42
42
43
fn zmq_bind ( socket : Socket_ , endpoint : * c_char ) -> c_int ;
@@ -639,10 +640,10 @@ pub static POLLOUT : i16 = 2i16;
639
640
pub static POLLERR : i16 = 4i16 ;
640
641
641
642
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
646
647
}
647
648
648
649
pub fn poll ( items : & mut [ PollItem ] , timeout : i64 ) -> Result < ( ) , Error > {
@@ -669,78 +670,40 @@ impl fmt::Show for Error {
669
670
}
670
671
}
671
672
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
+ )
728
689
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 )
731
694
732
695
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
-
738
696
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
+
739
702
let r = zmq_getsockopt (
740
703
sock,
741
704
opt,
742
- value. as_ptr ( ) as * c_void ,
743
- & size) ;
705
+ value. as_mut_ptr ( ) as * mut c_void ,
706
+ & mut size) ;
744
707
745
708
if r == -1i32 {
746
709
Err ( errno_to_error ( ) )
@@ -751,42 +714,25 @@ fn getsockopt_bytes(sock: Socket_, opt: c_int) -> Result<Vec<u8>, Error> {
751
714
}
752
715
}
753
716
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;
778
722
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
+ )
787
732
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 )
790
736
791
737
fn setsockopt_bytes ( sock : Socket_ , opt : c_int , value : & [ u8 ] ) -> Result < ( ) , Error > {
792
738
unsafe {
0 commit comments