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,
iter_map_ids, SyscallError,
},
util::{nr_cpus, KernelVersion},
util::{bytes_of_bpf_name, nr_cpus, KernelVersion},
PinningType, Pod,
};
@ -927,17 +927,7 @@ impl MapInfo {
/// The name of the map, limited to 16 bytes.
pub fn name(&self) -> &[u8] {
let length = self
.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) }
bytes_of_bpf_name(&self.0.name)
}
/// 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,
BpfLoadProgramAttrs, SyscallError,
},
util::KernelVersion,
util::{bytes_of_bpf_name, KernelVersion},
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
pub fn name(&self) -> &[u8] {
let length = self
.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) }
bytes_of_bpf_name(&self.0.name)
}
/// 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) }
}
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)]
mod tests {
use assert_matches::assert_matches;

Loading…
Cancel
Save