summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Lam <plam@MIT.EDU>2005-10-05 00:34:52 +0000
committerPatrick Lam <plam@MIT.EDU>2005-10-05 00:34:52 +0000
commit55c8fa4f08b86f4e9af97920a61943f5facd7822 (patch)
treed401da94eee1c388f0dbd39e981444075b07a916
parent6bf2380478f825a6135527133a03869e0ae18742 (diff)
Add new API which unlinks directory caches and checks dir caches for
existence of appropriate sections. Fix fc-cache to unlink stale cache files and save directory caches that lack relevant sections.
-rw-r--r--ChangeLog11
-rw-r--r--fc-cache/fc-cache.c6
-rw-r--r--fontconfig/fontconfig.h6
-rw-r--r--src/fccache.c44
4 files changed, 56 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index d85f2b2..b7cfb91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-10-04 Patrick Lam <plam@mit.edu>
+ * src/fccache.c (FcDirCacheValid, FcDirCacheUnlink,
+ FcDirCacheHasCurrentArch):
+ * fc-cache/fc-cache.c (scanDirs):
+ * fontconfig/fontconfig.h:
+
+ Add new API which unlinks directory caches and checks dir caches
+ for existence of appropriate sections. Fix fc-cache to unlink
+ stale cache files and save directory caches that lack relevant
+ sections.
+
2005-10-03 Patrick Lam <plam@mit.edu>
* src/fccache.c (FcDirCacheValid):
diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c
index 20c7c95..388baa7 100644
--- a/fc-cache/fc-cache.c
+++ b/fc-cache/fc-cache.c
@@ -191,7 +191,7 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool
ret++;
continue;
}
- if (!force && FcDirCacheValid (dir))
+ if (!force && FcDirCacheValid (dir) && FcDirCacheHasCurrentArch (dir))
{
if (verbose)
printf ("skipping, %d fonts, %d dirs\n",
@@ -203,6 +203,10 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool
printf ("caching, %d fonts, %d dirs\n",
set->nfont, nsubdirs (subdirs));
+ if (!FcDirCacheValid (dir))
+ if (!FcDirCacheUnlink (dir))
+ ret++;
+
if (!FcDirSave (set, subdirs, dir))
{
fprintf (stderr, "Can't save cache in \"%s\"\n", dir);
diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
index 34e7b8b..2ffcb24 100644
--- a/fontconfig/fontconfig.h
+++ b/fontconfig/fontconfig.h
@@ -273,6 +273,12 @@ _FCFUNCPROTOBEGIN
FcBool
FcDirCacheValid (const FcChar8 *cache_file);
+FcBool
+FcDirCacheHasCurrentArch (const FcChar8 *dir);
+
+FcBool
+FcDirCacheUnlink (const FcChar8 *dir);
+
/* fcblanks.c */
FcBlanks *
FcBlanksCreate (void);
diff --git a/src/fccache.c b/src/fccache.c
index 7ff9fc6..43e45af 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -517,14 +517,12 @@ FcCacheCopyOld (int fd, int fd_orig, off_t start)
return FcFalse;
}
+/* Does not check that the cache has the appropriate arch section. */
FcBool
FcDirCacheValid (const FcChar8 *dir)
{
FcChar8 *cache_file = FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
struct stat file_stat, dir_stat;
- int fd;
- off_t current_arch_start;
- char *current_arch_machine_name;
if (stat ((char *) dir, &dir_stat) < 0)
{
@@ -537,8 +535,28 @@ FcDirCacheValid (const FcChar8 *dir)
return FcFalse;
}
+ FcStrFree (cache_file);
+ /*
+ * If the directory has been modified more recently than
+ * the cache file, the cache is not valid
+ */
+ if (dir_stat.st_mtime - file_stat.st_mtime > 0)
+ return FcFalse;
+ return FcTrue;
+}
+
+/* Assumes that the cache file in 'dir' exists.
+ * Checks that the cache has the appropriate arch section. */
+FcBool
+FcDirCacheHasCurrentArch (const FcChar8 *dir)
+{
+ FcChar8 *cache_file = FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
+ int fd;
+ off_t current_arch_start;
+ char *current_arch_machine_name;
+
current_arch_machine_name = FcCacheMachineSignature();
- fd = open(cache_file, O_RDONLY);
+ fd = open ((char *)cache_file, O_RDONLY);
if (fd == -1)
return FcFalse;
@@ -547,14 +565,20 @@ FcDirCacheValid (const FcChar8 *dir)
if (current_arch_start < 0)
return FcFalse;
+
+ return FcTrue;
+}
- FcStrFree (cache_file);
- /*
- * If the directory has been modified more recently than
- * the cache file, the cache is not valid
- */
- if (dir_stat.st_mtime - file_stat.st_mtime > 0)
+FcBool
+FcDirCacheUnlink (const FcChar8 *dir)
+{
+ FcChar8 *cache_file = FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
+
+ if (!unlink ((char *)cache_file))
return FcFalse;
+
+ FcStrFree (cache_file);
+
return FcTrue;
}