From 82ab5bbac5d115b7cae4f3ca28f3ba8cce9431ba Mon Sep 17 00:00:00 2001
From: Flávio Cruz <flaviocruz@gmail.com>
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 <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.
---
 trans/fakeroot.c | 47 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 34 insertions(+), 13 deletions(-)

(limited to 'trans')

diff --git a/trans/fakeroot.c b/trans/fakeroot.c
index 711a8565..6ef93327 100644
--- a/trans/fakeroot.c
+++ b/trans/fakeroot.c
@@ -685,26 +685,47 @@ error_t
 netfs_attempt_utimes (struct iouser *cred, struct node *np,
 		      struct timespec *atime, struct timespec *mtime)
 {
-  union tv
-  {
-    struct timeval tv;
-    time_value_t tvt;
-  };
-  union tv a, m;
+  error_t err;
+#ifdef HAVE_FILE_UTIMENS
+  struct timespec tatime, tmtime;
+
   if (atime)
+    tatime = *atime;
+  else
     {
-      TIMESPEC_TO_TIMEVAL (&a.tv, atime);
+      tatime.tv_sec = 0;
+      tatime.tv_nsec = UTIME_OMIT;
     }
-  else
-    a.tv.tv_sec = a.tv.tv_usec = -1;
+
   if (mtime)
+    tmtime = *mtime;
+  else
     {
-      TIMESPEC_TO_TIMEVAL (&m.tv, mtime);
+      tmtime.tv_sec = 0;
+      tmtime.tv_nsec = UTIME_OMIT;
     }
-  else
-    m.tv.tv_sec = m.tv.tv_usec = -1;
 
-  return file_utimes (netfs_node_netnode (np)->file, a.tvt, m.tvt);
+  err = file_utimens (netfs_node_netnode (np)->file, tatime, tmtime);
+
+  if(err == EMIG_BAD_ID || err == EOPNOTSUPP)
+#endif
+    {
+      time_value_t atim, mtim;
+
+      if(atime)
+        TIMESPEC_TO_TIME_VALUE (&atim, atime);
+      else
+        atim.seconds = atim.microseconds = -1;
+
+      if (mtime)
+        TIMESPEC_TO_TIME_VALUE (&mtim, mtime);
+      else
+        mtim.seconds = mtim.microseconds = -1;
+
+      err = file_utimes (netfs_node_netnode (np)->file, atim, mtim);
+    }
+
+  return err;
 }
 
 error_t
-- 
cgit v1.2.3