]> git.wh0rd.org - fontconfig.git/blobdiff - fc-cache/fc-cache.c
#ifdef out old cache stuff, replace with first version of new mmapping
[fontconfig.git] / fc-cache / fc-cache.c
index b3d0f3f80ba6e1175b3eefa92ed400013a1fbfdf..7d01ccf9997f2490e4469fbfd9198be1d07cbca3 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * $XFree86: xc/lib/fontconfig/fc-cache/fc-cache.c,v 1.2 2002/02/15 07:36:14 keithp Exp $
+ * $RCSId: xc/lib/fontconfig/fc-cache/fc-cache.c,v 1.8tsi Exp $
  *
- * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2002 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 
 #include <fontconfig/fontconfig.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #else
@@ -47,6 +51,7 @@
 #include <getopt.h>
 const struct option longopts[] = {
     {"force", 0, 0, 'f'},
+    {"system-only", 0, 0, 's'},
     {"version", 0, 0, 'V'},
     {"verbose", 0, 0, 'v'},
     {"help", 0, 0, '?'},
@@ -62,18 +67,33 @@ extern int optind, opterr, optopt;
 static void
 usage (char *program)
 {
-    fprintf (stderr, "usage: %s [-fvV?] [--force] [--verbose] [--version] [--help] [dirs]\n",
+#if HAVE_GETOPT_LONG
+    fprintf (stderr, "usage: %s [-fsvV?] [--force] [--system-only] [--verbose] [--version] [--help] [dirs]\n",
+            program);
+#else
+    fprintf (stderr, "usage: %s [-fsvV?] [dirs]\n",
             program);
+#endif
     fprintf (stderr, "Build font information caches in [dirs]\n"
             "(all directories in font configuration by default).\n");
     fprintf (stderr, "\n");
-    fprintf (stderr, "  -v, --force          scan directories with apparently valid caches\n");
+#if HAVE_GETOPT_LONG
+    fprintf (stderr, "  -f, --force          scan directories with apparently valid caches\n");
+    fprintf (stderr, "  -s, --system-only    scan system-wide directories only\n");
     fprintf (stderr, "  -v, --verbose        display status information while busy\n");
     fprintf (stderr, "  -V, --version        display font config version and exit\n");
     fprintf (stderr, "  -?, --help           display this help and exit\n");
+#else
+    fprintf (stderr, "  -f         (force)   scan directories with apparently valid caches\n");
+    fprintf (stderr, "  -s         (system)  scan system-wide directories only\n");
+    fprintf (stderr, "  -v         (verbose) display status information while busy\n");
+    fprintf (stderr, "  -V         (version) display font config version and exit\n");
+    fprintf (stderr, "  -?         (help)    display this help and exit\n");
+#endif
     exit (1);
 }
 
+#if 0
 static int
 nsubdirs (FcStrSet *set)
 {
@@ -90,13 +110,14 @@ nsubdirs (FcStrSet *set)
 }
 
 static int
-scanDirs (FcStrList *list, char *program, FcBool force, FcBool verbose)
+scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool verbose)
 {
     int                ret = 0;
     FcChar8    *dir;
     FcFontSet  *set;
     FcStrSet   *subdirs;
     FcStrList  *sublist;
+    struct stat        statb;
     
     /*
      * Now scan all of the directories into separate databases
@@ -121,11 +142,53 @@ scanDirs (FcStrList *list, char *program, FcBool force, FcBool verbose)
        {
            fprintf (stderr, "Can't create directory set\n");
            ret++;
+           FcFontSetDestroy (set);
            continue;
        }
-       if (!FcDirScan (set, subdirs, 0, FcConfigGetBlanks (0), dir, force))
+       
+       if (access ((char *) dir, W_OK) < 0)
        {
-           fprintf (stderr, "Can't scan \"%s\"\n", dir);
+           switch (errno) {
+           case ENOENT:
+           case ENOTDIR:
+               if (verbose)
+                   printf ("skipping, no such directory\n");
+               break;
+           case EACCES:
+           case EROFS:
+               if (verbose)
+                   printf ("skipping, no write access\n");
+               break;
+           default:
+               fprintf (stderr, "\"%s\": ", dir);
+               perror ("");
+               ret++;
+           }
+           FcFontSetDestroy (set);
+           FcStrSetDestroy (subdirs);
+           continue;
+       }
+       if (stat ((char *) dir, &statb) == -1)
+       {
+           fprintf (stderr, "\"%s\": ", dir);
+           perror ("");
+           FcFontSetDestroy (set);
+           FcStrSetDestroy (subdirs);
+           ret++;
+           continue;
+       }
+       if (!S_ISDIR (statb.st_mode))
+       {
+           fprintf (stderr, "\"%s\": not a directory, skipping\n", dir);
+           FcFontSetDestroy (set);
+           FcStrSetDestroy (subdirs);
+           continue;
+       }
+       if (!FcDirScan (set, subdirs, 0, FcConfigGetBlanks (config), dir, force))
+       {
+           fprintf (stderr, "\"%s\": error scanning\n", dir);
+           FcFontSetDestroy (set);
+           FcStrSetDestroy (subdirs);
            ret++;
            continue;
        }
@@ -148,18 +211,19 @@ scanDirs (FcStrList *list, char *program, FcBool force, FcBool verbose)
        }
        FcFontSetDestroy (set);
        sublist = FcStrListCreate (subdirs);
+       FcStrSetDestroy (subdirs);
        if (!sublist)
        {
            fprintf (stderr, "Can't create subdir list in \"%s\"\n", dir);
            ret++;
            continue;
        }
-       ret += scanDirs (sublist, program, force, verbose);
-       FcStrSetDestroy (subdirs);
+       ret += scanDirs (sublist, config, program, force, verbose);
     }
     FcStrListDone (list);
     return ret;
 }
+#endif
 
 int
 main (int argc, char **argv)
@@ -168,6 +232,7 @@ main (int argc, char **argv)
     FcStrList  *list;
     FcBool     verbose = FcFalse;
     FcBool     force = FcFalse;
+    FcBool     systemOnly = FcFalse;
     FcConfig   *config;
     int                i;
     int                ret;
@@ -175,15 +240,18 @@ main (int argc, char **argv)
     int                c;
 
 #if HAVE_GETOPT_LONG
-    while ((c = getopt_long (argc, argv, "fVv?", longopts, NULL)) != -1)
+    while ((c = getopt_long (argc, argv, "fsVv?", longopts, NULL)) != -1)
 #else
-    while ((c = getopt (argc, argv, "fVv?")) != -1)
+    while ((c = getopt (argc, argv, "fsVv?")) != -1)
 #endif
     {
        switch (c) {
        case 'f':
            force = FcTrue;
            break;
+       case 's':
+           systemOnly = FcTrue;
+           break;
        case 'V':
            fprintf (stderr, "fontconfig version %d.%d.%d\n", 
                     FC_MAJOR, FC_MINOR, FC_REVISION);
@@ -200,12 +268,22 @@ main (int argc, char **argv)
     i = 1;
 #endif
 
-    config = FcInitLoadConfig ();
+    if (systemOnly)
+       FcConfigEnableHome (FcFalse);
+    FcCacheForce (FcTrue);
+    /* need to use FcInitLoadConfig when we use dirs */
+    FcInit ();
+    config = FcConfigGetCurrent ();
     if (!config)
     {
        fprintf (stderr, "%s: Can't init font config library\n", argv[0]);
        return 1;
     }
+
+    /* We don't yet have per-directory caches. */
+    ret = (FcCacheWrite (config) == FcFalse);
+
+#if 0
     if (argv[i])
     {
        dirs = FcStrSetCreate ();
@@ -229,7 +307,17 @@ main (int argc, char **argv)
     }
     else
        list = FcConfigGetConfigDirs (config);
-    ret = scanDirs (list, argv[0], force, verbose);
+    ret = scanDirs (list, config, argv[0], force, verbose);
+#endif
+    /* 
+     * Now we need to sleep a second  (or two, to be extra sure), to make
+     * sure that timestamps for changes after this run of fc-cache are later
+     * then any timestamps we wrote.  We don't use gettimeofday() because
+     * sleep(3) can't be interrupted by a signal here -- this isn't in the
+     * library, and there aren't any signals flying around here.
+     */
+    FcConfigDestroy (config);
+    sleep (2);
     if (verbose)
        printf ("%s: %s\n", argv[0], ret ? "failed" : "succeeded");
     return ret;