From: Patrick Lam Date: Sat, 11 Feb 2006 05:01:32 +0000 (+0000) Subject: Try to open /var/cache/fontconfig/[hashed name] before fonts.cache-2 in a X-Git-Tag: fc-2_3_94~22 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=d00c3cb5e046dfb04b446d8b0bb10880d190cc13;p=fontconfig.git Try to open /var/cache/fontconfig/[hashed name] before fonts.cache-2 in a directory, because /var/cache/fontconfig failures ought to be fixable, unlike fonts.cache-2 failures, which may leave you screwed. reviewed by: plam --- diff --git a/ChangeLog b/ChangeLog index fb6a699..7e338d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-02-10 Takashi Iwai + reviewed by: plam + * src/fccache.c (FcDirCacheOpen): + + Try to open /var/cache/fontconfig/[hashed name] before + fonts.cache-2 in a directory, because /var/cache/fontconfig + failures ought to be fixable, unlike fonts.cache-2 failures, + which may leave you screwed. + 2006-02-10 Takashi Iwai reviewed by: plam * src/fcmatch.c (FcFontSetMatch): diff --git a/src/fccache.c b/src/fccache.c index 0ec4117..7001ced 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -1019,22 +1019,21 @@ FcDirCacheOpen (const FcChar8 *dir) char name_buf[FC_MAX_FILE_LEN]; struct stat dir_stat; - cache_file = (char *)FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE); - if (!cache_file) + if (stat ((char *)dir, &dir_stat) == -1) return -1; - fd = open(cache_file, O_RDONLY | O_BINARY); - if (fd != -1) - return fd; - - if (stat ((char *)dir, &dir_stat) == -1) + cache_file = (char *)FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE); + if (!cache_file) return -1; found = FcFalse; do { - struct stat c; - FcChar8 * name_buf_dir; + struct stat c; + FcChar8 *name_buf_dir; + + if (fd >= 0) + close (fd); cache_hashed = FcDirCacheHashName (cache_file, collisions++); if (!cache_hashed) @@ -1043,18 +1042,14 @@ FcDirCacheOpen (const FcChar8 *dir) return -1; } - if (fd > 0) - close (fd); fd = open(cache_hashed, O_RDONLY | O_BINARY); FcStrFree ((FcChar8 *)cache_hashed); if (fd == -1) - { - FcStrFree ((FcChar8 *)cache_file); - return -1; - } - if (!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || !strlen(name_buf)) - goto bail; + break; + if (!FcCacheReadString (fd, name_buf, sizeof (name_buf)) || + !strlen(name_buf)) + break; name_buf_dir = FcStrDirname ((FcChar8 *)name_buf); if (stat ((char *)name_buf_dir, &c) == -1) @@ -1065,13 +1060,16 @@ FcDirCacheOpen (const FcChar8 *dir) FcStrFree (name_buf_dir); found = (c.st_ino == dir_stat.st_ino) && (c.st_dev == dir_stat.st_dev); } while (!found); - FcStrFree ((FcChar8 *)cache_file); - return fd; - bail: + if (!found || fd < 0) + { + if (fd >= 0) + close (fd); + fd = open(cache_file, O_RDONLY | O_BINARY); + } + FcStrFree ((FcChar8 *)cache_file); - close (fd); - return -1; + return fd; } /* read serialized state from the cache file */