doc/fccache.fncs | 9 +++++ doc/fcconfig.fncs | 2 - fc-cache/fc-cache.c | 73 ----------------------------------------- fontconfig/fontconfig.h | 5 ++ src/fccache.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ src/fccfg.c | 2 - src/fcint.h | 3 + 7 files changed, 104 insertions(+), 75 deletions(-) New commits: commit 06d6b7c3120cd417af5ff47e9735aed577978354 Author: Akira TAGOH <akira at tagoh.org> Date: Wed Mar 28 17:28:06 2012 +0900 Create CACHEDIR.TAG when fc-cache is run or only when the cache directory is created at the runtime. Also add FcCacheCreateTagFile() API to do create CACHEDIR.TAG on the cache directory. diff --git a/doc/fccache.fncs b/doc/fccache.fncs index 2f5fa47..ca8ffa0 100644 --- a/doc/fccache.fncs +++ b/doc/fccache.fncs @@ -75,3 +75,12 @@ FcCacheCopySet. This tries to clean up the cache directory of <parameter>cache_dir</parameter>. This returns FcTrue if the operation is successfully complete. otherwise FcFalse. @@ + + at RET@ void + at FUNC@ FcCacheCreateTagFile + at TYPE1@ const FcConfig * @ARG1@ config + at PURPOSE@ Create CACHEDIR.TAG at cache directory. + at DESC@ +This tries to create CACHEDIR.TAG file at the cache directory registered +to <parameter>config</parameter>. +@@ diff --git a/doc/fcconfig.fncs b/doc/fcconfig.fncs index 9b9f66e..10028b4 100644 --- a/doc/fcconfig.fncs +++ b/doc/fcconfig.fncs @@ -154,7 +154,7 @@ simply returns NULL to indicate that no per-user file exists. @RET@ FcStrList * @FUNC@ FcConfigGetCacheDirs - at TYPE1@ FcConfig * @ARG1@ config + at TYPE1@ const FcConfig * @ARG1@ config @PURPOSE@ return the list of directories searched for cache files @DESC@ <function>FcConfigGetCacheDirs</function> returns a string list containing diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c index b42fd35..9fb383b 100644 --- a/fc-cache/fc-cache.c +++ b/fc-cache/fc-cache.c @@ -42,14 +42,6 @@ #include <dirent.h> #include <string.h> -#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 <windows.h> @@ -122,69 +114,6 @@ 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; - FILE *fp; - 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 = sizeof (cache_tag_contents) - 1; - FcBool ret = FcTrue; - - 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; - fp = fdopen(fd, "wb"); - if (fp == NULL) - goto bail3; - - fwrite(cache_tag_contents, cache_tag_contents_size, sizeof (FcChar8), fp); - fclose(fp); - - 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) { @@ -435,7 +364,7 @@ main (int argc, char **argv) * This expects the fontconfig cache directory already exists. * If it doesn''t, it won''t be simply created. */ - create_tag_file (config, verbose); + FcCacheCreateTagFile (config); FcStrSetDestroy (processed_dirs); diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h index b27ccb5..e4d5708 100644 --- a/fontconfig/fontconfig.h +++ b/fontconfig/fontconfig.h @@ -331,6 +331,9 @@ FcDirCacheValid (const FcChar8 *cache_file); FcPublic FcBool FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose); +FcPublic void +FcCacheCreateTagFile (const FcConfig *config); + /* fccfg.c */ FcPublic FcChar8 * FcConfigHome (void); @@ -378,7 +381,7 @@ FcPublic FcBlanks * FcConfigGetBlanks (FcConfig *config); FcPublic FcStrList * -FcConfigGetCacheDirs (FcConfig *config); +FcConfigGetCacheDirs (const FcConfig *config); FcPublic int FcConfigGetRescanInterval (FcConfig *config); diff --git a/src/fccache.c b/src/fccache.c index b7ba1fd..fbe2d5c 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -930,6 +930,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config) if (FcMakeDirectory (test_dir)) { cache_dir = test_dir; + /* Create CACHEDIR.TAG */ + FcDirCacheCreateTagFile (cache_dir); break; } } @@ -939,6 +941,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config) else if (chmod ((char *) test_dir, 0755) == 0) { cache_dir = test_dir; + /* Try to create CACHEDIR.TAG too */ + FcDirCacheCreateTagFile (cache_dir); break; } } @@ -1408,6 +1412,87 @@ static void MD5Transform(FcChar32 buf[4], FcChar32 in[16]) buf[2] += c; buf[3] += d; } + +FcBool +FcDirCacheCreateTagFile (const FcChar8 *cache_dir) +{ + FcChar8 *cache_tag; + int fd; + FILE *fp; + 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 = sizeof (cache_tag_contents) - 1; + FcBool ret = FcFalse; + + if (!cache_dir) + return FcFalse; + + if (access ((char *) cache_dir, W_OK|X_OK) == 0) + { + /* 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; + fp = fdopen(fd, "wb"); + if (fp == NULL) + goto bail3; + + fwrite(cache_tag_contents, cache_tag_contents_size, sizeof (FcChar8), fp); + fclose(fp); + + if (!FcAtomicReplaceOrig(atomic)) + goto bail3; + + ret = FcTrue; + bail3: + FcAtomicUnlock (atomic); + bail2: + FcAtomicDestroy (atomic); + bail1: + FcStrFree (cache_tag); + } + + if (FcDebug () & FC_DBG_CACHE) + { + if (ret) + printf ("Created CACHEDIR.TAG at %s\n", cache_dir); + else + printf ("Unable to create CACHEDIR.TAG at %s\n", cache_dir); + } + + return ret; +} + +void +FcCacheCreateTagFile (const FcConfig *config) +{ + FcChar8 *cache_dir = NULL; + FcStrList *list; + + list = FcConfigGetCacheDirs (config); + if (!list) + return; + + while ((cache_dir = FcStrListNext (list))) + { + if (FcDirCacheCreateTagFile (cache_dir)) + break; + } + FcStrListDone (list); +} + #define __fccache__ #include "fcaliastail.h" #undef __fccache__ diff --git a/src/fccfg.c b/src/fccfg.c index bd1dc34..0d0b778 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -471,7 +471,7 @@ FcConfigAddCacheDir (FcConfig *config, } FcStrList * -FcConfigGetCacheDirs (FcConfig *config) +FcConfigGetCacheDirs (const FcConfig *config) { if (!config) { diff --git a/src/fcint.h b/src/fcint.h index ba4b388..bada325 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -542,6 +542,9 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt FcPrivate FcBool FcDirCacheWrite (FcCache *cache, FcConfig *config); +FcPrivate FcBool +FcDirCacheCreateTagFile (const FcChar8 *cache_dir); + FcPrivate void FcCacheObjectReference (void *object);