From 569454dd498540dca0611bcd9cd085740f8c8cda Mon Sep 17 00:00:00 2001 From: Patrick Auernig Date: Fri, 18 Aug 2023 17:05:25 +0200 Subject: [PATCH] Implement sigterm handler This avoids situations where the terminal is not reset and still in raw mode. --- Cargo.lock | 1 + crates/wayfarer/Cargo.toml | 1 + crates/wayfarer/src/tui.rs | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 1591fd8..cf16621 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1074,6 +1074,7 @@ dependencies = [ "lazy_static", "notify", "ratatui", + "signal-hook", "tracing", "tracing-appender", "tracing-subscriber", diff --git a/crates/wayfarer/Cargo.toml b/crates/wayfarer/Cargo.toml index 1905042..e5a4b9d 100644 --- a/crates/wayfarer/Cargo.toml +++ b/crates/wayfarer/Cargo.toml @@ -12,6 +12,7 @@ lazy_static = "1.4" tracing = "0.1" tracing-subscriber = "0.3" tracing-appender = "0.2" +signal-hook = "0.3" [dependencies.clap] version = "4.3" diff --git a/crates/wayfarer/src/tui.rs b/crates/wayfarer/src/tui.rs index 1ab28e1..35fb486 100644 --- a/crates/wayfarer/src/tui.rs +++ b/crates/wayfarer/src/tui.rs @@ -5,7 +5,9 @@ mod view; use std::io::{self, Stdout}; use std::path::PathBuf; +use std::sync::atomic::{self, AtomicBool}; use std::sync::mpsc::{self, TryRecvError}; +use std::sync::Arc; use anyhow::Result; use clap::Parser as ArgParser; @@ -98,8 +100,19 @@ pub(crate) fn execute(args: &Args) -> Result<()> { #[cfg_attr(not(feature = "watch"), allow(unused_mut))] fn run(terminal: &mut Terminal, mut state: State) -> Result<()> { let (mut msg_tx, msg_rx) = mpsc::channel::(); + let term_signal_received = Arc::new(AtomicBool::new(false)); + + signal_hook::flag::register( + signal_hook::consts::SIGTERM, + Arc::clone(&term_signal_received), + )?; loop { + if term_signal_received.load(atomic::Ordering::Relaxed) { + info!("Received termination signal, exiting"); + break; + } + terminal.draw(|frame| { view::render(&mut state, frame); })?;