From dc5bd70728be9afe4d8d0781ba32c2d954a5116b Mon Sep 17 00:00:00 2001
From: Ian Douglas Scott <ian@iandouglasscott.com>
Date: Mon, 14 Aug 2017 16:35:03 -0700
Subject: [PATCH] futimens: do not require O_RWONLY/O_RDWR

---
 mount/redox/resource.rs | 10 +++++++---
 mount/redox/scheme.rs   |  4 ++--
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/mount/redox/resource.rs b/mount/redox/resource.rs
index da7d230..cae8206 100644
--- a/mount/redox/resource.rs
+++ b/mount/redox/resource.rs
@@ -131,15 +131,17 @@ pub struct FileResource {
     block: u64,
     flags: usize,
     seek: u64,
+    uid: u32,
 }
 
 impl FileResource {
-    pub fn new(path: String, block: u64, flags: usize, seek: u64) -> FileResource {
+    pub fn new(path: String, block: u64, flags: usize, seek: u64, uid: u32) -> FileResource {
         FileResource {
             path: path,
             block: block,
             flags: flags,
             seek: seek,
+            uid: uid,
         }
     }
 }
@@ -151,6 +153,7 @@ impl Resource for FileResource {
             block: self.block,
             flags: self.flags,
             seek: self.seek,
+            uid: self.uid,
         }))
     }
 
@@ -246,9 +249,10 @@ impl Resource for FileResource {
     }
 
     fn utimens(&mut self, times: &[TimeSpec], fs: &mut FileSystem) -> Result<usize> {
-        if self.flags & O_ACCMODE == O_RDWR || self.flags & O_ACCMODE == O_WRONLY {
+        let mut node = fs.node(self.block)?;
+
+        if node.1.uid == self.uid || self.uid == 0 {
             if let Some(mtime) = times.get(1) {
-                let mut node = fs.node(self.block)?;
 
                 node.1.mtime = mtime.tv_sec as u64;
                 node.1.mtime_nsec = mtime.tv_nsec as u32;
diff --git a/mount/redox/scheme.rs b/mount/redox/scheme.rs
index ca0362e..b77da3d 100644
--- a/mount/redox/scheme.rs
+++ b/mount/redox/scheme.rs
@@ -253,7 +253,7 @@ impl Scheme for FileScheme {
                     0
                 };
 
-                Box::new(FileResource::new(path.to_string(), node.0, flags, seek))
+                Box::new(FileResource::new(path.to_string(), node.0, flags, seek, uid))
             },
             None => if flags & O_CREAT == O_CREAT {
                 let mut last_part = String::new();
@@ -293,7 +293,7 @@ impl Scheme for FileScheme {
                                 0
                             };
 
-                            Box::new(FileResource::new(path.to_string(), node.0, flags, seek))
+                            Box::new(FileResource::new(path.to_string(), node.0, flags, seek, uid))
                         }
                     } else {
                         return Err(Error::new(EPERM));
-- 
GitLab