use crate::{core::optional::NSTDOptional, NSTDAny, NSTDAnyMut, NSTDChar, NSTD_NULL};
use libc::{dlclose, dlopen, dlsym, RTLD_LAZY, RTLD_LOCAL};
use nstdapi::nstdapi;
#[nstdapi]
pub struct NSTDUnixSharedLib {
handle: NSTDAnyMut,
}
impl Drop for NSTDUnixSharedLib {
#[inline]
fn drop(&mut self) {
unsafe { dlclose(self.handle) };
}
}
unsafe impl Send for NSTDUnixSharedLib {}
unsafe impl Sync for NSTDUnixSharedLib {}
pub type NSTDUnixOptionalSharedLib = NSTDOptional<NSTDUnixSharedLib>;
#[inline]
#[nstdapi]
pub unsafe fn nstd_os_unix_shared_lib_load(path: *const NSTDChar) -> NSTDUnixOptionalSharedLib {
match dlopen(path, RTLD_LAZY | RTLD_LOCAL) {
NSTD_NULL => NSTDOptional::None,
handle => NSTDOptional::Some(NSTDUnixSharedLib { handle }),
}
}
#[inline]
#[nstdapi]
pub const fn nstd_os_unix_shared_lib_handle(lib: &NSTDUnixSharedLib) -> NSTDAnyMut {
lib.handle
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_os_unix_shared_lib_get(
lib: &NSTDUnixSharedLib,
symbol: *const NSTDChar,
) -> NSTDAny {
dlsym(lib.handle, symbol)
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_os_unix_shared_lib_get_mut(
lib: &mut NSTDUnixSharedLib,
symbol: *const NSTDChar,
) -> NSTDAnyMut {
dlsym(lib.handle, symbol)
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub unsafe fn nstd_os_unix_shared_lib_free(lib: NSTDUnixSharedLib) {}