Add salt attribute to dir and remap-dir elements
'salt' attribute affects a cache filename to generate different name from directory name. This is useful when sharing caches with host on sandbox and/or give a filename differently: <dir salt="randomdata">/usr/share/fonts</dir> <remap-dir as-path="/usr/share/fonts" salt="salt for /usr/share/fonts on host">/run/host/fonts</remap-dir> Applications can read caches as-is for fonts on /run/host/fonts where is mounted from host. and write a cache for their own fonts on /usr/share/fonts with different name.
This commit is contained in:
parent
def1d00036
commit
2e8ce63514
|
@ -152,14 +152,25 @@ FcDirCacheBasenameMD5 (FcConfig *config, const FcChar8 *dir, FcChar8 cache_base[
|
||||||
{
|
{
|
||||||
FcChar8 *new_dir;
|
FcChar8 *new_dir;
|
||||||
unsigned char hash[16];
|
unsigned char hash[16];
|
||||||
FcChar8 *hex_hash;
|
FcChar8 *hex_hash, *key = NULL;
|
||||||
int cnt;
|
int cnt;
|
||||||
struct MD5Context ctx;
|
struct MD5Context ctx;
|
||||||
|
const FcChar8 *salt;
|
||||||
|
|
||||||
|
salt = FcConfigMapSalt (config, dir);
|
||||||
new_dir = FcConfigMapFontPath(config, dir);
|
new_dir = FcConfigMapFontPath(config, dir);
|
||||||
if (new_dir)
|
if (new_dir)
|
||||||
dir = new_dir;
|
dir = new_dir;
|
||||||
|
if (salt)
|
||||||
|
{
|
||||||
|
size_t dl = strlen ((const char *) dir);
|
||||||
|
size_t sl = strlen ((const char *) salt);
|
||||||
|
|
||||||
|
key = (FcChar8 *) malloc (dl + sl + 1);
|
||||||
|
memcpy (key, dir, dl);
|
||||||
|
memcpy (key + dl, salt, sl + 1);
|
||||||
|
dir = key;
|
||||||
|
}
|
||||||
MD5Init (&ctx);
|
MD5Init (&ctx);
|
||||||
MD5Update (&ctx, (const unsigned char *)dir, strlen ((const char *) dir));
|
MD5Update (&ctx, (const unsigned char *)dir, strlen ((const char *) dir));
|
||||||
|
|
||||||
|
@ -167,6 +178,8 @@ FcDirCacheBasenameMD5 (FcConfig *config, const FcChar8 *dir, FcChar8 cache_base[
|
||||||
|
|
||||||
if (new_dir)
|
if (new_dir)
|
||||||
FcStrFree(new_dir);
|
FcStrFree(new_dir);
|
||||||
|
if (key)
|
||||||
|
FcStrFree (key);
|
||||||
|
|
||||||
cache_base[0] = '/';
|
cache_base[0] = '/';
|
||||||
hex_hash = cache_base + 1;
|
hex_hash = cache_base + 1;
|
||||||
|
|
29
src/fccfg.c
29
src/fccfg.c
|
@ -540,9 +540,10 @@ FcConfigGetConfigDirs (FcConfig *config)
|
||||||
FcBool
|
FcBool
|
||||||
FcConfigAddFontDir (FcConfig *config,
|
FcConfigAddFontDir (FcConfig *config,
|
||||||
const FcChar8 *d,
|
const FcChar8 *d,
|
||||||
const FcChar8 *m)
|
const FcChar8 *m,
|
||||||
|
const FcChar8 *salt)
|
||||||
{
|
{
|
||||||
return FcStrSetAddFilenamePair (config->fontDirs, d, m);
|
return FcStrSetAddFilenamePairWithSalt (config->fontDirs, d, m, salt);
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
|
@ -587,7 +588,7 @@ FcConfigMapFontPath(FcConfig *config,
|
||||||
{
|
{
|
||||||
FcStrList *list;
|
FcStrList *list;
|
||||||
FcChar8 *dir;
|
FcChar8 *dir;
|
||||||
FcChar8 *map;
|
const FcChar8 *map;
|
||||||
FcChar8 *retval;
|
FcChar8 *retval;
|
||||||
|
|
||||||
list = FcConfigGetFontDirs(config);
|
list = FcConfigGetFontDirs(config);
|
||||||
|
@ -599,7 +600,7 @@ FcConfigMapFontPath(FcConfig *config,
|
||||||
FcStrListDone(list);
|
FcStrListDone(list);
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return 0;
|
return 0;
|
||||||
map = FcStrPairSecond(dir);
|
map = FcStrTripleSecond(dir);
|
||||||
if (!map)
|
if (!map)
|
||||||
return 0;
|
return 0;
|
||||||
retval = FcStrBuildFilename(map, path + strlen((char *) dir), NULL);
|
retval = FcStrBuildFilename(map, path + strlen((char *) dir), NULL);
|
||||||
|
@ -615,6 +616,26 @@ FcConfigMapFontPath(FcConfig *config,
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FcChar8 *
|
||||||
|
FcConfigMapSalt (FcConfig *config,
|
||||||
|
const FcChar8 *path)
|
||||||
|
{
|
||||||
|
FcStrList *list;
|
||||||
|
FcChar8 *dir;
|
||||||
|
|
||||||
|
list = FcConfigGetFontDirs (config);
|
||||||
|
if (!list)
|
||||||
|
return NULL;
|
||||||
|
while ((dir = FcStrListNext (list)))
|
||||||
|
if (FcConfigPathStartsWith (path, dir))
|
||||||
|
break;
|
||||||
|
FcStrListDone (list);
|
||||||
|
if (!dir)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return FcStrTripleThird (dir);
|
||||||
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcConfigAddCacheDir (FcConfig *config,
|
FcConfigAddCacheDir (FcConfig *config,
|
||||||
const FcChar8 *d)
|
const FcChar8 *d)
|
||||||
|
|
18
src/fcint.h
18
src/fcint.h
|
@ -660,7 +660,8 @@ FcConfigAddConfigDir (FcConfig *config,
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcConfigAddFontDir (FcConfig *config,
|
FcConfigAddFontDir (FcConfig *config,
|
||||||
const FcChar8 *d,
|
const FcChar8 *d,
|
||||||
const FcChar8 *m);
|
const FcChar8 *m,
|
||||||
|
const FcChar8 *salt);
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcConfigResetFontDirs (FcConfig *config);
|
FcConfigResetFontDirs (FcConfig *config);
|
||||||
|
@ -669,6 +670,10 @@ FcPrivate FcChar8 *
|
||||||
FcConfigMapFontPath(FcConfig *config,
|
FcConfigMapFontPath(FcConfig *config,
|
||||||
const FcChar8 *path);
|
const FcChar8 *path);
|
||||||
|
|
||||||
|
FcPrivate const FcChar8 *
|
||||||
|
FcConfigMapSalt (FcConfig *config,
|
||||||
|
const FcChar8 *path);
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcConfigAddCacheDir (FcConfig *config,
|
FcConfigAddCacheDir (FcConfig *config,
|
||||||
const FcChar8 *d);
|
const FcChar8 *d);
|
||||||
|
@ -1245,13 +1250,16 @@ FcPrivate void
|
||||||
FcStrSetSort (FcStrSet * set);
|
FcStrSetSort (FcStrSet * set);
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcStrSetAddPair (FcStrSet *set, const FcChar8 *a, const FcChar8 *b);
|
FcStrSetAddTriple (FcStrSet *set, const FcChar8 *a, const FcChar8 *b, const FcChar8 *c);
|
||||||
|
|
||||||
FcPrivate FcChar8 *
|
FcPrivate const FcChar8 *
|
||||||
FcStrPairSecond (FcChar8 *s);
|
FcStrTripleSecond (FcChar8 *s);
|
||||||
|
|
||||||
|
FcPrivate const FcChar8 *
|
||||||
|
FcStrTripleThird (FcChar8 *str);
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcStrSetAddFilenamePair (FcStrSet *strs, const FcChar8 *d, const FcChar8 *m);
|
FcStrSetAddFilenamePairWithSalt (FcStrSet *strs, const FcChar8 *d, const FcChar8 *m, const FcChar8 *salt);
|
||||||
|
|
||||||
FcPrivate FcBool
|
FcPrivate FcBool
|
||||||
FcStrSetDeleteAll (FcStrSet *set);
|
FcStrSetDeleteAll (FcStrSet *set);
|
||||||
|
|
32
src/fcstr.c
32
src/fcstr.c
|
@ -37,11 +37,12 @@ FcStrCopy (const FcChar8 *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
static FcChar8 *
|
static FcChar8 *
|
||||||
FcStrMakePair (const FcChar8 *s1, const FcChar8 *s2)
|
FcStrMakeTriple (const FcChar8 *s1, const FcChar8 *s2, const FcChar8 *s3)
|
||||||
{
|
{
|
||||||
int s1l = s1 ? strlen ((char *) s1) : 0;
|
int s1l = s1 ? strlen ((char *) s1) : 0;
|
||||||
int s2l = s2 ? strlen ((char *) s2) : 0;
|
int s2l = s2 ? strlen ((char *) s2) : 0;
|
||||||
int l = s1l + 1 + s2l + 1;
|
int s3l = s3 ? strlen ((char *) s3) : 0;
|
||||||
|
int l = s1l + 1 + s2l + 1 + s3l + 1;
|
||||||
FcChar8 *s = malloc (l);
|
FcChar8 *s = malloc (l);
|
||||||
|
|
||||||
if (!s)
|
if (!s)
|
||||||
|
@ -54,6 +55,10 @@ FcStrMakePair (const FcChar8 *s1, const FcChar8 *s2)
|
||||||
memcpy (s + s1l + 1, s2, s2l + 1);
|
memcpy (s + s1l + 1, s2, s2l + 1);
|
||||||
else
|
else
|
||||||
s[s1l + 1] = '\0';
|
s[s1l + 1] = '\0';
|
||||||
|
if (s3)
|
||||||
|
memcpy (s + s1l + 1 + s2l + 1, s3, s3l + 1);
|
||||||
|
else
|
||||||
|
s[s1l + 1 + s2l + 1] = '\0';
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1255,9 +1260,9 @@ FcStrSetAdd (FcStrSet *set, const FcChar8 *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcStrSetAddPair (FcStrSet *set, const FcChar8 *a, const FcChar8 *b)
|
FcStrSetAddTriple (FcStrSet *set, const FcChar8 *a, const FcChar8 *b, const FcChar8 *c)
|
||||||
{
|
{
|
||||||
FcChar8 *new = FcStrMakePair (a, b);
|
FcChar8 *new = FcStrMakeTriple (a, b, c);
|
||||||
if (!new)
|
if (!new)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
if (!_FcStrSetAppend (set, new))
|
if (!_FcStrSetAppend (set, new))
|
||||||
|
@ -1268,8 +1273,8 @@ FcStrSetAddPair (FcStrSet *set, const FcChar8 *a, const FcChar8 *b)
|
||||||
return FcTrue;
|
return FcTrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
FcChar8 *
|
const FcChar8 *
|
||||||
FcStrPairSecond (FcChar8 *str)
|
FcStrTripleSecond (FcChar8 *str)
|
||||||
{
|
{
|
||||||
FcChar8 *second = str + strlen((char *) str) + 1;
|
FcChar8 *second = str + strlen((char *) str) + 1;
|
||||||
|
|
||||||
|
@ -1278,6 +1283,17 @@ FcStrPairSecond (FcChar8 *str)
|
||||||
return second;
|
return second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FcChar8 *
|
||||||
|
FcStrTripleThird (FcChar8 *str)
|
||||||
|
{
|
||||||
|
FcChar8 *second = str + strlen ((char *) str) + 1;
|
||||||
|
FcChar8 *third = second + strlen ((char *) second) + 1;
|
||||||
|
|
||||||
|
if (*third == '\0')
|
||||||
|
return 0;
|
||||||
|
return third;
|
||||||
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s)
|
FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s)
|
||||||
{
|
{
|
||||||
|
@ -1293,7 +1309,7 @@ FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s)
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcStrSetAddFilenamePair (FcStrSet *set, const FcChar8 *a, const FcChar8 *b)
|
FcStrSetAddFilenamePairWithSalt (FcStrSet *set, const FcChar8 *a, const FcChar8 *b, const FcChar8 *salt)
|
||||||
{
|
{
|
||||||
FcChar8 *new_a = NULL;
|
FcChar8 *new_a = NULL;
|
||||||
FcChar8 *new_b = NULL;
|
FcChar8 *new_b = NULL;
|
||||||
|
@ -1315,7 +1331,7 @@ FcStrSetAddFilenamePair (FcStrSet *set, const FcChar8 *a, const FcChar8 *b)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = FcStrSetAddPair (set, new_a, new_b);
|
ret = FcStrSetAddTriple (set, new_a, new_b, salt);
|
||||||
if (new_a)
|
if (new_a)
|
||||||
FcStrFree (new_a);
|
FcStrFree (new_a);
|
||||||
if (new_b)
|
if (new_b)
|
||||||
|
|
10
src/fcxml.c
10
src/fcxml.c
|
@ -2057,7 +2057,7 @@ FcParseDescription (FcConfigParse *parse)
|
||||||
static void
|
static void
|
||||||
FcParseRemapDir (FcConfigParse *parse)
|
FcParseRemapDir (FcConfigParse *parse)
|
||||||
{
|
{
|
||||||
const FcChar8 *path, *attr, *data;
|
const FcChar8 *path, *attr, *data, *salt;
|
||||||
FcChar8 *prefix = NULL;
|
FcChar8 *prefix = NULL;
|
||||||
|
|
||||||
data = FcStrBufDoneStatic (&parse->pstack->str);
|
data = FcStrBufDoneStatic (&parse->pstack->str);
|
||||||
|
@ -2073,12 +2073,13 @@ FcParseRemapDir (FcConfigParse *parse)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
attr = FcConfigGetAttribute (parse, "prefix");
|
attr = FcConfigGetAttribute (parse, "prefix");
|
||||||
|
salt = FcConfigGetAttribute (parse, "salt");
|
||||||
prefix = _get_real_path_from_prefix (parse, data, attr);
|
prefix = _get_real_path_from_prefix (parse, data, attr);
|
||||||
if (!prefix || prefix[0] == 0)
|
if (!prefix || prefix[0] == 0)
|
||||||
FcConfigMessage (parse, FcSevereWarning, "empty font directory name for remap ignored");
|
FcConfigMessage (parse, FcSevereWarning, "empty font directory name for remap ignored");
|
||||||
else if (!parse->scanOnly && (!FcStrUsesHome (prefix) || FcConfigHome ()))
|
else if (!parse->scanOnly && (!FcStrUsesHome (prefix) || FcConfigHome ()))
|
||||||
{
|
{
|
||||||
if (!FcConfigAddFontDir (parse->config, prefix, path))
|
if (!FcConfigAddFontDir (parse->config, prefix, path, salt))
|
||||||
FcConfigMessage (parse, FcSevereError, "out of memory; cannot create remap data for %s as %s", prefix, path);
|
FcConfigMessage (parse, FcSevereError, "out of memory; cannot create remap data for %s as %s", prefix, path);
|
||||||
}
|
}
|
||||||
FcStrBufDestroy (&parse->pstack->str);
|
FcStrBufDestroy (&parse->pstack->str);
|
||||||
|
@ -2237,7 +2238,7 @@ FcParseUnary (FcConfigParse *parse, FcOp op)
|
||||||
static void
|
static void
|
||||||
FcParseDir (FcConfigParse *parse)
|
FcParseDir (FcConfigParse *parse)
|
||||||
{
|
{
|
||||||
const FcChar8 *attr, *data;
|
const FcChar8 *attr, *data, *salt;
|
||||||
FcChar8 *prefix = NULL;
|
FcChar8 *prefix = NULL;
|
||||||
|
|
||||||
data = FcStrBufDoneStatic (&parse->pstack->str);
|
data = FcStrBufDoneStatic (&parse->pstack->str);
|
||||||
|
@ -2247,12 +2248,13 @@ FcParseDir (FcConfigParse *parse)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
attr = FcConfigGetAttribute (parse, "prefix");
|
attr = FcConfigGetAttribute (parse, "prefix");
|
||||||
|
salt = FcConfigGetAttribute (parse, "salt");
|
||||||
prefix = _get_real_path_from_prefix (parse, data, attr);
|
prefix = _get_real_path_from_prefix (parse, data, attr);
|
||||||
if (!prefix || prefix[0] == 0)
|
if (!prefix || prefix[0] == 0)
|
||||||
FcConfigMessage (parse, FcSevereWarning, "empty font directory name ignored");
|
FcConfigMessage (parse, FcSevereWarning, "empty font directory name ignored");
|
||||||
else if (!parse->scanOnly && (!FcStrUsesHome (prefix) || FcConfigHome ()))
|
else if (!parse->scanOnly && (!FcStrUsesHome (prefix) || FcConfigHome ()))
|
||||||
{
|
{
|
||||||
if (!FcConfigAddFontDir (parse->config, prefix, NULL))
|
if (!FcConfigAddFontDir (parse->config, prefix, NULL, salt))
|
||||||
FcConfigMessage (parse, FcSevereError, "out of memory; cannot add directory %s", prefix);
|
FcConfigMessage (parse, FcSevereError, "out of memory; cannot add directory %s", prefix);
|
||||||
}
|
}
|
||||||
FcStrBufDestroy (&parse->pstack->str);
|
FcStrBufDestroy (&parse->pstack->str);
|
||||||
|
|
|
@ -172,6 +172,53 @@ if cmp flist1 flist2 > /dev/null ; then : ; else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
rm -rf $TESTTMPDIR out1 out2 xxx flist1 flist2 bind-fonts.conf
|
rm -rf $TESTTMPDIR out1 out2 xxx flist1 flist2 bind-fonts.conf
|
||||||
|
|
||||||
|
dotest "Different directory content between host and sandbox"
|
||||||
|
prep
|
||||||
|
cp $FONT1 $FONTDIR
|
||||||
|
$FCCACHE $FONTDIR
|
||||||
|
sleep 1
|
||||||
|
ls -1 --color=no $CACHEDIR/*cache*> out1
|
||||||
|
stat -c '%n %s %y %z' `cat out1` > stat1
|
||||||
|
TESTTMPDIR=`mktemp -d /tmp/fontconfig.XXXXXXXX`
|
||||||
|
TESTTMP2DIR=`mktemp -d /tmp/fontconfig.XXXXXXXX`
|
||||||
|
cp $FONT2 $TESTTMP2DIR
|
||||||
|
sed "s!@FONTDIR@!$TESTTMPDIR/fonts</dir><dir salt="'"'"salt-to-make-different"'"'">$FONTDIR!
|
||||||
|
s!@REMAPDIR@!<remap-dir as-path="'"'"$FONTDIR"'"'">$TESTTMPDIR/fonts</remap-dir>!
|
||||||
|
s!@CACHEDIR@!$TESTTMPDIR/cache.dir!" < $TESTDIR/fonts.conf.in > bind-fonts.conf
|
||||||
|
$BWRAP --bind / / --bind $CACHEDIR $TESTTMPDIR/cache.dir --bind $FONTDIR $TESTTMPDIR/fonts --bind $TESTTMP2DIR $FONTDIR --bind .. $TESTTMPDIR/build --dev-bind /dev /dev --setenv FONTCONFIG_FILE $TESTTMPDIR/build/test/bind-fonts.conf $TESTTMPDIR/build/fc-match/fc-match$EXEEXT -f "%{file}\n" ":foundry=Misc" > xxx
|
||||||
|
$BWRAP --bind / / --bind $CACHEDIR $TESTTMPDIR/cache.dir --bind $FONTDIR $TESTTMPDIR/fonts --bind $TESTTMP2DIR $FONTDIR --bind .. $TESTTMPDIR/build --dev-bind /dev /dev --setenv FONTCONFIG_FILE $TESTTMPDIR/build/test/bind-fonts.conf $TESTTMPDIR/build/test/test-bz106618$EXEEXT | sort > flist1
|
||||||
|
$BWRAP --bind / / --bind $CACHEDIR $TESTTMPDIR/cache.dir --bind $FONTDIR $TESTTMPDIR/fonts --bind $TESTTMP2DIR $FONTDIR --bind .. $TESTTMPDIR/build --dev-bind /dev /dev find $TESTTMPDIR/fonts/ -type f -name '*.pcf' | sort > flist2
|
||||||
|
ls -1 --color=no $CACHEDIR/*cache* > out2
|
||||||
|
stat -c '%n %s %y %z' `cat out1` > stat2
|
||||||
|
if cmp stat1 stat2 > /dev/null ; then : ; else
|
||||||
|
echo "*** Test failed: $TEST"
|
||||||
|
echo "cache was created/updated."
|
||||||
|
cat stat1 stat2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if grep -v -- "`cat out1`" out2 > /dev/null ; then : ; else
|
||||||
|
echo "*** Test failed: $TEST"
|
||||||
|
echo "cache wasn't created for dir inside sandbox."
|
||||||
|
cat out1 out2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ x`cat xxx` != "x$TESTTMPDIR/fonts/4x6.pcf" ]; then
|
||||||
|
echo "*** Test failed: $TEST"
|
||||||
|
echo "file property doesn't point to the new place: $TESTTMPDIR/fonts/4x6.pcf"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if cmp flist1 flist2 > /dev/null ; then
|
||||||
|
echo "*** Test failed: $TEST"
|
||||||
|
echo "Missing fonts should be available on sandbox"
|
||||||
|
echo "Expected result:"
|
||||||
|
cat flist2
|
||||||
|
echo "Actual result:"
|
||||||
|
cat flist1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm -rf $TESTTMPDIR $TESTTMP2DIR out1 out2 xxx flist1 flist2 stat1 stat2 bind-fonts.conf
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "x$EXEEXT" = "x" ]; then
|
if [ "x$EXEEXT" = "x" ]; then
|
||||||
|
|
Loading…
Reference in New Issue