Commit 06d6b7c3 authored by Akira TAGOH's avatar Akira TAGOH

Create CACHEDIR.TAG when fc-cache is run or only when the cache directory is...

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.
parent 25ccc3f3
......@@ -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>.
@@
......@@ -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
......
......@@ -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);
......
......@@ -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);
......
......@@ -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__
......@@ -471,7 +471,7 @@ FcConfigAddCacheDir (FcConfig *config,
}
FcStrList *
FcConfigGetCacheDirs (FcConfig *config)
FcConfigGetCacheDirs (const FcConfig *config)
{
if (!config)
{
......
......@@ -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);
......
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