+ FcStrSet *subdirs;
+ FcStrList *sublist;
+ struct stat statb;
+
+ /*
+ * Now scan all of the directories into separate databases
+ * and write out the results
+ */
+ while ((dir = FcStrListNext (list)))
+ {
+ if (verbose)
+ {
+ printf ("%s: \"%s\": ", program, dir);
+ fflush (stdout);
+ }
+ set = FcFontSetCreate ();
+ if (!set)
+ {
+ fprintf (stderr, "Can't create font set\n");
+ ret++;
+ continue;
+ }
+ subdirs = FcStrSetCreate ();
+ if (!subdirs)
+ {
+ fprintf (stderr, "Can't create directory set\n");
+ ret++;
+ FcFontSetDestroy (set);
+ continue;
+ }
+
+ if (access ((char *) dir, W_OK) < 0)
+ {
+ 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 (!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) && FcDirCacheHasCurrentArch (dir))
+ {
+ if (verbose)
+ printf ("skipping, %d fonts, %d dirs\n",
+ set->nfont, nsubdirs(subdirs));
+ }
+ else
+ {
+ 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))
+ {
+ 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);
+ ret++;
+ continue;
+ }
+ ret += scanDirs (sublist, config, program, force, verbose);
+ }
+ FcStrListDone (list);
+ return ret;
+}
+
+int
+main (int argc, char **argv)
+{
+ FcStrSet *dirs;
+ FcStrList *list;
+ FcBool verbose = FcFalse;
+ FcBool force = FcFalse;
+ FcBool systemOnly = FcFalse;
+ FcConfig *config;