add new programinfo constructor

Add a new ProgramInfo constructor that builds a new instance using
a raw fd.

Signed-off-by: Andrew Stoycos <astoycos@redhat.com>
reviewable/pr637/r39
Andrew Stoycos 2 years ago
parent 58e53df2b0
commit 92a9eda9a9
No known key found for this signature in database
GPG Key ID: 66735B92BB71C096

@ -4,7 +4,7 @@ use std::os::fd::{AsRawFd, IntoRawFd as _, RawFd};
use crate::{
generated::{bpf_attach_type::BPF_LIRC_MODE2, bpf_prog_type::BPF_PROG_TYPE_LIRC_MODE2},
programs::{load_program, query, Link, ProgramData, ProgramError, ProgramInfo},
sys::{bpf_prog_attach, bpf_prog_detach, bpf_prog_get_fd_by_id, bpf_prog_get_info_by_fd},
sys::{bpf_prog_attach, bpf_prog_detach, bpf_prog_get_fd_by_id},
};
use libc::{close, dup};
@ -132,13 +132,7 @@ impl LircLink {
/// Get ProgramInfo from this link
pub fn info(&self) -> Result<ProgramInfo, ProgramError> {
match bpf_prog_get_info_by_fd(self.prog_fd, &[]) {
Ok(info) => Ok(ProgramInfo(info)),
Err(io_error) => Err(ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
}),
}
ProgramInfo::new_from_fd(self.prog_fd)
}
}

@ -497,14 +497,9 @@ impl<T: Link> ProgramData<T> {
io_error,
})? as RawFd;
let info =
bpf_prog_get_info_by_fd(fd, &[]).map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})?;
let name = ProgramInfo(info).name_as_str().map(|s| s.to_string());
ProgramData::from_bpf_prog_info(name, fd, path.as_ref(), info, verifier_log_level)
let info = ProgramInfo::new_from_fd(fd)?;
let name = info.name_as_str().map(|s| s.to_string());
ProgramData::from_bpf_prog_info(name, fd, path.as_ref(), info.0, verifier_log_level)
}
}
@ -933,12 +928,7 @@ macro_rules! impl_program_info {
pub fn program_info(&self) -> Result<ProgramInfo, ProgramError> {
let fd = self.fd().ok_or(ProgramError::NotLoaded)?;
bpf_prog_get_info_by_fd(fd.as_raw_fd(), &[])
.map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})
.map(ProgramInfo)
ProgramInfo::new_from_fd(fd.as_raw_fd())
}
}
)+
@ -977,6 +967,14 @@ impl_program_info!(
pub struct ProgramInfo(bpf_prog_info);
impl ProgramInfo {
fn new_from_fd(fd: RawFd) -> Result<Self, ProgramError> {
bpf_prog_get_info_by_fd(fd.as_raw_fd(), &[])
.map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})
.map(ProgramInfo)
}
/// The name of the program as was provided when it was load. This is limited to 16 bytes
pub fn name(&self) -> &[u8] {
let length = self
@ -1121,14 +1119,7 @@ impl Iterator for ProgramsIter {
call: "bpf_prog_get_fd_by_id",
io_error,
})
.and_then(|fd| {
bpf_prog_get_info_by_fd(fd.as_raw_fd(), &[])
.map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})
.map(ProgramInfo)
}),
.and_then(|fd| ProgramInfo::new_from_fd(fd.as_raw_fd())),
)
}
Ok(None) => None,

Loading…
Cancel
Save