terminal_wait_exit/
lib.rs

1use std::io;
2
3#[cfg(windows)]
4pub async fn wait_exit() -> Result<(), io::Error> {
5    use tokio::signal::windows::{ctrl_break, ctrl_c, ctrl_close, ctrl_logoff, ctrl_shutdown};
6    use tokio::select;
7
8    let mut ctrl_c = match ctrl_c() {
9        Ok(c) => c,
10        Err(e) => return Err(e),
11    };
12    let mut ctrl_break = match ctrl_break() {
13        Ok(c) => c,
14        Err(e) => return Err(e),
15    };
16    let mut ctrl_close = match ctrl_close() {
17        Ok(c) => c,
18        Err(e) => return Err(e),
19    };
20    let mut ctrl_logoff = match ctrl_logoff() {
21        Ok(c) => c,
22        Err(e) => return Err(e),
23    };
24    let mut ctrl_shutdown = match ctrl_shutdown() {
25        Ok(c) => c,
26        Err(e) => return Err(e),
27    };
28    select! {
29        _ = ctrl_c.recv() => (),
30        _ = ctrl_break.recv() => (),
31        _ = ctrl_close.recv() => (),
32        _ = ctrl_logoff.recv() => (),
33        _ = ctrl_shutdown.recv() => (),
34    };
35    return Ok(());
36}
37
38#[cfg(unix)]
39pub async fn wait_exit() -> Result<(), io::Error> {
40    use tokio::signal::unix::{signal, SignalKind};
41    use tokio::select;
42
43    let mut sigint = signal(SignalKind::interrupt())?;
44    let mut sigquit = signal(SignalKind::quit())?;
45    let mut sigterm = signal(SignalKind::terminate())?;
46    select! {
47        _ = sigint.recv() => (),
48        _ = sigquit.recv() => (),
49        _ = sigterm.recv() => (),
50    };
51    return Ok(());
52}