Commit 2e8ce635 authored by Akira TAGOH's avatar Akira TAGOH

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.
parent def1d000
...@@ -152,14 +152,25 @@ FcDirCacheBasenameMD5 (FcConfig *config, const FcChar8 *dir, FcChar8 cache_base[ ...@@ -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[ ...@@ -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;
......
...@@ -540,9 +540,10 @@ FcConfigGetConfigDirs (FcConfig *config) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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)
......
...@@ -660,7 +660,8 @@ FcConfigAddConfigDir (FcConfig *config, ...@@ -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 * ...@@ -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 ...@@ -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);
......
...@@ -37,11 +37,12 @@ FcStrCopy (const FcChar8 *s) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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)
......
...@@ -2057,7 +2057,7 @@ FcParseDescription (FcConfigParse *parse) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment