diff options
Diffstat (limited to 'libs/host/CopyFile.c')
-rw-r--r-- | libs/host/CopyFile.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/libs/host/CopyFile.c b/libs/host/CopyFile.c index a822b41..98adcff 100644 --- a/libs/host/CopyFile.c +++ b/libs/host/CopyFile.c @@ -63,6 +63,22 @@ static bool isSourceNewer(const struct stat* pSrcStat, const struct stat* pDstSt } /* + * Returns true if the source file has high resolution modification + * date. Cygwin doesn't support st_mtim in normal build, so always + * return false. + */ +static bool isHiresMtime(const struct stat* pSrcStat) +{ +#ifdef WIN32_EXE + return 0; +#elif defined(MACOSX_RSRC) + return pSrcStat->st_mtimespec.tv_nsec > 0; +#else + return pSrcStat->st_mtim.tv_nsec > 0; +#endif +} + +/* * Returns true if the source and destination files are actually the * same thing. We detect this by checking the inode numbers, which seems * to work on Cygwin. @@ -151,6 +167,8 @@ static int setPermissions(const char* dst, const struct stat* pSrcStat, unsigned */ ut.actime = pSrcStat->st_atime; ut.modtime = pSrcStat->st_mtime; + if (isHiresMtime(pSrcStat)) + ut.modtime += 1; if (utime(dst, &ut) != 0) { DBUG(("--- unable to set timestamps on '%s': %s\n", dst, strerror(errno))); |