summaryrefslogtreecommitdiff
path: root/src/sys/stat.rs
diff options
context:
space:
mode:
authorJulio Merino <julio@meroh.net>2018-11-05 09:16:58 -0500
committerJulio Merino <jmmv@google.com>2018-11-07 15:19:53 -0500
commit12f10c76a5221d4977aca0646d615ae170d8722e (patch)
treed9e9918a827a99dbb3240d2c1d1e8042e8d3f298 /src/sys/stat.rs
parent50658fd3e5e0ad460c90c9f9b24933ef6be7412b (diff)
downloadnix-12f10c76a5221d4977aca0646d615ae170d8722e.zip
Add a wrapper for lutimes(2)
PR #944 added wrappers for the more-modern futimens(2) and utimesat(2), but unfortunately these APIs are not available on old-ish systems. In particular, macOS Sierra and below don't implement them, making the new APIs unusable. Whether we should care about such "old" systems is debatable, but the problem is that, at the moment, this is the only macOS version usable on Travis to test kexts and, thus, to test FUSE file systems. This should have been part of PR #946, which added a wrapper for utimes(2) following this same rationale, but missed lutimes(2) because I simply didn't notice it existed.
Diffstat (limited to 'src/sys/stat.rs')
-rw-r--r--src/sys/stat.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/sys/stat.rs b/src/sys/stat.rs
index a0b3aafc..925c0ede 100644
--- a/src/sys/stat.rs
+++ b/src/sys/stat.rs
@@ -199,6 +199,26 @@ pub fn utimes<P: ?Sized + NixPath>(path: &P, atime: &TimeVal, mtime: &TimeVal) -
Errno::result(res).map(|_| ())
}
+/// Change the access and modification times of a file without following symlinks.
+///
+/// `lutimes(path, times)` is identical to
+/// `utimensat(None, path, times, UtimensatFlags::NoFollowSymlink)`. The former
+/// is a deprecated API so prefer using the latter if the platforms you care
+/// about support it.
+///
+/// # References
+///
+/// [lutimes(2)](http://pubs.opengroup.org/onlinepubs/9699919799/functions/lutimes.html).
+#[cfg(not(target_os = "android"))]
+pub fn lutimes<P: ?Sized + NixPath>(path: &P, atime: &TimeVal, mtime: &TimeVal) -> Result<()> {
+ let times: [libc::timeval; 2] = [*atime.as_ref(), *mtime.as_ref()];
+ let res = path.with_nix_path(|cstr| unsafe {
+ libc::lutimes(cstr.as_ptr(), &times[0])
+ })?;
+
+ Errno::result(res).map(|_| ())
+}
+
/// Change the access and modification times of the file specified by a file descriptor.
///
/// # References