bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

copy-file: don't lose sub-second timestamps


From: Bruno Haible
Subject: copy-file: don't lose sub-second timestamps
Date: Mon, 01 May 2017 13:27:50 +0200
User-agent: KMail/5.1.3 (Linux/4.4.0-75-generic; KDE/5.18.0; x86_64; ; )

The copy-file module, so far, loses the fractional part of the seconds of the
timestamp of the file being copied. This fixes it.


2017-05-01  Bruno Haible  <address@hidden>

        copy-file: Preserve sub-second time stamps.
        * lib/copy-file.c: Include stat-time.h, utimens.h instead of <utime.h>.
        (qcopy_file_preserving): Use 'struct timespec' and utimens() to
        transport the time stamps from the original file to the destination
        file.
        * m4/copy-file.m4 (gl_COPY_FILE): Don't test for utime, utimes.
        * modules/copy-file (Depends-on): Add stat-time, utimns instead of
        utime-h.

diff --git a/lib/copy-file.c b/lib/copy-file.c
index b3f02a7..462ea1c 100644
--- a/lib/copy-file.c
+++ b/lib/copy-file.c
@@ -28,14 +28,12 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#if HAVE_UTIME || HAVE_UTIMES
-# include <utime.h>
-#endif
-
 #include "error.h"
 #include "ignore-value.h"
 #include "safe-read.h"
 #include "full-write.h"
+#include "stat-time.h"
+#include "utimens.h"
 #include "acl.h"
 #include "binary-io.h"
 #include "quote.h"
@@ -113,23 +111,13 @@ qcopy_file_preserving (const char *src_filename, const 
char *dest_filename)
 #endif
 
   /* Preserve the access and modification times.  */
-#if HAVE_UTIME
-  {
-    struct utimbuf ut;
-
-    ut.actime = statbuf.st_atime;
-    ut.modtime = statbuf.st_mtime;
-    utime (dest_filename, &ut);
-  }
-#elif HAVE_UTIMES
   {
-    struct timeval ut[2];
+    struct timespec ts[2];
 
-    ut[0].tv_sec = statbuf.st_atime; ut[0].tv_usec = 0;
-    ut[1].tv_sec = statbuf.st_mtime; ut[1].tv_usec = 0;
-    utimes (dest_filename, &ut);
+    ts[0] = get_stat_atime (&statbuf);
+    ts[1] = get_stat_mtime (&statbuf);
+    utimens (dest_filename, ts);
   }
-#endif
 
 #if HAVE_CHOWN
   /* Preserve the owner and group.  */
diff --git a/m4/copy-file.m4 b/m4/copy-file.m4
index 4b5db8a..c29f793 100644
--- a/m4/copy-file.m4
+++ b/m4/copy-file.m4
@@ -1,4 +1,4 @@
-# copy-file.m4 serial 4
+# copy-file.m4 serial 5
 dnl Copyright (C) 2003, 2009-2017 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,5 +7,5 @@ dnl with or without modifications, as long as this notice is 
preserved.
 AC_DEFUN([gl_COPY_FILE],
 [
   AC_CHECK_HEADERS_ONCE([unistd.h])
-  AC_CHECK_FUNCS([chown utime utimes])
+  AC_CHECK_FUNCS([chown])
 ])
diff --git a/modules/copy-file b/modules/copy-file
index 7238f55..e94a22c 100644
--- a/modules/copy-file
+++ b/modules/copy-file
@@ -17,9 +17,10 @@ ignore-value
 open
 quote
 safe-read
+stat-time
 stdlib
 unistd
-utime-h
+utimens
 xalloc
 
 configure.ac:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]