Fix mkstemp absence for some platform
Patch from LRN and modified to make more generic.
This commit is contained in:
parent
9dbc282796
commit
6363193a05
|
@ -31,7 +31,6 @@
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <time.h>
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#if defined(HAVE_MMAP) || defined(__CYGWIN__)
|
#if defined(HAVE_MMAP) || defined(__CYGWIN__)
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
|
@ -253,62 +252,6 @@ static FcCacheSkip *fcCacheChains[FC_CACHE_MAX_LEVEL];
|
||||||
static int fcCacheMaxLevel;
|
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 FcMutex *cache_lock;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
116
src/fccompat.c
116
src/fccompat.c
|
@ -31,11 +31,20 @@
|
||||||
|
|
||||||
#include "fcint.h"
|
#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
|
#if HAVE_FCNTL_H
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef O_CLOEXEC
|
#ifdef O_CLOEXEC
|
||||||
#define FC_O_CLOEXEC O_CLOEXEC
|
#define FC_O_CLOEXEC O_CLOEXEC
|
||||||
|
@ -47,6 +56,58 @@
|
||||||
#else
|
#else
|
||||||
#define FC_O_LARGEFILE 0
|
#define FC_O_LARGEFILE 0
|
||||||
#endif
|
#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
|
int
|
||||||
FcOpen(const char *pathname, int flags, ...)
|
FcOpen(const char *pathname, int flags, ...)
|
||||||
|
@ -109,3 +170,58 @@ FcMakeTempfile (char *template)
|
||||||
|
|
||||||
return fd;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -724,6 +724,9 @@ FcOpen(const char *pathname, int flags, ...);
|
||||||
FcPrivate int
|
FcPrivate int
|
||||||
FcMakeTempfile (char *template);
|
FcMakeTempfile (char *template);
|
||||||
|
|
||||||
|
FcPrivate int32_t
|
||||||
|
FcRandom (void);
|
||||||
|
|
||||||
/* fcdbg.c */
|
/* fcdbg.c */
|
||||||
|
|
||||||
FcPrivate void
|
FcPrivate void
|
||||||
|
|
Loading…
Reference in New Issue