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.
This commit is contained in:
Akira TAGOH 2012-03-28 17:28:06 +09:00
parent 25ccc3f3d2
commit 06d6b7c312
7 changed files with 104 additions and 75 deletions

View File

@ -75,3 +75,12 @@ FcCacheCopySet.
This tries to clean up the cache directory of <parameter>cache_dir</parameter>. This tries to clean up the cache directory of <parameter>cache_dir</parameter>.
This returns FcTrue if the operation is successfully complete. otherwise FcFalse. This returns FcTrue if the operation is successfully complete. otherwise FcFalse.
@@ @@
@RET@ void
@FUNC@ FcCacheCreateTagFile
@TYPE1@ const FcConfig * @ARG1@ config
@PURPOSE@ Create CACHEDIR.TAG at cache directory.
@DESC@
This tries to create CACHEDIR.TAG file at the cache directory registered
to <parameter>config</parameter>.
@@

View File

@ -154,7 +154,7 @@ simply returns NULL to indicate that no per-user file exists.
@RET@ FcStrList * @RET@ FcStrList *
@FUNC@ FcConfigGetCacheDirs @FUNC@ FcConfigGetCacheDirs
@TYPE1@ FcConfig * @ARG1@ config @TYPE1@ const FcConfig * @ARG1@ config
@PURPOSE@ return the list of directories searched for cache files @PURPOSE@ return the list of directories searched for cache files
@DESC@ @DESC@
<function>FcConfigGetCacheDirs</function> returns a string list containing <function>FcConfigGetCacheDirs</function> returns a string list containing

View File

@ -42,14 +42,6 @@
#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>
@ -122,69 +114,6 @@ 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;
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 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)
{ {
@ -435,7 +364,7 @@ main (int argc, char **argv)
* This expects the fontconfig cache directory already exists. * This expects the fontconfig cache directory already exists.
* If it doesn't, it won't be simply created. * If it doesn't, it won't be simply created.
*/ */
create_tag_file (config, verbose); FcCacheCreateTagFile (config);
FcStrSetDestroy (processed_dirs); FcStrSetDestroy (processed_dirs);

View File

@ -331,6 +331,9 @@ FcDirCacheValid (const FcChar8 *cache_file);
FcPublic FcBool FcPublic FcBool
FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose); FcDirCacheClean (const FcChar8 *cache_dir, FcBool verbose);
FcPublic void
FcCacheCreateTagFile (const FcConfig *config);
/* fccfg.c */ /* fccfg.c */
FcPublic FcChar8 * FcPublic FcChar8 *
FcConfigHome (void); FcConfigHome (void);
@ -378,7 +381,7 @@ FcPublic FcBlanks *
FcConfigGetBlanks (FcConfig *config); FcConfigGetBlanks (FcConfig *config);
FcPublic FcStrList * FcPublic FcStrList *
FcConfigGetCacheDirs (FcConfig *config); FcConfigGetCacheDirs (const FcConfig *config);
FcPublic int FcPublic int
FcConfigGetRescanInterval (FcConfig *config); FcConfigGetRescanInterval (FcConfig *config);

View File

@ -930,6 +930,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
if (FcMakeDirectory (test_dir)) if (FcMakeDirectory (test_dir))
{ {
cache_dir = test_dir; cache_dir = test_dir;
/* Create CACHEDIR.TAG */
FcDirCacheCreateTagFile (cache_dir);
break; break;
} }
} }
@ -939,6 +941,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
else if (chmod ((char *) test_dir, 0755) == 0) else if (chmod ((char *) test_dir, 0755) == 0)
{ {
cache_dir = test_dir; cache_dir = test_dir;
/* Try to create CACHEDIR.TAG too */
FcDirCacheCreateTagFile (cache_dir);
break; break;
} }
} }
@ -1408,6 +1412,87 @@ static void MD5Transform(FcChar32 buf[4], FcChar32 in[16])
buf[2] += c; buf[2] += c;
buf[3] += d; 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__ #define __fccache__
#include "fcaliastail.h" #include "fcaliastail.h"
#undef __fccache__ #undef __fccache__

View File

@ -471,7 +471,7 @@ FcConfigAddCacheDir (FcConfig *config,
} }
FcStrList * FcStrList *
FcConfigGetCacheDirs (FcConfig *config) FcConfigGetCacheDirs (const FcConfig *config)
{ {
if (!config) if (!config)
{ {

View File

@ -542,6 +542,9 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt
FcPrivate FcBool FcPrivate FcBool
FcDirCacheWrite (FcCache *cache, FcConfig *config); FcDirCacheWrite (FcCache *cache, FcConfig *config);
FcPrivate FcBool
FcDirCacheCreateTagFile (const FcChar8 *cache_dir);
FcPrivate void FcPrivate void
FcCacheObjectReference (void *object); FcCacheObjectReference (void *object);