From 46771d0169fbcde9fc25169f4e4aa9f4c9abac41 Mon Sep 17 00:00:00 2001 From: Andrew Stoycos Date: Wed, 26 Jul 2023 16:41:04 -0400 Subject: [PATCH] add new programinfo constructor Add a new ProgramInfo constructor that builds a new instance using a raw fd. Signed-off-by: Andrew Stoycos --- aya/src/programs/lirc_mode2.rs | 10 ++-------- aya/src/programs/mod.rs | 35 +++++++++++++--------------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/aya/src/programs/lirc_mode2.rs b/aya/src/programs/lirc_mode2.rs index bc435ce2..6f89de6a 100644 --- a/aya/src/programs/lirc_mode2.rs +++ b/aya/src/programs/lirc_mode2.rs @@ -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 { - 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) } } diff --git a/aya/src/programs/mod.rs b/aya/src/programs/mod.rs index 52e9d75a..c806fe9c 100644 --- a/aya/src/programs/mod.rs +++ b/aya/src/programs/mod.rs @@ -498,14 +498,9 @@ impl ProgramData { 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) } } @@ -934,12 +929,7 @@ macro_rules! impl_program_info { pub fn program_info(&self) -> Result { 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()) } } )+ @@ -978,6 +968,14 @@ impl_program_info!( pub struct ProgramInfo(bpf_prog_info); impl ProgramInfo { + fn new_from_fd(fd: RawFd) -> Result { + 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 @@ -1122,14 +1120,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,