diff --git a/src/clibwrap/fork.rs b/src/clibwrap/fork.rs new file mode 100644 index 0000000..452c02b --- /dev/null +++ b/src/clibwrap/fork.rs @@ -0,0 +1,26 @@ +use crate::clibwrap::{ErrnoError, Pid}; + +mod external { + use crate::clibwrap::Pid; + + unsafe extern "C" { + pub fn fork() -> Pid; + } +} + +#[derive(Debug)] +pub enum ForkResult { + Parent { child_pid: Pid }, + Child, +} + +pub unsafe fn fork() -> Result { + let return_value = unsafe { external::fork() }; + if return_value == -1 { + unsafe { Err(ErrnoError::from_current_errno()) } + } else if return_value == 0 { + Ok(ForkResult::Child) + } else { + Ok(ForkResult::Parent { child_pid: return_value }) + } +} diff --git a/src/clibwrap/mod.rs b/src/clibwrap/mod.rs index bd5aa5f..549d434 100644 --- a/src/clibwrap/mod.rs +++ b/src/clibwrap/mod.rs @@ -1,7 +1,8 @@ use std::ffi::{c_char, c_int, CStr}; pub mod ptrace; +pub mod fork; -type Pid = i32; +pub type Pid = i32; unsafe extern "C" { fn __errno_location() -> *mut c_int; diff --git a/src/main.rs b/src/main.rs index 32ad2e4..e5b0795 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,9 +3,10 @@ mod syscall_info; mod clibwrap; use crate::debug_target::{ExitedTarget, StoppedTarget}; +use clibwrap::fork::{fork, ForkResult}; use color_eyre::eyre::eyre; use either::Either; -use nix::unistd::{fork, ForkResult}; +use nix::unistd::Pid; use std::ffi::CString; #[allow(dead_code)] @@ -52,10 +53,10 @@ fn main() -> color_eyre::Result<()> { nix::unistd::execv(&child_exec_path, &[&child_exec_path])?; unreachable!(); } - Ok(ForkResult::Parent { child: child_pid }) => { + Ok(ForkResult::Parent { child_pid }) => { println!("✔️ Created child {child_pid}"); - let mut target = StoppedTarget::new(child_pid)?; + let mut target = StoppedTarget::new(Pid::from_raw(child_pid))?; println!("✔️ Child ready!"); let breakpoint1 = 0x40101b;