diff --git a/examples/clone3.rs b/examples/clone3.rs new file mode 100644 index 00000000..0dfae416 --- /dev/null +++ b/examples/clone3.rs @@ -0,0 +1,14 @@ +fn main() { + let mut args = nc::clone_args_t::default(); + let mut pid_fd: i32 = -1; + args.exit_signal = nc::SIGCHLD as u64; + args.pidfd = &mut pid_fd as *mut i32 as usize as u64; + args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; + let pid = unsafe { nc::clone3(&mut args) }; + match pid { + Err(errno) => eprintln!("clone3() failed, err: {:?}", nc::strerror(errno)), + Ok(0) => println!("[child] pid"), + Ok(pid) => println!("[parent] pid: {pid:?}"), + } + assert!(pid.is_ok()); +} diff --git a/src/calls/abort2.rs b/src/calls/abort2.rs index d44609fa..6382ad42 100644 --- a/src/calls/abort2.rs +++ b/src/calls/abort2.rs @@ -1,5 +1,5 @@ /// Abort process with diagnostics -pub unsafe fn abort2(why: &str, args_len: i32, args: usize) -> ! { +pub unsafe fn abort2(why: &str, args_len: i32, args: uinptr_t) -> ! { let why = CString::new(why); let why_ptr = why.as_ptr() as usize; let args_len = args_len as usize; diff --git a/src/calls/add_key.rs b/src/calls/add_key.rs index ae2f9c4d..15945d79 100644 --- a/src/calls/add_key.rs +++ b/src/calls/add_key.rs @@ -2,7 +2,7 @@ pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { diff --git a/src/calls/clone.rs b/src/calls/clone.rs index 8918b78c..601cc3b5 100644 --- a/src/calls/clone.rs +++ b/src/calls/clone.rs @@ -1,12 +1,11 @@ /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( diff --git a/src/calls/clone3.rs b/src/calls/clone3.rs index 1ad4c22e..f3a235f8 100644 --- a/src/calls/clone3.rs +++ b/src/calls/clone3.rs @@ -8,10 +8,11 @@ /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-aarch64/call.rs b/src/platform/linux-aarch64/call.rs index c56eaf4a..8ab7921d 100644 --- a/src/platform/linux-aarch64/call.rs +++ b/src/platform/linux-aarch64/call.rs @@ -72,7 +72,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -321,13 +321,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -351,11 +350,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-arm/call.rs b/src/platform/linux-arm/call.rs index 48a3c90f..7768bbd1 100644 --- a/src/platform/linux-arm/call.rs +++ b/src/platform/linux-arm/call.rs @@ -91,7 +91,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -407,13 +407,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -437,11 +436,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-loongarch64/call.rs b/src/platform/linux-loongarch64/call.rs index ed808dce..095fd92b 100644 --- a/src/platform/linux-loongarch64/call.rs +++ b/src/platform/linux-loongarch64/call.rs @@ -72,7 +72,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -278,13 +278,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -308,11 +307,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-mips/call.rs b/src/platform/linux-mips/call.rs index 99ab177b..ed645e71 100644 --- a/src/platform/linux-mips/call.rs +++ b/src/platform/linux-mips/call.rs @@ -91,7 +91,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -449,13 +449,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -479,11 +478,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-mips64/call.rs b/src/platform/linux-mips64/call.rs index 13a991f4..b6943901 100644 --- a/src/platform/linux-mips64/call.rs +++ b/src/platform/linux-mips64/call.rs @@ -91,7 +91,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -433,13 +433,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -463,11 +462,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-ppc64/call.rs b/src/platform/linux-ppc64/call.rs index 83b49dc8..caa92794 100644 --- a/src/platform/linux-ppc64/call.rs +++ b/src/platform/linux-ppc64/call.rs @@ -91,7 +91,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -442,13 +442,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -472,11 +471,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-riscv64/call.rs b/src/platform/linux-riscv64/call.rs index 5e6ef940..95b65295 100644 --- a/src/platform/linux-riscv64/call.rs +++ b/src/platform/linux-riscv64/call.rs @@ -72,7 +72,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -321,13 +321,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -351,11 +350,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-s390x/call.rs b/src/platform/linux-s390x/call.rs index 83afcef8..12499c00 100644 --- a/src/platform/linux-s390x/call.rs +++ b/src/platform/linux-s390x/call.rs @@ -77,7 +77,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -424,13 +424,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -454,11 +453,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-x86/call.rs b/src/platform/linux-x86/call.rs index e9a1916f..f32e1623 100644 --- a/src/platform/linux-x86/call.rs +++ b/src/platform/linux-x86/call.rs @@ -77,7 +77,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -434,13 +434,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -464,11 +463,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) } diff --git a/src/platform/linux-x86_64/call.rs b/src/platform/linux-x86_64/call.rs index 7165c163..db6cdd63 100644 --- a/src/platform/linux-x86_64/call.rs +++ b/src/platform/linux-x86_64/call.rs @@ -91,7 +91,7 @@ pub unsafe fn acct>(filename: P) -> Result<(), Errno> { pub unsafe fn add_key>( type_: P, description: P, - payload: usize, + payload: uintptr_t, plen: size_t, dest_keyring: key_serial_t, ) -> Result { @@ -432,13 +432,12 @@ pub unsafe fn clock_settime(which_clock: clockid_t, tp: ×pec_t) -> Result<( /// Create a child process. pub unsafe fn clone( - clone_flags: i32, + clone_flags: usize, newsp: usize, parent_tid: &mut i32, child_tid: &mut i32, tls: usize, ) -> Result { - let clone_flags = clone_flags as usize; let parent_tid_ptr = parent_tid as *mut i32 as usize; let child_tid_ptr = child_tid as *mut i32 as usize; syscall5( @@ -462,11 +461,12 @@ pub unsafe fn clone( /// args.exit_signal = nc::SIGCHLD as u64; /// args.pidfd = &mut pid_fd as *mut i32 as usize as u64; /// args.flags = nc::CLONE_PIDFD as u64 | nc::CLONE_PARENT_SETTID as u64; -/// let pid = unsafe { nc::clone3(&mut args, core::mem::size_of::()) }; +/// let pid = unsafe { nc::clone3(&mut args) }; /// assert!(pid.is_ok()); /// ``` -pub unsafe fn clone3(cl_args: &mut clone_args_t, size: size_t) -> Result { +pub unsafe fn clone3(cl_args: &mut clone_args_t) -> Result { let cl_args_ptr = cl_args as *mut clone_args_t as usize; + let size = core::mem::size_of::(); syscall2(SYS_CLONE3, cl_args_ptr, size).map(|ret| ret as pid_t) }