[Fontconfig] fontconfig: Branch 'master'

Akira TAGOH tagoh at kemper.freedesktop.org
Sun Apr 22 19:30:13 PDT 2012


 doc/fccache.fncs        |    9 +++++
 doc/fcconfig.fncs       |    2 -
 fc-cache/fc-cache.c     |   73 -----------------------------------------
 fontconfig/fontconfig.h |    5 ++
 src/fccache.c           |   85 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/fccfg.c             |    2 -
 src/fcint.h             |    3 +
 7 files changed, 104 insertions(+), 75 deletions(-)

New commits:
commit 06d6b7c3120cd417af5ff47e9735aed577978354
Author: Akira TAGOH <akira at tagoh.org>
Date:   Wed Mar 28 17:28:06 2012 +0900

    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.

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.
 @@
+
+ at RET@		void
+ at FUNC@		FcCacheCreateTagFile
+ at TYPE1@		const FcConfig *		@ARG1@		config
+ at PURPOSE@	Create CACHEDIR.TAG at cache directory.
+ at 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
- at TYPE1@		FcConfig *			@ARG1@		config
+ at 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);
 


More information about the Fontconfig mailing list