Skip to content
Snippets Groups Projects
Commit 63ea94c4 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Merge branch 'sigwait_impl' into 'master'

signal adding sig(timed)wait implementations

See merge request redox-os/relibc!392
parents 69fbd110 a5cfc5d2
No related branches found
No related tags found
1 merge request!392signal adding sig(timed)wait implementations
Pipeline #12145 failed
sys_includes = ["stdint.h", "sys/types.h"]
sys_includes = ["stdint.h", "sys/types.h", "time.h"]
include_guard = "_RELIBC_SIGNAL_H"
trailer = "#include <bits/signal.h>"
language = "C"
......@@ -12,3 +12,6 @@ cpp_compat = true
[enum]
prefix_with_name = true
[export.rename]
"timespec" = "struct timespec"
......@@ -5,8 +5,11 @@ use core::{mem, ptr};
use cbitset::BitSet;
use crate::{
header::errno,
platform::{self, types::*, PalSignal, Sys},
header::{
errno,
time::timespec,
},
platform::{self, types::*, Pal, PalSignal, Sys},
};
pub use self::sys::*;
......@@ -47,6 +50,16 @@ pub struct sigaltstack {
pub ss_size: size_t,
}
#[repr(C)]
#[derive(Clone, Debug)]
pub struct siginfo_t {
pub si_signo: c_int,
pub si_errno: c_int,
pub si_code: c_int,
_padding: [c_int; 29],
_si_align: [usize; 0],
}
pub type sigset_t = c_ulong;
pub type stack_t = sigaltstack;
......@@ -308,9 +321,22 @@ pub extern "C" fn sigsuspend(sigmask: *const sigset_t) -> c_int {
Sys::sigsuspend(sigmask)
}
// #[no_mangle]
#[no_mangle]
pub extern "C" fn sigwait(set: *const sigset_t, sig: *mut c_int) -> c_int {
unimplemented!();
let mut pinfo = mem::MaybeUninit::<siginfo_t>::uninit();
if sigtimedwait(set, pinfo.as_mut_ptr(), ptr::null_mut()) < 0 {
return -1;
}
unsafe {
let mut info = pinfo.assume_init();
(*sig) = info.si_signo;
}
0
}
#[no_mangle]
pub extern "C" fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int {
Sys::sigtimedwait(set, sig, tp)
}
pub const _signal_strings: [&str; 32] = [
......
......@@ -5,8 +5,9 @@ use super::{
e, Sys,
};
use crate::header::{
signal::{NSIG, sigaction, sigset_t, stack_t},
signal::{NSIG, sigaction, siginfo_t, sigset_t, stack_t},
sys_time::itimerval,
time::timespec,
};
impl PalSignal for Sys {
......@@ -62,4 +63,8 @@ impl PalSignal for Sys {
fn sigsuspend(set: *const sigset_t) -> c_int {
e(unsafe { syscall!(RT_SIGSUSPEND, set, NSIG/8) }) as c_int
}
fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int {
e(unsafe { syscall!(RT_SIGTIMEDWAIT, set, sig, tp, NSIG/8) }) as c_int
}
}
use super::super::{types::*, Pal};
use crate::header::{
signal::{sigaction, sigset_t, stack_t},
signal::{sigaction, siginfo_t, sigset_t, stack_t},
sys_time::itimerval,
time::timespec,
};
pub trait PalSignal: Pal {
......@@ -24,4 +25,6 @@ pub trait PalSignal: Pal {
fn sigprocmask(how: c_int, set: *const sigset_t, oset: *mut sigset_t) -> c_int;
fn sigsuspend(set: *const sigset_t) -> c_int;
fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int;
}
......@@ -8,8 +8,9 @@ use super::{
use crate::{
header::{
errno::{EINVAL, ENOSYS},
signal::{sigaction, sigset_t, stack_t},
signal::{sigaction, siginfo_t, sigset_t, stack_t},
sys_time::{itimerval, ITIMER_REAL},
time::timespec,
},
platform::errno,
};
......@@ -166,4 +167,11 @@ impl PalSignal for Sys {
}
-1
}
fn sigtimedwait(set: *const sigset_t, sig: *mut siginfo_t, tp: *const timespec) -> c_int {
unsafe {
errno = ENOSYS;
}
-1
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment