Skip to content

Commit

Permalink
aya: extracting program and map names with the same function
Browse files Browse the repository at this point in the history
  • Loading branch information
preuss-adam committed Oct 31, 2023
1 parent b138a5a commit 2c89d73
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 24 deletions.
14 changes: 2 additions & 12 deletions aya/src/maps/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down Expand Up @@ -927,17 +927,7 @@ impl MapInfo {

/// The name of the map.
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.
Expand Down
14 changes: 2 additions & 12 deletions aya/src/programs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};

Expand Down Expand Up @@ -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.
Expand Down
12 changes: 12 additions & 0 deletions aya/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,18 @@ 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: &[i8]) -> &[u8] {
let length = bpf_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(bpf_name.as_ptr() as *const _, length) }
}

#[cfg(test)]
mod tests {
use assert_matches::assert_matches;
Expand Down

0 comments on commit 2c89d73

Please sign in to comment.