|
@@ -95,6 +95,39 @@ fn parse_kernel_symbols(reader: impl BufRead) -> Result<BTreeMap<u64, String>, i
|
|
|
Ok(syms)
|
|
|
}
|
|
|
|
|
|
+/// Returns the prefix used by syscalls.
|
|
|
+///
|
|
|
+/// # Example
|
|
|
+///
|
|
|
+/// ```no_run
|
|
|
+/// use aya::util::syscall_prefix;
|
|
|
+/// let prefix = syscall_prefix().unwrap();
|
|
|
+/// let syscall_fname = format!("{prefix}exec");
|
|
|
+/// ```
|
|
|
+///
|
|
|
+/// # Errors
|
|
|
+///
|
|
|
+/// Returns [`std::io::ErrorKind::NotFound`] if the prefix can't be guessed. Returns other [`std::io::Error`] kinds if `/proc/kallsyms` can't be opened or is somehow invalid.
|
|
|
+pub fn syscall_prefix() -> Result<&'static str, io::Error> {
|
|
|
+ const PREFIXES: [&str; 7] = [
|
|
|
+ "sys_",
|
|
|
+ "__x64_sys_",
|
|
|
+ "__x32_compat_sys_",
|
|
|
+ "__ia32_compat_sys_",
|
|
|
+ "__arm64_sys_",
|
|
|
+ "__s390x_sys_",
|
|
|
+ "__s390_sys_",
|
|
|
+ ];
|
|
|
+ let ksym = kernel_symbols()?;
|
|
|
+ for p in PREFIXES {
|
|
|
+ let prefixed_syscall = format!("{}bpf", p);
|
|
|
+ if ksym.values().any(|el| *el == prefixed_syscall) {
|
|
|
+ return Ok(p);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Err(io::ErrorKind::NotFound.into())
|
|
|
+}
|
|
|
+
|
|
|
pub(crate) fn ifindex_from_ifname(if_name: &str) -> Result<u32, io::Error> {
|
|
|
let c_str_if_name = CString::new(if_name)?;
|
|
|
let c_if_name = c_str_if_name.as_ptr();
|