use interceptor_rs::{syscall, Interceptor};
use std::{
env::args,
ffi::{c_char, CStr, CString},
mem::forget,
process::Command,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = args().collect::<Vec<_>>();
let mut cmd = Command::new(&args[0]);
if let Some(args) = args.get(1..) {
cmd.args(args);
}
Interceptor::new(cmd)?.on(&openat).run()?;
Ok(())
}
#[syscall]
fn openat(dfd: i32, mut filename: *const c_char, flags: i32, mode: i32) -> i32 {
let file = unsafe { CStr::from_ptr(filename).to_string_lossy() };
println!("openat filename: {}", file);
if file == "1.c" {
{
let a = b"2.c";
unsafe {
std::ptr::copy_nonoverlapping(a.as_ptr(), filename as *mut u8, a.len());
}
}
{
let a = CString::new("1.cpp").unwrap();
filename = a.as_ptr() as *mut c_char;
forget(a);
}
}
let ret = real!(dfd, filename, flags, mode);
println!("ret: {}", ret);
ret
}