Re: [PATCH 3/3] Win32: implement nanosecond-precision file times

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

 



Am 12.02.2015 um 00:53 schrieb Karsten Blees:
> We no longer use any of MSVCRT's stat-functions, so there's no need to
> stick to a CRT-compatible 'struct stat' either.
> 
> Define and use our own POSIX-2013-compatible 'struct stat' with nanosecond-
> precision file times.
> 
> Signed-off-by: Karsten Blees <blees@xxxxxxx>
> ---
>  compat/mingw.c   | 12 ++++++------
>  compat/mingw.h   | 43 +++++++++++++++++++++++++++++++------------
>  config.mak.uname |  4 ++--
>  3 files changed, 39 insertions(+), 20 deletions(-)
> 
> diff --git a/compat/mingw.c b/compat/mingw.c
> index 6d73a3d..e4d5e3f 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -442,9 +442,9 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf)
>  		buf->st_size = fdata.nFileSizeLow |
>  			(((off_t)fdata.nFileSizeHigh)<<32);
>  		buf->st_dev = buf->st_rdev = 0; /* not used by Git */
> -		buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
> -		buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
> -		buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
> +		filetime_to_timespec(&(fdata.ftLastAccessTime), &(buf->st_atim));
> +		filetime_to_timespec(&(fdata.ftLastWriteTime), &(buf->st_mtim));
> +		filetime_to_timespec(&(fdata.ftCreationTime), &(buf->st_ctim));
>  		if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
>  			WIN32_FIND_DATAW findbuf;
>  			HANDLE handle = FindFirstFileW(wfilename, &findbuf);
> @@ -550,9 +550,9 @@ int mingw_fstat(int fd, struct stat *buf)
>  		buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
>  		buf->st_size = fdata.nFileSizeLow |
>  			(((off_t)fdata.nFileSizeHigh)<<32);
> -		buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
> -		buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
> -		buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
> +		filetime_to_timespec(&(fdata.ftLastAccessTime), &(buf->st_atim));
> +		filetime_to_timespec(&(fdata.ftLastWriteTime), &(buf->st_mtim));
> +		filetime_to_timespec(&(fdata.ftCreationTime), &(buf->st_ctim));
>  		return 0;
>  
>  	case FILE_TYPE_CHAR:
> diff --git a/compat/mingw.h b/compat/mingw.h
> index f2a78b4..8dee9c9 100644
> --- a/compat/mingw.h
> +++ b/compat/mingw.h
> @@ -293,22 +293,48 @@ static inline long long filetime_to_hnsec(const FILETIME *ft)
>  	return winTime - 116444736000000000LL;
>  }
>  
> -static inline time_t filetime_to_time_t(const FILETIME *ft)
> +struct timespec {
> +	time_t tv_sec;
> +	long tv_nsec;
> +};
> +
> +static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts)
>  {
> -	return (time_t)(filetime_to_hnsec(ft) / 10000000);
> +	long long hnsec = filetime_to_hnsec(ft);
> +	ts->tv_sec = (time_t)(hnsec / 10000000);
> +	ts->tv_nsec = (hnsec % 10000000) * 100;
>  }
>  
>  /*
> - * Use mingw specific stat()/lstat()/fstat() implementations on Windows.
> + * Use mingw specific stat()/lstat()/fstat() implementations on Windows,
> + * including our own struct stat with 64 bit st_size and nanosecond-precision
> + * file times.
>   */
>  #define off_t off64_t
>  #define lseek _lseeki64
>  
> -/* use struct stat with 64 bit st_size */
> +struct mingw_stat {
> +    _dev_t st_dev;
> +    _ino_t st_ino;
> +    _mode_t st_mode;
> +    short st_nlink;
> +    short st_uid;
> +    short st_gid;
> +    _dev_t st_rdev;
> +    off64_t st_size;
> +    struct timespec st_atim;
> +    struct timespec st_mtim;
> +    struct timespec st_ctim;
> +};
> +
> +#define st_atime st_atim.tv_sec
> +#define st_mtime st_mtim.tv_sec
> +#define st_ctime st_ctim.tv_sec
> +
>  #ifdef stat
>  #undef stat
>  #endif
> -#define stat _stati64
> +#define stat mingw_stat
>  int mingw_lstat(const char *file_name, struct stat *buf);
>  int mingw_stat(const char *file_name, struct stat *buf);
>  int mingw_fstat(int fd, struct stat *buf);
> @@ -321,13 +347,6 @@ int mingw_fstat(int fd, struct stat *buf);
>  #endif
>  #define lstat mingw_lstat
>  
> -#ifndef _stati64
> -# define _stati64(x,y) mingw_stat(x,y)
> -#elif defined (_USE_32BIT_TIME_T)
> -# define _stat32i64(x,y) mingw_stat(x,y)
> -#else
> -# define _stat64(x,y) mingw_stat(x,y)
> -#endif
>  
>  int mingw_utime(const char *file_name, const struct utimbuf *times);
>  #define utime mingw_utime
> diff --git a/config.mak.uname b/config.mak.uname
> index b64b63c..a18a4cc 100644
> --- a/config.mak.uname
> +++ b/config.mak.uname
> @@ -346,7 +346,7 @@ ifeq ($(uname_S),Windows)
>  	NO_SVN_TESTS = YesPlease
>  	RUNTIME_PREFIX = YesPlease
>  	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
> -	NO_NSEC = YesPlease
> +	USE_NSEC = YesPlease
>  	USE_WIN32_MMAP = YesPlease
>  	# USE_NED_ALLOCATOR = YesPlease
>  	UNRELIABLE_FSTAT = UnfortunatelyYes
> @@ -498,7 +498,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
>  	NO_PERL_MAKEMAKER = YesPlease
>  	RUNTIME_PREFIX = YesPlease
>  	NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
> -	NO_NSEC = YesPlease
> +	USE_NSEC = YesPlease
>  	USE_WIN32_MMAP = YesPlease
>  	USE_NED_ALLOCATOR = YesPlease
>  	UNRELIABLE_FSTAT = UnfortunatelyYes
> 

Why not also enable it in our special msysgit section?

diff --git a/config.mak.uname b/config.mak.uname
index b64b63c..6326794 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -535,6 +535,7 @@ ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
        INTERNAL_QSORT = YesPlease
        HAVE_LIBCHARSET_H = YesPlease
        NO_GETTEXT = YesPlease
+       USE_NSEC = YesPlease
 else
        NO_CURL = YesPlease
 endif

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]