aya: Correctly set the kernel code version for Ubuntu kernel

Fix BPF syscall failure related to the kernel code version.
pull/579/head
Mary 1 year ago
parent b5c2928b0e
commit f1d891836e

@ -8,6 +8,8 @@ mod fake;
use std::io; use std::io;
#[cfg(not(test))] #[cfg(not(test))]
use std::{ffi::CString, mem}; use std::{ffi::CString, mem};
#[cfg(not(test))]
use std::{fs::File, io::Read};
#[cfg(not(test))] #[cfg(not(test))]
use libc::utsname; use libc::utsname;
@ -82,8 +84,40 @@ pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> {
Ok((0xff, 0xff, 0xff)) Ok((0xff, 0xff, 0xff))
} }
#[cfg(not(test))]
fn ubuntu_kernel_version() -> Result<(u32, u32, u32), ()> {
if let Ok(mut file) = File::open("/proc/version_signature") {
let mut buf = String::new();
let mut major = 0u32;
let mut minor = 0u32;
let mut patch = 0u32;
let format = CString::new("%*s %*s %u.%u.%u\n").unwrap();
file.read_to_string(&mut buf).map_err(|_| ())?;
unsafe {
if libc::sscanf(
buf.as_ptr() as *const _,
format.as_ptr(),
&mut major as *mut u32,
&mut minor as *mut _,
&mut patch as *mut _,
) == 3
{
return Ok((major, minor, patch));
}
}
}
Err(())
}
#[cfg(not(test))] #[cfg(not(test))]
pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> { pub(crate) fn kernel_version() -> Result<(u32, u32, u32), ()> {
if let Ok(version) = ubuntu_kernel_version() {
return Ok(version);
}
unsafe { unsafe {
let mut v = mem::zeroed::<utsname>(); let mut v = mem::zeroed::<utsname>();
if libc::uname(&mut v as *mut _) != 0 { if libc::uname(&mut v as *mut _) != 0 {

Loading…
Cancel
Save