terminal_wait_exit/
lib.rs1use 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}