scanner: make plugin interface ffi-safe with handle-based registry

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I8e4790db3cc29f84f4e0d7d8eff36c2c6a6a6964
This commit is contained in:
raf 2026-02-18 22:49:12 +03:00
commit f4961c7f95
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
9 changed files with 93 additions and 44 deletions

View file

@ -12,7 +12,7 @@ pub fn scanner(name: TokenStream, input: TokenStream) -> TokenStream {
let result = quote! {
#[no_mangle]
pub extern "C" fn pscand_scanner() -> Box<dyn pscand_core::Scanner> {
pub extern "C" fn pscand_scanner() -> *mut std::os::raw::c_void {
struct ScannerImpl;
impl pscand_core::Scanner for ScannerImpl {
@ -37,7 +37,8 @@ pub fn scanner(name: TokenStream, input: TokenStream) -> TokenStream {
}
}
Box::new(ScannerImpl)
let handle = unsafe { pscand_core::register_scanner(Box::new(ScannerImpl)) };
handle as *mut std::os::raw::c_void
}
};
@ -53,8 +54,9 @@ pub fn register_scanner(input: TokenStream) -> TokenStream {
#input
#[no_mangle]
pub extern "C" fn pscand_scanner() -> Box<dyn pscand_core::Scanner> {
Box::new(#fn_name())
pub extern "C" fn pscand_scanner() -> *mut std::os::raw::c_void {
let handle = unsafe { pscand_core::register_scanner(Box::new(#fn_name())) };
handle as *mut std::os::raw::c_void
}
};