summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2012-03-28 17:28:06 +0900
committerAkira TAGOH <akira@tagoh.org>2012-04-23 11:26:32 +0900
commit06d6b7c3120cd417af5ff47e9735aed577978354 (patch)
tree77e31078ce2c3c4cd6c738fb886a8bf7a22d442c
parent25ccc3f3d27d8affd45c4b0a8041ef757dbb20dd (diff)
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.
-rw-r--r--doc/fccache.fncs9
-rw-r--r--doc/fcconfig.fncs2
-rw-r--r--fc-cache/fc-cache.c73
-rw-r--r--fontconfig/fontconfig.h5
-rw-r--r--src/fccache.c85
-rw-r--r--src/fccfg.c2
-rw-r--r--src/fcint.h3
7 files changed, 104 insertions, 75 deletions
diff --git a/doc/fccache.fncs b/doc/fccache.fncs
index 2f5fa47..ca8ffa0 100644
--- a/doc/fccache.fncs
+++ b/doc/fccache.fncs
@@ -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>.
+@@
diff --git a/doc/fcconfig.fncs b/doc/fcconfig.fncs
index 9b9f66e..10028b4 100644
--- a/doc/fcconfig.fncs
+++ b/doc/fcconfig.fncs
@@ -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
diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c
index b42fd35..9fb383b 100644
--- a/fc-cache/fc-cache.c
+++ b/fc-cache/fc-cache.c
@@ -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);
diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h
index b27ccb5..e4d5708 100644
--- a/fontconfig/fontconfig.h
+++ b/fontconfig/fontconfig.h
@@ -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);
diff --git a/src/fccache.c b/src/fccache.c
index b7ba1fd..fbe2d5c 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -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__
diff --git a/src/fccfg.c b/src/fccfg.c
index bd1dc34..0d0b778 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -471,7 +471,7 @@ FcConfigAddCacheDir (FcConfig *config,
}
FcStrList *
-FcConfigGetCacheDirs (FcConfig *config)
+FcConfigGetCacheDirs (const FcConfig *config)
{
if (!config)
{
diff --git a/src/fcint.h b/src/fcint.h
index ba4b388..bada325 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -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);