diff --git a/mount/redox/resource.rs b/mount/redox/resource.rs index da7d230fbba3262d115549327cc5bfd6ad9c4c67..cae82066a3df29046c8f81e1028dbe8aea45dcb2 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 ca0362e4ae74facf33c0e4f5fb81345b3e29cccb..b77da3d2a3bbac31e70083e119346278621caabf 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));