@@ -3,8 +3,8 @@ use libc;
3
3
use sctp_sys;
4
4
5
5
use std:: io:: { Result , Error , ErrorKind , Read , Write } ;
6
- use std:: net:: { ToSocketAddrs , SocketAddr } ;
7
- use std:: mem:: { transmute, size_of} ;
6
+ use std:: net:: { ToSocketAddrs , SocketAddr , Shutdown } ;
7
+ use std:: mem:: { transmute, size_of, zeroed } ;
8
8
9
9
#[ cfg( target_os="linux" ) ]
10
10
use std:: os:: unix:: io:: { AsRawFd , RawFd , FromRawFd } ;
@@ -40,7 +40,7 @@ fn check_socket(sock: SOCKET) -> Result<SOCKET> {
40
40
return Ok ( sock) ;
41
41
}
42
42
43
- /// SCTP bind opeartion
43
+ /// SCTP bind operation
44
44
#[ allow( dead_code) ]
45
45
pub enum BindOp {
46
46
/// Add bind addresses
@@ -182,7 +182,7 @@ impl SctpSocket {
182
182
for address in addresses {
183
183
let raw = try!( SocketAddr :: from_addr ( address) ) ;
184
184
let len = raw. addr_len ( ) ;
185
- std:: ptr:: copy ( raw. as_ptr ( ) as * mut u8 , buf. offset ( offset) , len as usize ) ;
185
+ std:: ptr:: copy_nonoverlapping ( raw. as_ptr ( ) as * mut u8 , buf. offset ( offset) , len as usize ) ;
186
186
offset += len as isize ;
187
187
}
188
188
@@ -286,7 +286,7 @@ impl SctpSocket {
286
286
unsafe {
287
287
let addr_ptr: * mut libc:: sockaddr = transmute ( & mut addr) ;
288
288
let mut info: sctp_sys:: sctp_sndrcvinfo = std:: mem:: zeroed ( ) ;
289
- return match sctp_sys:: sctp_recvmsg ( self . 0 , msg. as_mut_ptr ( ) as * mut libc:: c_void , len, addr_ptr, & mut addr_len, & mut info, & mut flags) {
289
+ return match sctp_sys:: sctp_recvmsg ( self . 0 , msg. as_mut_ptr ( ) as * mut libc:: c_void , len, addr_ptr, & mut addr_len, & mut info, & mut flags) {
290
290
res if res > 0 => Ok ( ( res as usize , info. sinfo_stream , try!( SocketAddr :: from_raw_ptr ( addr_ptr, addr_len) ) ) ) ,
291
291
_ => Err ( Error :: last_os_error ( ) )
292
292
} ;
@@ -312,6 +312,42 @@ impl SctpSocket {
312
312
}
313
313
}
314
314
315
+ /// Shuts down the read, write, or both halves of this connection
316
+ pub fn shutdown ( & self , how : Shutdown ) -> Result < ( ) > {
317
+ let side = match how {
318
+ Shutdown :: Read => libc:: SHUT_RD ,
319
+ Shutdown :: Write => libc:: SHUT_WR ,
320
+ Shutdown :: Both => libc:: SHUT_RDWR
321
+ } ;
322
+ return match unsafe { libc:: shutdown ( self . 0 , side) } {
323
+ 0 => Ok ( ( ) ) ,
324
+ _ => Err ( Error :: last_os_error ( ) )
325
+ } ;
326
+ }
327
+
328
+ /// Set SCTP socket option
329
+ pub fn setsockopt < T > ( & self , optname : libc:: c_int , optval : & T ) -> Result < ( ) > {
330
+ unsafe {
331
+ return match libc:: setsockopt ( self . 0 , sctp_sys:: SOL_SCTP , optname, transmute ( optval) , size_of :: < T > ( ) as libc:: socklen_t ) {
332
+ 0 => Ok ( ( ) ) ,
333
+ _ => Err ( Error :: last_os_error ( ) )
334
+ } ;
335
+ }
336
+ }
337
+
338
+ /// Get SCTP socket option
339
+ pub fn getsockopt < T > ( & self , optname : libc:: c_int , assoc : sctp_sys:: sctp_assoc_t ) -> Result < T > {
340
+ unsafe {
341
+ let mut val: T = zeroed ( ) ;
342
+ let mut len = size_of :: < T > ( ) as libc:: socklen_t ;
343
+ return match sctp_sys:: sctp_opt_info ( self . 0 , assoc, optname, transmute ( & mut val) , & mut len) {
344
+ 0 => Ok ( val) ,
345
+ _ => Err ( Error :: last_os_error ( ) )
346
+ } ;
347
+ }
348
+ }
349
+
350
+
315
351
/// Try to clone this socket
316
352
pub fn try_clone ( & self ) -> Result < SctpSocket > {
317
353
unsafe {
0 commit comments