-
- if (!FcAtomicLock (atomic))
- goto bail1;
- fd = open ((char *) FcAtomicNewFile(atomic), O_RDWR | O_CREAT,
- S_IRUSR | S_IWUSR);
- if (fd == -1)
- goto bail2;
-
- fd_orig = open ((char *) FcAtomicOrigFile(atomic), O_RDONLY);
-
- current_arch_machine_name = FcCacheMachineSignature ();
- if (fd_orig == -1)
- current_arch_start = 0;
- else
- current_arch_start = FcCacheSkipToArch (fd_orig,
- current_arch_machine_name);
-
- if (current_arch_start < 0)
- current_arch_start = FcCacheNextOffset (lseek(fd_orig, 0, SEEK_END));
-
- if (!FcCacheCopyOld(fd, fd_orig, current_arch_start))
- goto bail3;
-
- close (fd_orig);
- fd_orig = -1;
-
- current_arch_start = lseek(fd, 0, SEEK_CUR);
- if (ftruncate (fd, current_arch_start) == -1)
- goto bail3;
-
- header = malloc (10 + strlen (current_arch_machine_name));
- if (!header)
- goto bail3;
-
- truncate_to = current_arch_start + strlen(current_arch_machine_name) + 11;
- for (dir = cache->dirs; dir; dir = dir->next)
- {
- truncate_to += strlen(dir->name) + 1;
- truncate_to += sizeof (FcCache);
- truncate_to = FcCacheNextOffset (truncate_to);
- truncate_to += dir->metadata.count;
- }
- truncate_to -= current_arch_start;
-
- FcCacheWriteString (fd, FC_GLOBAL_MAGIC_COOKIE);
- sprintf (header, "%8x ", (int)truncate_to);
- strcat (header, current_arch_machine_name);
- if (!FcCacheWriteString (fd, header))
- goto bail4;
-
- for (dir = cache->dirs; dir; dir = dir->next)
- {
- if (dir->name)
- {
- FcCacheWriteString (fd, dir->name);
- write (fd, &dir->metadata, sizeof(FcCache));
- lseek (fd, FcCacheNextOffset (lseek(fd, 0, SEEK_CUR)), SEEK_SET);
- write (fd, dir->ent, dir->metadata.count);
- free (dir->ent);
- }
- }
- FcCacheWriteString (fd, "");
-
- if (close (fd) == -1)
- goto bail25;
-
- if (!FcAtomicReplaceOrig (atomic))
- goto bail25;
-
- FcAtomicUnlock (atomic);
- FcAtomicDestroy (atomic);
-
- cache->updated = FcFalse;