From 82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba Mon Sep 17 00:00:00 2001 From: Flávio Cruz Date: Mon, 5 Mar 2018 02:58:41 +0100 Subject: 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 . (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. --- libdiskfs/file-utimes.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) (limited to 'libdiskfs') diff --git a/libdiskfs/file-utimes.c b/libdiskfs/file-utimes.c index 29839fc9..13751d0b 100644 --- a/libdiskfs/file-utimes.c +++ b/libdiskfs/file-utimes.c @@ -23,6 +23,33 @@ kern_return_t diskfs_S_file_utimes (struct protid *cred, time_value_t atime, time_value_t mtime) +{ + struct timespec atim, mtim; + + if (atime.microseconds == -1) + { + atim.tv_sec = 0; + atim.tv_nsec = UTIME_NOW; + } + else + TIME_VALUE_TO_TIMESPEC (&atime, &atim); + + if (mtime.microseconds == -1) + { + mtim.tv_sec = 0; + mtim.tv_nsec = UTIME_NOW; + } + else + TIME_VALUE_TO_TIMESPEC (&mtime, &mtim); + + return diskfs_S_file_utimens (cred, atim, mtim); +} + +/* Implement file_utimens as described in . */ +kern_return_t +diskfs_S_file_utimens (struct protid *cred, + struct timespec atime, + struct timespec mtime) { CHANGE_NODE_FIELD (cred, ({ @@ -31,21 +58,23 @@ diskfs_S_file_utimes (struct protid *cred, /* Flush pending updates first. */ diskfs_set_node_times (np); - if (atime.microseconds == -1) + if (atime.tv_nsec == UTIME_NOW) np->dn_set_atime = 1; + else if (atime.tv_nsec == UTIME_OMIT) + ; /* do nothing */ else { - np->dn_stat.st_atim.tv_sec = atime.seconds; - np->dn_stat.st_atim.tv_nsec = atime.microseconds * 1000; + np->dn_stat.st_atim = atime; np->dn_set_atime = 0; } - if (mtime.microseconds == -1) + if (mtime.tv_nsec == UTIME_NOW) np->dn_set_mtime = 1; + else if (mtime.tv_nsec == UTIME_OMIT) + ; /* do nothing */ else { - np->dn_stat.st_mtim.tv_sec = mtime.seconds; - np->dn_stat.st_mtim.tv_nsec = mtime.microseconds * 1000; + np->dn_stat.st_mtim = mtime; np->dn_set_mtime = 0; } -- cgit v1.2.3