fcatomic: fallback to create a directory with FcAtomicLock

link(2) might be failed on the filesystem that doesn't support
the hard link. e.g. FcAtomicLock() always fails on FAT filesystem
when link(2) is available.
So that may be a good idea to fallback if link(2) is failed.
This commit is contained in:
Akira TAGOH 2012-05-28 15:58:56 +09:00
parent 2837c63876
commit 26160366d7
1 changed files with 9 additions and 1 deletions

View File

@ -130,6 +130,13 @@ FcAtomicLock (FcAtomic *atomic)
return FcFalse; return FcFalse;
} }
ret = link ((char *) atomic->tmp, (char *) atomic->lck); ret = link ((char *) atomic->tmp, (char *) atomic->lck);
if (ret < 0 && errno == EPERM)
{
/* the filesystem where atomic->lck points to may not supports
* the hard link. so better try to fallback
*/
ret = mkdir ((char *) atomic->lck, 0600);
}
(void) unlink ((char *) atomic->tmp); (void) unlink ((char *) atomic->tmp);
#else #else
ret = mkdir ((char *) atomic->lck, 0600); ret = mkdir ((char *) atomic->lck, 0600);
@ -195,7 +202,8 @@ void
FcAtomicUnlock (FcAtomic *atomic) FcAtomicUnlock (FcAtomic *atomic)
{ {
#ifdef HAVE_LINK #ifdef HAVE_LINK
unlink ((char *) atomic->lck); if (unlink ((char *) atomic->lck) == -1)
rmdir ((char *) atomic->lck);
#else #else
rmdir ((char *) atomic->lck); rmdir ((char *) atomic->lck);
#endif #endif