Skip to content

Commit

Permalink
Add a try_clone method to OwnedFd.
Browse files Browse the repository at this point in the history
This corresponds to the `try_clone` function in sunfishcode/io-lifetimes#16
and rust-lang/rust#88794.
  • Loading branch information
sunfishcode committed Feb 8, 2022
1 parent 32b50d5 commit 4e1100b
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/io/owned_fd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,27 @@ pub struct OwnedFd {
inner: ManuallyDrop<crate::imp::fd::OwnedFd>,
}

impl OwnedFd {
/// Creates a new `OwnedFd` instance that shares the same underlying file handle
/// as the existing `OwnedFd` instance.
pub fn try_clone(&self) -> std::io::Result<Self> {
// We want to atomically duplicate this file descriptor and set the
// CLOEXEC flag, and currently that's done via F_DUPFD_CLOEXEC. This
// is a POSIX flag that was added to Linux in 2.6.24.
#[cfg(not(target_os = "espidf"))]
let fd = crate::fs::fcntl_dupfd_cloexec(self, 0)?;

// For ESP-IDF, F_DUPFD is used instead, because the CLOEXEC semantics
// will never be supported, as this is a bare metal framework with
// no capabilities for multi-process execution. While F_DUPFD is also
// not supported yet, it might be (currently it returns ENOSYS).
#[cfg(target_os = "espidf")]
let fd = crate::fs::fcntl_dupfd(self)?;

Ok(fd)
}
}

#[cfg(not(windows))]
impl AsFd for OwnedFd {
#[inline]
Expand Down

0 comments on commit 4e1100b

Please sign in to comment.