diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 0756cd8b387bb6d6a57ed6220c49d25b87274ac5..ef927dcad368c36b2478205c8d01b170ea3b97a1 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -675,29 +675,18 @@ impl Pal for Sys { let timeout_file = if timeout.is_null() { None } else { - let timeout_file = match RawFile::open( - &unsafe { - CString::from_vec_unchecked( - format!("time:{}", syscall::CLOCK_MONOTONIC).into_bytes(), - ) - }, - 0, - 0, - ) { + let timeout = unsafe { &*timeout }; + + let timeout_path = unsafe { + CString::from_vec_unchecked( + format!("time:{}\0", syscall::CLOCK_MONOTONIC).into_bytes(), + ) + }; + let timeout_file = match RawFile::open(&timeout_path, 0, 0) { Ok(file) => file, Err(_) => return -1, }; - let timeout = unsafe { &*timeout }; - if Self::write( - *timeout_file, - &syscall::TimeSpec { - tv_sec: timeout.tv_sec, - tv_nsec: timeout.tv_usec * 1000, - }, - ) < 0 - { - return -1; - } + if Self::write( *event_file, &syscall::Event { @@ -710,6 +699,22 @@ impl Pal for Sys { return -1; } + let mut time = syscall::TimeSpec::default(); + if Self::read(*timeout_file, &mut time) < 0 { + return -1; + } + + time.tv_sec += timeout.tv_sec; + time.tv_nsec += timeout.tv_usec * 1000; + while time.tv_nsec >= 1000000000 { + time.tv_sec += 1; + time.tv_nsec -= 1000000000; + } + + if Self::write(*timeout_file, &time) < 0 { + return -1; + } + Some(timeout_file) };