]> git.wh0rd.org Git - fontconfig.git/commit
Workaround for stat() brokenness in Microsoft's C library (bug 8526)
authorTor Lillqvist <tml@iki.fi>
Wed, 14 Nov 2007 00:41:55 +0000 (16:41 -0800)
committerKeith Packard <keithp@koto.keithp.com>
Wed, 14 Nov 2007 00:41:55 +0000 (16:41 -0800)
commit8a3dc4880c1182ea446cdbc0885e956c6517cf83
treec319ed320f396d4d3e490c1d8aab1b2a1d2c28bb
parent1315db01b626aedd27e3e05bde96ce46c253629b
Workaround for stat() brokenness in Microsoft's C library (bug 8526)

Fix a couple of longstanding problems with fontconfig on Windows that
manifest themselves especially in GIMP. The root cause to the problems is in
Microsoft's incredibly stupid stat() implementation. Basically, stat()
returns wrong timestamp fields for files on NTFS filesystems on machines
that use automatic DST switching.

See for instance http://bugzilla.gnome.org/show_bug.cgi?id=154968 and
http://www.codeproject.com/datetime/dstbugs.asp

As fccache.c now looks at more fields in the stat struct I fill in them all.
I noticed that fstat() is used only on a fd just after opening it, so on
Win32 I just call my stat() replacement before opening instead...
Implementing a good replacement for fstat() would be harder because the code
in fccache.c wants to compare inode numbers. There are no (readily
accessible) inode numbers on Win32, so I fake it with the hash of the full
file name, in the case as it is on disk. And fstat() doesn't know the full
file name, so it would be rather hard to come up with a inode number to
identify the file.

The patch also adds similar handling for the cache directory as for the fonts
directory: If a cachedir element in fonts.conf contains the magic string
"WINDOWSTEMPDIR_FONTCONFIG_CACHE" it is replaced at runtime with a path under
the machine's (or user's) temp folder as returned by GetTempPath(). I don't
want to hardcode any pathnames in a fonts.conf intended to be distributed to
end-users, most of which who wouldn't know how to edit it anyway. And
requiring an installer to edit it gets complicated.
configure.in
fc-cache/Makefile.am
src/fccache.c
src/fcxml.c