From 182186e53a38d2c8b82d0a1785f6873f2b54316a Mon Sep 17 00:00:00 2001 From: Akira TAGOH Date: Mon, 18 Dec 2017 21:26:29 +0900 Subject: [PATCH] Do not update mtime with creating .uuid --- src/fccache.c | 26 ++++++++++++++++++++++++++ test/run-test.sh | 13 +++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/fccache.c b/src/fccache.c index dfe9520..33c8a11 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #if defined(HAVE_MMAP) || defined(__CYGWIN__) # include @@ -63,7 +64,14 @@ FcDirCacheCreateUUID (FcChar8 *dir, uuid_t uuid; char out[37]; FcBool (* hash_add) (FcHashTable *, void*, void*); + struct stat statb; + struct timeval times[2]; + if (FcStat (dir, &statb) != 0) + { + ret = FcFalse; + goto bail1; + } atomic = FcAtomicCreate (uuidname); if (!atomic) { @@ -101,6 +109,24 @@ FcDirCacheCreateUUID (FcChar8 *dir, FcAtomicUnlock (atomic); bail2: FcAtomicDestroy (atomic); + + if (ret) + { + /* revert mtime of the directory */ + times[0].tv_sec = statb.st_atime; + times[1].tv_sec = statb.st_mtime; +#ifdef HAVE_STRUCT_STAT_ST_MTIM + times[0].tv_usec = statb.st_atim.tv_nsec / 1000; + times[1].tv_usec = statb.st_mtim.tv_nsec / 1000; +#else + times[0].tv_usec = 0; + times[1].tv_usec = 0; +#endif + if (utimes ((const char *) dir, times) != 0) + { + fprintf (stderr, "Unable to revert mtime: %s\n", dir); + } + } } bail1: FcStrFree (uuidname); diff --git a/test/run-test.sh b/test/run-test.sh index 4154dd3..436dee1 100644 --- a/test/run-test.sh +++ b/test/run-test.sh @@ -164,6 +164,19 @@ if [ $n != 1 ]; then exit 1 fi +dotest "Keep mtime of the font directory" +prep +cp $FONT1 $FONTDIR +touch -d @0 $FONTDIR +stat $FONTDIR | grep Modify > out1 +$FCCACHE $FONTDIR +stat $FONTDIR | grep Modify > out2 +if cmp out1 out2 > /dev/null ; then : ; else + echo "*** Test failed: $TEST" + echo "mtime was modified" + exit 1 +fi + if [ x"$BWRAP" != "x" ]; then dotest "Basic functionality with the bind-mounted cache dir" prep