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:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
@@ -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<()>;
|
||||
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user