浏览代码

programs: add FdLink

FdLink is a generic Link impl that calls close() on the given fd.
Alessandro Decina 4 年之前
父节点
当前提交
0f0bc795e3
共有 1 个文件被更改,包括 24 次插入2 次删除
  1. 24 2
      src/programs/mod.rs

+ 24 - 2
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<T: Link> Link for LinkRef<T> {
         }
     }
 }
+
+#[derive(Debug)]
+pub(crate) struct FdLink {
+    fd: Option<RawFd>,
+}
+
+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();
+    }
+}