broxus_util/
signal.rs

1use tokio::signal::unix;
2
3pub const TERMINATION_SIGNALS: [libc::c_int; 5] = [
4    libc::SIGINT,
5    libc::SIGTERM,
6    libc::SIGQUIT,
7    libc::SIGABRT,
8    20, // SIGTSTP
9];
10
11pub fn any_signal<I, T>(signals: I) -> tokio::sync::oneshot::Receiver<unix::SignalKind>
12where
13    I: IntoIterator<Item = T>,
14    T: Into<unix::SignalKind> + Send + 'static,
15{
16    let (tx, rx) = tokio::sync::oneshot::channel();
17
18    let any_signal = futures_util::future::select_all(signals.into_iter().map(|signal| {
19        Box::pin(async move {
20            let signal = signal.into();
21            unix::signal(signal)
22                .expect("Failed subscribing on unix signals")
23                .recv()
24                .await;
25            signal
26        })
27    }));
28
29    tokio::spawn(async move {
30        let signal = any_signal.await.0;
31        tx.send(signal).ok();
32    });
33
34    rx
35}