diff options
Diffstat (limited to 'libtrivfs/times.c')
-rw-r--r-- | libtrivfs/times.c | 64 |
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; } |