@@ -35,7 +35,7 @@ use std::ffi::{CString, OsStr};
35
35
use std:: os:: unix:: ffi:: OsStrExt ;
36
36
use std:: os:: unix:: ffi:: OsStringExt ;
37
37
use std:: os:: unix:: io:: RawFd ;
38
- use std:: os:: unix:: io:: { AsFd , AsRawFd } ;
38
+ use std:: os:: unix:: io:: { AsFd , AsRawFd , OwnedFd } ;
39
39
use std:: path:: PathBuf ;
40
40
use std:: { fmt, mem, ptr} ;
41
41
@@ -260,7 +260,7 @@ impl ForkResult {
260
260
/// }
261
261
/// Ok(ForkResult::Child) => {
262
262
/// // Unsafe to use `println!` (or `unwrap`) here. See Safety.
263
- /// write(libc::STDOUT_FILENO , "I'm a new child process\n".as_bytes()).ok();
263
+ /// write(std::io::stdout() , "I'm a new child process\n".as_bytes()).ok();
264
264
/// unsafe { libc::_exit(0) };
265
265
/// }
266
266
/// Err(_) => println!("Fork failed"),
@@ -1115,9 +1115,13 @@ pub fn read(fd: RawFd, buf: &mut [u8]) -> Result<usize> {
1115
1115
/// Write to a raw file descriptor.
1116
1116
///
1117
1117
/// See also [write(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html)
1118
- pub fn write ( fd : RawFd , buf : & [ u8 ] ) -> Result < usize > {
1118
+ pub fn write < Fd : AsFd > ( fd : Fd , buf : & [ u8 ] ) -> Result < usize > {
1119
1119
let res = unsafe {
1120
- libc:: write ( fd, buf. as_ptr ( ) as * const c_void , buf. len ( ) as size_t )
1120
+ libc:: write (
1121
+ fd. as_fd ( ) . as_raw_fd ( ) ,
1122
+ buf. as_ptr ( ) as * const c_void ,
1123
+ buf. len ( ) as size_t ,
1124
+ )
1121
1125
} ;
1122
1126
1123
1127
Errno :: result ( res) . map ( |r| r as usize )
@@ -1189,14 +1193,15 @@ pub fn lseek64(
1189
1193
/// Create an interprocess channel.
1190
1194
///
1191
1195
/// See also [pipe(2)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html)
1192
- pub fn pipe ( ) -> std:: result:: Result < ( RawFd , RawFd ) , Error > {
1193
- let mut fds = mem:: MaybeUninit :: < [ c_int ; 2 ] > :: uninit ( ) ;
1196
+ pub fn pipe ( ) -> std:: result:: Result < ( OwnedFd , OwnedFd ) , Error > {
1197
+ let mut fds = mem:: MaybeUninit :: < [ OwnedFd ; 2 ] > :: uninit ( ) ;
1194
1198
1195
1199
let res = unsafe { libc:: pipe ( fds. as_mut_ptr ( ) as * mut c_int ) } ;
1196
1200
1197
1201
Error :: result ( res) ?;
1198
1202
1199
- unsafe { Ok ( ( fds. assume_init ( ) [ 0 ] , fds. assume_init ( ) [ 1 ] ) ) }
1203
+ let [ read, write] = unsafe { fds. assume_init ( ) } ;
1204
+ Ok ( ( read, write) )
1200
1205
}
1201
1206
1202
1207
feature ! {
@@ -1230,15 +1235,16 @@ feature! {
1230
1235
target_os = "openbsd" ,
1231
1236
target_os = "solaris"
1232
1237
) ) ]
1233
- pub fn pipe2( flags: OFlag ) -> Result <( RawFd , RawFd ) > {
1234
- let mut fds = mem:: MaybeUninit :: <[ c_int ; 2 ] >:: uninit( ) ;
1238
+ pub fn pipe2( flags: OFlag ) -> Result <( OwnedFd , OwnedFd ) > {
1239
+ let mut fds = mem:: MaybeUninit :: <[ OwnedFd ; 2 ] >:: uninit( ) ;
1235
1240
1236
1241
let res =
1237
1242
unsafe { libc:: pipe2( fds. as_mut_ptr( ) as * mut c_int, flags. bits( ) ) } ;
1238
1243
1239
1244
Errno :: result( res) ?;
1240
1245
1241
- unsafe { Ok ( ( fds. assume_init( ) [ 0 ] , fds. assume_init( ) [ 1 ] ) ) }
1246
+ let [ read, write] = unsafe { fds. assume_init( ) } ;
1247
+ Ok ( ( read, write) )
1242
1248
}
1243
1249
1244
1250
/// Truncate a file to a specified length
0 commit comments