Skip to content
Snippets Groups Projects
Verified Commit aefb4fb1 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Improvements for dlfcn

parent c41c20a9
No related branches found
No related tags found
No related merge requests found
//! dlfcn implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/dlfcn.h.html
use core::{ptr, str};
use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
use c_str::CStr;
use platform::types::*;
......@@ -10,6 +11,11 @@ pub const RTLD_NOW: c_int = 0x0002;
pub const RTLD_GLOBAL: c_int = 0x0100;
pub const RTLD_LOCAL: c_int = 0x0000;
static ERROR_NOT_SUPPORTED: &'static CStr = c_str!("dlfcn not supported");
#[thread_local]
static ERROR: AtomicUsize = ATOMIC_USIZE_INIT;
#[repr(C)]
pub struct Dl_info {
dli_fname: *const c_char,
......@@ -29,14 +35,32 @@ pub unsafe extern "C" fn dladdr(addr: *mut c_void, info: *mut Dl_info) -> c_int
#[no_mangle]
pub unsafe extern "C" fn dlopen(filename: *const c_char, flags: c_int) -> *mut c_void {
let filename_cstr = CStr::from_ptr(filename);
let filename_str = str::from_utf8_unchecked(filename_cstr.to_bytes());
eprintln!("dlopen({}, {:#>04X})", filename_str, flags);
ptr::null_mut()
let filename_opt = if filename.is_null() {
None
} else {
Some(str::from_utf8_unchecked(CStr::from_ptr(filename).to_bytes()))
};
eprintln!("dlopen({:?}, {:#>04x})", filename_opt, flags);
if let Some(filename) = filename_opt {
ERROR.store(ERROR_NOT_SUPPORTED.as_ptr() as usize, Ordering::SeqCst);
ptr::null_mut()
} else {
1 as *mut c_void
}
}
#[no_mangle]
pub extern "C" fn dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void {
pub unsafe extern "C" fn dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void {
let symbol_opt = if symbol.is_null() {
None
} else {
Some(str::from_utf8_unchecked(CStr::from_ptr(symbol).to_bytes()))
};
eprintln!("dlsym({:p}, {:?})", handle, symbol_opt);
ptr::null_mut()
}
......@@ -47,5 +71,5 @@ pub extern "C" fn dlclose(handle: *mut c_void) -> c_int {
#[no_mangle]
pub extern "C" fn dlerror() -> *mut c_char {
ptr::null_mut()
ERROR.swap(0, Ordering::SeqCst) as *mut c_char
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment