use libc::{c_char, size_t};
use libloading::Library;
use std::io::Error;
use crate::internal::LibHandler;
const LIB_NAME: &str = "/usr/lib/libvoidstar.so";
pub struct VoidstarHandler {
_lib: Library,
fuzz_json_data: unsafe fn(s: *const c_char, l: size_t),
fuzz_get_random: fn() -> u64,
fuzz_flush: fn(),
}
impl VoidstarHandler {
pub fn try_load() -> Result<Self, libloading::Error> {
unsafe {
let lib = Library::new(LIB_NAME)?;
let fuzz_json_data = *lib.get(b"fuzz_json_data\0")?;
let fuzz_get_random = *lib.get(b"fuzz_get_random\0")?;
let fuzz_flush = *lib.get(b"fuzz_flush\0")?;
Ok(VoidstarHandler {
_lib: lib,
fuzz_json_data,
fuzz_get_random,
fuzz_flush,
})
}
}
}
impl LibHandler for VoidstarHandler {
fn output(&self, value: &str) -> Result<(), Error> {
unsafe {
(self.fuzz_json_data)(value.as_bytes().as_ptr() as *const c_char, value.len());
(self.fuzz_flush)();
}
Ok(())
}
fn random(&self) -> u64 {
(self.fuzz_get_random)()
}
}