]> git.wh0rd.org - fontconfig.git/blobdiff - fc-cache/fc-cache.c
There is no U+1257 (bug 10899).
[fontconfig.git] / fc-cache / fc-cache.c
index bda8b1468cfa7a0504cac35a821a186070ed0b2a..b4d49885d4245aacc991a72139af65c1b462a9b0 100644 (file)
@@ -22,6 +22,8 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include "../fc-arch/fcarch.h"
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #else
@@ -40,6 +42,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <dirent.h>
+#include <string.h>
 
 #if defined (_WIN32)
 #define STRICT
@@ -150,35 +153,23 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
            continue;
        }
 
-       if (access ((char *) dir, W_OK) < 0)
+       if (stat ((char *) dir, &statb) == -1)
        {
            switch (errno) {
            case ENOENT:
            case ENOTDIR:
                if (verbose)
                    printf ("skipping, no such directory\n");
-               continue;
-           case EACCES:
-           case EROFS:
-               /* That's ok, caches go to /var anyway. */
-               /* Ideally we'd do an access on the hashed_name. */
-               /* But we hid that behind an abstraction barrier. */
                break;
            default:
                fprintf (stderr, "\"%s\": ", dir);
                perror ("");
                ret++;
-
-               continue;
+               break;
            }
-       }
-       if (stat ((char *) dir, &statb) == -1)
-       {
-           fprintf (stderr, "\"%s\": ", dir);
-           perror ("");
-           ret++;
            continue;
        }
+
        if (!S_ISDIR (statb.st_mode))
        {
            fprintf (stderr, "\"%s\": not a directory, skipping\n", dir);
@@ -210,13 +201,13 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
        if (was_valid)
        {
            if (verbose)
-               printf ("skipping, %d fonts, %d dirs\n",
+               printf ("skipping, existing cache is valid: %d fonts, %d dirs\n",
                        FcCacheNumFont (cache), FcCacheNumSubdir (cache));
        }
        else
        {
            if (verbose)
-               printf ("caching, %d fonts, %d dirs\n", 
+               printf ("caching, new cache contents: %d fonts, %d dirs\n", 
                        FcCacheNumFont (cache), FcCacheNumSubdir (cache));
 
            if (!FcDirCacheValid (dir))
@@ -273,10 +264,11 @@ cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose)
        fprintf (stderr, "%s: out of memory\n", dir);
        return FcFalse;
     }
-    if (access ((char *) dir, W_OK|X_OK) != 0)
+    if (access ((char *) dir, W_OK) != 0)
     {
        if (verbose)
-           printf ("%s: not cleaning unwritable cache directory\n", dir);
+           printf ("%s: not cleaning %s cache directory\n", dir,
+                   access ((char *) dir, F_OK) == 0 ? "unwritable" : "non-existent");
        FcStrFree (dir_base);
        return FcTrue;
     }
@@ -296,6 +288,12 @@ cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose)
 
        if (ent->d_name[0] == '.')
            continue;
+       /* skip cache files for different architectures and */
+       /* files which are not cache files at all */
+       if (strlen(ent->d_name) != 32 + strlen ("-" FC_ARCHITECTURE FC_CACHE_SUFFIX) ||
+           strcmp(ent->d_name + 32, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX))
+           continue;
+       
        file_name = FcStrPlus (dir_base, (FcChar8 *) ent->d_name);
        if (!file_name)
        {
@@ -303,29 +301,31 @@ cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose)
            ret = FcFalse;
            break;
        }
+       remove = FcFalse;
        cache = FcDirCacheLoadFile (file_name, &file_stat);
        if (!cache)
-       {
-           fprintf (stderr, "%s: invalid cache file: %s\n", dir, ent->d_name);
-           FcStrFree (file_name);
-           ret = FcFalse;
-           continue;
-       }
-       target_dir = FcCacheDir (cache);
-       remove = FcFalse;
-       if (stat ((char *) target_dir, &target_stat) < 0)
        {
            if (verbose)
-               printf ("%s: %s: missing directory: %s \n",
-                       dir, ent->d_name, target_dir);
+               printf ("%s: invalid cache file: %s\n", dir, ent->d_name);
            remove = FcTrue;
        }
-       else if (target_stat.st_mtime > file_stat.st_mtime)
+       else
        {
-           if (verbose)
-               printf ("%s: %s: cache outdated: %s\n",
-                       dir, ent->d_name, target_dir);
-           remove = FcTrue;
+           target_dir = FcCacheDir (cache);
+           if (stat ((char *) target_dir, &target_stat) < 0)
+           {
+               if (verbose)
+                   printf ("%s: %s: missing directory: %s \n",
+                           dir, ent->d_name, target_dir);
+               remove = FcTrue;
+           }
+           else if (target_stat.st_mtime > file_stat.st_mtime)
+           {
+               if (verbose)
+                   printf ("%s: %s: cache outdated: %s\n",
+                           dir, ent->d_name, target_dir);
+               remove = FcTrue;
+           }
        }
        if (remove)
        {