summaryrefslogtreecommitdiff
path: root/libtrivfs/times.c
diff options
context:
space:
mode:
Diffstat (limited to 'libtrivfs/times.c')
-rw-r--r--libtrivfs/times.c64
1 files changed, 44 insertions, 20 deletions
diff --git a/libtrivfs/times.c b/libtrivfs/times.c
index 42e668d7..5e20bf10 100644
--- a/libtrivfs/times.c
+++ b/libtrivfs/times.c
@@ -21,36 +21,60 @@ error_t
trivfs_set_atime (struct trivfs_control *cntl)
{
error_t err;
- struct stat st;
- time_value_t atime;
- time_value_t mtime;
+#ifdef HAVE_FILE_UTIMENS
+ struct timespec atime;
+ struct timespec mtime;
- err = io_stat (cntl->underlying, &st);
- if (err)
- return err;
+ atime.tv_sec = 0;
+ atime.tv_nsec = UTIME_NOW;
+ mtime.tv_sec = 0;
+ mtime.tv_nsec = UTIME_OMIT;
- mtime.seconds = st.st_mtim.tv_sec;
- mtime.microseconds = st.st_mtim.tv_nsec / 1000;
- atime.microseconds = -1;
+ err = file_utimens (cntl->underlying, atime, mtime);
- return file_utimes (cntl->underlying, atime, mtime);
+ if (err == MIG_BAD_ID || err == EOPNOTSUPP)
+#endif
+ {
+ struct stat st;
+ time_value_t atim, mtim;
+
+ io_stat (cntl->underlying, &st);
+
+ TIMESPEC_TO_TIME_VALUE (&atim, &st.st_atim);
+ mtim.microseconds = -1;
+ err = file_utimes (cntl->underlying, atim, mtim);
+ }
+
+ return err;
}
error_t
trivfs_set_mtime (struct trivfs_control *cntl)
{
error_t err;
- struct stat st;
- time_value_t atime;
- time_value_t mtime;
+#ifdef HAVE_FILE_UTIMENS
+ struct timespec atime;
+ struct timespec mtime;
+
+ atime.tv_sec = 0;
+ atime.tv_nsec = UTIME_OMIT;
+ mtime.tv_sec = 0;
+ mtime.tv_nsec = UTIME_NOW;
+
+ err = file_utimens (cntl->underlying, atime, mtime);
+
+ if (err == MIG_BAD_ID || err == EOPNOTSUPP)
+#endif
+ {
+ struct stat st;
+ time_value_t atim, mtim;
- err = io_stat (cntl->underlying, &st);
- if (err)
- return err;
+ io_stat (cntl->underlying, &st);
- atime.seconds = st.st_atim.tv_sec;
- atime.microseconds = st.st_atim.tv_nsec / 1000;
- mtime.microseconds = -1;
+ atim.microseconds = -1;
+ TIMESPEC_TO_TIME_VALUE (&mtim, &st.st_mtim);
+ err = file_utimes (cntl->underlying, atim, mtim);
+ }
- return file_utimes (cntl->underlying, atime, mtime);
+ return err;
}