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 c29f2b51c..f222a6e36 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 8a4c72ad5..a1329d602 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 ac74cf417..1129b3b4c 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 2c80345f8..612b04f2e 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 6437eeb04..bd78eafc9 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