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 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 *
@FUNC@ FcConfigGetCacheDirs
@TYPE1@ FcConfig * @ARG1@ config
@TYPE1@ const FcConfig * @ARG1@ config
@PURPOSE@ return the list of directories searched for cache files
@DESC@
<function>FcConfigGetCacheDirs</function> returns a string list containing

View File

@ -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);

View File

@ -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);

View File

@ -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__

View File

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

View File

@ -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);