From 0f0bc795e3c7b9dad40bfe71a6ab45b460e0a954 Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Tue, 19 Jan 2021 07:44:21 +0000 Subject: [PATCH] programs: add FdLink FdLink is a generic Link impl that calls close() on the given fd. --- src/programs/mod.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/programs/mod.rs b/src/programs/mod.rs index 98f09987..4235c6db 100644 --- a/src/programs/mod.rs +++ b/src/programs/mod.rs @@ -4,7 +4,7 @@ mod socket_filter; mod trace_point; mod xdp; -use libc::ENOSPC; +use libc::{close, ENOSPC}; use perf_attach::*; pub use probe::*; pub use socket_filter::*; @@ -39,7 +39,7 @@ pub enum ProgramError { verifier_log: String, }, - #[error("FIXME")] + #[error("the program was already detached")] AlreadyDetached, #[error("the perf_event_open syscall failed: {io_error}")] @@ -260,3 +260,25 @@ impl Link for LinkRef { } } } + +#[derive(Debug)] +pub(crate) struct FdLink { + fd: Option, +} + +impl Link for FdLink { + fn detach(&mut self) -> Result<(), ProgramError> { + if let Some(fd) = self.fd.take() { + unsafe { close(fd) }; + Ok(()) + } else { + Err(ProgramError::AlreadyDetached) + } + } +} + +impl Drop for FdLink { + fn drop(&mut self) { + let _ = self.detach(); + } +}