#[cfg(unix)]
pub use unix::*;
#[cfg(windows)]
pub use windows::*;
#[cfg(unix)]
mod unix {
use std::io;
pub use tokio::signal::unix::SignalKind;
use tokio::signal::unix::{Signal, signal};
pub struct DtactSignalStream(Signal);
impl DtactSignalStream {
pub async fn recv(&mut self) {
self.0.recv().await;
}
}
pub fn register(kind: SignalKind) -> io::Result<DtactSignalStream> {
make(kind)
}
fn make(kind: SignalKind) -> io::Result<DtactSignalStream> {
signal(kind).map(DtactSignalStream)
}
#[must_use]
pub fn sigint() -> DtactSignalStream {
make(SignalKind::interrupt()).expect("dtact-signal: failed to register SIGINT handler")
}
#[must_use]
pub fn sigterm() -> DtactSignalStream {
make(SignalKind::terminate()).expect("dtact-signal: failed to register SIGTERM handler")
}
#[must_use]
pub fn sighup() -> DtactSignalStream {
make(SignalKind::hangup()).expect("dtact-signal: failed to register SIGHUP handler")
}
#[must_use]
pub fn sigusr1() -> DtactSignalStream {
make(SignalKind::user_defined1()).expect("dtact-signal: failed to register SIGUSR1 handler")
}
#[must_use]
pub fn sigusr2() -> DtactSignalStream {
make(SignalKind::user_defined2()).expect("dtact-signal: failed to register SIGUSR2 handler")
}
#[must_use]
pub fn sigchld() -> DtactSignalStream {
make(SignalKind::child()).expect("dtact-signal: failed to register SIGCHLD handler")
}
}
#[cfg(windows)]
mod windows {
use tokio::signal::windows::{CtrlBreak, CtrlC, CtrlClose, CtrlLogoff, CtrlShutdown};
pub struct DtactSignalStream(CtrlWrapper);
enum CtrlWrapper {
C(CtrlC),
Break(CtrlBreak),
Close(CtrlClose),
Logoff(CtrlLogoff),
Shutdown(CtrlShutdown),
}
impl DtactSignalStream {
pub async fn recv(&mut self) {
match &mut self.0 {
CtrlWrapper::C(s) => {
s.recv().await;
}
CtrlWrapper::Break(s) => {
s.recv().await;
}
CtrlWrapper::Close(s) => {
s.recv().await;
}
CtrlWrapper::Logoff(s) => {
s.recv().await;
}
CtrlWrapper::Shutdown(s) => {
s.recv().await;
}
}
}
}
#[must_use]
pub fn ctrl_c() -> DtactSignalStream {
DtactSignalStream(CtrlWrapper::C(
tokio::signal::windows::ctrl_c()
.expect("dtact-signal: failed to register Ctrl+C handler"),
))
}
#[must_use]
pub fn ctrl_break() -> DtactSignalStream {
DtactSignalStream(CtrlWrapper::Break(
tokio::signal::windows::ctrl_break()
.expect("dtact-signal: failed to register Ctrl+Break handler"),
))
}
#[must_use]
pub fn ctrl_close() -> DtactSignalStream {
DtactSignalStream(CtrlWrapper::Close(
tokio::signal::windows::ctrl_close()
.expect("dtact-signal: failed to register Ctrl+Close handler"),
))
}
#[must_use]
pub fn ctrl_logoff() -> DtactSignalStream {
DtactSignalStream(CtrlWrapper::Logoff(
tokio::signal::windows::ctrl_logoff()
.expect("dtact-signal: failed to register Ctrl+Logoff handler"),
))
}
#[must_use]
pub fn ctrl_shutdown() -> DtactSignalStream {
DtactSignalStream(CtrlWrapper::Shutdown(
tokio::signal::windows::ctrl_shutdown()
.expect("dtact-signal: failed to register Ctrl+Shutdown handler"),
))
}
}