Compare device numbers as well as inodes. Always normalize directory names
before comparing them. Allocate extra space for appended '/' in directory name. reviewed by: plam
This commit is contained in:
parent
df3efc11a9
commit
8a0b0ed6d0
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,22 @@
|
||||||
|
2006-01-14 Patrick Lam <plam@mit.edu>
|
||||||
|
* fc-cache/fc-cache.c (scanDirs):
|
||||||
|
* fontconfig/fontconfig.h:
|
||||||
|
* src/fccache.c (FcGlobalCacheReadDir, FcGlobalCacheUpdate,
|
||||||
|
FcGlobalCacheSave, FcDirCacheUnlink, FcDirCacheOpen):
|
||||||
|
* src/fccfg.c (FcConfigBuildFonts, FcConfigNormalizeFontDir):
|
||||||
|
* src/fcdir.c (FcDirScanConfig):
|
||||||
|
* src/fcint.h:
|
||||||
|
|
||||||
|
Compare device numbers as well as inodes.
|
||||||
|
Always normalize directory names before comparing them.
|
||||||
|
|
||||||
|
2006-01-11 Mike Fabian <mfabian@suse.de>
|
||||||
|
reviewed by: plam
|
||||||
|
|
||||||
|
* fc-cat/fc-cat.c (FcCacheGlobalFileReadAndPrint):
|
||||||
|
|
||||||
|
Allocate extra space for appended '/' in directory name.
|
||||||
|
|
||||||
2006-01-10 Patrick Lam <plam@mit.edu>
|
2006-01-10 Patrick Lam <plam@mit.edu>
|
||||||
* src/fccache.c (FcDirCacheConsume, FcDirCacheOpen,
|
* src/fccache.c (FcDirCacheConsume, FcDirCacheOpen,
|
||||||
FcDirCacheValid, FcDirCacheHasCurrentArch,
|
FcDirCacheValid, FcDirCacheHasCurrentArch,
|
||||||
|
|
|
@ -204,7 +204,7 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool
|
||||||
set->nfont, nsubdirs (subdirs));
|
set->nfont, nsubdirs (subdirs));
|
||||||
|
|
||||||
if (!FcDirCacheValid (dir))
|
if (!FcDirCacheValid (dir))
|
||||||
if (!FcDirCacheUnlink (dir))
|
if (!FcDirCacheUnlink (dir, config))
|
||||||
ret++;
|
ret++;
|
||||||
|
|
||||||
if (!FcDirSave (set, subdirs, dir))
|
if (!FcDirSave (set, subdirs, dir))
|
||||||
|
|
|
@ -205,7 +205,11 @@ FcCacheGlobalFileReadAndPrint (FcFontSet * set, FcStrSet *dirs, char *cache_file
|
||||||
if (!FcDirCacheConsume (fd, name_buf, set, 0))
|
if (!FcDirCacheConsume (fd, name_buf, set, 0))
|
||||||
goto bail1;
|
goto bail1;
|
||||||
|
|
||||||
dir = strdup(name_buf);
|
dir = malloc (strlen (name_buf) + 2);
|
||||||
|
if (!dir)
|
||||||
|
goto bail1;
|
||||||
|
|
||||||
|
strcpy (dir, name_buf);
|
||||||
strcat (dir, "/");
|
strcat (dir, "/");
|
||||||
|
|
||||||
FcCachePrintSet (set, dirs, dir);
|
FcCachePrintSet (set, dirs, dir);
|
||||||
|
|
|
@ -282,7 +282,7 @@ FcBool
|
||||||
FcDirCacheHasCurrentArch (const FcChar8 *dir);
|
FcDirCacheHasCurrentArch (const FcChar8 *dir);
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcDirCacheUnlink (const FcChar8 *dir);
|
FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config);
|
||||||
|
|
||||||
/* fcblanks.c */
|
/* fcblanks.c */
|
||||||
FcBlanks *
|
FcBlanks *
|
||||||
|
|
|
@ -304,6 +304,7 @@ FcGlobalCacheReadDir (FcFontSet *set, FcStrSet *dirs, FcGlobalCache * cache, con
|
||||||
if (cache->fd == -1)
|
if (cache->fd == -1)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
|
|
||||||
|
dir = (char *)FcConfigNormalizeFontDir (config, (FcChar8 *)dir);
|
||||||
for (d = cache->dirs; d; d = d->next)
|
for (d = cache->dirs; d; d = d->next)
|
||||||
{
|
{
|
||||||
if (strncmp (d->name, dir, strlen(dir)) == 0)
|
if (strncmp (d->name, dir, strlen(dir)) == 0)
|
||||||
|
@ -322,10 +323,12 @@ FcGlobalCacheReadDir (FcFontSet *set, FcStrSet *dirs, FcGlobalCache * cache, con
|
||||||
FcBool
|
FcBool
|
||||||
FcGlobalCacheUpdate (FcGlobalCache *cache,
|
FcGlobalCacheUpdate (FcGlobalCache *cache,
|
||||||
const char *name,
|
const char *name,
|
||||||
FcFontSet *set)
|
FcFontSet *set,
|
||||||
|
FcConfig *config)
|
||||||
{
|
{
|
||||||
FcGlobalCacheDir * d;
|
FcGlobalCacheDir * d;
|
||||||
|
|
||||||
|
name = (char *)FcConfigNormalizeFontDir (config, (FcChar8 *)name);
|
||||||
for (d = cache->dirs; d; d = d->next)
|
for (d = cache->dirs; d; d = d->next)
|
||||||
{
|
{
|
||||||
if (strcmp(d->name, name) == 0)
|
if (strcmp(d->name, name) == 0)
|
||||||
|
@ -351,7 +354,8 @@ FcGlobalCacheUpdate (FcGlobalCache *cache,
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcGlobalCacheSave (FcGlobalCache *cache,
|
FcGlobalCacheSave (FcGlobalCache *cache,
|
||||||
const FcChar8 *cache_file)
|
const FcChar8 *cache_file,
|
||||||
|
FcConfig *config)
|
||||||
{
|
{
|
||||||
int fd, fd_orig;
|
int fd, fd_orig;
|
||||||
FcGlobalCacheDir *dir;
|
FcGlobalCacheDir *dir;
|
||||||
|
@ -425,7 +429,9 @@ FcGlobalCacheSave (FcGlobalCache *cache,
|
||||||
{
|
{
|
||||||
if (dir->name)
|
if (dir->name)
|
||||||
{
|
{
|
||||||
FcCacheWriteString (fd, dir->name);
|
const char * d = (const char *)FcConfigNormalizeFontDir (config, (const FcChar8 *)dir->name);
|
||||||
|
|
||||||
|
FcCacheWriteString (fd, d);
|
||||||
write (fd, &dir->metadata, sizeof(FcCache));
|
write (fd, &dir->metadata, sizeof(FcCache));
|
||||||
lseek (fd, FcCacheNextOffset (lseek(fd, 0, SEEK_CUR)), SEEK_SET);
|
lseek (fd, FcCacheNextOffset (lseek(fd, 0, SEEK_CUR)), SEEK_SET);
|
||||||
write (fd, dir->ent, dir->metadata.count);
|
write (fd, dir->ent, dir->metadata.count);
|
||||||
|
@ -649,14 +655,16 @@ FcDirCacheHasCurrentArch (const FcChar8 *dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcDirCacheUnlink (const FcChar8 *dir)
|
FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config)
|
||||||
{
|
{
|
||||||
char *cache_file = (char *)FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
|
char *cache_file;
|
||||||
char *cache_hashed;
|
char *cache_hashed;
|
||||||
int fd, collisions;
|
int fd, collisions;
|
||||||
struct stat cache_stat;
|
struct stat cache_stat;
|
||||||
char name_buf[FC_MAX_FILE_LEN];
|
char name_buf[FC_MAX_FILE_LEN];
|
||||||
|
|
||||||
|
dir = FcConfigNormalizeFontDir (config, dir);
|
||||||
|
cache_file = (char *)FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
|
||||||
if (!cache_file)
|
if (!cache_file)
|
||||||
return FcFalse;
|
return FcFalse;
|
||||||
|
|
||||||
|
@ -878,6 +886,7 @@ FcDirCacheOpen (const FcChar8 *dir)
|
||||||
if (stat ((char *)dir, &dir_stat) == -1)
|
if (stat ((char *)dir, &dir_stat) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
found = FcFalse;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
struct stat c;
|
struct stat c;
|
||||||
|
|
|
@ -325,7 +325,7 @@ FcConfigBuildFonts (FcConfig *config)
|
||||||
FcFontSetPrint (fonts);
|
FcFontSetPrint (fonts);
|
||||||
|
|
||||||
if (config->cache)
|
if (config->cache)
|
||||||
FcGlobalCacheSave (cache, config->cache);
|
FcGlobalCacheSave (cache, config->cache, config);
|
||||||
FcGlobalCacheDestroy (cache);
|
FcGlobalCacheDestroy (cache);
|
||||||
FcStrSetDestroy (oldDirs);
|
FcStrSetDestroy (oldDirs);
|
||||||
|
|
||||||
|
@ -394,18 +394,19 @@ FcConfigNormalizeFontDir (FcConfig *config,
|
||||||
{
|
{
|
||||||
/* If this is a bottleneck, we can cache the fontDir inodes. */
|
/* If this is a bottleneck, we can cache the fontDir inodes. */
|
||||||
ino_t di;
|
ino_t di;
|
||||||
|
dev_t dd;
|
||||||
int n;
|
int n;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
|
||||||
if (stat ((char *)d, &s) == -1)
|
if (stat ((char *)d, &s) == -1)
|
||||||
return 0;
|
return 0;
|
||||||
di = s.st_ino;
|
di = s.st_ino; dd = s.st_dev;
|
||||||
|
|
||||||
for (n = 0; n < config->fontDirs->num; n++)
|
for (n = 0; n < config->fontDirs->num; n++)
|
||||||
{
|
{
|
||||||
if (stat ((char *)config->fontDirs->strs[n], &s) == -1)
|
if (stat ((char *)config->fontDirs->strs[n], &s) == -1)
|
||||||
continue;
|
continue;
|
||||||
if (di == s.st_ino)
|
if (di == s.st_ino && dd == s.st_dev)
|
||||||
return config->fontDirs->strs[n];
|
return config->fontDirs->strs[n];
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -188,7 +188,7 @@ FcDirScanConfig (FcFontSet *set,
|
||||||
* add the cache entry
|
* add the cache entry
|
||||||
*/
|
*/
|
||||||
if (ret && cache)
|
if (ret && cache)
|
||||||
FcGlobalCacheUpdate (cache, (char *)dir, tmpSet);
|
FcGlobalCacheUpdate (cache, (char *)dir, tmpSet, config);
|
||||||
|
|
||||||
for (i = 0; i < tmpSet->nfont; i++)
|
for (i = 0; i < tmpSet->nfont; i++)
|
||||||
FcFontSetAdd (set, tmpSet->fonts[i]);
|
FcFontSetAdd (set, tmpSet->fonts[i]);
|
||||||
|
|
|
@ -448,11 +448,13 @@ FcGlobalCacheLoad (FcGlobalCache *cache,
|
||||||
FcBool
|
FcBool
|
||||||
FcGlobalCacheUpdate (FcGlobalCache *cache,
|
FcGlobalCacheUpdate (FcGlobalCache *cache,
|
||||||
const char *file,
|
const char *file,
|
||||||
FcFontSet *set);
|
FcFontSet *set,
|
||||||
|
FcConfig *config);
|
||||||
|
|
||||||
FcBool
|
FcBool
|
||||||
FcGlobalCacheSave (FcGlobalCache *cache,
|
FcGlobalCacheSave (FcGlobalCache *cache,
|
||||||
const FcChar8 *cache_file);
|
const FcChar8 *cache_file,
|
||||||
|
FcConfig *config);
|
||||||
|
|
||||||
FcFontSet *
|
FcFontSet *
|
||||||
FcCacheRead (FcConfig *config, FcGlobalCache * cache);
|
FcCacheRead (FcConfig *config, FcGlobalCache * cache);
|
||||||
|
|
Loading…
Reference in New Issue