@@ -14,53 +14,6 @@ pub struct NioLinuxSyscall<I: UnixSyscall> {
1414 inner : I ,
1515}
1616
17- macro_rules! impl_expected_read_hook {
18- ( $invoker: expr, $syscall: ident, $fn_ptr: expr, $socket: expr, $buffer: expr, $length: expr, $( $arg: expr) ,* $( , ) * ) => { {
19- let socket = $socket;
20- let blocking = $crate:: syscall:: common:: is_blocking( socket) ;
21- if blocking {
22- $crate:: syscall:: common:: set_non_blocking( socket) ;
23- }
24- let mut received = 0 ;
25- let mut r = 0 ;
26- while received < $length {
27- r = $invoker. $syscall(
28- $fn_ptr,
29- $socket,
30- ( $buffer as usize + received) as * mut c_void,
31- $length - received,
32- $( $arg, ) *
33- ) ;
34- if r != -1 {
35- $crate:: syscall:: common:: reset_errno( ) ;
36- received += r as size_t;
37- if received >= $length || r == 0 {
38- r = received as ssize_t;
39- break ;
40- }
41- }
42- let error_kind = std:: io:: Error :: last_os_error( ) . kind( ) ;
43- if error_kind == std:: io:: ErrorKind :: WouldBlock {
44- //wait read event
45- if $crate:: net:: event_loop:: EventLoops :: wait_read_event(
46- socket,
47- Some ( std:: time:: Duration :: from_millis( 10 ) ) ,
48- )
49- . is_err( )
50- {
51- break ;
52- }
53- } else if error_kind != std:: io:: ErrorKind :: Interrupted {
54- break ;
55- }
56- }
57- if blocking {
58- $crate:: syscall:: common:: set_blocking( socket) ;
59- }
60- r
61- } } ;
62- }
63-
6417macro_rules! impl_expected_write_hook {
6518 ( $invoker: expr, $syscall: ident, $fn_ptr: expr, $socket: expr, $buffer: expr, $length: expr, $( $arg: expr) ,* $( , ) * ) => { {
6619 let socket = $socket;
@@ -109,125 +62,6 @@ macro_rules! impl_expected_write_hook {
10962}
11063
11164impl < I : UnixSyscall > UnixSyscall for NioLinuxSyscall < I > {
112- extern "C" fn read (
113- & self ,
114- fn_ptr : Option < & extern "C" fn ( c_int , * mut c_void , size_t ) -> ssize_t > ,
115- fd : c_int ,
116- buf : * mut c_void ,
117- count : size_t ,
118- ) -> ssize_t {
119- impl_expected_read_hook ! ( self . inner, read, fn_ptr, fd, buf, count, )
120- }
121-
122- extern "C" fn pread (
123- & self ,
124- fn_ptr : Option < & extern "C" fn ( c_int , * mut c_void , size_t , off_t ) -> ssize_t > ,
125- fd : c_int ,
126- buf : * mut c_void ,
127- count : size_t ,
128- offset : off_t ,
129- ) -> ssize_t {
130- impl_expected_read_hook ! ( self . inner, pread, fn_ptr, fd, buf, count, offset)
131- }
132-
133- extern "C" fn recvmsg (
134- & self ,
135- fn_ptr : Option < & extern "C" fn ( c_int , * mut msghdr , c_int ) -> ssize_t > ,
136- fd : c_int ,
137- msg : * mut msghdr ,
138- flags : c_int ,
139- ) -> ssize_t {
140- let blocking = is_blocking ( fd) ;
141- if blocking {
142- set_non_blocking ( fd) ;
143- }
144- let msghdr = unsafe { * msg } ;
145- let mut vec = std:: collections:: VecDeque :: from ( unsafe {
146- Vec :: from_raw_parts (
147- msghdr. msg_iov ,
148- msghdr. msg_iovlen as usize ,
149- msghdr. msg_iovlen as usize ,
150- )
151- } ) ;
152- let mut length = 0 ;
153- let mut pices = std:: collections:: VecDeque :: new ( ) ;
154- for iovec in & vec {
155- length += iovec. iov_len ;
156- pices. push_back ( length) ;
157- }
158- let mut received = 0 ;
159- let mut r = 0 ;
160- while received < length {
161- // find from-index
162- let mut from_index = 0 ;
163- for ( i, v) in pices. iter ( ) . enumerate ( ) {
164- if received < * v {
165- from_index = i;
166- break ;
167- }
168- }
169- // calculate offset
170- let current_received_offset = if from_index > 0 {
171- received. saturating_sub ( pices[ from_index. saturating_sub ( 1 ) ] )
172- } else {
173- received
174- } ;
175- // remove already received
176- for _ in 0 ..from_index {
177- _ = vec. pop_front ( ) ;
178- _ = pices. pop_front ( ) ;
179- }
180- // build syscall args
181- vec[ 0 ] = iovec {
182- iov_base : ( vec[ 0 ] . iov_base as usize + current_received_offset) as * mut c_void ,
183- iov_len : vec[ 0 ] . iov_len - current_received_offset,
184- } ;
185- cfg_if:: cfg_if! {
186- if #[ cfg( any(
187- target_os = "linux" ,
188- target_os = "l4re" ,
189- target_os = "android" ,
190- target_os = "emscripten"
191- ) ) ] {
192- let len = vec. len( ) ;
193- } else {
194- let len = c_int:: try_from( vec. len( ) ) . unwrap( ) ;
195- }
196- }
197- let mut new_msg = msghdr {
198- msg_name : msghdr. msg_name ,
199- msg_namelen : msghdr. msg_namelen ,
200- msg_iov : vec. get_mut ( 0 ) . unwrap ( ) ,
201- msg_iovlen : len,
202- msg_control : msghdr. msg_control ,
203- msg_controllen : msghdr. msg_controllen ,
204- msg_flags : msghdr. msg_flags ,
205- } ;
206- r = self . inner . recvmsg ( fn_ptr, fd, & mut new_msg, flags) ;
207- if r != -1 {
208- reset_errno ( ) ;
209- received += r as usize ;
210- if received >= length || r == 0 {
211- r = received as ssize_t ;
212- break ;
213- }
214- }
215- let error_kind = std:: io:: Error :: last_os_error ( ) . kind ( ) ;
216- if error_kind == std:: io:: ErrorKind :: WouldBlock {
217- //wait read event
218- if EventLoops :: wait_read_event ( fd, Some ( Duration :: from_millis ( 10 ) ) ) . is_err ( ) {
219- break ;
220- }
221- } else if error_kind != std:: io:: ErrorKind :: Interrupted {
222- break ;
223- }
224- }
225- if blocking {
226- set_blocking ( fd) ;
227- }
228- r
229- }
230-
23165 extern "C" fn sendto (
23266 & self ,
23367 fn_ptr : Option <
0 commit comments