Merge branch 'itimer_stub' into 'master'

Make redox itimer relibc stub rather than kernel stub.

See merge request redox-os/relibc!647
This commit is contained in:
Jeremy Soller
2025-04-13 20:14:41 +00:00
4 changed files with 41 additions and 27 deletions
+2 -2
View File
@@ -81,7 +81,7 @@ pub struct timezone {
#[deprecated]
#[no_mangle]
pub unsafe extern "C" fn getitimer(which: c_int, value: *mut itimerval) -> c_int {
Sys::getitimer(which, value)
Sys::getitimer(which, &mut *value)
.map(|()| 0)
.or_minus_one_errno()
}
@@ -114,7 +114,7 @@ pub unsafe extern "C" fn setitimer(
value: *const itimerval,
ovalue: *mut itimerval,
) -> c_int {
Sys::setitimer(which, value, ovalue)
Sys::setitimer(which, &*value, ovalue.as_mut())
.map(|()| 0)
.or_minus_one_errno()
}
+13 -4
View File
@@ -15,8 +15,10 @@ use crate::{
};
impl PalSignal for Sys {
unsafe fn getitimer(which: c_int, out: *mut itimerval) -> Result<()> {
e_raw(syscall!(GETITIMER, which, out))?;
fn getitimer(which: c_int, out: &mut itimerval) -> Result<()> {
unsafe {
e_raw(syscall!(GETITIMER, which, out as *mut _))?;
}
Ok(())
}
@@ -49,8 +51,15 @@ impl PalSignal for Sys {
Ok(())
}
unsafe fn setitimer(which: c_int, new: *const itimerval, old: *mut itimerval) -> Result<()> {
e_raw(unsafe { syscall!(SETITIMER, which, new, old) })?;
fn setitimer(which: c_int, new: &itimerval, old: Option<&mut itimerval>) -> Result<()> {
e_raw(unsafe {
syscall!(
SETITIMER,
which,
new as *const _,
old.map_or_else(core::ptr::null_mut, |r| r as *mut _)
)
})?;
Ok(())
}
+2 -2
View File
@@ -9,7 +9,7 @@ use crate::{
};
pub trait PalSignal: Pal {
unsafe fn getitimer(which: c_int, out: *mut itimerval) -> Result<()>;
fn getitimer(which: c_int, out: &mut itimerval) -> Result<()>;
fn kill(pid: pid_t, sig: c_int) -> Result<()>;
@@ -19,7 +19,7 @@ pub trait PalSignal: Pal {
fn raise(sig: c_int) -> Result<()>;
unsafe fn setitimer(which: c_int, new: *const itimerval, old: *mut itimerval) -> Result<()>;
fn setitimer(which: c_int, new: &itimerval, old: Option<&mut itimerval>) -> Result<()>;
fn sigaction(sig: c_int, act: Option<&sigaction>, oact: Option<&mut sigaction>) -> Result<()>;
+24 -19
View File
@@ -46,21 +46,20 @@ const _: () = {
};
impl PalSignal for Sys {
unsafe fn getitimer(which: c_int, out: *mut itimerval) -> Result<()> {
fn getitimer(which: c_int, out: &mut itimerval) -> Result<()> {
let path = match which {
ITIMER_REAL => "/scheme/itimer/1",
_ => return Err(Errno(EINVAL)),
};
let fd = FdGuard::new(syscall::open(path, syscall::O_RDONLY | syscall::O_CLOEXEC)?);
// TODO: implement setitimer
// let fd = FdGuard::new(syscall::open(path, syscall::O_RDONLY | syscall::O_CLOEXEC)?);
// let count = syscall::read(*fd, &mut spec)?;
let mut spec = syscall::ITimerSpec::default();
let count = syscall::read(*fd, &mut spec)?;
(*out).it_interval.tv_sec = spec.it_interval.tv_sec as time_t;
(*out).it_interval.tv_usec = spec.it_interval.tv_nsec / 1000;
(*out).it_value.tv_sec = spec.it_value.tv_sec as time_t;
(*out).it_value.tv_usec = spec.it_value.tv_nsec / 1000;
out.it_interval.tv_sec = spec.it_interval.tv_sec as time_t;
out.it_interval.tv_usec = spec.it_interval.tv_nsec / 1000;
out.it_value.tv_sec = spec.it_value.tv_sec as time_t;
out.it_value.tv_usec = spec.it_value.tv_nsec / 1000;
Ok(())
}
@@ -87,25 +86,30 @@ impl PalSignal for Sys {
unsafe { Self::rlct_kill(Self::current_os_tid(), sig as _) }
}
unsafe fn setitimer(which: c_int, new: *const itimerval, old: *mut itimerval) -> Result<()> {
let path = match which {
fn setitimer(which: c_int, _new: &itimerval, old: Option<&mut itimerval>) -> Result<()> {
let _path = match which {
ITIMER_REAL => "/scheme/itimer/1",
_ => return Err(Errno(EINVAL)),
};
let fd = FdGuard::new(syscall::open(path, syscall::O_RDWR | syscall::O_CLOEXEC)?);
// TODO
eprintln!("relibc: todo: implement setitimer");
let mut spec = syscall::ITimerSpec::default();
if let Some(old) = old {
old.it_interval.tv_sec = spec.it_interval.tv_sec as time_t;
old.it_interval.tv_usec = spec.it_interval.tv_nsec / 1000;
old.it_value.tv_sec = spec.it_value.tv_sec as time_t;
old.it_value.tv_usec = spec.it_value.tv_nsec / 1000;
}
/*
let fd = FdGuard::new(syscall::open(path, syscall::O_RDWR | syscall::O_CLOEXEC)?);
let _ = syscall::read(*fd, &mut spec)?;
unsafe {
if !old.is_null() {
(*old).it_interval.tv_sec = spec.it_interval.tv_sec as time_t;
(*old).it_interval.tv_usec = spec.it_interval.tv_nsec / 1000;
(*old).it_value.tv_sec = spec.it_value.tv_sec as time_t;
(*old).it_value.tv_usec = spec.it_value.tv_nsec / 1000;
}
spec.it_interval.tv_sec = (*new).it_interval.tv_sec as i64;
spec.it_interval.tv_nsec = (*new).it_interval.tv_usec * 1000;
@@ -114,6 +118,7 @@ impl PalSignal for Sys {
}
let _ = syscall::write(*fd, &spec)?;
*/
Ok(())
}