|
|
@ -469,7 +469,8 @@ impl MapData {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Err(_) => {
|
|
|
|
Err(_) => {
|
|
|
|
let mut map = Self::create(obj, name, btf_fd)?;
|
|
|
|
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()),
|
|
|
|
name: Some(name.into()),
|
|
|
|
error,
|
|
|
|
error,
|
|
|
|
})?;
|
|
|
|
})?;
|
|
|
@ -542,13 +543,37 @@ 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 _;
|
|
|
|
use std::os::unix::ffi::OsStrExt as _;
|
|
|
|
|
|
|
|
let path = path.as_ref();
|
|
|
|
let Self { fd, obj: _ } = self;
|
|
|
|
let Self { fd, obj: _ } = self;
|
|
|
|
let path = path.as_ref().join(name);
|
|
|
|
|
|
|
|
let path_string = CString::new(path.as_os_str().as_bytes()).map_err(|error| {
|
|
|
|
let path_string = CString::new(path.as_os_str().as_bytes()).map_err(|error| {
|
|
|
|
PinError::InvalidPinPath {
|
|
|
|
PinError::InvalidPinPath {
|
|
|
|
path: path.clone(),
|
|
|
|
path: path.to_path_buf(),
|
|
|
|
error,
|
|
|
|
error,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})?;
|
|
|
|
})?;
|
|
|
|