From f2357390e9b028ce1497bd28656d15cff4534fc4 Mon Sep 17 00:00:00 2001
From: Xavier L'Heureux <xavier.lheureux@icloud.com>
Date: Sun, 11 Aug 2019 21:06:47 -0400
Subject: [PATCH] Fix redox's implementation

---
 src/platform/redox/signal.rs | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs
index 1b945762..6e1a22de 100644
--- a/src/platform/redox/signal.rs
+++ b/src/platform/redox/signal.rs
@@ -105,27 +105,21 @@ impl PalSignal for Sys {
         0
     }
 
-    unsafe fn sigaction(sig: c_int, act: *const sigaction, oact: *mut sigaction) -> c_int {
-        let new_opt = if act.is_null() {
-            None
-        } else {
-            let m = (*act).sa_mask;
-            let sa_handler = mem::transmute((*act).sa_handler);
+    fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> c_int {
+        let new_opt = act.map(|act| {
+            let m = act.sa_mask;
+            let sa_handler = unsafe { mem::transmute(act.sa_handler) };
             println!("signal called with {:x}", unsafe {
                 mem::transmute::<_, usize>(sa_handler)
             });
-            Some(syscall::SigAction {
+            syscall::SigAction {
                 sa_handler,
                 sa_mask: [m as u64, 0],
-                sa_flags: syscall::SigActionFlags::from_bits((*act).sa_flags as usize)
+                sa_flags: syscall::SigActionFlags::from_bits(act.sa_flags as usize)
                     .expect("sigaction: invalid bit pattern"),
-            })
-        };
-        let mut old_opt = if oact.is_null() {
-            None
-        } else {
-            Some(syscall::SigAction::default())
-        };
+            }
+        });
+        let mut old_opt = oact.as_ref().map(|_| syscall::SigAction::default());
         println!("before : {:?}", new_opt);
         println!("before old : {:?}", old_opt);
         let ret = e(syscall::sigaction(
@@ -134,13 +128,13 @@ impl PalSignal for Sys {
             old_opt.as_mut(),
         )) as c_int;
         println!("after : {:?}", old_opt);
-        if let Some(old) = old_opt {
-            (*oact).sa_handler = mem::transmute(old.sa_handler);
+        if let (Some(old), Some(oact)) = (old_opt, oact) {
+            println!("after : {:?}", oact);
+            oact.sa_handler = unsafe { mem::transmute(old.sa_handler) };
             let m = old.sa_mask;
-            (*oact).sa_mask = m[0] as c_ulong;
-            (*oact).sa_flags = old.sa_flags.bits() as c_ulong;
+            oact.sa_mask = m[0] as c_ulong;
+            oact.sa_flags = old.sa_flags.bits() as c_ulong;
         }
-        println!("after : {:?}", (*oact));
         ret
     }
 
-- 
GitLab