sysnames/
lib.rs

1// SPDX-License-Identifier: MIT
2//
3// Linux system call names and numbers.
4// Copyright (c) 2021  William Findlay
5//
6// June 14, 2021  William Findlay  Created this.
7
8//! Get system call information for the Linux kernel according to your target
9//! architecture.
10
11#![crate_name = "sysnames"]
12// Only supported on Linux (for now)
13#![cfg(target_os = "linux")]
14// Everything should be documented
15#![deny(missing_docs)]
16
17mod syscalls;
18
19/// Get system call information for your target architecture.
20/// Currently only supports the Linux kernel.
21pub struct Syscalls;
22impl Syscalls {
23    /// Get a system call name by its number, if it exists on your architecture.
24    ///
25    /// ```rust
26    /// use sysnames::Syscalls;
27    ///
28    /// let execve_num = Syscalls::number("execve");
29    /// assert!(execve_num.is_some());
30    /// ```
31    pub fn number(name: &str) -> Option<u64> {
32        syscalls::SYSCALL_NUMS
33            .get_by_left(name.to_lowercase().as_str())
34            .cloned()
35    }
36
37    /// Get a system call number by its name, if it exists on your architecture.
38    ///
39    /// ```rust
40    /// use sysnames::Syscalls;
41    ///
42    /// let execve_name = Syscalls::name(59);
43    /// assert!(execve_name.is_some());
44    /// ```
45    pub fn name<'a>(number: u64) -> Option<&'a str> {
46        syscalls::SYSCALL_NUMS.get_by_right(&number).cloned()
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn name_number_bijection_test() {
56        let number = Syscalls::number("execve").unwrap();
57        let name = Syscalls::name(number).unwrap();
58        assert_eq!(name, "execve");
59    }
60
61    #[test]
62    #[cfg(target_arch = "x86_64")]
63    fn execve_x86_64_test() {
64        let name = Syscalls::name(59).unwrap();
65        assert_eq!(name, "execve");
66
67        let number = Syscalls::number("execve").unwrap();
68        assert_eq!(number, 59);
69    }
70}