diff options
Diffstat (limited to 'fontconfig/fc-cache/fc-cache.c')
-rw-r--r-- | fontconfig/fc-cache/fc-cache.c | 81 |
1 files changed, 79 insertions, 2 deletions
diff --git a/fontconfig/fc-cache/fc-cache.c b/fontconfig/fc-cache/fc-cache.c index d2653507e..24bb2ec9f 100644 --- a/fontconfig/fc-cache/fc-cache.c +++ b/fontconfig/fc-cache/fc-cache.c @@ -22,8 +22,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -#include "../src/fcarch.h" - #ifdef HAVE_CONFIG_H #include <config.h> #else @@ -34,6 +32,7 @@ #endif #include <fontconfig/fontconfig.h> +#include "../src/fcarch.h" #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -44,6 +43,14 @@ #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> @@ -116,6 +123,69 @@ 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) { @@ -451,6 +521,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); |