|
|
|
@ -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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|