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