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