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:
parent
25ccc3f3d2
commit
06d6b7c312
|
@ -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.
|
||||||
|
|
||||||
@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 @@
|
||||||
#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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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__
|
||||||
|
|
|
@ -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
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue