@@ -19,6 +19,10 @@ use std::net::{ToSocketAddrs, SocketAddr, Shutdown};
19
19
20
20
#[ cfg( target_os="linux" ) ]
21
21
use std:: os:: unix:: io:: { AsRawFd , RawFd , FromRawFd } ;
22
+
23
+ #[ cfg( target_os="linux" ) ]
24
+ pub mod mio_unix;
25
+
22
26
#[ cfg( target_os="windows" ) ]
23
27
use std:: os:: windows:: io:: { AsRawHandle , RawHandle , FromRawHandle } ;
24
28
@@ -60,9 +64,9 @@ impl SctpStream {
60
64
61
65
/// Create a new stream by connecting it to a remote endpoint
62
66
pub fn connect < A : ToSocketAddrs > ( address : A ) -> Result < SctpStream > {
63
- let raw_addr = try! ( SocketAddr :: from_addr ( & address) ) ;
64
- let sock = try! ( SctpSocket :: new ( raw_addr. family ( ) , SOCK_STREAM ) ) ;
65
- try! ( sock. connect ( raw_addr) ) ;
67
+ let raw_addr = SocketAddr :: from_addr ( & address) ? ;
68
+ let sock = SctpSocket :: new ( raw_addr. family ( ) , SOCK_STREAM ) ? ;
69
+ sock. connect ( raw_addr) ? ;
66
70
return Ok ( SctpStream ( sock) ) ;
67
71
}
68
72
@@ -72,26 +76,32 @@ impl SctpStream {
72
76
let mut vec = Vec :: with_capacity ( addresses. len ( ) ) ;
73
77
let mut family = AF_INET ;
74
78
for address in addresses {
75
- let a = try! ( SocketAddr :: from_addr ( address) ) ;
79
+ let a = SocketAddr :: from_addr ( address) ? ;
76
80
if a. family ( ) == AF_INET6 { family = AF_INET6 ; }
77
81
vec. push ( a) ;
78
82
}
79
83
80
- let sock = try! ( SctpSocket :: new ( family, SOCK_STREAM ) ) ;
81
- try! ( sock. connectx ( & vec) ) ;
84
+ let sock = SctpSocket :: new ( family, SOCK_STREAM ) ? ;
85
+ sock. connectx ( & vec) ? ;
82
86
return Ok ( SctpStream ( sock) ) ;
83
87
}
84
88
85
89
/// Send bytes on the specified SCTP stream. On success, returns the
86
90
/// quantity of bytes read
87
91
pub fn sendmsg ( & self , msg : & [ u8 ] , stream : u16 ) -> Result < usize > {
88
- return self . 0 . sendmsg :: < SocketAddr > ( msg, None , stream, 0 ) ;
92
+ return self . 0 . sendmsg :: < SocketAddr > ( msg, None , 0 , stream, 0 ) ;
93
+ }
94
+
95
+ /// Send bytes on the specified SCTP stream. On success, returns the
96
+ /// quantity of bytes read
97
+ pub fn sendmsg_ppid ( & self , msg : & [ u8 ] , ppid : u32 , stream : u16 ) -> Result < usize > {
98
+ return self . 0 . sendmsg :: < SocketAddr > ( msg, None , ppid, stream, 0 ) ;
89
99
}
90
100
91
101
/// Read bytes. On success, return a tuple with the quantity of
92
102
/// bytes received and the stream they were recived on
93
103
pub fn recvmsg ( & self , msg : & mut [ u8 ] ) -> Result < ( usize , u16 ) > {
94
- let ( size, stream, _) = try! ( self . 0 . recvmsg ( msg) ) ;
104
+ let ( size, stream, _) = self . 0 . recvmsg ( msg) ? ;
95
105
return Ok ( ( size, stream) ) ;
96
106
}
97
107
@@ -118,7 +128,7 @@ impl SctpStream {
118
128
119
129
/// Verify if SCTP_NODELAY option is activated for this socket
120
130
pub fn has_nodelay ( & self ) -> Result < bool > {
121
- let val: libc:: c_int = try! ( self . 0 . sctp_opt_info ( sctp_sys:: SCTP_NODELAY , 0 ) ) ;
131
+ let val: libc:: c_int = self . 0 . sctp_opt_info ( sctp_sys:: SCTP_NODELAY , 0 ) ? ;
122
132
return Ok ( val == 1 ) ;
123
133
}
124
134
@@ -129,8 +139,8 @@ impl SctpStream {
129
139
}
130
140
131
141
/// Get the socket buffer size for the direction specified by `dir`
132
- pub fn get_buffer_size ( & self , dir : SoDirection ) -> Result < ( usize ) > {
133
- let val: u32 = try! ( self . 0 . getsockopt ( SOL_SOCKET , dir. buffer_opt ( ) ) ) ;
142
+ pub fn get_buffer_size ( & self , dir : SoDirection ) -> Result < usize > {
143
+ let val: u32 = self . 0 . getsockopt ( SOL_SOCKET , dir. buffer_opt ( ) ) ? ;
134
144
return Ok ( val as usize ) ;
135
145
}
136
146
@@ -144,7 +154,7 @@ impl SctpStream {
144
154
/// Try to clone the SctpStream. On success, returns a new stream
145
155
/// wrapping a new socket handler
146
156
pub fn try_clone ( & self ) -> Result < SctpStream > {
147
- return Ok ( SctpStream ( try! ( self . 0 . try_clone ( ) ) ) ) ;
157
+ return Ok ( SctpStream ( self . 0 . try_clone ( ) ? ) ) ;
148
158
}
149
159
}
150
160
@@ -200,10 +210,10 @@ impl SctpEndpoint {
200
210
201
211
/// Create a one-to-many SCTP endpoint bound to a single address
202
212
pub fn bind < A : ToSocketAddrs > ( address : A ) -> Result < SctpEndpoint > {
203
- let raw_addr = try! ( SocketAddr :: from_addr ( & address) ) ;
204
- let sock = try! ( SctpSocket :: new ( raw_addr. family ( ) , SOCK_SEQPACKET ) ) ;
205
- try! ( sock. bind ( raw_addr) ) ;
206
- try! ( sock. listen ( -1 ) ) ;
213
+ let raw_addr = SocketAddr :: from_addr ( & address) ? ;
214
+ let sock = SctpSocket :: new ( raw_addr. family ( ) , SOCK_SEQPACKET ) ? ;
215
+ sock. bind ( raw_addr) ? ;
216
+ sock. listen ( -1 ) ? ;
207
217
return Ok ( SctpEndpoint ( sock) ) ;
208
218
}
209
219
@@ -213,14 +223,14 @@ impl SctpEndpoint {
213
223
let mut vec = Vec :: with_capacity ( addresses. len ( ) ) ;
214
224
let mut family = AF_INET ;
215
225
for address in addresses {
216
- let a = try! ( SocketAddr :: from_addr ( address) ) ;
226
+ let a = SocketAddr :: from_addr ( address) ? ;
217
227
if a. family ( ) == AF_INET6 { family = AF_INET6 ; }
218
228
vec. push ( a) ;
219
229
}
220
230
221
- let sock = try! ( SctpSocket :: new ( family, SOCK_SEQPACKET ) ) ;
222
- try! ( sock. bindx ( & vec, BindOp :: AddAddr ) ) ;
223
- try! ( sock. listen ( -1 ) ) ;
231
+ let sock = SctpSocket :: new ( family, SOCK_SEQPACKET ) ? ;
232
+ sock. bindx ( & vec, BindOp :: AddAddr ) ? ;
233
+ sock. listen ( -1 ) ? ;
224
234
return Ok ( SctpEndpoint ( sock) ) ;
225
235
}
226
236
@@ -234,7 +244,7 @@ impl SctpEndpoint {
234
244
/// Send data in Sctp style, to the provided address on the stream `stream`.
235
245
/// On success, returns the quantity on bytes sent
236
246
pub fn send_to < A : ToSocketAddrs > ( & self , msg : & mut [ u8 ] , address : A , stream : u16 ) -> Result < usize > {
237
- return self . 0 . sendmsg ( msg, Some ( address) , stream, 0 ) ;
247
+ return self . 0 . sendmsg ( msg, Some ( address) , 0 , stream, 0 ) ;
238
248
}
239
249
240
250
/// Get local socket addresses to which this socket is bound
@@ -255,7 +265,7 @@ impl SctpEndpoint {
255
265
256
266
/// Verify if SCTP_NODELAY option is activated for this socket
257
267
pub fn has_nodelay ( & self ) -> Result < bool > {
258
- let val: libc:: c_int = try! ( self . 0 . sctp_opt_info ( sctp_sys:: SCTP_NODELAY , 0 ) ) ;
268
+ let val: libc:: c_int = self . 0 . sctp_opt_info ( sctp_sys:: SCTP_NODELAY , 0 ) ? ;
259
269
return Ok ( val == 1 ) ;
260
270
}
261
271
@@ -266,8 +276,8 @@ impl SctpEndpoint {
266
276
}
267
277
268
278
/// Get the socket buffer size for the direction specified by `dir`
269
- pub fn get_buffer_size ( & self , dir : SoDirection ) -> Result < ( usize ) > {
270
- let val: u32 = try! ( self . 0 . getsockopt ( SOL_SOCKET , dir. buffer_opt ( ) ) ) ;
279
+ pub fn get_buffer_size ( & self , dir : SoDirection ) -> Result < usize > {
280
+ let val: u32 = self . 0 . getsockopt ( SOL_SOCKET , dir. buffer_opt ( ) ) ? ;
271
281
return Ok ( val as usize ) ;
272
282
}
273
283
@@ -280,7 +290,7 @@ impl SctpEndpoint {
280
290
281
291
/// Try to clone this socket
282
292
pub fn try_clone ( & self ) -> Result < SctpEndpoint > {
283
- return Ok ( SctpEndpoint ( try! ( self . 0 . try_clone ( ) ) ) ) ;
293
+ return Ok ( SctpEndpoint ( self . 0 . try_clone ( ) ? ) ) ;
284
294
}
285
295
}
286
296
@@ -336,10 +346,10 @@ impl SctpListener {
336
346
337
347
/// Create a listener bound to a single address
338
348
pub fn bind < A : ToSocketAddrs > ( address : A ) -> Result < SctpListener > {
339
- let raw_addr = try! ( SocketAddr :: from_addr ( & address) ) ;
340
- let sock = try! ( SctpSocket :: new ( raw_addr. family ( ) , SOCK_STREAM ) ) ;
341
- try! ( sock. bind ( raw_addr) ) ;
342
- try! ( sock. listen ( -1 ) ) ;
349
+ let raw_addr = SocketAddr :: from_addr ( & address) ? ;
350
+ let sock = SctpSocket :: new ( raw_addr. family ( ) , SOCK_STREAM ) ? ;
351
+ sock. bind ( raw_addr) ? ;
352
+ sock. listen ( -1 ) ? ;
343
353
return Ok ( SctpListener ( sock) ) ;
344
354
}
345
355
@@ -349,20 +359,20 @@ impl SctpListener {
349
359
let mut vec = Vec :: with_capacity ( addresses. len ( ) ) ;
350
360
let mut family = AF_INET ;
351
361
for address in addresses {
352
- let a = try! ( SocketAddr :: from_addr ( address) ) ;
362
+ let a = SocketAddr :: from_addr ( address) ? ;
353
363
if a. family ( ) == AF_INET6 { family = AF_INET6 ; }
354
364
vec. push ( a) ;
355
365
}
356
366
357
- let sock = try! ( SctpSocket :: new ( family, SOCK_STREAM ) ) ;
358
- try! ( sock. bindx ( & vec, BindOp :: AddAddr ) ) ;
359
- try! ( sock. listen ( -1 ) ) ;
367
+ let sock = SctpSocket :: new ( family, SOCK_STREAM ) ? ;
368
+ sock. bindx ( & vec, BindOp :: AddAddr ) ? ;
369
+ sock. listen ( -1 ) ? ;
360
370
return Ok ( SctpListener ( sock) ) ;
361
371
}
362
372
363
373
/// Accept a new connection
364
374
pub fn accept ( & self ) -> Result < ( SctpStream , SocketAddr ) > {
365
- let ( sock, addr) = try! ( self . 0 . accept ( ) ) ;
375
+ let ( sock, addr) = self . 0 . accept ( ) ? ;
366
376
return Ok ( ( SctpStream ( sock) , addr) ) ;
367
377
}
368
378
@@ -385,7 +395,7 @@ impl SctpListener {
385
395
386
396
/// Try to clone this listener
387
397
pub fn try_clone ( & self ) -> Result < SctpListener > {
388
- return Ok ( SctpListener ( try! ( self . 0 . try_clone ( ) ) ) ) ;
398
+ return Ok ( SctpListener ( self . 0 . try_clone ( ) ? ) ) ;
389
399
}
390
400
}
391
401
0 commit comments