Skip to content

Commit

Permalink
pidfd_send_signal
Browse files Browse the repository at this point in the history
  • Loading branch information
JonathanWoollett-Light committed Dec 4, 2022
1 parent 0343ae2 commit 31afa82
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ This project adheres to [Semantic Versioning](https://semver.org/).
([#1868](https://github.com/nix-rust/nix/pull/1868))
- Added `pid_open` on Linux.
([#1868](https://github.com/nix-rust/nix/pull/1868))
- Added `pidfd_send_signal` on Linux.
([#1868](https://github.com/nix-rust/nix/pull/1868))

### Changed

Expand Down
2 changes: 1 addition & 1 deletion src/sys/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,6 @@ feature! {
pub mod timer;
}

#[cfg(all(target_os = "linux", feature = "process"))]
#[cfg(all(target_os = "linux", feature = "signal", feature = "process"))]
/// pidfd related functionality
pub mod pidfd;
37 changes: 37 additions & 0 deletions src/sys/pidfd.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::errno::Errno;
use crate::sys::signal::Signal;
use crate::unistd::Pid;
use crate::Result;
use std::convert::TryFrom;
Expand Down Expand Up @@ -60,3 +61,39 @@ pub fn pid_open(pid_t: Pid, pidfd_nonblock: bool) -> Result<RawFd> {
_ => unreachable!(),
}
}

/// Sends the signal `sig` to the target process referred to by `pidfd`, a PID file descriptor that
/// refers to a process.
///
/// If the info argument is some [`libc::siginfo_t`] buffer, that buffer should be populated as
/// described in [rt_sigqueueinfo(2)](https://man7.org/linux/man-pages/man2/rt_sigqueueinfo.2.html).
///
/// If the info argument is `None`, this is equivalent to specifying a pointer to a `siginfo_t`
/// buffer whose fields match the values that are implicitly supplied when a signal is sent using
/// [`crate::sys::signal::kill`]:
///
/// - `si_signo` is set to the signal number;
/// - `si_errno` is set to 0;
/// - `si_code` is set to SI_USER;
/// - `si_pid` is set to the caller's PID; and
/// - `si_uid` is set to the caller's real user ID.
///
/// The calling process must either be in the same PID namespace as the process referred to by
/// pidfd, or be in an ancestor of that namespace.
pub fn pidfd_send_signal(
pidfd: RawFd,
sig: Signal,
info: Option<libc::siginfo_t>,
) -> Result<()> {
let info = match info {
Some(i) => &i,
None => std::ptr::null(),
};
match unsafe {
libc::syscall(libc::SYS_pidfd_send_signal, pidfd, sig as i32, info)
} {
-1 => Err(Errno::last()),
0 => Ok(()),
_ => unreachable!(),
}
}

0 comments on commit 31afa82

Please sign in to comment.