]> git.nega.tv - josh/narcissus/commitdiff
narcissus-core: Add `errno` API
authorJosh Simmons <josh@nega.tv>
Mon, 2 Dec 2024 21:43:42 +0000 (22:43 +0100)
committerJosh Simmons <josh@nega.tv>
Sat, 5 Apr 2025 12:33:17 +0000 (14:33 +0200)
engine/narcissus-core/src/errno.rs [new file with mode: 0644]
engine/narcissus-core/src/lib.rs
engine/narcissus-core/src/libc.rs

diff --git a/engine/narcissus-core/src/errno.rs b/engine/narcissus-core/src/errno.rs
new file mode 100644 (file)
index 0000000..0c6c9e5
--- /dev/null
@@ -0,0 +1,66 @@
+use crate::libc;
+
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub struct Errno(pub i32);
+
+/// Returns the system's equivalent of `errno`
+pub fn errno() -> Errno {
+    #[cfg(not(target_os = "linux"))]
+    const _: () = panic!("unsupported os");
+
+    #[cfg(target_os = "linux")]
+    Errno(
+        // SAFETY: The pointer returned from errno_location is always a valid pointer to the thread's errno variable.
+        unsafe { *libc::errno_location() },
+    )
+}
+
+#[cfg(target_os = "linux")]
+pub mod unix {
+    use std::ffi::c_int;
+
+    pub const EPERM: c_int = 1;
+    pub const ENOENT: c_int = 2;
+    pub const ESRCH: c_int = 3;
+    pub const EINTR: c_int = 4;
+    pub const EIO: c_int = 5;
+    pub const ENXIO: c_int = 6;
+    pub const E2BIG: c_int = 7;
+    pub const ENOEXEC: c_int = 8;
+    pub const EBADF: c_int = 9;
+    pub const ECHILD: c_int = 10;
+    pub const EAGAIN: c_int = 11;
+    pub const ENOMEM: c_int = 12;
+    pub const EACCES: c_int = 13;
+    pub const EFAULT: c_int = 14;
+    pub const ENOTBLK: c_int = 15;
+    pub const EBUSY: c_int = 16;
+    pub const EEXIST: c_int = 17;
+    pub const EXDEV: c_int = 18;
+    pub const ENODEV: c_int = 19;
+    pub const ENOTDIR: c_int = 20;
+    pub const EISDIR: c_int = 21;
+    pub const EINVAL: c_int = 22;
+    pub const ENFILE: c_int = 23;
+    pub const EMFILE: c_int = 24;
+    pub const ENOTTY: c_int = 25;
+    pub const ETXTBSY: c_int = 26;
+    pub const EFBIG: c_int = 27;
+    pub const ENOSPC: c_int = 28;
+    pub const ESPIPE: c_int = 29;
+    pub const EROFS: c_int = 30;
+    pub const EMLINK: c_int = 31;
+    pub const EPIPE: c_int = 32;
+    pub const EDOM: c_int = 33;
+    pub const ERANGE: c_int = 34;
+}
+
+#[cfg(test)]
+mod tests {
+    use super::errno;
+
+    #[test]
+    fn call_errno() {
+        let _ = errno();
+    }
+}
index 669b153ee7527152f28da3444b87f369e0afbff5..ce07276e04836c92ae2668a91cde997131fe0ec8 100644 (file)
@@ -2,6 +2,7 @@ mod arena;
 mod bitset;
 pub mod dds;
 mod directory;
+pub mod errno;
 mod finite;
 mod fixed_vec;
 mod fourcc;
index 1b40c1f7a125bfc259fa1f02700f75c742d88145..d963b91047233aecf2e61dba68c2e3bc7336da4c 100644 (file)
@@ -440,4 +440,7 @@ extern "C" {
     ) -> *mut c_void;
     pub fn munmap(addr: *mut c_void, len: size_t) -> c_int;
     pub fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int;
+
+    #[cfg_attr(target_os = "linux", link_name = "__errno_location")]
+    pub fn errno_location() -> *mut c_int;
 }