| From b9bd98b20f45e9df6ea9320159c970c93e669857 Mon Sep 17 00:00:00 2001 |
| From: Akira TAGOH <akira@tagoh.org> |
| Date: Sun, 13 May 2018 16:21:58 +0900 |
| Subject: [PATCH] Bug 106459 - fc-cache doesn't use -y option for .uuid files |
| |
| https://bugs.freedesktop.org/show_bug.cgi?id=106459 |
| --- |
| src/fccache.c | 48 +++++++++++++++++++++++++++++++++++++----------- |
| test/run-test.sh | 25 +++++++++++++++++++++++++ |
| 2 files changed, 62 insertions(+), 11 deletions(-) |
| |
| diff --git a/src/fccache.c b/src/fccache.c |
| index 742cb89..480e06a 100644 |
| --- a/src/fccache.c |
| +++ b/src/fccache.c |
| @@ -51,13 +51,23 @@ FcDirCacheCreateUUID (FcChar8 *dir, |
| FcBool force, |
| FcConfig *config) |
| { |
| + const FcChar8 *sysroot = FcConfigGetSysRoot (config); |
| + FcChar8 *target; |
| FcBool ret = FcTrue; |
| #ifndef _WIN32 |
| FcChar8 *uuidname; |
| |
| - uuidname = FcStrBuildFilename (dir, ".uuid", NULL); |
| + if (sysroot) |
| + target = FcStrBuildFilename (sysroot, dir, NULL); |
| + else |
| + target = FcStrdup (dir); |
| + uuidname = FcStrBuildFilename (target, ".uuid", NULL); |
| + |
| if (!uuidname) |
| + { |
| + FcStrFree (target); |
| return FcFalse; |
| + } |
| |
| if (force || access ((const char *) uuidname, F_OK) < 0) |
| { |
| @@ -69,7 +79,7 @@ FcDirCacheCreateUUID (FcChar8 *dir, |
| struct stat statb; |
| struct timeval times[2]; |
| |
| - if (FcStat (dir, &statb) != 0) |
| + if (FcStat (target, &statb) != 0) |
| { |
| ret = FcFalse; |
| goto bail1; |
| @@ -96,7 +106,7 @@ FcDirCacheCreateUUID (FcChar8 *dir, |
| hash_add = FcHashTableReplace; |
| else |
| hash_add = FcHashTableAdd; |
| - if (!hash_add (config->uuid_table, dir, uuid)) |
| + if (!hash_add (config->uuid_table, target, uuid)) |
| { |
| ret = FcFalse; |
| goto bail3; |
| @@ -124,14 +134,15 @@ FcDirCacheCreateUUID (FcChar8 *dir, |
| times[0].tv_usec = 0; |
| times[1].tv_usec = 0; |
| #endif |
| - if (utimes ((const char *) dir, times) != 0) |
| + if (utimes ((const char *) target, times) != 0) |
| { |
| - fprintf (stderr, "Unable to revert mtime: %s\n", dir); |
| + fprintf (stderr, "Unable to revert mtime: %s\n", target); |
| } |
| } |
| } |
| - bail1: |
| +bail1: |
| FcStrFree (uuidname); |
| + FcStrFree (target); |
| #endif |
| |
| return ret; |
| @@ -144,10 +155,17 @@ FcDirCacheReadUUID (FcChar8 *dir, |
| { |
| void *u; |
| uuid_t uuid; |
| + const FcChar8 *sysroot = FcConfigGetSysRoot (config); |
| + FcChar8 *target; |
| + |
| + if (sysroot) |
| + target = FcStrBuildFilename (sysroot, dir, NULL); |
| + else |
| + target = FcStrdup (dir); |
| |
| - if (!FcHashTableFind (config->uuid_table, dir, &u)) |
| + if (!FcHashTableFind (config->uuid_table, target, &u)) |
| { |
| - FcChar8 *uuidname = FcStrBuildFilename (dir, ".uuid", NULL); |
| + FcChar8 *uuidname = FcStrBuildFilename (target, ".uuid", NULL); |
| int fd; |
| |
| if ((fd = FcOpen ((char *) uuidname, O_RDONLY)) >= 0) |
| @@ -162,7 +180,7 @@ FcDirCacheReadUUID (FcChar8 *dir, |
| { |
| if (FcDebug () & FC_DBG_CACHE) |
| printf ("FcDirCacheReadUUID %s -> %s\n", uuidname, suuid); |
| - FcHashTableAdd (config->uuid_table, dir, uuid); |
| + FcHashTableAdd (config->uuid_table, target, uuid); |
| } |
| } |
| close (fd); |
| @@ -176,6 +194,7 @@ FcDirCacheReadUUID (FcChar8 *dir, |
| } |
| else |
| FcHashUuidFree (u); |
| + FcStrFree (target); |
| } |
| #endif |
| |
| @@ -259,18 +278,25 @@ static FcChar8 * |
| FcDirCacheBasenameUUID (const FcChar8 *dir, FcChar8 cache_base[CACHEBASE_LEN], FcConfig *config) |
| { |
| void *u; |
| - FcChar8 *alias; |
| + FcChar8 *alias, *target; |
| + const FcChar8 *sysroot = FcConfigGetSysRoot (config); |
| |
| if (!FcHashTableFind (config->alias_table, dir, (void **)&alias)) |
| alias = FcStrdup (dir); |
| - if (FcHashTableFind (config->uuid_table, alias, &u)) |
| + if (sysroot) |
| + target = FcStrBuildFilename (sysroot, alias, NULL); |
| + else |
| + target = FcStrdup (alias); |
| + if (FcHashTableFind (config->uuid_table, target, &u)) |
| { |
| uuid_unparse (u, (char *) cache_base); |
| strcat ((char *) cache_base, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX); |
| FcHashUuidFree (u); |
| + FcStrFree (target); |
| FcStrFree (alias); |
| return cache_base; |
| } |
| + FcStrFree (target); |
| FcStrFree (alias); |
| return NULL; |
| } |
| diff --git a/test/run-test.sh b/test/run-test.sh |
| index 436dee1..7e52ab3 100644 |
| --- a/test/run-test.sh |
| +++ b/test/run-test.sh |
| @@ -202,4 +202,29 @@ fi |
| rm -rf $TESTTMPDIR out1 out2 xxx bind-fonts.conf |
| fi |
| |
| +dotest "sysroot option" |
| +prep |
| +mkdir -p $MyPWD/sysroot/$FONTDIR |
| +mkdir -p $MyPWD/sysroot/$CACHEDIR |
| +cp $FONT1 $MyPWD/sysroot/$FONTDIR |
| +cp $MyPWD/fonts.conf $MyPWD/sysroot/$MyPWD/fonts.conf |
| +$FCCACHE -y $MyPWD/sysroot |
| +stat $MyPWD/sysroot/$FONTDIR/.uuid |
| +if test $? != 0; then |
| + echo "*** Test failed: $TEST" |
| + exit 1 |
| +fi |
| + |
| +dotest "creating uuid-based cache file on sysroot" |
| +uuid=`cat $MyPWD/sysroot/$FONTDIR/.uuid` |
| +ls $MyPWD/sysroot/$CACHEDIR/$uuid* |
| +if [ $? != 0 ]; then |
| + echo "*** Test failed: $TEST" |
| + echo "No cache for $uuid" |
| + ls $MyPWD/sysroot/$CACHEDIR |
| + exit 1 |
| +fi |
| + |
| +rm -rf $MyPWD/sysroot |
| + |
| rm -rf $FONTDIR $CACHEFILE $CACHEDIR $FONTCONFIG_FILE out |
| -- |
| 2.20.0.rc0.387.gc7a69e6b6c-goog |
| |