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