summaryrefslogtreecommitdiff
path: root/src/sys/signalfd.rs
diff options
context:
space:
mode:
authorAlan Somers <asomers@gmail.com>2021-02-01 20:00:48 -0700
committerAlan Somers <asomers@gmail.com>2021-02-07 15:53:40 -0700
commitc9cb83a5f6a4ec315b187afcf899d5758647dd0f (patch)
treee0879116b5302f17e3c3deee98e3e0581812e866 /src/sys/signalfd.rs
parenta279f789bde7d1e5ba738166d214b994fa7564e6 (diff)
downloadnix-c9cb83a5f6a4ec315b187afcf899d5758647dd0f.zip
Don't implement Clone on Dir, SignalFd, and PtyMaster
Since they close their file descriptors on Drop, it's almost impossible to use Clone without creating a double-close situation. Also, check for EBADF in SignalFd::drop and Dir::drop.
Diffstat (limited to 'src/sys/signalfd.rs')
-rw-r--r--src/sys/signalfd.rs7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/sys/signalfd.rs b/src/sys/signalfd.rs
index e3ded1f7..c43b4504 100644
--- a/src/sys/signalfd.rs
+++ b/src/sys/signalfd.rs
@@ -79,7 +79,7 @@ pub fn signalfd(fd: RawFd, mask: &SigSet, flags: SfdFlags) -> Result<RawFd> {
/// Err(err) => (), // some error happend
/// }
/// ```
-#[derive(Clone, Debug, Eq, Hash, PartialEq)]
+#[derive(Debug, Eq, Hash, PartialEq)]
pub struct SignalFd(RawFd);
impl SignalFd {
@@ -116,7 +116,10 @@ impl SignalFd {
impl Drop for SignalFd {
fn drop(&mut self) {
- let _ = unistd::close(self.0);
+ let e = unistd::close(self.0);
+ if !std::thread::panicking() && e == Err(Error::Sys(Errno::EBADF)) {
+ panic!("Closing an invalid file descriptor!");
+ };
}
}