Commit 4f7f3bf9 authored by Akira TAGOH's avatar Akira TAGOH

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's avatarJosh Triplett <>
parent 8cc44981
......@@ -43,6 +43,14 @@
#include <dirent.h>
#include <string.h>
# ifdef _WIN32
# define FC_DIR_SEPARATOR_S "\\"
# else
# define FC_DIR_SEPARATOR_S "/"
# endif
#if defined (_WIN32)
#define STRICT
#include <windows.h>
......@@ -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"
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);
if (!FcAtomicReplaceOrig(atomic))
goto bail3;
FcAtomicUnlock (atomic);
FcAtomicDestroy (atomic);
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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment