mirror of
				https://git.tukaani.org/xz.git
				synced 2025-11-04 07:22:55 +00:00 
			
		
		
		
	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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user