From 2db85f9a3f3c4de90ef74756814b2228e4d2785f Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen@gmail.com>
Date: Mon, 8 May 2023 18:52:05 +0100
Subject: [PATCH] clock_getres/clock_settime additions

---
 src/header/time/mod.rs    | 10 +++++-----
 src/platform/linux/mod.rs |  8 ++++++++
 src/platform/pal/mod.rs   |  4 ++++
 src/platform/redox/mod.rs | 12 ++++++++++++
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs
index cebe2ac51..f83991230 100644
--- a/src/header/time/mod.rs
+++ b/src/header/time/mod.rs
@@ -198,9 +198,9 @@ pub extern "C" fn clock() -> clock_t {
     }
 }
 
-// #[no_mangle]
-pub extern "C" fn clock_getres(clock_id: clockid_t, res: *mut timespec) -> c_int {
-    unimplemented!();
+#[no_mangle]
+pub extern "C" fn clock_getres(clock_id: clockid_t, tp: *mut timespec) -> c_int {
+    Sys::clock_getres(clock_id, tp)
 }
 
 #[no_mangle]
@@ -208,9 +208,9 @@ pub extern "C" fn clock_gettime(clock_id: clockid_t, tp: *mut timespec) -> c_int
     Sys::clock_gettime(clock_id, tp)
 }
 
-// #[no_mangle]
+#[no_mangle]
 pub extern "C" fn clock_settime(clock_id: clockid_t, tp: *const timespec) -> c_int {
-    unimplemented!();
+    Sys::clock_settime(clock_id, tp)
 }
 
 #[no_mangle]
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 722f23836..0cb325a86 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -106,10 +106,18 @@ impl Pal for Sys {
         }) as c_int
     }
 
+    fn clock_getres(clk_id: clockid_t, tp: *mut timespec) -> c_int {
+        e(unsafe { syscall!(CLOCK_GETRES, clk_id, tp) }) as c_int
+    }
+
     fn clock_gettime(clk_id: clockid_t, tp: *mut timespec) -> c_int {
         e(unsafe { syscall!(CLOCK_GETTIME, clk_id, tp) }) as c_int
     }
 
+    fn clock_settime(clk_id: clockid_t, tp: *const timespec) -> c_int {
+        e(unsafe { syscall!(CLOCK_SETTIME, clk_id, tp) }) as c_int
+    }
+
     fn close(fildes: c_int) -> c_int {
         e(unsafe { syscall!(CLOSE, fildes) }) as c_int
     }
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index c6bdc770a..02726debd 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -35,8 +35,12 @@ pub trait Pal {
 
     fn chown(path: &CStr, owner: uid_t, group: gid_t) -> c_int;
 
+    fn clock_getres(clk_id: clockid_t, tp: *mut timespec) -> c_int;
+
     fn clock_gettime(clk_id: clockid_t, tp: *mut timespec) -> c_int;
 
+    fn clock_settime(clk_id: clockid_t, tp: *const timespec) -> c_int;
+
     fn close(fildes: c_int) -> c_int;
 
     fn dup(fildes: c_int) -> c_int;
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index decf4fd35..4b4f0f0e7 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -184,6 +184,12 @@ impl Pal for Sys {
         }
     }
 
+    fn clock_getres(clk_id: clockid_t, tp: *mut timespec) -> c_int {
+        // TODO
+        unsafe { errno = ENOSYS };
+        -1
+    }
+
     fn clock_gettime(clk_id: clockid_t, tp: *mut timespec) -> c_int {
         let mut redox_tp = unsafe { redox_timespec::from(&*tp) };
         match e(syscall::clock_gettime(clk_id as usize, &mut redox_tp)) as c_int {
@@ -198,6 +204,12 @@ impl Pal for Sys {
         }
     }
 
+    fn clock_settime(clk_id: clockid_t, tp: *const timespec) -> c_int {
+        // TODO
+        unsafe { errno = ENOSYS };
+        -1
+    }
+
     fn close(fd: c_int) -> c_int {
         e(syscall::close(fd as usize)) as c_int
     }
-- 
GitLab