@@ -35,7 +35,7 @@ use std::ffi::{CString, OsStr};
3535use std:: os:: unix:: ffi:: OsStrExt ;
3636use std:: os:: unix:: ffi:: OsStringExt ;
3737use std:: os:: unix:: io:: RawFd ;
38- use std:: os:: unix:: io:: { AsFd , AsRawFd } ;
38+ use std:: os:: unix:: io:: { AsFd , AsRawFd , OwnedFd } ;
3939use std:: path:: PathBuf ;
4040use std:: { fmt, mem, ptr} ;
4141
@@ -260,7 +260,7 @@ impl ForkResult {
260260/// }
261261/// Ok(ForkResult::Child) => {
262262/// // 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();
264264/// unsafe { libc::_exit(0) };
265265/// }
266266/// Err(_) => println!("Fork failed"),
@@ -1115,9 +1115,13 @@ pub fn read(fd: RawFd, buf: &mut [u8]) -> Result<usize> {
11151115/// Write to a raw file descriptor.
11161116///
11171117/// 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 > {
11191119 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+ )
11211125 } ;
11221126
11231127 Errno :: result ( res) . map ( |r| r as usize )
@@ -1189,14 +1193,15 @@ pub fn lseek64(
11891193/// Create an interprocess channel.
11901194///
11911195/// 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 ( ) ;
11941198
11951199 let res = unsafe { libc:: pipe ( fds. as_mut_ptr ( ) as * mut c_int ) } ;
11961200
11971201 Error :: result ( res) ?;
11981202
1199- unsafe { Ok ( ( fds. assume_init ( ) [ 0 ] , fds. assume_init ( ) [ 1 ] ) ) }
1203+ let [ read, write] = unsafe { fds. assume_init ( ) } ;
1204+ Ok ( ( read, write) )
12001205}
12011206
12021207feature ! {
@@ -1230,15 +1235,16 @@ feature! {
12301235 target_os = "openbsd" ,
12311236 target_os = "solaris"
12321237) ) ]
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( ) ;
12351240
12361241 let res =
12371242 unsafe { libc:: pipe2( fds. as_mut_ptr( ) as * mut c_int, flags. bits( ) ) } ;
12381243
12391244 Errno :: result( res) ?;
12401245
1241- unsafe { Ok ( ( fds. assume_init( ) [ 0 ] , fds. assume_init( ) [ 1 ] ) ) }
1246+ let [ read, write] = unsafe { fds. assume_init( ) } ;
1247+ Ok ( ( read, write) )
12421248}
12431249
12441250/// Truncate a file to a specified length
0 commit comments