use std::ffi::OsStr; use super::{path, Library}; use crate::{Error, Result}; const OPEN_FLAGS: i32 = libloading::os::unix::RTLD_LAZY | libloading::os::unix::RTLD_GLOBAL; pub fn from_name(name: &str) -> Result { let path = path::from_name(name)?; from_path(&path) } pub fn from_path(path: &OsStr) -> Result { //SAFETY: Calls dlopen(3) on unix platforms. This might not have to be unsafe // if wrapped in with_dlerror. let lib = unsafe { Library::open(Some(path), OPEN_FLAGS) }; if let Err(e) = lib { let name = path::to_name(path)?; return Err(Error::Err(format!("Loading module {name:?} failed: {e}"))); } Ok(lib.expect("module loaded")) }