diff options
author | marha <marha@users.sourceforge.net> | 2013-01-22 14:07:34 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2013-01-22 14:07:34 +0100 |
commit | 470f7ca9f0be348faf2f03fc16811844c5eeffce (patch) | |
tree | 3071ab9b9fbabc772ee68c86fe587f260bde26c6 /fontconfig/src/fccompat.c | |
parent | 4fc6b34d1c14cc61f553ca59264d0909656933f3 (diff) | |
download | vcxsrv-470f7ca9f0be348faf2f03fc16811844c5eeffce.tar.gz vcxsrv-470f7ca9f0be348faf2f03fc16811844c5eeffce.tar.bz2 vcxsrv-470f7ca9f0be348faf2f03fc16811844c5eeffce.zip |
fontconfig libfontenc mesa mkfontscale pixman xserver xkeyboard-config
fontconfig: 000ca9ccb03013a5b151f0d21148ab0ca4c2f2de
libfontenc: f5d1208172e965fdd7fae8927bd3e29b3cc3a975
mesa: 148fc6d53716f39971a453792570c2b8c207efb6
mkfontscale: 547517571e695728278a264eedbac47b6e1f43bc
pixman: 2c6577476e5b18e17904ae8af244a39c352e2e33
xserver: 70b127c9f1c53bdb42f078265e67f76b464deae2
xkeyboard-config: 6b35b1b43d2fdff30f530d7cf65fffd6c3504690
Diffstat (limited to 'fontconfig/src/fccompat.c')
-rw-r--r-- | fontconfig/src/fccompat.c | 118 |
1 files changed, 117 insertions, 1 deletions
diff --git a/fontconfig/src/fccompat.c b/fontconfig/src/fccompat.c index 2aa29ddcc..0a9c135fe 100644 --- a/fontconfig/src/fccompat.c +++ b/fontconfig/src/fccompat.c @@ -31,11 +31,20 @@ #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 @@ -47,6 +56,58 @@ #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, ...) @@ -84,7 +145,7 @@ FcMakeTempfile (char *template) # ifdef F_DUPFD_CLOEXEC if (fd != -1) { - int newfd = fcntl(fd, F_DUPFD_CLOEXEC); + int newfd = fcntl(fd, F_DUPFD_CLOEXEC, STDIN_FILENO); close(fd); fd = newfd; @@ -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; +} |