From 34f5f572136989e206f99752b5bce7c09f91f12c Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Sat, 25 Aug 2018 09:21:08 -0600
Subject: [PATCH] Fix signal and socket pal implementations on Redox

---
 src/platform/src/linux/socket.rs |  4 ++--
 src/platform/src/pal/socket.rs   |  2 +-
 src/platform/src/redox/mod.rs    |  9 ---------
 src/platform/src/redox/signal.rs | 17 ++++++++++++++++-
 src/platform/src/redox/socket.rs | 16 ++++++++++++----
 5 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/platform/src/linux/socket.rs b/src/platform/src/linux/socket.rs
index c29f2b51..f222a6e3 100644
--- a/src/platform/src/linux/socket.rs
+++ b/src/platform/src/linux/socket.rs
@@ -109,8 +109,8 @@ impl PalSocket for Sys {
         e(unsafe { syscall!(SHUTDOWN, socket, how) }) as c_int
     }
 
-    fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
-        e(unsafe { syscall!(SOCKET, domain, kind, protocol) }) as c_int
+    unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
+        e(syscall!(SOCKET, domain, kind, protocol)) as c_int
     }
 
     fn socketpair(domain: c_int, kind: c_int, protocol: c_int, socket_vector: *mut c_int) -> c_int {
diff --git a/src/platform/src/pal/socket.rs b/src/platform/src/pal/socket.rs
index 8a4c72ad..a1329d60 100644
--- a/src/platform/src/pal/socket.rs
+++ b/src/platform/src/pal/socket.rs
@@ -72,7 +72,7 @@ pub trait PalSocket: Pal {
         Self::no_pal("shutdown")
     }
 
-    fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
+    unsafe fn socket(domain: c_int, kind: c_int, protocol: c_int) -> c_int {
         Self::no_pal("socket")
     }
 
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index ac74cf41..1129b3b4 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -19,21 +19,12 @@ const EINVAL: c_int = 22;
 const ENOSYS: c_int = 38;
 const MAP_ANON: c_int = 1;
 
-#[thread_local]
-static mut SIG_HANDLER: Option<extern "C" fn(c_int)> = None;
-
 static ANONYMOUS_MAPS: Once<Mutex<BTreeMap<usize, usize>>> = Once::new();
 
 fn anonymous_maps() -> MutexGuard<'static, BTreeMap<usize, usize>> {
     ANONYMOUS_MAPS.call_once(|| Mutex::new(BTreeMap::new())).lock()
 }
 
-extern "C" fn sig_handler(sig: usize) {
-    if let Some(ref callback) = unsafe { SIG_HANDLER } {
-        callback(sig as c_int);
-    }
-}
-
 fn e(sys: Result<usize>) -> usize {
     match sys {
         Ok(ok) => ok,
diff --git a/src/platform/src/redox/signal.rs b/src/platform/src/redox/signal.rs
index 2c80345f..612b04f2 100644
--- a/src/platform/src/redox/signal.rs
+++ b/src/platform/src/redox/signal.rs
@@ -1,3 +1,18 @@
+use syscall;
+
+use super::{e, Sys};
+use {Pal, PalSignal};
+use types::*;
+
+#[thread_local]
+static mut SIG_HANDLER: Option<extern "C" fn(c_int)> = None;
+
+extern "C" fn sig_handler(sig: usize) {
+    if let Some(ref callback) = unsafe { SIG_HANDLER } {
+        callback(sig as c_int);
+    }
+}
+
 impl PalSignal for Sys {
     fn kill(pid: pid_t, sig: c_int) -> c_int {
         e(syscall::kill(pid as usize, sig as usize)) as c_int
@@ -8,7 +23,7 @@ impl PalSignal for Sys {
     }
 
     fn raise(sig: c_int) -> c_int {
-        kill(getpid(), sig)
+        Self::kill(Self::getpid(), sig)
     }
 
     unsafe fn sigaction(sig: c_int, act: *const sigaction, oact: *mut sigaction) -> c_int {
diff --git a/src/platform/src/redox/socket.rs b/src/platform/src/redox/socket.rs
index 6437eeb0..bd78eafc 100644
--- a/src/platform/src/redox/socket.rs
+++ b/src/platform/src/redox/socket.rs
@@ -1,3 +1,11 @@
+use core::{mem, ptr, slice};
+use syscall::{self, Result};
+use syscall::flag::*;
+
+use super::{e, Sys};
+use {errno, Pal, PalSocket};
+use types::*;
+
 macro_rules! bind_or_connect {
     (bind $path:expr) => {
         concat!("/", $path)
@@ -75,7 +83,7 @@ impl PalSocket for Sys {
         }
         if address != ptr::null_mut()
             && address_len != ptr::null_mut()
-            && getpeername(stream, address, address_len) < 0
+            && Self::getpeername(stream, address, address_len) < 0
         {
             return -1;
         }
@@ -120,11 +128,11 @@ impl PalSocket for Sys {
         }
         if address != ptr::null_mut()
             && address_len != ptr::null_mut()
-            && getpeername(socket, address, address_len) < 0
+            && Self::getpeername(socket, address, address_len) < 0
         {
             return -1;
         }
-        read(socket, slice::from_raw_parts_mut(buf as *mut u8, len))
+        Self::read(socket, slice::from_raw_parts_mut(buf as *mut u8, len))
     }
 
     unsafe fn sendto(
@@ -143,7 +151,7 @@ impl PalSocket for Sys {
             errno = syscall::EOPNOTSUPP;
             return -1;
         }
-        write(socket, slice::from_raw_parts(buf as *const u8, len))
+        Self::write(socket, slice::from_raw_parts(buf as *const u8, len))
     }
 
     unsafe fn socket(domain: c_int, mut kind: c_int, protocol: c_int) -> c_int {
-- 
GitLab