From 8d66d9ce54490cf92b69aef12e2409dec448bf40 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 9 Jul 2017 15:54:03 -0600 Subject: [PATCH] Add futimens --- mount/redox/resource.rs | 26 ++++++++++++++++++++++++++ mount/redox/scheme.rs | 12 +++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/mount/redox/resource.rs b/mount/redox/resource.rs index 35ce4d71da..b1d4ccf1f0 100644 --- a/mount/redox/resource.rs +++ b/mount/redox/resource.rs @@ -1,8 +1,10 @@ use redoxfs::FileSystem; use std::cmp::{min, max}; +use std::mem; use std::time::{SystemTime, UNIX_EPOCH}; +use syscall::data::TimeSpec; use syscall::error::{Error, Result, EBADF, EINVAL}; use syscall::flag::{O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, F_GETFL, F_SETFL}; use syscall::{Stat, SEEK_SET, SEEK_CUR, SEEK_END}; @@ -17,6 +19,7 @@ pub trait Resource { fn stat(&self, _stat: &mut Stat, fs: &mut FileSystem) -> Result; fn sync(&mut self) -> Result; fn truncate(&mut self, len: usize, fs: &mut FileSystem) -> Result; + fn utimens(&mut self, times: &[TimeSpec], fs: &mut FileSystem) -> Result; } pub struct DirResource { @@ -116,6 +119,10 @@ impl Resource for DirResource { fn truncate(&mut self, _len: usize, _fs: &mut FileSystem) -> Result { Err(Error::new(EBADF)) } + + fn utimens(&mut self, _times: &[TimeSpec], _fs: &mut FileSystem) -> Result { + Err(Error::new(EBADF)) + } } pub struct FileResource { @@ -236,4 +243,23 @@ impl Resource for FileResource { Err(Error::new(EBADF)) } } + + fn utimens(&mut self, times: &[TimeSpec], fs: &mut FileSystem) -> Result { + if self.flags & O_ACCMODE == O_RDWR || self.flags & O_ACCMODE == O_WRONLY { + if let Some(mtime) = times.get(0) { + let mut node = fs.node(self.block)?; + + node.1.mtime = mtime.tv_sec as u64; + node.1.mtime_nsec = mtime.tv_nsec as u32; + + fs.write_at(node.0, &node.1)?; + + Ok(mem::size_of::()) + } else { + Ok(0) + } + } else { + Err(Error::new(EBADF)) + } + } } diff --git a/mount/redox/scheme.rs b/mount/redox/scheme.rs index eb144c5a6e..314d9934b2 100644 --- a/mount/redox/scheme.rs +++ b/mount/redox/scheme.rs @@ -8,7 +8,7 @@ use std::str; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::{SystemTime, UNIX_EPOCH}; -use syscall::data::{Stat, StatVfs}; +use syscall::data::{Stat, StatVfs, TimeSpec}; use syscall::error::{Error, Result, EACCES, EEXIST, EISDIR, ENOTDIR, EPERM, ENOENT, EBADF, ELOOP, EINVAL}; use syscall::flag::{O_APPEND, O_CREAT, O_DIRECTORY, O_STAT, O_EXCL, O_TRUNC, O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, MODE_PERM, O_SYMLINK, O_NOFOLLOW}; use syscall::scheme::Scheme; @@ -539,6 +539,16 @@ impl Scheme for FileScheme { } } + fn futimens(&self, id: usize, times: &[TimeSpec]) -> Result { + // println!("Futimens {}, {}", id, times.len()); + let mut files = self.files.lock(); + if let Some(mut file) = files.get_mut(&id) { + file.utimens(times, &mut self.fs.borrow_mut()) + } else { + Err(Error::new(EBADF)) + } + } + fn close(&self, id: usize) -> Result { // println!("Close {}", id); let mut files = self.files.lock();