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