aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Lublin <daniel@lublin.se>2018-06-18 20:12:38 +0200
committerNikolaus Rath <Nikolaus@rath.org>2018-06-18 19:12:38 +0100
commitf0452119e0e5365bd140e8dd47ff268d274f55de (patch)
treec302a30a447fd9b8e169573887a21664298ab91f
parentfb174704ddbaa086ed801cfbb5c8326d28140a92 (diff)
downloadsshfs-f0452119e0e5365bd140e8dd47ff268d274f55de.tar
sshfs-f0452119e0e5365bd140e8dd47ff268d274f55de.tar.gz
sshfs-f0452119e0e5365bd140e8dd47ff268d274f55de.tar.bz2
sshfs-f0452119e0e5365bd140e8dd47ff268d274f55de.zip
Make utimens(NULL) work correctly
-rw-r--r--ChangeLog.rst2
-rw-r--r--sshfs.c12
-rwxr-xr-xtest/test_sshfs.py13
3 files changed, 25 insertions, 2 deletions
diff --git a/ChangeLog.rst b/ChangeLog.rst
index 58396c7..556d27e 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -1,6 +1,8 @@
Unreleased Changes
------------------
+* Make utimens(NULL) result in timestamp "now" -- no more touched files
+ dated 1970-01-01
* New `createmode` workaround.
Release 3.3.2 (2018-04-29)
diff --git a/sshfs.c b/sshfs.c
index bb1ef3a..e62c45a 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -2473,6 +2473,14 @@ static int sshfs_utimens(const char *path, const struct timespec tv[2],
int err;
struct buffer buf;
struct sshfs_file *sf = NULL;
+ time_t asec = tv[0].tv_sec, msec = tv[1].tv_sec;
+
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ if (asec == 0)
+ asec = now.tv_sec;
+ if (msec == 0)
+ msec = now.tv_sec;
if (fi != NULL) {
sf = get_sshfs_file(fi);
@@ -2486,8 +2494,8 @@ static int sshfs_utimens(const char *path, const struct timespec tv[2],
else
buf_add_buf(&buf, &sf->handle);
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_ACMODTIME);
- buf_add_uint32(&buf, tv[0].tv_sec);
- buf_add_uint32(&buf, tv[1].tv_sec);
+ buf_add_uint32(&buf, asec);
+ buf_add_uint32(&buf, msec);
err = sftp_request(sf == NULL ? SSH_FXP_SETSTAT : SSH_FXP_FSETSTAT,
&buf, SSH_FXP_STATUS, NULL);
diff --git a/test/test_sshfs.py b/test/test_sshfs.py
index caa7fda..04366fe 100755
--- a/test/test_sshfs.py
+++ b/test/test_sshfs.py
@@ -102,6 +102,7 @@ def test_sshfs(tmpdir, debug, cache_timeout, sync_rd, capfd):
# SSHFS only supports one second resolution when setting
# file timestamps.
tst_utimens(mnt_dir, tol=1)
+ tst_utimens_now(mnt_dir)
tst_link(mnt_dir, cache_timeout)
tst_truncate_path(mnt_dir)
@@ -403,6 +404,18 @@ def tst_utimens(mnt_dir, tol=0):
assert abs(fstat.st_atime_ns - atime_ns) < tol*1e9
assert abs(fstat.st_mtime_ns - mtime_ns) < tol*1e9
+def tst_utimens_now(mnt_dir):
+ fullname = pjoin(mnt_dir, name_generator())
+
+ fd = os.open(fullname, os.O_CREAT | os.O_RDWR)
+ os.close(fd)
+ os.utime(fullname, None)
+
+ fstat = os.lstat(fullname)
+ # We should get now-timestamps
+ assert fstat.st_atime != 0
+ assert fstat.st_mtime != 0
+
def tst_passthrough(src_dir, mnt_dir, cache_timeout):
name = name_generator()
src_name = pjoin(src_dir, name)