From 7bcfa9cfd9bdc98c7ee9459637d21cca4dc99afd Mon Sep 17 00:00:00 2001
From: 4lDO2 <4lDO2@protonmail.com>
Date: Sun, 30 Apr 2023 17:28:45 +0200
Subject: [PATCH] Fix Linux.

---
 src/header/bits_pthread/mod.rs |  3 ++-
 src/platform/linux/mod.rs      | 17 ++++++++++++-----
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/header/bits_pthread/mod.rs b/src/header/bits_pthread/mod.rs
index 3a82389f..f9c282b2 100644
--- a/src/header/bits_pthread/mod.rs
+++ b/src/header/bits_pthread/mod.rs
@@ -84,7 +84,8 @@ macro_rules! assert_equal_size(
             let a = [0_u8; core::mem::align_of::<$export>()];
             let b: [u8; core::mem::align_of::<Wrapped>()] = core::mem::transmute(a);
         };
-        #[cfg(feature = "check_against_libc_crate")]
+        // TODO: Turn into a macro?
+        #[cfg(all(target_os = "redox", feature = "check_against_libc_crate"))]
         const _: () = unsafe {
             let export = $export { __relibc_internal_align: 0 };
             let _: libc::$export = core::mem::transmute(export.__relibc_internal_size); 
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 9885a939..be454f92 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -49,8 +49,11 @@ struct linux_statfs {
     f_spare: [c_long; 4],
 }
 
+// TODO
+const ERRNO_MAX: usize = 4095;
+
 pub fn e_raw(sys: usize) -> Result<usize, usize> {
-    if (sys as isize) < 0 && (sys as isize) >= -256 {
+    if sys > ERRNO_MAX.wrapping_neg() {
         Err(sys.wrapping_neg())
     } else {
         Ok(sys)
@@ -61,7 +64,7 @@ pub fn e(sys: usize) -> usize {
         Ok(value) => value,
         Err(errcode) => {
             unsafe {
-                errno = errcode;
+                errno = errcode as c_int;
             }
             !0
         }
@@ -140,6 +143,10 @@ impl Pal for Sys {
         }
         loop {}
     }
+    fn exit_thread() -> ! {
+        // TODO
+        Self::exit(0)
+    }
 
     fn fchdir(fildes: c_int) -> c_int {
         e(unsafe { syscall!(FCHDIR, fildes) }) as c_int
@@ -220,7 +227,7 @@ impl Pal for Sys {
     }
 
     fn futex(addr: *mut c_int, op: c_int, val: c_int, val2: usize) -> Result<c_long, crate::pthread::Errno> {
-        e_raw(unsafe { syscall!(FUTEX, addr, op, val, val2, 0, 0)}).map(|r| r as c_long).map_err(|e| Errno(e as c_int))
+        e_raw(unsafe { syscall!(FUTEX, addr, op, val, val2, 0, 0)}).map(|r| r as c_long).map_err(|e| crate::pthread::Errno(e as c_int))
     }
 
     fn futimens(fd: c_int, times: *const timespec) -> c_int {
@@ -437,13 +444,13 @@ impl Pal for Sys {
             out("r14") _,
             out("r15") _,
         );
-        let tid = e_raw(pid)?;
+        let tid = e_raw(pid).map_err(|err| crate::pthread::Errno(err as c_int))?;
 
         Ok(crate::pthread::OsTid { thread_id: tid })
     }
     unsafe fn rlct_kill(os_tid: crate::pthread::OsTid, signal: usize) -> Result<(), crate::pthread::Errno> {
         let tgid = Self::getpid();
-        e_raw(unsafe { syscall!(TGKILL, pid, os_tid.thread_id, signal) })
+        e_raw(unsafe { syscall!(TGKILL, tgid, os_tid.thread_id, signal) }).map(|_| ()).map_err(|err| crate::pthread::Errno(err as c_int))
     }
     fn current_os_tid() -> crate::pthread::OsTid {
         crate::pthread::OsTid {
-- 
GitLab