1use regex::Regex;
3
4use crate::error;
5
6#[derive(Copy, Clone, Default)]
8pub struct Siginfo {
9 pub si_signo: u32,
11 pub si_errno: u32,
12 pub si_code: u32,
13 pub si_addr: u64,
15}
16
17impl Siginfo {
18 pub fn from_gdb<T: AsRef<str>>(info: T) -> error::Result<Siginfo> {
24 let re =
25 Regex::new(r"si_signo.*?0x([0-9a-f]+)(?:.|\n)*si_errno.*?0x([0-9a-f]+)(?:.|\n)*si_code.*?0x([0-9a-f]+)(?:.|\n)*si_addr.*?0x([0-9a-f]+)").unwrap();
26 if let Some(caps) = re.captures(info.as_ref()) {
27 Ok(Siginfo {
28 si_signo: u32::from_str_radix(caps.get(1).unwrap().as_str(), 16)?,
29 si_errno: u32::from_str_radix(caps.get(2).unwrap().as_str(), 16)?,
30 si_code: u32::from_str_radix(caps.get(3).unwrap().as_str(), 16)?,
31 si_addr: u64::from_str_radix(caps.get(4).unwrap().as_str(), 16)?,
32 })
33 } else {
34 Err(error::Error::SiginfoParse(format!(
35 "Siginfo string: {} doesn't match regex template",
36 info.as_ref()
37 )))
38 }
39 }
40}