From 75b2dcaa455d15e812d68a2bf285271f5ba9f252 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Thu, 25 Jul 2024 19:28:10 +0200 Subject: [PATCH] WIP: implement sigqueue --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- redox-rt/src/sys.rs | 7 +++++++ src/header/signal/mod.rs | 11 +++++++++++ src/platform/pal/signal.rs | 4 +++- src/platform/redox/signal.rs | 11 +++++++++-- 6 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f2ce4c5c..34baa0b6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -390,9 +390,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "62871f2d65009c0256aed1b9cfeeb8ac272833c404e13d53d400cd0dad7a2ac0" dependencies = [ "bitflags", ] diff --git a/Cargo.toml b/Cargo.toml index cc46f4547..668f1ac57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,7 +59,7 @@ features = ["c_api"] sc = "0.2.3" [target.'cfg(target_os = "redox")'.dependencies] -redox_syscall = "0.5.4" +redox_syscall = "0.5.5" redox-rt = { path = "redox-rt" } redox-path = "0.2" redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git", default-features = false, features = ["redox_syscall"] } diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index 2e2db3712..7566f63f3 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -44,6 +44,13 @@ pub fn posix_kill(pid: usize, sig: usize) -> Result<()> { } } #[inline] +pub fn posix_sigqueue(pid: usize, sig: usize, val: usize) -> Result<()> { + match wrapper(false, || unsafe { syscall::syscall3(101, pid, sig, val) }) { + Ok(_) | Err(Error { errno: EINTR }) => Ok(()), + Err(error) => Err(error), + } +} +#[inline] pub fn posix_killpg(pgrp: usize, sig: usize) -> Result<()> { match wrapper(false, || syscall::kill(usize::wrapping_neg(pgrp), sig)) { Ok(_) | Err(Error { errno: EINTR }) => Ok(()), diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs index ffde0d516..f3c58111a 100644 --- a/src/header/signal/mod.rs +++ b/src/header/signal/mod.rs @@ -67,6 +67,11 @@ pub struct siginfo { #[no_mangle] pub extern "C" fn _cbindgen_export_siginfo(a: siginfo) {} +pub union sigval { + pub si_int: c_int, + pub si_ptr: *mut c_void, +} + /// cbindgen:ignore pub type sigset_t = c_ulonglong; /// cbindgen:ignore @@ -78,6 +83,12 @@ pub type stack_t = sigaltstack; pub extern "C" fn kill(pid: pid_t, sig: c_int) -> c_int { Sys::kill(pid, sig) } +#[no_mangle] +pub extern "C" fn sigqueue(pid: pid_t, sig: c_int, val: sigval) -> c_int { + Sys::sigqueue(pid, sig, val) + .map(|()| 0) + .or_minus_one_errno() +} #[no_mangle] pub extern "C" fn killpg(pgrp: pid_t, sig: c_int) -> c_int { diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs index e661eef4b..b00525a83 100644 --- a/src/platform/pal/signal.rs +++ b/src/platform/pal/signal.rs @@ -2,7 +2,7 @@ use super::super::{types::*, Pal}; use crate::{ error::Errno, header::{ - signal::{sigaction, siginfo_t, sigset_t, stack_t}, + signal::{sigaction, siginfo_t, sigset_t, sigval, stack_t}, sys_time::itimerval, time::timespec, }, @@ -13,6 +13,8 @@ pub trait PalSignal: Pal { fn kill(pid: pid_t, sig: c_int) -> c_int; + fn sigqueue(pid: pid_t, sig: c_int, val: sigval) -> Result<(), Errno>; + fn killpg(pgrp: pid_t, sig: c_int) -> c_int; fn raise(sig: c_int) -> Result<(), Errno>; diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index f6dfc9747..1f71784f8 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -11,8 +11,8 @@ use crate::{ header::{ errno::{EINVAL, ENOSYS}, signal::{ - sigaction, siginfo_t, sigset_t, stack_t, SA_SIGINFO, SIG_BLOCK, SIG_DFL, SIG_IGN, - SIG_SETMASK, SIG_UNBLOCK, SS_DISABLE, SS_ONSTACK, + sigaction, siginfo_t, sigset_t, sigval, stack_t, SA_SIGINFO, SIG_BLOCK, SIG_DFL, + SIG_IGN, SIG_SETMASK, SIG_UNBLOCK, SS_DISABLE, SS_ONSTACK, }, sys_time::{itimerval, ITIMER_REAL}, time::timespec, @@ -55,6 +55,13 @@ impl PalSignal for Sys { fn kill(pid: pid_t, sig: c_int) -> c_int { e(redox_rt::sys::posix_kill(pid as usize, sig as usize).map(|()| 0)) as c_int } + fn sigqueue(pid: pid_t, sig: c_int, val: sigval) -> Result<(), Errno> { + Ok(redox_rt::sys::posix_sigqueue( + pid as usize, + sig as usize, + unsafe { val.si_ptr } as usize, + )?) + } fn killpg(pgrp: pid_t, sig: c_int) -> c_int { e(redox_rt::sys::posix_killpg(pgrp as usize, sig as usize).map(|()| 0)) as c_int -- GitLab