Browse Source

sys: add kernel_version() util to get the running kernel version

Alessandro Decina 4 years ago
parent
commit
4bd0cde199
1 changed files with 31 additions and 2 deletions
  1. 31 2
      src/sys/mod.rs

+ 31 - 2
src/sys/mod.rs

@@ -4,9 +4,12 @@ mod perf_event;
 #[cfg(test)]
 mod fake;
 
-use std::io;
+use std::{
+    ffi::{CStr, CString},
+    io, mem,
+};
 
-use libc::{c_int, c_long, c_ulong, pid_t};
+use libc::{c_int, c_long, c_ulong, pid_t, utsname};
 
 pub(crate) use bpf::*;
 #[cfg(test)]
@@ -69,3 +72,29 @@ unsafe fn syscall_impl(call: Syscall) -> SysResult {
 
     Ok(ret)
 }
+
+pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> {
+    unsafe {
+        let mut v = mem::zeroed::<utsname>();
+        if libc::uname(&mut v as *mut _) != 0 {
+            return Err(());
+        }
+
+        let mut major = 0u32;
+        let mut minor = 0u32;
+        let mut patch = 0u32;
+        let format = CString::new("%u.%u.%u").unwrap();
+        if libc::sscanf(
+            v.release.as_ptr(),
+            format.as_ptr(),
+            &mut major as *mut u32,
+            &mut minor as *mut _,
+            &mut patch as *mut _,
+        ) != 3
+        {
+            return Err(());
+        }
+
+        Ok((major, minor, patch))
+    }
+}