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}