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 <[email protected]>
> ---
>  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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to