26.0.1
This commit is contained in:
@@ -19,6 +19,13 @@ use std::time::Instant;
|
||||
|
||||
pub type ParanoiaCallback = Option<unsafe extern "C" fn(c_long, c_int)>;
|
||||
|
||||
fn ffi_guard<T>(default: T, f: impl FnOnce() -> T) -> T {
|
||||
match std::panic::catch_unwind(std::panic::AssertUnwindSafe(f)) {
|
||||
Ok(value) => value,
|
||||
Err(_) => default,
|
||||
}
|
||||
}
|
||||
|
||||
struct CAbiDrive {
|
||||
d: *mut CdromDrive,
|
||||
toc: DiscToc,
|
||||
@@ -190,6 +197,10 @@ pub unsafe extern "C" fn paranoia_version() -> *const c_char {
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn paranoia_init(d: *mut CdromDrive) -> *mut c_void {
|
||||
ffi_guard(ptr::null_mut(), || paranoia_init_impl(d))
|
||||
}
|
||||
|
||||
unsafe fn paranoia_init_impl(d: *mut CdromDrive) -> *mut c_void {
|
||||
if d.is_null() {
|
||||
return ptr::null_mut();
|
||||
}
|
||||
@@ -201,6 +212,10 @@ pub unsafe extern "C" fn paranoia_init(d: *mut CdromDrive) -> *mut c_void {
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn paranoia_free(p: *mut c_void) {
|
||||
ffi_guard((), || paranoia_free_impl(p))
|
||||
}
|
||||
|
||||
unsafe fn paranoia_free_impl(p: *mut c_void) {
|
||||
if !p.is_null() {
|
||||
drop(Box::from_raw(p as *mut Paranoia));
|
||||
}
|
||||
@@ -246,6 +261,16 @@ pub unsafe extern "C" fn paranoia_read_limited(
|
||||
p: *mut c_void,
|
||||
callback: ParanoiaCallback,
|
||||
max_retries: c_int,
|
||||
) -> *mut i16 {
|
||||
ffi_guard(ptr::null_mut(), || {
|
||||
paranoia_read_limited_impl(p, callback, max_retries)
|
||||
})
|
||||
}
|
||||
|
||||
unsafe fn paranoia_read_limited_impl(
|
||||
p: *mut c_void,
|
||||
callback: ParanoiaCallback,
|
||||
max_retries: c_int,
|
||||
) -> *mut i16 {
|
||||
let p = match p_ref(p) {
|
||||
Some(p) => p,
|
||||
|
||||
Reference in New Issue
Block a user