From c5a1cca81c95a8091965a918ac766a1c02a44538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fe=CC=81lix=20Saparelli?= Date: Sat, 9 Dec 2023 23:20:03 +1300 Subject: [PATCH] WIP: listen for SIGSTOP in lib --- crates/lib/src/sources/signal.rs | 42 ++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/crates/lib/src/sources/signal.rs b/crates/lib/src/sources/signal.rs index 1f39e86..5d7b1e4 100644 --- a/crates/lib/src/sources/signal.rs +++ b/crates/lib/src/sources/signal.rs @@ -55,13 +55,14 @@ async fn imp_worker( debug!("launching unix signal worker"); macro_rules! listen { - ($sig:ident) => {{ - trace!(kind=%stringify!($sig), "listening for unix signal"); - signal(SignalKind::$sig()).map_err(|err| CriticalError::IoError { - about: concat!("setting ", stringify!($sig), " signal listener"), err - })? - }} -} + ($sig:ident, $signum:expr) => {{ + trace!(kind=%stringify!($sig), "listening for unix signal"); + signal($signum).map_err(|err| CriticalError::IoError { + about: concat!("setting ", stringify!($sig), " signal listener"), err + })? + }}; + ($sig:ident) => (listen!($sig, SignalKind::$sig())); + } let mut s_hangup = listen!(hangup); let mut s_interrupt = listen!(interrupt); @@ -70,6 +71,30 @@ async fn imp_worker( let mut s_user1 = listen!(user_defined1); let mut s_user2 = listen!(user_defined2); + // TODO: option to customise set of signals being listened to, so we can safely listen to sigstop only when requested + + let mut s_tstp = if let Some(signum) = Signal::TerminalSuspend.to_nix().map(|s| s as i32) { + listen!(terminal_suspend, SignalKind::from_raw(signum)) + } else { + signal(SignalKind::from_raw(9)).map_err(|err| CriticalError::IoError { + about: concat!("setting unreceivable signal listener"), err + })? + }; + let mut s_stop = if let Some(signum) = Signal::Suspend.to_nix().map(|s| s as i32) { + listen!(suspend, SignalKind::from_raw(signum)) + } else { + signal(SignalKind::from_raw(9)).map_err(|err| CriticalError::IoError { + about: concat!("setting unreceivable signal listener"), err + })? + }; + let mut s_cont = if let Some(signum) = Signal::Continue.to_nix().map(|s| s as i32) { + listen!(r#continue, SignalKind::from_raw(signum)) + } else { + signal(SignalKind::from_raw(9)).map_err(|err| CriticalError::IoError { + about: concat!("setting unreceivable signal listener"), err + })? + }; + loop { let sig = select!( _ = s_hangup.recv() => Signal::Hangup, @@ -78,6 +103,9 @@ async fn imp_worker( _ = s_terminate.recv() => Signal::Terminate, _ = s_user1.recv() => Signal::User1, _ = s_user2.recv() => Signal::User2, + _ = s_tstp.recv() => Signal::TerminalSuspend, + _ = s_stop.recv() => Signal::Suspend, + _ = s_cont.recv() => Signal::Continue, ); debug!(?sig, "received unix signal");