/*
- * $XFree86: $
+ * $RCSId: xc/lib/fontconfig/src/fcatomic.c,v 1.2 2002/03/04 21:15:28 tsi Exp $
*
- * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2002 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* Uses only regular filesystem calls so it should
* work even in the absense of functioning file locking
*
- * Four files:
+ * On Unix, four files are used:
* file - the data file accessed by other apps.
* new - a new version of the data file while it's being written
* lck - the lock file
* Attempt to link it to 'lck'
* Unlink 'tmp'
* If the link succeeded, the lock is held
+ *
+ * On Windows, where there are no links, no tmp file is used, and lck
+ * is a directory that's mkdir'ed. If the mkdir succeeds, the lock is
+ * held.
*/
#include "fcint.h"
#include <stdlib.h>
#include <time.h>
+#ifdef _WIN32
+#define mkdir(path,mode) _mkdir(path)
+#endif
+
#define NEW_NAME ".NEW"
#define LCK_NAME ".LCK"
#define TMP_NAME ".TMP-XXXXXX"
FcAtomic *atomic = malloc (total_len);
if (!atomic)
return 0;
+ FcMemAlloc (FC_MEM_ATOMIC, total_len);
atomic->file = (FcChar8 *) (atomic + 1);
strcpy ((char *) atomic->file, (char *) file);
int ret;
struct stat lck_stat;
+#ifdef HAVE_LINK
strcpy ((char *) atomic->tmp, (char *) atomic->file);
strcat ((char *) atomic->tmp, TMP_NAME);
fd = mkstemp ((char *) atomic->tmp);
unlink ((char *) atomic->tmp);
return FcFalse;
}
- ret = fprintf (f, "%d\n", getpid());
+ ret = fprintf (f, "%ld\n", (long)getpid());
if (ret <= 0)
{
fclose (f);
}
ret = link ((char *) atomic->tmp, (char *) atomic->lck);
(void) unlink ((char *) atomic->tmp);
+#else
+ ret = mkdir ((char *) atomic->lck, 0600);
+#endif
if (ret < 0)
{
/*
time_t now = time (0);
if ((long int) (now - lck_stat.st_mtime) > 10 * 60)
{
+#ifdef HAVE_LINK
if (unlink ((char *) atomic->lck) == 0)
return FcAtomicLock (atomic);
+#else
+ if (rmdir ((char *) atomic->lck) == 0)
+ return FcAtomicLock (atomic);
+#endif
}
}
return FcFalse;
FcBool
FcAtomicReplaceOrig (FcAtomic *atomic)
{
+#ifdef _WIN32
+ unlink (atomic->file);
+#endif
if (rename ((char *) atomic->new, (char *) atomic->file) < 0)
return FcFalse;
return FcTrue;
void
FcAtomicUnlock (FcAtomic *atomic)
{
+#ifdef HAVE_LINK
unlink ((char *) atomic->lck);
+#else
+ rmdir ((char *) atomic->lck);
+#endif
}
void
FcAtomicDestroy (FcAtomic *atomic)
{
+ FcMemFree (FC_MEM_ATOMIC, sizeof (FcAtomic) +
+ strlen ((char *) atomic->file) * 4 + 1 +
+ sizeof (NEW_NAME) + sizeof (LCK_NAME) +
+ sizeof (TMP_NAME));
+
free (atomic);
}