summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Jacke <bj@sernet.de>2009-12-09 02:06:17 +0100
committerBjörn Jacke <bj@sernet.de>2009-12-09 02:58:40 +0100
commitfd5855608f2704fddf887e3424762d344dc93993 (patch)
treebbbf414c068b982849001fb32319ad10b0e5b59a
parentb6174662df2d2b1a98ec89237c7cacf02024daef (diff)
downloadsamba-fd5855608f2704fddf887e3424762d344dc93993.tar.gz
s3: keep subsecond times on cross-filesystem moves and don't follow links
-rw-r--r--source3/modules/vfs_default.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index ded4b1af276..6e2a5712c83 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -540,6 +540,27 @@ static int copy_reg(const char *source, const char *dest)
return -1;
/* Try to copy the old file's modtime and access time. */
+#if defined(HAVE_UTIMENSAT)
+ {
+ struct timespec ts[2];
+
+ ts[0] = source_stats.st_ex_atime;
+ ts[1] = source_stats.st_ex_mtime;
+ utimensat(AT_FDCWD, dest, ts, AT_SYMLINK_NOFOLLOW);
+ }
+#elif defined(HAVE_UTIMES)
+ {
+ struct timeval tv[2];
+
+ tv[0] = convert_timespec_to_timeval(source_stats.st_ex_atime);
+ tv[1] = convert_timespec_to_timeval(source_stats.st_ex_mtime);
+#ifdef HAVE_LUTIMES
+ lutimes(dest, tv);
+#else
+ utimes(dest, tv);
+#endif
+ }
+#elif defined(HAVE_UTIME)
{
struct utimbuf tv;
@@ -547,6 +568,7 @@ static int copy_reg(const char *source, const char *dest)
tv.modtime = convert_timespec_to_time_t(source_stats.st_ex_mtime);
utime(dest, &tv);
}
+#endif
if (unlink (source) == -1)
return -1;