|
@@ -469,7 +469,8 @@ impl MapData {
|
|
|
}
|
|
|
Err(_) => {
|
|
|
let mut map = Self::create(obj, name, btf_fd)?;
|
|
|
- map.pin(name, path).map_err(|error| MapError::PinError {
|
|
|
+ let path = path.join(name);
|
|
|
+ map.pin(&path).map_err(|error| MapError::PinError {
|
|
|
name: Some(name.into()),
|
|
|
error,
|
|
|
})?;
|
|
@@ -542,14 +543,38 @@ impl MapData {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- pub(crate) fn pin<P: AsRef<Path>>(&mut self, name: &str, path: P) -> Result<(), PinError> {
|
|
|
+ /// Allows the map to be pinned to the provided path.
|
|
|
+ ///
|
|
|
+ /// Any directories in the the path provided should have been created by the caller.
|
|
|
+ /// The path must be on a BPF filesystem.
|
|
|
+ ///
|
|
|
+ /// # Errors
|
|
|
+ ///
|
|
|
+ /// Returns a [`PinError::SyscallError`] if the underlying syscall fails.
|
|
|
+ /// This may also happen if the path already exists, in which case the wrapped
|
|
|
+ /// [`std::io::Error`] kind will be [`std::io::ErrorKind::AlreadyExists`].
|
|
|
+ /// Returns a [`PinError::InvalidPinPath`] if the path provided cannot be
|
|
|
+ /// converted to a [`CString`].
|
|
|
+ ///
|
|
|
+ /// # Example
|
|
|
+ ///
|
|
|
+ /// ```no_run
|
|
|
+ /// # let mut bpf = aya::Bpf::load(&[])?;
|
|
|
+ /// # use aya::maps::MapData;
|
|
|
+ ///
|
|
|
+ /// let mut map = MapData::from_pin("/sys/fs/bpf/my_map")?;
|
|
|
+ /// map.pin("/sys/fs/bpf/my_map2")?;
|
|
|
+ ///
|
|
|
+ /// # Ok::<(), Box<dyn std::error::Error>>(())
|
|
|
+ /// ```
|
|
|
+ pub fn pin<P: AsRef<Path>>(&mut self, path: P) -> Result<(), PinError> {
|
|
|
use std::os::unix::ffi::OsStrExt as _;
|
|
|
|
|
|
let Self { fd, obj: _ } = self;
|
|
|
- let path = path.as_ref().join(name);
|
|
|
+ let path = path.as_ref();
|
|
|
let path_string = CString::new(path.as_os_str().as_bytes()).map_err(|error| {
|
|
|
PinError::InvalidPinPath {
|
|
|
- path: path.clone(),
|
|
|
+ path: path.to_path_buf(),
|
|
|
error,
|
|
|
}
|
|
|
})?;
|