Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::os::raw::c_void;
- use std::ptr::NonNull;
- type virErrorPtr = *const ();
- type virErrorFunc = Option<unsafe extern "C" fn(userData: *mut c_void, error: virErrorPtr)>;
- extern "C" {
- fn virSetErrorFunc(userData: *mut c_void, handler: virErrorFunc);
- }
- struct Error(virErrorPtr);
- static mut HANDLER: Option<NonNull<Fn(Error)>> = None;
- fn set_error_func<F: Fn(Error) + 'static>(f: F) {
- unsafe extern "C" fn callback<F: Fn(Error)>(userData: *mut c_void, error: virErrorPtr) {
- let f = userData as *const F;
- let wrapped_error = Error(error);
- (*f)(wrapped_error)
- }
- let data = Box::into_raw(Box::new(f));
- unsafe {
- HANDLER.take().map(|p| Box::from_raw(p.as_ptr())); //drop the old one
- HANDLER = Some(NonNull::new_unchecked(data));
- virSetErrorFunc(data as _, Some(callback::<F>))
- }
- }
- fn main() {}
Add Comment
Please, Sign In to add comment