From 7e19ce23bdb669c6111295e4ea0ec2dc79a09290 Mon Sep 17 00:00:00 2001
From: Paul Sajna <paulsajna@gmail.com>
Date: Fri, 9 Mar 2018 03:26:45 -0800
Subject: [PATCH] nanosleep

---
 src/platform/src/linux/mod.rs |  4 ++++
 src/platform/src/redox/mod.rs | 10 ++++++++++
 src/platform/src/types.rs     |  6 ++++++
 src/time/src/lib.rs           | 14 ++++++++------
 4 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs
index aa7eef7c..bd573355 100644
--- a/src/platform/src/linux/mod.rs
+++ b/src/platform/src/linux/mod.rs
@@ -123,6 +123,10 @@ pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int {
     e(unsafe { syscall!(MKDIRAT, AT_FDCWD, path, mode) }) as c_int
 }
 
+pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int {
+    e(unsafe { syscall!(NANOSLEEP, rqtp, rmtp) }) as c_int
+}
+
 pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
     e(unsafe { syscall!(OPENAT, AT_FDCWD, path, oflag, mode) }) as c_int
 }
diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs
index 264042d7..faa3bc1f 100644
--- a/src/platform/src/redox/mod.rs
+++ b/src/platform/src/redox/mod.rs
@@ -1,7 +1,9 @@
 use core::ptr;
 use core::slice;
+use core::mem;
 use syscall;
 use syscall::flag::*;
+use syscall::data::TimeSpec as redox_timespec;
 
 use c_str;
 use errno;
@@ -135,6 +137,14 @@ pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int {
     }
 }
 
+pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int {
+    unsafe {
+        let rqtp = mem::transmute::<*const timespec, &redox_timespec>(rqtp);
+        let rmtp = mem::transmute::<*mut timespec, &mut redox_timespec>(rmtp);
+        e(syscall::nanosleep(rqtp, rmtp)) as c_int
+    }
+}
+
 pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int {
     let path = unsafe { c_str(path) };
     e(syscall::open(path, (oflag as usize) | (mode as usize))) as c_int
diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs
index e8644553..45ae6449 100644
--- a/src/platform/src/types.rs
+++ b/src/platform/src/types.rs
@@ -63,3 +63,9 @@ pub type suseconds_t = i64;
 pub type clock_t = i64;
 pub type clockid_t = i32;
 pub type timer_t = c_void;
+
+#[repr(C)]
+pub struct timespec {
+    pub tv_sec: time_t,
+    pub tv_nsec: c_long,
+}
diff --git a/src/time/src/lib.rs b/src/time/src/lib.rs
index b7817a2b..5b90e86f 100644
--- a/src/time/src/lib.rs
+++ b/src/time/src/lib.rs
@@ -6,11 +6,13 @@ extern crate platform;
 
 use platform::types::*;
 
-#[repr(C)]
-pub struct timespec {
-    pub tv_sec: time_t,
-    pub tv_nsec: c_long,
-}
+/*
+ *#[repr(C)]
+ *pub struct timespec {
+ *    pub tv_sec: time_t,
+ *    pub tv_nsec: c_long,
+ *}
+ */
 
 #[repr(C)]
 pub struct tm {
@@ -112,7 +114,7 @@ pub extern "C" fn mktime(timeptr: *mut tm) -> time_t {
 
 #[no_mangle]
 pub extern "C" fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int {
-    unimplemented!();
+    platform::nanosleep(rqtp, rmtp)
 }
 
 #[no_mangle]
-- 
GitLab