diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2013-11-05 15:48:27 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2013-11-10 01:37:11 -0800 |
| commit | f9abd998d6a5368c54162deb0bf187e94e31dc27 (patch) | |
| tree | 28e04136e84956a1156eab73b65bf1debd1a4c57 /src/libstd | |
| parent | 497d63f0bcc6436ae5a5f824946caca8f6d6fb53 (diff) | |
| download | rust-f9abd998d6a5368c54162deb0bf187e94e31dc27.tar.gz rust-f9abd998d6a5368c54162deb0bf187e94e31dc27.zip | |
Add bindings to uv's utime function
This exposes the ability to change the modification and access times on a file. Closes #10266
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/rt/io/fs.rs | 44 | ||||
| -rw-r--r-- | src/libstd/rt/io/mod.rs | 5 | ||||
| -rw-r--r-- | src/libstd/rt/rtio.rs | 2 |
3 files changed, 47 insertions, 4 deletions
diff --git a/src/libstd/rt/io/fs.rs b/src/libstd/rt/io/fs.rs index 22d7ea55f3b..f9e622b1f1e 100644 --- a/src/libstd/rt/io/fs.rs +++ b/src/libstd/rt/io/fs.rs @@ -587,6 +587,21 @@ pub fn rmdir_recursive(path: &Path) { rmdir(path); } +/// Changes the timestamps for a file's last modification and access time. +/// The file at the path specified will have its last access time set to +/// `atime` and its modification time set to `mtime`. +/// +/// # Errors +/// +/// This function will raise on the `io_error` condition if an error +/// happens. +// FIXME(#10301) these arguments should not be u64 +pub fn change_file_times(path: &Path, atime: u64, mtime: u64) { + do io_raise |io| { + io.fs_utime(&path.to_c_str(), atime, mtime) + }; +} + impl Reader for File { fn read(&mut self, buf: &mut [u8]) -> Option<uint> { match self.fd.read(buf) { @@ -704,8 +719,8 @@ mod test { use rt::io; use str; use super::{File, rmdir, mkdir, readdir, rmdir_recursive, mkdir_recursive, - copy, unlink, stat, symlink, link, readlink, chmod, chown, - lstat}; + copy, unlink, stat, symlink, link, readlink, chmod, + lstat, change_file_times}; fn tmpdir() -> Path { use os; @@ -1244,4 +1259,29 @@ mod test { rmdir_recursive(&tmpdir); } + + #[test] + fn utime() { + let tmpdir = tmpdir(); + let path = tmpdir.join("a"); + File::create(&path); + + change_file_times(&path, 100, 200); + assert_eq!(path.stat().accessed, 100); + assert_eq!(path.stat().modified, 200); + + rmdir_recursive(&tmpdir); + } + + #[test] + fn utime_noexist() { + let tmpdir = tmpdir(); + + match io::result(|| change_file_times(&tmpdir.join("a"), 100, 200)) { + Ok(*) => fail!(), + Err(*) => {} + } + + rmdir_recursive(&tmpdir); + } } diff --git a/src/libstd/rt/io/mod.rs b/src/libstd/rt/io/mod.rs index f01ce5012eb..e8ab4670233 100644 --- a/src/libstd/rt/io/mod.rs +++ b/src/libstd/rt/io/mod.rs @@ -1142,8 +1142,9 @@ pub struct FileStat { /// The file permissions currently on the file perm: FilePermission, - // XXX: These time fields are pretty useless without an actual time - // representation, what are the milliseconds relative to? + // FIXME(#10301): These time fields are pretty useless without an actual + // time representation, what are the milliseconds relative + // to? /// The time that the file was created at, in platform-dependent /// milliseconds diff --git a/src/libstd/rt/rtio.rs b/src/libstd/rt/rtio.rs index f8b87abb9f6..96ba5123456 100644 --- a/src/libstd/rt/rtio.rs +++ b/src/libstd/rt/rtio.rs @@ -125,6 +125,8 @@ pub trait IoFactory { fn fs_readlink(&mut self, path: &CString) -> Result<Path, IoError>; fn fs_symlink(&mut self, src: &CString, dst: &CString) -> Result<(), IoError>; fn fs_link(&mut self, src: &CString, dst: &CString) -> Result<(), IoError>; + fn fs_utime(&mut self, src: &CString, atime: u64, mtime: u64) -> + Result<(), IoError>; // misc fn timer_init(&mut self) -> Result<~RtioTimer, IoError>; |
