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}