From 587d15054440084fd1cfc07ca55d3f2daea5592b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=B7=D0=B0=D0=BB=D0=B8=D1=8F=20=D0=A1=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D0=B4=D0=BE=D0=B2=D0=B0?= Date: Sat, 15 Jun 2024 18:20:39 +0500 Subject: [PATCH 1/3] Add sigaction() versions that allow specify the signal by its number (to allow working with real-time signals) and replace the signal handler without retrieving the old one. --- src/sys/signal.rs | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/sys/signal.rs b/src/sys/signal.rs index abf6f21abf..97dd85a9b1 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -901,6 +901,56 @@ pub unsafe fn sigaction(signal: Signal, sigaction: &SigAction) -> Result Result { + let mut oldact = mem::MaybeUninit::::uninit(); + + let res = unsafe { libc::sigaction(signal as libc::c_int, + &sigaction.sigaction as *const libc::sigaction, + oldact.as_mut_ptr()) }; + + Errno::result(res).map(|_| SigAction { sigaction: unsafe { oldact.assume_init() } }) +} + +/// Changes the action taken by a process on receipt of a specific signal, which is specified by a signal number. Old sigaction struct is not retrieved. +/// +/// `signal` can be any signal except `SIGKILL` or `SIGSTOP`. On success, it returns the previous +/// action for the given signal. If `sigaction` fails, no new signal handler is installed. +/// +/// # Safety +/// +/// * Signal handlers may be called at any point during execution, which limits +/// what is safe to do in the body of the signal-catching function. Be certain +/// to only make syscalls that are explicitly marked safe for signal handlers +/// and only share global data using atomics. +pub unsafe fn sigaction_noretrieve(signal: libc::c_int, sigaction: &SigAction) -> Result<()> { + let res = unsafe { libc::sigaction(signal as libc::c_int, + &sigaction.sigaction as *const libc::sigaction, + std::ptr::null_mut()) }; + + match Errno::result(res) { + Ok(_) => { return Ok(()); } + Err(e) => { return Err(e); } + } + +} + /// Signal management (see [signal(3p)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html)) /// /// Installs `handler` for the given `signal`, returning the previous signal From cc7c8345423e8da19027d58dd5dc917c10d1bae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=B7=D0=B0=D0=BB=D0=B8=D1=8F=20=D0=A1=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D0=B4=D0=BE=D0=B2=D0=B0?= Date: Sat, 15 Jun 2024 19:29:08 +0500 Subject: [PATCH 2/3] Fix return value of nix::sys::signal::sigaction_noretrieve() --- src/sys/signal.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sys/signal.rs b/src/sys/signal.rs index 97dd85a9b1..023316c15a 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -945,8 +945,8 @@ pub unsafe fn sigaction_noretrieve(signal: libc::c_int, sigaction: &SigAction) - std::ptr::null_mut()) }; match Errno::result(res) { - Ok(_) => { return Ok(()); } - Err(e) => { return Err(e); } + Ok(_) => { Ok(()) } + Err(e) => { Err(e) } } } From 01a10675fd94084a0e498bf8c8c68586b1a84d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=B7=D0=B0=D0=BB=D0=B8=D1=8F=20=D0=A1=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=B3=D0=B4=D0=BE=D0=B2=D0=B0?= Date: Sat, 15 Jun 2024 19:49:09 +0500 Subject: [PATCH 3/3] cargo fmt --- src/sys/signal.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sys/signal.rs b/src/sys/signal.rs index 023316c15a..586e4240e4 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -948,7 +948,7 @@ pub unsafe fn sigaction_noretrieve(signal: libc::c_int, sigaction: &SigAction) - Ok(_) => { Ok(()) } Err(e) => { Err(e) } } - + } /// Signal management (see [signal(3p)](https://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html))