This commit is contained in:
tux
2026-11-03 22:13:16 +01:00
parent 158e115242
commit 8012e912ec
19 changed files with 975 additions and 208 deletions
+25
View File
@@ -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,