@@ -75,17 +75,17 @@ pub fn sockaddr_to_addr(storage: &libc::sockaddr_storage,
75
75
}
76
76
}
77
77
78
- fn addr_to_sockaddr ( addr : rtio:: SocketAddr ) -> ( libc:: sockaddr_storage , uint ) {
78
+ fn addr_to_sockaddr ( addr : rtio:: SocketAddr ,
79
+ storage : & mut libc:: sockaddr_storage )
80
+ -> libc:: socklen_t {
79
81
unsafe {
80
- let mut storage: libc:: sockaddr_storage = mem:: zeroed ( ) ;
81
82
let len = match addr. ip {
82
83
rtio:: Ipv4Addr ( a, b, c, d) => {
83
84
let ip = ( a as u32 << 24 ) |
84
85
( b as u32 << 16 ) |
85
86
( c as u32 << 8 ) |
86
87
( d as u32 << 0 ) ;
87
- let storage: & mut libc:: sockaddr_in =
88
- mem:: transmute ( & mut storage) ;
88
+ let storage = storage as * mut _ as * mut libc:: sockaddr_in ;
89
89
( * storage) . sin_family = libc:: AF_INET as libc:: sa_family_t ;
90
90
( * storage) . sin_port = htons ( addr. port ) ;
91
91
( * storage) . sin_addr = libc:: in_addr {
@@ -95,11 +95,10 @@ fn addr_to_sockaddr(addr: rtio::SocketAddr) -> (libc::sockaddr_storage, uint) {
95
95
mem:: size_of :: < libc:: sockaddr_in > ( )
96
96
}
97
97
rtio:: Ipv6Addr ( a, b, c, d, e, f, g, h) => {
98
- let storage: & mut libc:: sockaddr_in6 =
99
- mem:: transmute ( & mut storage) ;
100
- storage. sin6_family = libc:: AF_INET6 as libc:: sa_family_t ;
101
- storage. sin6_port = htons ( addr. port ) ;
102
- storage. sin6_addr = libc:: in6_addr {
98
+ let storage = storage as * mut _ as * mut libc:: sockaddr_in6 ;
99
+ ( * storage) . sin6_family = libc:: AF_INET6 as libc:: sa_family_t ;
100
+ ( * storage) . sin6_port = htons ( addr. port ) ;
101
+ ( * storage) . sin6_addr = libc:: in6_addr {
103
102
s6_addr : [
104
103
htons ( a) ,
105
104
htons ( b) ,
@@ -114,7 +113,7 @@ fn addr_to_sockaddr(addr: rtio::SocketAddr) -> (libc::sockaddr_storage, uint) {
114
113
mem:: size_of :: < libc:: sockaddr_in6 > ( )
115
114
}
116
115
} ;
117
- return ( storage , len) ;
116
+ return len as libc :: socklen_t
118
117
}
119
118
}
120
119
@@ -203,8 +202,9 @@ impl TcpWatcher {
203
202
timeout : Option < u64 > ) -> Result < TcpWatcher , UvError > {
204
203
let tcp = TcpWatcher :: new ( io) ;
205
204
let cx = ConnectCtx { status : -1 , task : None , timer : None } ;
206
- let ( addr, _len) = addr_to_sockaddr ( address) ;
207
- let addr_p = & addr as * const _ as * const libc:: sockaddr ;
205
+ let mut storage = unsafe { mem:: zeroed ( ) } ;
206
+ let _len = addr_to_sockaddr ( address, & mut storage) ;
207
+ let addr_p = & storage as * const _ as * const libc:: sockaddr ;
208
208
cx. connect ( tcp, timeout, io, |req, tcp, cb| {
209
209
unsafe { uvll:: uv_tcp_connect ( req. handle , tcp. handle , addr_p, cb) }
210
210
} )
@@ -361,10 +361,11 @@ impl TcpListener {
361
361
outgoing : tx,
362
362
incoming : rx,
363
363
} ;
364
- let ( addr, _len) = addr_to_sockaddr ( address) ;
364
+ let mut storage = unsafe { mem:: zeroed ( ) } ;
365
+ let _len = addr_to_sockaddr ( address, & mut storage) ;
365
366
let res = unsafe {
366
- let addr_p = & addr as * const libc:: sockaddr_storage ;
367
- uvll:: uv_tcp_bind ( l. handle , addr_p as * const libc :: sockaddr )
367
+ let addr_p = & storage as * const _ as * const libc:: sockaddr ;
368
+ uvll:: uv_tcp_bind ( l. handle , addr_p)
368
369
} ;
369
370
return match res {
370
371
0 => Ok ( l. install ( ) ) ,
@@ -513,10 +514,11 @@ impl UdpWatcher {
513
514
assert_eq ! ( unsafe {
514
515
uvll:: uv_udp_init( io. uv_loop( ) , udp. handle)
515
516
} , 0 ) ;
516
- let ( addr, _len) = addr_to_sockaddr ( address) ;
517
+ let mut storage = unsafe { mem:: zeroed ( ) } ;
518
+ let _len = addr_to_sockaddr ( address, & mut storage) ;
517
519
let result = unsafe {
518
- let addr_p = & addr as * const libc:: sockaddr_storage ;
519
- uvll:: uv_udp_bind ( udp. handle , addr_p as * const libc :: sockaddr , 0u32 )
520
+ let addr_p = & storage as * const _ as * const libc:: sockaddr ;
521
+ uvll:: uv_udp_bind ( udp. handle , addr_p, 0u32 )
520
522
} ;
521
523
return match result {
522
524
0 => Ok ( udp) ,
@@ -614,8 +616,9 @@ impl rtio::RtioUdpSocket for UdpWatcher {
614
616
let guard = try!( self . write_access . grant ( m) ) ;
615
617
616
618
let mut req = Request :: new ( uvll:: UV_UDP_SEND ) ;
617
- let ( addr, _len) = addr_to_sockaddr ( dst) ;
618
- let addr_p = & addr as * const _ as * const libc:: sockaddr ;
619
+ let mut storage = unsafe { mem:: zeroed ( ) } ;
620
+ let _len = addr_to_sockaddr ( dst, & mut storage) ;
621
+ let addr_p = & storage as * const _ as * const libc:: sockaddr ;
619
622
620
623
// see comments in StreamWatcher::write for why we may allocate a buffer
621
624
// here.
0 commit comments