aboutsummaryrefslogtreecommitdiff
path: root/fontconfig/fc-cache/fc-cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'fontconfig/fc-cache/fc-cache.c')
-rw-r--r--fontconfig/fc-cache/fc-cache.c81
1 files changed, 79 insertions, 2 deletions
diff --git a/fontconfig/fc-cache/fc-cache.c b/fontconfig/fc-cache/fc-cache.c
index d2653507e..24bb2ec9f 100644
--- a/fontconfig/fc-cache/fc-cache.c
+++ b/fontconfig/fc-cache/fc-cache.c
@@ -22,8 +22,6 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-#include "../src/fcarch.h"
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#else
@@ -34,6 +32,7 @@
#endif
#include <fontconfig/fontconfig.h>
+#include "../src/fcarch.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -44,6 +43,14 @@
#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>
@@ -116,6 +123,69 @@ 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)
{
@@ -451,6 +521,13 @@ main (int argc, char **argv)
changed = 0;
ret = scanDirs (list, config, force, really_force, verbose, &changed);
+ /*
+ * Try to create CACHEDIR.TAG anyway.
+ * This expects the fontconfig cache directory already exists.
+ * If it doesn't, it won't be simply created.
+ */
+ create_tag_file (config, verbose);
+
FcStrSetDestroy (processed_dirs);
cleanCacheDirectories (config, verbose);