blob: ffc6c70c94bebcc29e7e61a9649c6adf0bec9186 [file] [log] [blame]
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