libsdb/
syscalls.rs

1use super::sdb_error::SdbError;
2use nix::libc::c_long;
3use std::collections::HashMap;
4use std::sync::LazyLock;
5use syscall_numbers::x86_64::sys_call_name;
6
7const MAX_SYSCALL_NUMBER: i64 = 0x1ff;
8
9static SYSCALL_NAME_TO_NUM: LazyLock<HashMap<&'static str, c_long>> = LazyLock::new(|| {
10    let mut map = HashMap::with_capacity(MAX_SYSCALL_NUMBER as usize);
11    for n in 0..=MAX_SYSCALL_NUMBER {
12        if let Some(name) = sys_call_name(n) {
13            if !name.is_empty() {
14                map.insert(name, n as c_long);
15            }
16        }
17    }
18    map
19});
20
21pub fn syscall_name_to_id(name: &str) -> Result<c_long, SdbError> {
22    SYSCALL_NAME_TO_NUM
23        .get(name)
24        .copied()
25        .ok_or(SdbError::new_err(&format!("No such syscall name: {name}")))
26}
27
28pub fn syscall_id_to_name(id: c_long) -> Result<&'static str, SdbError> {
29    sys_call_name(id).ok_or(SdbError::new_err(&format!("No such syscall id: {id}")))
30}