@@ -259,7 +259,7 @@ use std::os::unix::process::CommandExt;
259
259
use std:: os:: windows:: process:: CommandExt ;
260
260
261
261
cfg_windows ! {
262
- use crate :: os:: windows:: io:: { AsRawHandle , RawHandle , AsHandle , BorrowedHandle } ;
262
+ use crate :: os:: windows:: io:: { AsRawHandle , RawHandle , AsHandle , BorrowedHandle , OwnedHandle } ;
263
263
}
264
264
265
265
/// This structure mimics the API of [`std::process::Command`] found in the standard library, but
@@ -1447,84 +1447,70 @@ impl TryInto<Stdio> for ChildStderr {
1447
1447
}
1448
1448
1449
1449
#[ cfg( unix) ]
1450
+ #[ cfg_attr( docsrs, doc( cfg( unix) ) ) ]
1450
1451
mod sys {
1451
- use std:: os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , RawFd } ;
1452
+ use std:: {
1453
+ io,
1454
+ os:: unix:: io:: { AsFd , AsRawFd , BorrowedFd , OwnedFd , RawFd } ,
1455
+ } ;
1452
1456
1453
1457
use super :: { ChildStderr , ChildStdin , ChildStdout } ;
1454
1458
1455
- impl AsRawFd for ChildStdin {
1456
- fn as_raw_fd ( & self ) -> RawFd {
1457
- self . inner . as_raw_fd ( )
1458
- }
1459
- }
1460
-
1461
- impl AsFd for ChildStdin {
1462
- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
1463
- unsafe { BorrowedFd :: borrow_raw ( self . as_raw_fd ( ) ) }
1464
- }
1465
- }
1466
-
1467
- impl AsRawFd for ChildStdout {
1468
- fn as_raw_fd ( & self ) -> RawFd {
1469
- self . inner . as_raw_fd ( )
1470
- }
1471
- }
1459
+ macro_rules! impl_traits {
1460
+ ( $type: ty) => {
1461
+ impl $type {
1462
+ /// Convert into [`OwnedFd`].
1463
+ pub fn into_owned_fd( self ) -> io:: Result <OwnedFd > {
1464
+ self . inner. into_owned_fd( )
1465
+ }
1466
+ }
1472
1467
1473
- impl AsFd for ChildStdout {
1474
- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
1475
- unsafe { BorrowedFd :: borrow_raw ( self . as_raw_fd ( ) ) }
1476
- }
1477
- }
1468
+ impl AsRawFd for $type {
1469
+ fn as_raw_fd ( & self ) -> RawFd {
1470
+ self . inner . as_raw_fd( )
1471
+ }
1472
+ }
1478
1473
1479
- impl AsRawFd for ChildStderr {
1480
- fn as_raw_fd ( & self ) -> RawFd {
1481
- self . inner . as_raw_fd ( )
1482
- }
1474
+ impl AsFd for $type {
1475
+ fn as_fd( & self ) -> BorrowedFd <' _> {
1476
+ unsafe { BorrowedFd :: borrow_raw( self . as_raw_fd( ) ) }
1477
+ }
1478
+ }
1479
+ } ;
1483
1480
}
1484
1481
1485
- impl AsFd for ChildStderr {
1486
- fn as_fd ( & self ) -> BorrowedFd < ' _ > {
1487
- unsafe { BorrowedFd :: borrow_raw ( self . as_raw_fd ( ) ) }
1488
- }
1489
- }
1482
+ impl_traits ! ( ChildStdin ) ;
1483
+ impl_traits ! ( ChildStdout ) ;
1484
+ impl_traits ! ( ChildStderr ) ;
1490
1485
}
1491
1486
1492
1487
cfg_windows ! {
1493
- impl AsRawHandle for ChildStdin {
1494
- fn as_raw_handle( & self ) -> RawHandle {
1495
- self . inner. as_raw_handle( )
1496
- }
1497
- }
1498
-
1499
- impl AsHandle for ChildStdin {
1500
- fn as_handle( & self ) -> BorrowedHandle <' _> {
1501
- unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1502
- }
1503
- }
1504
-
1505
- impl AsRawHandle for ChildStdout {
1506
- fn as_raw_handle( & self ) -> RawHandle {
1507
- self . inner. as_raw_handle( )
1508
- }
1509
- }
1488
+ macro_rules! impl_traits {
1489
+ ( $type : ty) => {
1490
+ impl $type {
1491
+ /// Convert into [`OwnedHandle`].
1492
+ pub fn into_owned_handle( self ) -> io:: Result <OwnedHandle > {
1493
+ self . inner. into_owned_handle( )
1494
+ }
1495
+ }
1510
1496
1511
- impl AsHandle for ChildStdout {
1512
- fn as_handle ( & self ) -> BorrowedHandle < ' _> {
1513
- unsafe { BorrowedHandle :: borrow_raw ( self . as_raw_handle( ) ) }
1514
- }
1515
- }
1497
+ impl AsRawHandle for $ type {
1498
+ fn as_raw_handle ( & self ) -> RawHandle {
1499
+ self . inner . as_raw_handle( )
1500
+ }
1501
+ }
1516
1502
1517
- impl AsRawHandle for ChildStderr {
1518
- fn as_raw_handle( & self ) -> RawHandle {
1519
- self . inner. as_raw_handle( )
1520
- }
1503
+ impl AsHandle for $type {
1504
+ fn as_handle( & self ) -> BorrowedHandle <' _> {
1505
+ unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1506
+ }
1507
+ }
1508
+ } ;
1521
1509
}
1522
1510
1523
- impl AsHandle for ChildStderr {
1524
- fn as_handle( & self ) -> BorrowedHandle <' _> {
1525
- unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1526
- }
1527
- }
1511
+ impl_traits!( ChildStdin ) ;
1512
+ impl_traits!( ChildStdout ) ;
1513
+ impl_traits!( ChildStderr ) ;
1528
1514
}
1529
1515
1530
1516
#[ cfg( all( test, not( loom) ) ) ]
0 commit comments