Fix mkstemp absence for some platform
authorAkira TAGOH <akira@tagoh.org>
Tue, 22 Jan 2013 03:03:28 +0000 (12:03 +0900)
committerAkira TAGOH <akira@tagoh.org>
Tue, 22 Jan 2013 03:11:02 +0000 (12:11 +0900)
Patch from LRN and modified to make more generic.

src/fccache.c
src/fccompat.c
src/fcint.h

index 610b8f0..2c63125 100644 (file)
@@ -31,7 +31,6 @@
 #include <dirent.h>
 #include <string.h>
 #include <sys/types.h>
-#include <time.h>
 #include <assert.h>
 #if defined(HAVE_MMAP) || defined(__CYGWIN__)
 #  include <unistd.h>
@@ -253,62 +252,6 @@ static FcCacheSkip *fcCacheChains[FC_CACHE_MAX_LEVEL];
 static int             fcCacheMaxLevel;
 
 
-static int32_t
-FcRandom(void)
-{
-    int32_t result;
-
-#if HAVE_RANDOM_R
-    static struct random_data fcrandbuf;
-    static char statebuf[256];
-    static FcBool initialized = FcFalse;
-
-    if (initialized != FcTrue)
-    {
-       initstate_r(time(NULL), statebuf, 256, &fcrandbuf);
-       initialized = FcTrue;
-    }
-
-    random_r(&fcrandbuf, &result);
-#elif HAVE_RANDOM
-    static char statebuf[256];
-    char *state;
-    static FcBool initialized = FcFalse;
-
-    if (initialized != FcTrue)
-    {
-       state = initstate(time(NULL), statebuf, 256);
-       initialized = FcTrue;
-    }
-    else
-       state = setstate(statebuf);
-
-    result = random();
-
-    setstate(state);
-#elif HAVE_LRAND48
-    result = lrand48();
-#elif HAVE_RAND_R
-    static unsigned int seed = time(NULL);
-
-    result = rand_r(&seed);
-#elif HAVE_RAND
-    static FcBool initialized = FcFalse;
-
-    if (initialized != FcTrue)
-    {
-       srand(time(NULL));
-       initialized = FcTrue;
-    }
-    result = rand();
-#else
-# error no random number generator function available.
-#endif
-
-    return result;
-}
-
-
 static FcMutex *cache_lock;
 
 static void
index 5ec2135..0a9c135 100644 (file)
 
 #include "fcint.h"
 
+#include <errno.h>
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 #if HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
 #include <stdarg.h>
 #include <stdlib.h>
+#include <string.h>
+#include <time.h>
 
 #ifdef O_CLOEXEC
 #define FC_O_CLOEXEC O_CLOEXEC
 #else
 #define FC_O_LARGEFILE 0
 #endif
+#ifdef O_BINARY
+#define FC_O_BINARY O_BINARY
+#else
+#define FC_O_BINARY 0
+#endif
+#ifdef O_TEMPORARY
+#define FC_O_TEMPORARY O_TEMPORARY
+#else
+#define FC_O_TEMPORARY 0
+#endif
+#ifdef O_NOINHERIT
+#define FC_O_NOINHERIT O_NOINHERIT
+#else
+#define FC_O_NOINHERIT 0
+#endif
+
+#if !defined (HAVE_MKOSTEMP) && !defined(HAVE_MKSTEMP) && !defined(HAVE__MKTEMP_S)
+static int
+mkstemp (char *template)
+{
+    static const char s[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    int fd, i;
+    size_t l;
+
+    if (template == NULL)
+    {
+       errno = EINVAL;
+       return -1;
+    }
+    l = strlen (template);
+    if (l < 6 || strcmp (&template[l - 6], "XXXXXX") != 0)
+    {
+       errno = EINVAL;
+       return -1;
+    }
+    do
+    {
+       errno = 0;
+       for (i = l - 6; i < l; i++)
+       {
+           int r = FcRandom ();
+           template[i] = s[r % 62];
+       }
+       fd = FcOpen (template, FC_O_BINARY | O_CREAT | O_EXCL | FC_O_TEMPORARY | FC_O_NOINHERIT | O_RDWR, 0600);
+    } while (fd < 0 && errno == EEXIST);
+    if (fd >= 0)
+       errno = 0;
+
+    return fd;
+}
+#define HAVE_MKSTEMP 1
+#endif
 
 int
 FcOpen(const char *pathname, int flags, ...)
@@ -109,3 +170,58 @@ FcMakeTempfile (char *template)
 
     return fd;
 }
+
+int32_t
+FcRandom(void)
+{
+    int32_t result;
+
+#if HAVE_RANDOM_R
+    static struct random_data fcrandbuf;
+    static char statebuf[256];
+    static FcBool initialized = FcFalse;
+
+    if (initialized != FcTrue)
+    {
+       initstate_r(time(NULL), statebuf, 256, &fcrandbuf);
+       initialized = FcTrue;
+    }
+
+    random_r(&fcrandbuf, &result);
+#elif HAVE_RANDOM
+    static char statebuf[256];
+    char *state;
+    static FcBool initialized = FcFalse;
+
+    if (initialized != FcTrue)
+    {
+       state = initstate(time(NULL), statebuf, 256);
+       initialized = FcTrue;
+    }
+    else
+       state = setstate(statebuf);
+
+    result = random();
+
+    setstate(state);
+#elif HAVE_LRAND48
+    result = lrand48();
+#elif HAVE_RAND_R
+    static unsigned int seed = time(NULL);
+
+    result = rand_r(&seed);
+#elif HAVE_RAND
+    static FcBool initialized = FcFalse;
+
+    if (initialized != FcTrue)
+    {
+       srand(time(NULL));
+       initialized = FcTrue;
+    }
+    result = rand();
+#else
+# error no random number generator function available.
+#endif
+
+    return result;
+}
index 3cf526f..71b7341 100644 (file)
@@ -724,6 +724,9 @@ FcOpen(const char *pathname, int flags, ...);
 FcPrivate int
 FcMakeTempfile (char *template);
 
+FcPrivate int32_t
+FcRandom (void);
+
 /* fcdbg.c */
 
 FcPrivate void