diff --git a/src/header/sys_time/mod.rs b/src/header/sys_time/mod.rs index 93b70b107d..9fdfff8dfc 100644 --- a/src/header/sys_time/mod.rs +++ b/src/header/sys_time/mod.rs @@ -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() } diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs index 139af7eff5..ec92d07dfa 100644 --- a/src/platform/linux/signal.rs +++ b/src/platform/linux/signal.rs @@ -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(()) } diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs index 695dcb65d9..73bc50ac57 100644 --- a/src/platform/pal/signal.rs +++ b/src/platform/pal/signal.rs @@ -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<()>; diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index 4c8500ee36..e4a16c9443 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -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(()) }