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. ...@@ -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>.
@@
...@@ -154,7 +154,7 @@ simply returns NULL to indicate that no per-user file exists. ...@@ -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
......
...@@ -42,14 +42,6 @@ ...@@ -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) ...@@ -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) ...@@ -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);
......
...@@ -331,6 +331,9 @@ FcDirCacheValid (const FcChar8 *cache_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 * ...@@ -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);
......
...@@ -930,6 +930,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config) ...@@ -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) ...@@ -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]) ...@@ -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__
...@@ -471,7 +471,7 @@ FcConfigAddCacheDir (FcConfig *config, ...@@ -471,7 +471,7 @@ FcConfigAddCacheDir (FcConfig *config,
} }
FcStrList * FcStrList *
FcConfigGetCacheDirs (FcConfig *config) FcConfigGetCacheDirs (const FcConfig *config)
{ {
if (!config) if (!config)
{ {
......
...@@ -542,6 +542,9 @@ FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcSt ...@@ -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);
......
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