From f3a832ad12ff5d0e1277baaec43187d244690b68 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Mon, 17 Sep 2018 09:46:40 -0600
Subject: [PATCH] Fixes for select on Redox

---
 src/platform/redox/mod.rs | 45 ++++++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 20 deletions(-)

diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 0756cd8b..ef927dca 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)
         };
 
-- 
GitLab