Skip to main content

tracexec_core/
lib.rs

1use std::os::unix::ffi::OsStrExt;
2
3use atoi::atoi;
4use color_eyre::eyre::bail;
5
6pub mod account;
7pub mod breakpoint;
8pub mod cache;
9pub mod cli;
10pub mod cmdbuilder;
11pub mod copy;
12pub mod elevate;
13pub mod event;
14pub mod export;
15pub mod output;
16pub mod primitives;
17pub mod printer;
18pub mod proc;
19pub mod pty;
20pub mod timestamp;
21pub mod tracee;
22pub mod tracer;
23
24pub fn is_current_kernel_ge(min_support: (u32, u32)) -> color_eyre::Result<bool> {
25  let utsname = nix::sys::utsname::uname()?;
26  let kstr = utsname.release().as_bytes();
27  let pos = kstr.iter().position(|&c| c != b'.' && !c.is_ascii_digit());
28  let kver = pos.map_or(kstr, |pos| kstr.split_at(pos).0);
29  let mut kvers = kver.split(|&c| c == b'.');
30  let Some(major) = kvers.next().and_then(atoi::<u32>) else {
31    bail!("Failed to parse kernel major ver!")
32  };
33  let Some(minor) = kvers.next().and_then(atoi::<u32>) else {
34    bail!("Failed to parse kernel minor ver!")
35  };
36  Ok((major, minor) >= min_support)
37}
38
39#[cfg(test)]
40mod test {
41  use crate::is_current_kernel_ge;
42
43  #[test]
44  fn test_is_current_kernel_ge() {
45    assert!(is_current_kernel_ge((3, 0)).unwrap())
46  }
47}