diff options
author | Flávio Cruz <flaviocruz@gmail.com> | 2018-03-05 02:58:41 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2018-03-05 02:58:41 +0100 |
commit | 82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba (patch) | |
tree | 2170bfb251afe6f2173c4424efa18e0b3fc0b46f /libnetfs/file-utimes.c | |
parent | 2ed669b5b1da77e80fff6dc2f72f11e266479a8c (diff) | |
download | hurd-82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba.tar.gz hurd-82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba.tar.bz2 hurd-82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba.zip |
Add file_utimens RPC to use a struct timespec
and update the servers to use UTIME_NOW and UTIME_OMIT.
* console-client/trans.c (netfs_attempt_utimes): Do not set current time
ourself.
* console/console.c (netfs_attempt_utimes): Likewise.
* ftpfs/netfs.c (netfs_attempt_utimes): Likewise.
* hostmux/node.c (netfs_attempt_utimes): Likewise.
* usermux/node.c (netfs_attempt_utimes): Likewise.
* nfs/ops.c (netfs_attempt_utimes): Likewise.
* doc/hurd.texi (file_utimens): Add documentation.
* hurd/fs.defs (file_utimens): Add RPC.
* libdiskfs/file-utimes.c (diskfs_S_file_utimes): Move implementation
and replace with translation layer with...
(diskfs_S_file_utimens): ... new function.
* libnetfs/file-utimes.c (netfs_S_file_utimes): Likewise with...
(netfs_S_file_utimens): ... new function.
* libnetfs/init-init.c: Include <error.h>.
(netfs_mtime): New variable.
(netfs_init): New function.
* libnetfs/netfs.h (netfs_attempt_utimes): Update documentation.
* libnetfs/priv.h (netfs_mtime): Declare variable.
* libtreefs/s-file.c (treefs_S_file_utimes): Convert time values and
call treefs_s_file_utimens instead of treefs_s_file_utimes.
* libtreefs/treefs-hooks.h: Replace TREEFS_HOOK_S_FILE_UTIMES with
TREEFS_HOOK_S_FILE_UTIMENS.
* libtreefs/treefs-s-hooks.h: Replace s_file_utimes with s_file_utimens.
* libtrivfs/file-utimes.c (trivfs_S_file_utimens): New function.
* libtrivfs/times.c (trivfs_set_atime): Try to use file_utimens before
using file_utimes.
(trivfs_set_mtime): Likewise.
* nfsd/ops.c (complete_setattr): Likewise.
* trans/fakeroot.c (netfs_attempt_utimes): Likewise.
* nfs/nfs.c (xdr_encode_sattr_times): Do not set atime or mtime when
they are NULL.
* configure.ac: Look for file_futimens, and define UTIME_NOW/OMIT, for
compatibility with old glibcs.
Diffstat (limited to 'libnetfs/file-utimes.c')
-rw-r--r-- | libnetfs/file-utimes.c | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/libnetfs/file-utimes.c b/libnetfs/file-utimes.c index 19156094..042c43e8 100644 --- a/libnetfs/file-utimes.c +++ b/libnetfs/file-utimes.c @@ -26,28 +26,52 @@ netfs_S_file_utimes (struct protid *user, time_value_t atimein, time_value_t mtimein) { - struct timespec atime, mtime; - error_t err; + struct timespec atim, mtim; - if (atimein.microseconds != -1) + if (atimein.microseconds == -1) { - atime.tv_sec = atimein.seconds; - atime.tv_nsec = atimein.microseconds * 1000; + atim.tv_sec = 0; + atim.tv_nsec = UTIME_NOW; } - - if (mtimein.microseconds != -1) + else + TIME_VALUE_TO_TIMESPEC (&atimein, &atim); + + if (mtimein.microseconds == -1) { - mtime.tv_sec = mtimein.seconds; - mtime.tv_nsec = mtimein.microseconds * 1000; + mtim.tv_sec = 0; + mtim.tv_nsec = UTIME_NOW; } - + else + TIME_VALUE_TO_TIMESPEC (&mtimein, &mtim); + + return netfs_S_file_utimens (user, atim, mtim); +} + +error_t +netfs_S_file_utimens (struct protid *user, + struct timespec atimein, + struct timespec mtimein) +{ + error_t err; + struct timeval t; + if (!user) return EOPNOTSUPP; - + + if (atimein.tv_nsec == UTIME_NOW || mtimein.tv_nsec == UTIME_NOW) + { + maptime_read (netfs_mtime, &t); + + if (atimein.tv_nsec == UTIME_NOW) + TIMEVAL_TO_TIMESPEC (&t, &atimein); + if (mtimein.tv_nsec == UTIME_NOW) + TIMEVAL_TO_TIMESPEC (&t, &mtimein); + } + pthread_mutex_lock (&user->po->np->lock); - err = netfs_attempt_utimes (user->user, user->po->np, - atimein.microseconds != -1 ? &atime : 0, - mtimein.microseconds != -1 ? &mtime : 0); + err = netfs_attempt_utimes (user->user, user->po->np, + (atimein.tv_nsec == UTIME_OMIT) ? 0 : &atimein, + (mtimein.tv_nsec == UTIME_OMIT) ? 0 : &mtimein); pthread_mutex_unlock (&user->po->np->lock); return err; } |