X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=fc-cache%2Ffc-cache.c;h=6aa53a5a76bc5c2445909f572509f6ca157fffb3;hb=cd9bca69702900ca9b24319c76b2dc9432bb548f;hp=00cf7fde4fb77004b4349ed0e98867a3153d66ab;hpb=5d43e799197d2758102b699f9bc12b3c116a9b80;p=fontconfig.git diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c index 00cf7fd..6aa53a5 100644 --- a/fc-cache/fc-cache.c +++ b/fc-cache/fc-cache.c @@ -1,7 +1,7 @@ /* - * $XFree86: xc/lib/fontconfig/fc-cache/fc-cache.c,v 1.7 2002/08/11 15:09:33 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 @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -50,6 +51,7 @@ #include const struct option longopts[] = { {"force", 0, 0, 'f'}, + {"system-only", 0, 0, 's'}, {"version", 0, 0, 'V'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, '?'}, @@ -65,15 +67,29 @@ 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"); +#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); } @@ -125,36 +141,57 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool { fprintf (stderr, "Can't create directory set\n"); ret++; + FcFontSetDestroy (set); continue; } - if (stat ((char *) dir, &statb) == -1) + if (access ((char *) dir, W_OK) < 0) { - if (errno == ENOENT || errno == ENOTDIR) - { + switch (errno) { + case ENOENT: + case ENOTDIR: if (verbose) - printf ("no such directory, skipping\n"); - } - else - { + 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)) + if (!FcDirScanConfig (set, subdirs, 0, FcConfigGetBlanks (config), dir, force, config)) { fprintf (stderr, "\"%s\": error scanning\n", dir); + FcFontSetDestroy (set); + FcStrSetDestroy (subdirs); ret++; continue; } - if (!force && FcDirCacheValid (dir)) + if (!force && FcDirCacheValid (dir) && FcDirCacheHasCurrentArch (dir)) { if (verbose) printf ("skipping, %d fonts, %d dirs\n", @@ -165,14 +202,22 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool if (verbose) printf ("caching, %d fonts, %d dirs\n", set->nfont, nsubdirs (subdirs)); + + if (!FcDirCacheValid (dir)) + if (!FcDirCacheUnlink (dir)) + ret++; + if (!FcDirSave (set, subdirs, dir)) { - fprintf (stderr, "Can't save cache in \"%s\"\n", dir); + if (!ret) + fprintf (stderr, "Caches are currently saved to \"%s\"\n", PKGCACHEDIR); + fprintf (stderr, "Can't save cache for \"%s\"\n", dir); ret++; } } FcFontSetDestroy (set); sublist = FcStrListCreate (subdirs); + FcStrSetDestroy (subdirs); if (!sublist) { fprintf (stderr, "Can't create subdir list in \"%s\"\n", dir); @@ -180,7 +225,6 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool continue; } ret += scanDirs (sublist, config, program, force, verbose); - FcStrSetDestroy (subdirs); } FcStrListDone (list); return ret; @@ -193,6 +237,7 @@ main (int argc, char **argv) FcStrList *list; FcBool verbose = FcFalse; FcBool force = FcFalse; + FcBool systemOnly = FcFalse; FcConfig *config; int i; int ret; @@ -200,15 +245,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); @@ -225,12 +273,15 @@ main (int argc, char **argv) i = 1; #endif + if (systemOnly) + FcConfigEnableHome (FcFalse); config = FcInitLoadConfig (); if (!config) { fprintf (stderr, "%s: Can't init font config library\n", argv[0]); return 1; } + if (argv[i]) { dirs = FcStrSetCreate (); @@ -255,6 +306,15 @@ main (int argc, char **argv) else list = FcConfigGetConfigDirs (config); ret = scanDirs (list, config, argv[0], force, verbose); + /* + * 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;