aya: extracting program and map names with the same function

pull/676/merge
Adam Preuss 1 year ago committed by Alessandro Decina
parent 4d24d1cfe8
commit 15faca8b2e

@ -73,7 +73,7 @@ use crate::{
bpf_map_get_info_by_fd, bpf_map_get_next_key, bpf_map_update_elem_ptr, bpf_pin_object, bpf_map_get_info_by_fd, bpf_map_get_next_key, bpf_map_update_elem_ptr, bpf_pin_object,
iter_map_ids, SyscallError, iter_map_ids, SyscallError,
}, },
util::{nr_cpus, KernelVersion}, util::{bytes_of_bpf_name, nr_cpus, KernelVersion},
PinningType, Pod, PinningType, Pod,
}; };
@ -927,17 +927,7 @@ impl MapInfo {
/// The name of the map, limited to 16 bytes. /// The name of the map, limited to 16 bytes.
pub fn name(&self) -> &[u8] { pub fn name(&self) -> &[u8] {
let length = self bytes_of_bpf_name(&self.0.name)
.0
.name
.iter()
.rposition(|ch| *ch != 0)
.map(|pos| pos + 1)
.unwrap_or(0);
// The name field is defined as [std::os::raw::c_char; 16]. c_char may be signed or
// unsigned depending on the platform; that's why we're using from_raw_parts here.
unsafe { std::slice::from_raw_parts(self.0.name.as_ptr() as *const _, length) }
} }
/// The name of the map as a &str. If the name is not valid unicode, None is returned. /// The name of the map as a &str. If the name is not valid unicode, None is returned.

@ -117,7 +117,7 @@ use crate::{
bpf_prog_query, iter_link_ids, iter_prog_ids, retry_with_verifier_logs, bpf_prog_query, iter_link_ids, iter_prog_ids, retry_with_verifier_logs,
BpfLoadProgramAttrs, SyscallError, BpfLoadProgramAttrs, SyscallError,
}, },
util::KernelVersion, util::{bytes_of_bpf_name, KernelVersion},
VerifierLogLevel, VerifierLogLevel,
}; };
@ -1002,17 +1002,7 @@ impl ProgramInfo {
/// The name of the program as was provided when it was load. This is limited to 16 bytes /// The name of the program as was provided when it was load. This is limited to 16 bytes
pub fn name(&self) -> &[u8] { pub fn name(&self) -> &[u8] {
let length = self bytes_of_bpf_name(&self.0.name)
.0
.name
.iter()
.rposition(|ch| *ch != 0)
.map(|pos| pos + 1)
.unwrap_or(0);
// The name field is defined as [std::os::raw::c_char; 16]. c_char may be signed or
// unsigned depending on the platform; that's why we're using from_raw_parts here
unsafe { std::slice::from_raw_parts(self.0.name.as_ptr() as *const _, length) }
} }
/// The name of the program as a &str. If the name was not valid unicode, None is returned. /// The name of the program as a &str. If the name was not valid unicode, None is returned.

@ -364,6 +364,15 @@ pub(crate) fn bytes_of_slice<T: Pod>(val: &[T]) -> &[u8] {
unsafe { slice::from_raw_parts(val.as_ptr().cast(), size) } unsafe { slice::from_raw_parts(val.as_ptr().cast(), size) }
} }
pub(crate) fn bytes_of_bpf_name(bpf_name: &[core::ffi::c_char; 16]) -> &[u8] {
let length = bpf_name
.iter()
.rposition(|ch| *ch != 0)
.map(|pos| pos + 1)
.unwrap_or(0);
unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as *const _, length) }
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use assert_matches::assert_matches; use assert_matches::assert_matches;

Loading…
Cancel
Save