From e2c12495886ab79973d7f793bcd6ad6d89723346 Mon Sep 17 00:00:00 2001 From: ur4t <46435411+ur4t@users.noreply.github.com> Date: Tue, 2 Dec 2025 09:01:31 +0000 Subject: [PATCH] Implement `SYS_pidfd_open` for Tokio 1.36+ --- c-scape/Cargo.toml | 2 ++ c-scape/src/syscall.rs | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/c-scape/Cargo.toml b/c-scape/Cargo.toml index f00a3dd..5c953e7 100644 --- a/c-scape/Cargo.toml +++ b/c-scape/Cargo.toml @@ -190,6 +190,7 @@ extra-syscalls = [ "syscall-syncfs", "syscall-sync", "syscall-pipe2", + "syscall-pidfd_open", ] syscall-read = [] syscall-write = [] @@ -206,3 +207,4 @@ syscall-fdatasync = [] syscall-syncfs = [] syscall-sync = [] syscall-pipe2 = [] +syscall-pidfd_open = [] diff --git a/c-scape/src/syscall.rs b/c-scape/src/syscall.rs index caa3f41..0b80480 100644 --- a/c-scape/src/syscall.rs +++ b/c-scape/src/syscall.rs @@ -162,6 +162,27 @@ unsafe extern "C" fn syscall(number: c_long, mut args: ...) -> *mut c_void { let flags = args.arg::(); without_provenance_mut(libc::pipe2(pipefd, flags) as isize as usize) } + #[cfg(feature = "syscall-pidfd_open")] + libc::SYS_pidfd_open => { + use rustix::fd::IntoRawFd; + use rustix::process::{pidfd_open, Pid, PidfdFlags}; + let pid = args.arg::(); + let flags = args.arg::(); + let fd = match (Pid::from_raw(pid), PidfdFlags::from_bits(flags)) { + (Some(pid), Some(flags)) => match pidfd_open(pid, flags) { + Err(err) => { + set_errno(Errno(err.raw_os_error())); + -1 + } + Ok(pidfd) => pidfd.into_raw_fd(), + }, + _ => { + set_errno(Errno(libc::EINVAL)); + -1 + } + }; + without_provenance_mut(fd as isize as usize) + } libc::SYS_gettid => { without_provenance_mut(rustix::thread::gettid().as_raw_nonzero().get() as _) }