From 0ea2b5d45f177932bac25ee3cb3bc976cdf7893a Mon Sep 17 00:00:00 2001
From: 4lDO2 <4lDO2@protonmail.com>
Date: Mon, 24 Jun 2024 11:00:28 +0200
Subject: [PATCH] Fix compilation on Linux.

---
 src/ld_so/tcb.rs             |  1 -
 src/platform/linux/signal.rs | 27 +++++++++++++++------------
 2 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/src/ld_so/tcb.rs b/src/ld_so/tcb.rs
index a7c0457b..048c52ae 100644
--- a/src/ld_so/tcb.rs
+++ b/src/ld_so/tcb.rs
@@ -1,6 +1,5 @@
 use alloc::vec::Vec;
 use generic_rt::GenericTcb;
-use syscall::Sigcontrol;
 use core::{arch::asm, cell::UnsafeCell, mem, ops::{Deref, DerefMut}, ptr, slice, sync::atomic::AtomicBool};
 use goblin::error::{Error, Result};
 
diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs
index 266c231b..86b4efb1 100644
--- a/src/platform/linux/signal.rs
+++ b/src/platform/linux/signal.rs
@@ -2,13 +2,14 @@ use core::mem;
 
 use super::{
     super::{types::*, PalSignal},
-    e, Sys,
+    e, e_raw, Sys,
 };
 use crate::header::{
     signal::{sigaction, siginfo_t, sigset_t, stack_t, NSIG},
     sys_time::itimerval,
     time::timespec,
 };
+use crate::pthread::Errno;
 
 impl PalSignal for Sys {
     unsafe fn getitimer(which: c_int, out: *mut itimerval) -> c_int {
@@ -36,8 +37,8 @@ impl PalSignal for Sys {
         e(syscall!(SETITIMER, which, new, old)) as c_int
     }
 
-    fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> c_int {
-        e(unsafe {
+    fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> Result<(), Errno> {
+        e_raw(unsafe {
             syscall!(
                 RT_SIGACTION,
                 sig,
@@ -45,7 +46,7 @@ impl PalSignal for Sys {
                 oact.map_or_else(core::ptr::null_mut, |x| x as *mut _),
                 mem::size_of::<sigset_t>()
             )
-        }) as c_int
+        }).map(|_| ())
     }
 
     unsafe fn sigaltstack(ss: *const stack_t, old_ss: *mut stack_t) -> c_int {
@@ -56,14 +57,16 @@ impl PalSignal for Sys {
         e(syscall!(RT_SIGPENDING, set, NSIG / 8)) as c_int
     }
 
-    unsafe fn sigprocmask(how: c_int, set: *const sigset_t, oset: *mut sigset_t) -> c_int {
-        e(syscall!(
-            RT_SIGPROCMASK,
-            how,
-            set,
-            oset,
-            mem::size_of::<sigset_t>()
-        )) as c_int
+    fn sigprocmask(how: c_int, set: Option<&sigset_t>, oset: Option<&mut sigset_t>) -> Result<(), Errno> {
+        e_raw(unsafe {
+            syscall!(
+                RT_SIGPROCMASK,
+                how,
+                set.map_or_else(core::ptr::null, |x| x as *const _),
+                oset.map_or_else(core::ptr::null_mut, |x| x as *mut _),
+                mem::size_of::<sigset_t>()
+            )
+        }).map(|_| ())
     }
 
     unsafe fn sigsuspend(set: *const sigset_t) -> c_int {
-- 
GitLab