3
3
use crate :: cmp;
4
4
use crate :: io:: { self , Read , Initializer , IoSlice , IoSliceMut } ;
5
5
use crate :: mem;
6
- use crate :: sys:: { cvt, net:: netc} ;
6
+ use crate :: sys:: { cvt, net:: netc:: { self , c_int , c_void , ssize_t } } ;
7
7
use crate :: sys_common:: AsInner ;
8
8
9
- use libc:: { c_int, c_void, ssize_t} ;
10
-
11
9
#[ derive( Debug ) ]
12
10
pub struct NetFileDesc {
13
11
fd : c_int ,
@@ -55,7 +53,7 @@ impl NetFileDesc {
55
53
pub fn read_vectored ( & self , bufs : & mut [ IoSliceMut < ' _ > ] ) -> io:: Result < usize > {
56
54
let ret = cvt ( unsafe {
57
55
netc:: readv ( self . fd ,
58
- bufs. as_ptr ( ) as * const libc :: iovec ,
56
+ bufs. as_ptr ( ) as * const netc :: iovec ,
59
57
cmp:: min ( bufs. len ( ) , c_int:: max_value ( ) as usize ) as c_int )
60
58
} ) ?;
61
59
Ok ( ret as usize )
@@ -78,7 +76,7 @@ impl NetFileDesc {
78
76
pub fn write_vectored ( & self , bufs : & [ IoSlice < ' _ > ] ) -> io:: Result < usize > {
79
77
let ret = cvt ( unsafe {
80
78
netc:: writev ( self . fd ,
81
- bufs. as_ptr ( ) as * const libc :: iovec ,
79
+ bufs. as_ptr ( ) as * const netc :: iovec ,
82
80
cmp:: min ( bufs. len ( ) , c_int:: max_value ( ) as usize ) as c_int )
83
81
} ) ?;
84
82
Ok ( ret as usize )
@@ -87,7 +85,7 @@ impl NetFileDesc {
87
85
#[ cfg( target_os = "linux" ) ]
88
86
pub fn get_cloexec ( & self ) -> io:: Result < bool > {
89
87
unsafe {
90
- Ok ( ( cvt ( libc :: fcntl ( self . fd , libc :: F_GETFD ) ) ? & libc :: FD_CLOEXEC ) != 0 )
88
+ Ok ( ( cvt ( netc :: fcntl ( self . fd , netc :: F_GETFD ) ) ? & netc :: FD_CLOEXEC ) != 0 )
91
89
}
92
90
}
93
91
@@ -101,29 +99,36 @@ impl NetFileDesc {
101
99
target_os = "redox" ) ) ) ]
102
100
pub fn set_cloexec ( & self ) -> io:: Result < ( ) > {
103
101
unsafe {
104
- cvt ( libc :: ioctl ( self . fd , libc :: FIOCLEX ) ) ?;
102
+ cvt ( netc :: ioctl ( self . fd , netc :: FIOCLEX ) ) ?;
105
103
Ok ( ( ) )
106
104
}
107
105
}
108
- #[ cfg( any( target_env = "newlib" ,
106
+ #[ cfg( all ( any( target_env = "newlib" ,
109
107
target_os = "solaris" ,
110
108
target_os = "emscripten" ,
111
109
target_os = "fuchsia" ,
112
110
target_os = "l4re" ,
113
111
target_os = "linux" ,
114
112
target_os = "haiku" ,
115
- target_os = "redox" ) ) ]
113
+ target_os = "redox" ) , not ( target_os = "freertos" ) ) ) ]
116
114
pub fn set_cloexec ( & self ) -> io:: Result < ( ) > {
117
115
unsafe {
118
- let previous = cvt ( libc :: fcntl ( self . fd , libc :: F_GETFD ) ) ?;
119
- let new = previous | libc :: FD_CLOEXEC ;
116
+ let previous = cvt ( netc :: fcntl ( self . fd , netc :: F_GETFD ) ) ?;
117
+ let new = previous | netc :: FD_CLOEXEC ;
120
118
if new != previous {
121
- cvt ( libc :: fcntl ( self . fd , libc :: F_SETFD , new) ) ?;
119
+ cvt ( netc :: fcntl ( self . fd , netc :: F_SETFD , new) ) ?;
122
120
}
123
121
Ok ( ( ) )
124
122
}
125
123
}
126
124
125
+ // Setting `FD_CLOEXEC` is not supported on FreeRTOS
126
+ // since there is no `exec` functionality.
127
+ #[ cfg( target_os = "freertos" ) ]
128
+ pub fn set_cloexec ( & self ) -> io:: Result < ( ) > {
129
+ Ok ( ( ) )
130
+ }
131
+
127
132
pub fn duplicate ( & self ) -> io:: Result < NetFileDesc > {
128
133
use crate :: sync:: atomic:: { AtomicBool , Ordering } ;
129
134
@@ -143,9 +148,9 @@ impl NetFileDesc {
143
148
//
144
149
// [1]: http://comments.gmane.org/gmane.linux.lib.musl.general/2963
145
150
#[ cfg( any( target_os = "android" , target_os = "haiku" ) ) ]
146
- use libc :: F_DUPFD as F_DUPFD_CLOEXEC ;
151
+ use netc :: F_DUPFD as F_DUPFD_CLOEXEC ;
147
152
#[ cfg( not( any( target_os = "android" , target_os="haiku" ) ) ) ]
148
- use libc :: F_DUPFD_CLOEXEC ;
153
+ use netc :: F_DUPFD_CLOEXEC ;
149
154
150
155
let make_filedesc = |fd| {
151
156
let fd = NetFileDesc :: new ( fd) ;
@@ -167,13 +172,13 @@ impl NetFileDesc {
167
172
NetFileDesc :: new ( fd)
168
173
} )
169
174
}
170
- Err ( ref e) if e. raw_os_error ( ) == Some ( libc :: EINVAL ) => {
175
+ Err ( ref e) if e. raw_os_error ( ) == Some ( netc :: EINVAL ) => {
171
176
TRY_CLOEXEC . store ( false , Ordering :: Relaxed ) ;
172
177
}
173
178
Err ( e) => return Err ( e) ,
174
179
}
175
180
}
176
- cvt ( unsafe { netc:: fcntl ( fd, libc :: F_DUPFD , 0 ) } ) . and_then ( make_filedesc)
181
+ cvt ( unsafe { netc:: fcntl ( fd, netc :: F_DUPFD , 0 ) } ) . and_then ( make_filedesc)
177
182
}
178
183
}
179
184
0 commit comments