]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
xz: Fix copying of timestamps on Windows.
authorLasse Collin <lasse.collin@tukaani.org>
Thu, 30 Jun 2016 17:27:36 +0000 (20:27 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Thu, 30 Jun 2016 17:27:36 +0000 (20:27 +0300)
xz used to call utime() on Windows, but its result gets lost
on close(). Using _futime() seems to work.

Thanks to Martok for reporting the bug:
http://www.mail-archive.com/xz-devel@tukaani.org/msg00261.html

configure.ac
src/xz/file_io.c

index 3df4348661fc026a3017f31804894cfedc12d96e..81abce582bd525709478a4b354c36bae7bffe774 100644 (file)
@@ -672,7 +672,7 @@ AC_C_BIGENDIAN
 gl_GETOPT
 
 # Find the best function to set timestamps.
-AC_CHECK_FUNCS([futimens futimes futimesat utimes utime], [break])
+AC_CHECK_FUNCS([futimens futimes futimesat utimes _futime utime], [break])
 
 # This is nice to have but not mandatory.
 AC_CHECK_FUNCS([posix_fadvise])
index 2ca188bd98d05467d531724ae169cfb3aef643af..c01f4e8bb99ddc34d9bf6aed0a0eac6f9ef946f3 100644 (file)
@@ -23,6 +23,8 @@ static bool warn_fchown;
 
 #if defined(HAVE_FUTIMES) || defined(HAVE_FUTIMESAT) || defined(HAVE_UTIMES)
 #      include <sys/time.h>
+#elif defined(HAVE__FUTIME)
+#      include <sys/utime.h>
 #elif defined(HAVE_UTIME)
 #      include <utime.h>
 #endif
@@ -457,6 +459,22 @@ io_copy_attrs(const file_pair *pair)
        (void)utimes(pair->dest_name, tv);
 #      endif
 
+#elif defined(HAVE__FUTIME)
+       // Use one-second precision with Windows-specific _futime().
+       // We could use utime() too except that for some reason the
+       // timestamp will get reset at close(). With _futime() it works.
+       // This struct cannot be const as _futime() takes a non-const pointer.
+       struct _utimbuf buf = {
+               .actime = pair->src_st.st_atime,
+               .modtime = pair->src_st.st_mtime,
+       };
+
+       // Avoid warnings.
+       (void)atime_nsec;
+       (void)mtime_nsec;
+
+       (void)_futime(pair->dest_fd, &buf);
+
 #elif defined(HAVE_UTIME)
        // Use one-second precision. utime() doesn't support using file
        // descriptor either. Some systems have broken utime() prototype