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 <josh@joshtriplett.org>
This commit is contained in:
parent
8cc4498122
commit
4f7f3bf9f7
|
@ -43,6 +43,14 @@
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <string.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)
|
#if defined (_WIN32)
|
||||||
#define STRICT
|
#define STRICT
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -115,6 +123,68 @@ usage (char *program, int error)
|
||||||
|
|
||||||
static FcStrSet *processed_dirs;
|
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
|
static int
|
||||||
scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, int *changed)
|
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;
|
changed = 0;
|
||||||
ret = scanDirs (list, config, force, really_force, verbose, &changed);
|
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);
|
FcStrSetDestroy (processed_dirs);
|
||||||
|
|
||||||
cleanCacheDirectories (config, verbose);
|
cleanCacheDirectories (config, verbose);
|
||||||
|
|
Loading…
Reference in New Issue