- hex_hash[32] = 0;
-
- tmp = FcStrPlus ((FcChar8 *)hex_hash, (FcChar8 *)FC_CACHE_SUFFIX);
- if (!tmp)
- return 0;
-
- cache_hashed = (char *)FcStrPlus ((FcChar8 *)PKGCACHEDIR"/", tmp);
- free (tmp);
-
- return cache_hashed;
-}
-
-/* Opens the hashed name for cache_file.
- * This would fail in the unlikely event of a collision and subsequent
- * removal of the file which originally caused the collision. */
-static int
-FcDirCacheOpen (const FcChar8 *dir)
-{
- FcBool found;
- int fd = -1, collisions = 0;
- char *cache_file, *cache_hashed;
- char name_buf[FC_MAX_FILE_LEN];
- struct stat dir_stat;
-
- cache_file = (char *)FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
- if (!cache_file)
- return -1;
-
- fd = open(cache_file, O_RDONLY);
- if (fd != -1)
- return fd;
-
- if (stat ((char *)dir, &dir_stat) == -1)
- return -1;
-
- found = FcFalse;
- do
- {
- struct stat c;
- FcChar8 * name_buf_dir;
-
- cache_hashed = FcDirCacheHashName (cache_file, collisions++);
- if (!cache_hashed)
- {
- FcStrFree ((FcChar8 *)cache_file);
- return -1;
- }
-
- if (fd > 0)
- close (fd);
- fd = open(cache_hashed, O_RDONLY);
- FcStrFree ((FcChar8 *)cache_hashed);
-
- if (fd == -1)
- {
- FcStrFree ((FcChar8 *)cache_file);
- return -1;
- }
- FcCacheReadString (fd, name_buf, sizeof (name_buf));
- if (!strlen(name_buf))
- goto bail;
-
- name_buf_dir = FcStrDirname ((FcChar8 *)name_buf);
- if (stat ((char *)name_buf_dir, &c) == -1)
- {
- FcStrFree (name_buf_dir);
- continue;
- }
- 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:
- FcStrFree ((FcChar8 *)cache_file);
- close (fd);
- return -1;
-}
-
-/* read serialized state from the cache file */
-FcBool
-FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir, FcConfig *config)
-{
- int fd;
- char *current_arch_machine_name;
- char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
- off_t current_arch_start = 0;
- char subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
-
- fd = FcDirCacheOpen (dir);
- if (fd < 0)
- goto bail;
-
- current_arch_machine_name = FcCacheMachineSignature();
- current_arch_start = FcCacheSkipToArch(fd,
- current_arch_machine_name);
- if (current_arch_start < 0)
- goto bail1;
-
- lseek (fd, current_arch_start, SEEK_SET);
- if (FcCacheReadString (fd, candidate_arch_machine_name,
- sizeof (candidate_arch_machine_name)) == 0)
- goto bail1;
-
- while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0)
- FcStrSetAdd (dirs, (FcChar8 *)subdirName);