mirror of https://git.tukaani.org/xz.git
xz: Fix copying of timestamps on Windows.
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
This commit is contained in:
parent
1b0ac0c53c
commit
446e4318fa
|
@ -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])
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue