@@ -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 } ;
263
263
}
264
264
265
265
/// This structure mimics the API of [`std::process::Command`] found in the standard library, but
@@ -1447,84 +1447,75 @@ 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
- 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
- }
1487
+ #[ cfg( windows) ]
1488
+ #[ cfg_attr( docsrs, doc( cfg( windows) ) ) ]
1489
+ mod windows {
1490
+ use super :: * ;
1491
+ use crate :: os:: windows:: io:: { AsHandle , BorrowedHandle , OwnedHandle } ;
1492
+
1493
+ macro_rules! impl_traits {
1494
+ ( $type: ty) => {
1495
+ impl $type {
1496
+ /// Convert into [`OwnedHandle`].
1497
+ pub fn into_owned_handle( self ) -> io:: Result <OwnedHandle > {
1498
+ self . inner. into_owned_handle( )
1499
+ }
1500
+ }
1510
1501
1511
- impl AsHandle for ChildStdout {
1512
- fn as_handle ( & self ) -> BorrowedHandle < ' _> {
1513
- unsafe { BorrowedHandle :: borrow_raw ( self . as_raw_handle( ) ) }
1514
- }
1515
- }
1502
+ impl AsRawHandle for $type {
1503
+ fn as_raw_handle ( & self ) -> RawHandle {
1504
+ self . inner . as_raw_handle( )
1505
+ }
1506
+ }
1516
1507
1517
- impl AsRawHandle for ChildStderr {
1518
- fn as_raw_handle( & self ) -> RawHandle {
1519
- self . inner. as_raw_handle( )
1520
- }
1508
+ impl AsHandle for $type {
1509
+ fn as_handle( & self ) -> BorrowedHandle <' _> {
1510
+ unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1511
+ }
1512
+ }
1513
+ } ;
1521
1514
}
1522
1515
1523
- impl AsHandle for ChildStderr {
1524
- fn as_handle( & self ) -> BorrowedHandle <' _> {
1525
- unsafe { BorrowedHandle :: borrow_raw( self . as_raw_handle( ) ) }
1526
- }
1527
- }
1516
+ impl_traits ! ( ChildStdin ) ;
1517
+ impl_traits ! ( ChildStdout ) ;
1518
+ impl_traits ! ( ChildStderr ) ;
1528
1519
}
1529
1520
1530
1521
#[ cfg( all( test, not( loom) ) ) ]
0 commit comments