From 2ac349d2d2d2594781a1550f8b9f3bf33ed7a4e7 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Sun, 1 Dec 2019 10:58:47 -0700
Subject: [PATCH] Add msync function and stub for Redox

---
 src/header/sys_mman/mod.rs | 12 ++++++++----
 src/platform/linux/mod.rs  |  4 ++++
 src/platform/pal/mod.rs    |  2 ++
 src/platform/redox/mod.rs  | 12 ++++++++++++
 4 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/src/header/sys_mman/mod.rs b/src/header/sys_mman/mod.rs
index 2a055e7c..27b36e5b 100644
--- a/src/header/sys_mman/mod.rs
+++ b/src/header/sys_mman/mod.rs
@@ -21,6 +21,10 @@ pub const MAP_FIXED: c_int = 0x0010;
 pub const MAP_ANON: c_int = 0x0020;
 pub const MAP_ANONYMOUS: c_int = MAP_ANON;
 
+pub const MS_ASYNC: c_int = 0x0001;
+pub const MS_INVALIDATE: c_int = 0x0002;
+pub const MS_SYNC: c_int = 0x0004;
+
 // #[no_mangle]
 pub extern "C" fn mlock(addr: *const c_void, len: usize) -> c_int {
     unimplemented!();
@@ -44,13 +48,13 @@ pub unsafe extern "C" fn mmap(
 }
 
 #[no_mangle]
-pub unsafe extern "C" fn mprotect(addr: *mut c_void, len: usize, prot: c_int) -> c_int {
+pub unsafe extern "C" fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int {
     Sys::mprotect(addr, len, prot)
 }
 
-// #[no_mangle]
-pub extern "C" fn msync(addr: *mut c_void, len: usize, flags: c_int) -> c_int {
-    unimplemented!();
+#[no_mangle]
+pub unsafe extern "C" fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int {
+    Sys::msync(addr, len, flags)
 }
 
 // #[no_mangle]
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index d4a28bdd..fe149a2b 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -310,6 +310,10 @@ impl Pal for Sys {
         e(syscall!(MPROTECT, addr, len, prot)) as c_int
     }
 
+    unsafe fn msync(addr: *mut c_void, len: usize, flags: c_int) -> c_int {
+        e(syscall!(MSYNC, addr, len, flags)) as c_int
+    }
+
     unsafe fn munmap(addr: *mut c_void, len: usize) -> c_int {
         e(syscall!(MUNMAP, addr, len)) as c_int
     }
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index 9a484c13..9900e378 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -118,6 +118,8 @@ pub trait Pal {
 
     unsafe fn mprotect(addr: *mut c_void, len: usize, prot: c_int) -> c_int;
 
+    unsafe fn msync(addr: *mut c_void, len: usize, flags: c_int) -> c_int;
+
     unsafe fn munmap(addr: *mut c_void, len: usize) -> c_int;
 
     fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int;
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 697482aa..00af8a08 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -675,6 +675,18 @@ impl Pal for Sys {
         )) as c_int
     }
 
+    unsafe fn msync(addr: *mut c_void, len: usize, flags: c_int) -> c_int {
+        eprintln!("msync {:p} {:x} {:x}", addr, len, flags);
+        e(Err(syscall::Error::new(syscall::ENOSYS))) as c_int
+        /* TODO
+        e(syscall::msync(
+            addr as usize,
+            len,
+            flags
+        )) as c_int
+        */
+    }
+
     unsafe fn munmap(addr: *mut c_void, _len: usize) -> c_int {
         if e(syscall::funmap(addr as usize)) == !0 {
             return !0;
-- 
GitLab