use std::ffi::CStr;
use std::os::raw::{c_void, c_char, c_int};
use std::ptr::NonNull;
#[repr(transparent)]
struct DlObj(c_void);
#[derive(Debug)]
pub(super) struct DlApi(NonNull<DlObj>);
impl DlApi {
pub(super) fn new(filename: &CStr) -> Option<Self> {
extern "C" {
fn dlopen(name: *const c_char, flags: c_int) -> *mut DlObj;
}
Some(DlApi(unsafe {
NonNull::new(dlopen(filename.as_ptr(), 0x00002 ))?
}))
}
pub(super) fn get(&self, symbol: &CStr) -> Option<NonNull<c_void>> {
extern "C" {
fn dlsym(dlobj: *mut DlObj, symbol: *const c_char) -> *mut c_void;
}
unsafe { NonNull::new(dlsym(self.0.as_ptr(), symbol.as_ptr())) }
}
}