From 4f7f3bf9f78843be5b39eb64acfeb02ffcd8e3a4 Mon Sep 17 00:00:00 2001 From: Akira TAGOH Date: Wed, 21 Mar 2012 16:06:37 +0900 Subject: [PATCH] Bug 39914 - Please tag the cache directory with CACHEDIR.TAG fc-cache: Create CACHEDIR.TAG at the top of the cache directory. Reviewed-by: Josh Triplett --- fc-cache/fc-cache.c | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c index deb4aa8..10bbea5 100644 --- a/fc-cache/fc-cache.c +++ b/fc-cache/fc-cache.c @@ -43,6 +43,14 @@ #include #include +#ifndef FC_DIR_SEPARATOR_S +# ifdef _WIN32 +# define FC_DIR_SEPARATOR_S "\\" +# else +# define FC_DIR_SEPARATOR_S "/" +# endif +#endif + #if defined (_WIN32) #define STRICT #include @@ -115,6 +123,68 @@ usage (char *program, int error) static FcStrSet *processed_dirs; +/* Create CACHEDIR.TAG */ +static FcBool +create_tag_file (FcConfig *config, FcBool verbose) +{ + FcChar8 *cache_tag; + FcChar8 *cache_dir = NULL; + FcStrList *list; + int fd; + FcAtomic *atomic; + static const FcChar8 cache_tag_contents[] = + "Signature: 8a477f597d28d172789f06886806bc55\n" + "# This file is a cache directory tag created by fontconfig.\n" + "# For information about cache directory tags, see:\n" + "# http://www.brynosaurus.com/cachedir/\n"; + static size_t cache_tag_contents_size = 0; + FcBool ret = FcTrue; + + if (cache_tag_contents_size == 0) + cache_tag_contents_size = strlen((char *)cache_tag_contents); + + list = FcConfigGetCacheDirs(config); + if (!list) + return FcFalse; + + while ((cache_dir = FcStrListNext (list))) + { + if (access ((char *) cache_dir, W_OK|X_OK) == 0) + { + if (verbose) + printf ("Create CACHEDIR.TAG at %s\n", cache_dir); + /* Create CACHEDIR.TAG */ + cache_tag = FcStrPlus (cache_dir, (const FcChar8 *) FC_DIR_SEPARATOR_S "CACHEDIR.TAG"); + if (!cache_tag) + return FcFalse; + atomic = FcAtomicCreate ((FcChar8 *)cache_tag); + if (!atomic) + goto bail1; + if (!FcAtomicLock (atomic)) + goto bail2; + fd = open((char *)FcAtomicNewFile (atomic), O_RDWR | O_CREAT, 0644); + if (fd == -1) + goto bail3; + + write(fd, cache_tag_contents, cache_tag_contents_size); + close(fd); + + if (!FcAtomicReplaceOrig(atomic)) + goto bail3; + + bail3: + FcAtomicUnlock (atomic); + bail2: + FcAtomicDestroy (atomic); + bail1: + FcStrFree (cache_tag); + } + } + FcStrListDone (list); + + return ret; +} + static int scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, int *changed) { @@ -450,6 +520,13 @@ main (int argc, char **argv) changed = 0; ret = scanDirs (list, config, force, really_force, verbose, &changed); + /* + * Try to create CACHEDIR.TAG anyway. + * This expects the fontconfig cache directory already exists. + * If it doesn't, it won't be simply created. + */ + create_tag_file (config, verbose); + FcStrSetDestroy (processed_dirs); cleanCacheDirectories (config, verbose);