From 26160366d7ba5c7baf20ae091d5dd0388714df83 Mon Sep 17 00:00:00 2001 From: Akira TAGOH Date: Mon, 28 May 2012 15:58:56 +0900 Subject: [PATCH] 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. --- src/fcatomic.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/fcatomic.c b/src/fcatomic.c index 33c1cc6..4f6ab01 100644 --- a/src/fcatomic.c +++ b/src/fcatomic.c @@ -130,6 +130,13 @@ FcAtomicLock (FcAtomic *atomic) return FcFalse; } 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); #else ret = mkdir ((char *) atomic->lck, 0600); @@ -195,7 +202,8 @@ void FcAtomicUnlock (FcAtomic *atomic) { #ifdef HAVE_LINK - unlink ((char *) atomic->lck); + if (unlink ((char *) atomic->lck) == -1) + rmdir ((char *) atomic->lck); #else rmdir ((char *) atomic->lck); #endif