use std::fmt;
use crate::system::interface::ProcessId;
use super::SignalNumber;
#[repr(transparent)]
pub(crate) struct SignalInfo {
info: libc::siginfo_t,
}
impl SignalInfo {
pub(super) const SIZE: usize = std::mem::size_of::<Self>();
fn is_user_signaled(&self) -> bool {
self.info.si_code <= 0
}
pub(crate) fn signaler_pid(&self) -> Option<ProcessId> {
if self.is_user_signaled() {
let id = unsafe { self.info.si_pid() };
Some(ProcessId::new(id))
} else {
None
}
}
pub(crate) fn signal(&self) -> SignalNumber {
self.info.si_signo
}
}
impl fmt::Display for SignalInfo {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{} {} from ",
if self.is_user_signaled() {
" user signaled"
} else {
""
},
self.signal(),
)?;
if let Some(pid) = self.signaler_pid() {
write!(f, "{pid}")
} else {
write!(f, "<none>")
}
}
}