diff options
Diffstat (limited to 'libnetfs')
-rw-r--r-- | libnetfs/file-utimes.c | 52 | ||||
-rw-r--r-- | libnetfs/init-init.c | 7 | ||||
-rw-r--r-- | libnetfs/netfs.h | 2 | ||||
-rw-r--r-- | libnetfs/priv.h | 2 |
4 files changed, 48 insertions, 15 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; } diff --git a/libnetfs/init-init.c b/libnetfs/init-init.c index 9ca1aacf..984a5e71 100644 --- a/libnetfs/init-init.c +++ b/libnetfs/init-init.c @@ -20,6 +20,7 @@ #include "netfs.h" +#include <error.h> /* For safe inlining of netfs_node_netnode and netfs_netnode_node. */ size_t const _netfs_sizeof_struct_node = sizeof (struct node); @@ -30,11 +31,17 @@ struct port_class *netfs_protid_class = 0; struct port_class *netfs_control_class = 0; auth_t netfs_auth_server_port = 0; mach_port_t netfs_fsys_identity; +volatile struct mapped_time_value *netfs_mtime; void netfs_init () { + error_t err; + err = maptime_map (0, 0, &netfs_mtime); + if (err) + error (2, err, "mapping time"); + netfs_protid_class = ports_create_class (netfs_release_protid, 0); netfs_control_class = ports_create_class (0, 0); netfs_port_bucket = ports_create_bucket (); diff --git a/libnetfs/netfs.h b/libnetfs/netfs.h index 5b5ca93b..3d51b74b 100644 --- a/libnetfs/netfs.h +++ b/libnetfs/netfs.h @@ -173,7 +173,7 @@ error_t netfs_attempt_chflags (struct iouser *cred, struct node *np, /* The user must define this function. This should attempt a utimes call for the user specified by CRED on locked node NP, to change the atime to ATIME and the mtime to MTIME. If ATIME or MTIME is - null, then set to the current time. */ + null, then do not change it. */ error_t netfs_attempt_utimes (struct iouser *cred, struct node *np, struct timespec *atime, struct timespec *mtime); diff --git a/libnetfs/priv.h b/libnetfs/priv.h index 3c5bcd4f..3871da8d 100644 --- a/libnetfs/priv.h +++ b/libnetfs/priv.h @@ -25,6 +25,8 @@ #include "netfs.h" +volatile struct mapped_time_value *netfs_mtime; + static inline struct protid * __attribute__ ((unused)) begin_using_protid_port (file_t port) { |