From 0b0fe7df8ecc2c2cc2040f84c609921c574c2a6f Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Thu, 6 Jun 2024 09:08:18 -0400 Subject: [PATCH] feat: forward sigint to child process --- src/main.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main.rs b/src/main.rs index 2673fae..7cc3c62 100644 --- a/src/main.rs +++ b/src/main.rs @@ -76,6 +76,7 @@ async fn main() -> anyhow::Result { let mut rotation_signal_stream = signal(handled_sig)?; let mut sigterm_stream = signal(SignalKind::terminate())?; let mut sigquit_stream = signal(SignalKind::quit())?; + let mut sigint_stream = signal(SignalKind::interrupt())?; // Setup our output wiring. let app_name = match args.cmd.first() { Some(n) => n, @@ -193,6 +194,21 @@ async fn main() -> anyhow::Result { } } } + _ = sigint_stream.recv() => { + // NOTE(zaphar): This is a giant hack. + // If https://github.com/tokio-rs/tokio/issues/3379 ever get's implemented it will become + // unnecessary. + use nix::{ + sys::signal::{kill, Signal::SIGINT}, + unistd::Pid, + }; + if let Some(pid) = child.id() { + // If the child hasn't already completed, send a SIGTERM. + if let Err(e) = kill(Pid::from_raw(pid.try_into().expect("Invalid PID")), SIGINT) { + eprintln!("Failed to forward SIGINT to child process: {}", e); + } + } + } result = child.wait() => { // The child has finished return cleanup(result, &args.pid_file).await;