Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24d22be3 authored by Kan-Ru Chen's avatar Kan-Ru Chen
Browse files

acp: Ensure dst mtime always greater or equal to src mtime

When copying files from file systems that support high resolution
mtime, we should not truncating the nsec part. Instead we should
increase the dst mtime by one sec to prevent dst mtime to become less
than src mtime.

Change-Id: I2b4200c72c4e6ee8aae875b5e64701324799afc7
parent f5f11eb0
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -62,6 +62,22 @@ static bool isSourceNewer(const struct stat* pSrcStat, const struct stat* pDstSt
           (pSrcStat->st_size != pDstStat->st_size);
}

/*
 * 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
@@ -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)));