Initial commit
This commit is contained in:
parent
fc16497ceb
commit
d39b360d76
10 changed files with 80 additions and 1186 deletions
|
@ -1 +0,0 @@
|
|||
|
32
src/main.rs
32
src/main.rs
|
@ -1,3 +1,33 @@
|
|||
use std::os::fd::FromRawFd;
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
let file = if std::fs::metadata("target/release/testexec").is_ok() {
|
||||
std::fs::File::open("target/release/testexec").unwrap()
|
||||
} else if std::fs::metadata("target/debug/testexec").is_ok() {
|
||||
std::fs::File::open("target/debug/testexec").unwrap()
|
||||
} else {
|
||||
panic!("testexec not found");
|
||||
};
|
||||
let filename = "testexec";
|
||||
let name = std::ffi::CString::new(filename).unwrap();
|
||||
let name = name.as_ptr();
|
||||
let mem_file_fd = unsafe { libc::memfd_create(name, 0) };
|
||||
let mem_file = unsafe { std::fs::File::from_raw_fd(mem_file_fd) };
|
||||
let mut reader = std::io::BufReader::new(file);
|
||||
let mut writer = std::io::BufWriter::new(&mem_file);
|
||||
std::io::copy(&mut reader, &mut writer).unwrap();
|
||||
|
||||
let filepath = std::ffi::CString::new(format!("/proc/self/fd/{}", mem_file_fd)).unwrap();
|
||||
let filepath = filepath.as_ptr();
|
||||
let argv_owned = vec![std::ffi::CString::new(filename).unwrap()];
|
||||
let argv: Vec<*const libc::c_char> = argv_owned.iter().map(|x| x.as_ptr()).chain(std::iter::once(std::ptr::null())).collect();
|
||||
let envp_owned = std::env::vars_os()
|
||||
.map(|(k, v)| {
|
||||
let mut kv = k.into_string().unwrap();
|
||||
kv.push('=');
|
||||
kv.push_str(&v.into_string().unwrap());
|
||||
std::ffi::CString::new(kv).unwrap()
|
||||
}).collect::<Vec<_>>();
|
||||
let envp: Vec<*const libc::c_char> = envp_owned.iter().map(|x| x.as_ptr()).chain(std::iter::once(std::ptr::null())).collect();
|
||||
unsafe { libc::execve(filepath, argv.as_ptr(), envp.as_ptr()) };
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue