X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=fc-cache%2Ffc-cache.c;h=6aa53a5a76bc5c2445909f572509f6ca157fffb3;hb=cd9bca69702900ca9b24319c76b2dc9432bb548f;hp=78418d786c4cc0844f86ba1c3f41da1e9fc8a7be;hpb=ff3f1f98ed240a4cde511cace7acd09d40548656;p=fontconfig.git diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c index 78418d7..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.8tsi 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 @@ -67,16 +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); } @@ -128,6 +141,7 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool { fprintf (stderr, "Can't create directory set\n"); ret++; + FcFontSetDestroy (set); continue; } @@ -149,27 +163,35 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool 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", @@ -180,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); @@ -195,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; @@ -216,9 +245,9 @@ 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) { @@ -252,6 +281,7 @@ main (int argc, char **argv) fprintf (stderr, "%s: Can't init font config library\n", argv[0]); return 1; } + if (argv[i]) { dirs = FcStrSetCreate (); @@ -276,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;