use std::ffi::CStr;
use std::os::raw::c_char;
use std::path::PathBuf;
use memflow::plugins::Inventory;
use memflow::plugins::{
connector::{ConnectorInstanceArcBox, MuConnectorInstanceArcBox},
os::{MuOsInstanceArcBox, OsInstanceArcBox},
};
use crate::util::*;
use memflow::cglue::result::IntResult;
use log::trace;
#[no_mangle]
pub unsafe extern "C" fn inventory_scan() -> &'static mut Inventory {
to_heap(Inventory::scan())
}
#[no_mangle]
pub unsafe extern "C" fn inventory_scan_path(
path: *const c_char,
) -> Option<&'static mut Inventory> {
let rpath = CStr::from_ptr(path).to_string_lossy();
Inventory::scan_path(rpath.to_string())
.map_err(inspect_err)
.ok()
.map(to_heap)
}
#[no_mangle]
pub unsafe extern "C" fn inventory_add_dir(inv: &mut Inventory, dir: *const c_char) -> i32 {
let rdir = CStr::from_ptr(dir).to_string_lossy();
inv.add_dir(PathBuf::from(rdir.to_string()))
.into_int_result()
}
#[no_mangle]
pub unsafe extern "C" fn inventory_create_connector(
inv: &mut Inventory,
name: *const c_char,
args: *const c_char,
out: &mut MuConnectorInstanceArcBox<'static>,
) -> i32 {
let rname = CStr::from_ptr(name).to_string_lossy();
if args.is_null() {
inv.create_connector(&rname, None, None)
.map_err(inspect_err)
.into_int_out_result(out)
} else {
let rargs = CStr::from_ptr(args).to_string_lossy();
str::parse(&rargs)
.map_err(inspect_err)
.and_then(|args| inv.create_connector(&rname, None, Some(&args)))
.map_err(inspect_err)
.into_int_out_result(out)
}
}
#[no_mangle]
pub unsafe extern "C" fn inventory_create_os(
inv: &mut Inventory,
name: *const c_char,
args: *const c_char,
mem: *mut ConnectorInstanceArcBox<'static>,
out: &mut MuOsInstanceArcBox<'static>,
) -> i32 {
let rname = CStr::from_ptr(name).to_string_lossy();
let _args = CStr::from_ptr(args).to_string_lossy();
let mem_obj = if mem.is_null() {
None
} else {
let mem_obj = mem.read();
std::ptr::write_bytes(mem, 0, 1);
Some(mem_obj)
};
if args.is_null() {
inv.create_os(&rname, mem_obj, None)
.map_err(inspect_err)
.into_int_out_result(out)
} else {
let rargs = CStr::from_ptr(args).to_string_lossy();
str::parse(&rargs)
.map_err(inspect_err)
.and_then(|args| inv.create_os(&rname, mem_obj, Some(&args)))
.map_err(inspect_err)
.into_int_out_result(out)
}
}
#[no_mangle]
pub unsafe extern "C" fn os_drop(os: &mut OsInstanceArcBox<'static>) {
trace!("connector_drop: {:?}", os as *mut _);
std::ptr::drop_in_place(os);
}
#[no_mangle]
pub unsafe extern "C" fn connector_clone(
conn: &ConnectorInstanceArcBox<'static>,
out: &mut MuConnectorInstanceArcBox<'static>,
) {
trace!("connector_clone: {:?}", conn as *const _);
*out.as_mut_ptr() = conn.clone();
}
#[no_mangle]
pub unsafe extern "C" fn connector_drop(conn: &mut ConnectorInstanceArcBox<'static>) {
trace!("connector_drop: {:?}", conn as *mut _);
std::ptr::drop_in_place(conn)
}
#[no_mangle]
pub unsafe extern "C" fn inventory_free(inv: &'static mut Inventory) {
trace!("inventory_free: {:?}", inv as *mut _);
let _ = Box::from_raw(inv);
}