@ -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,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 _ ;
use std ::os ::unix ::ffi ::OsStrExt as _ ;
let Self { fd , obj : _ } = self ;
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 | {
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 ,
}
}
} ) ? ;
} ) ? ;