aboutsummaryrefslogtreecommitdiff
path: root/fontconfig/src
diff options
context:
space:
mode:
Diffstat (limited to 'fontconfig/src')
-rw-r--r--fontconfig/src/Makefile.am5
-rw-r--r--fontconfig/src/fccache.c57
-rw-r--r--fontconfig/src/fccompat.c118
-rw-r--r--fontconfig/src/fcdefault.c4
-rw-r--r--fontconfig/src/fcint.h3
5 files changed, 125 insertions, 62 deletions
diff --git a/fontconfig/src/Makefile.am b/fontconfig/src/Makefile.am
index dba42065a..3bb90eab5 100644
--- a/fontconfig/src/Makefile.am
+++ b/fontconfig/src/Makefile.am
@@ -31,8 +31,9 @@ fontconfig_def_dependency = fontconfig.def
# gcc import library install/uninstall
-install-libtool-import-lib:
- $(INSTALL) .libs/libfontconfig.dll.a $(DESTDIR)$(libdir)
+install-libtool-import-lib: libfontconfig.la
+ $(MKDIR_P) $(DESTDIR)$(libdir)
+ $(INSTALL) .libs/libfontconfig.dll.a $(DESTDIR)$(libdir)/libfontconfig.dll.a
$(INSTALL) fontconfig.def $(DESTDIR)$(libdir)/fontconfig.def
uninstall-libtool-import-lib:
diff --git a/fontconfig/src/fccache.c b/fontconfig/src/fccache.c
index 610b8f0b7..2c631256b 100644
--- a/fontconfig/src/fccache.c
+++ b/fontconfig/src/fccache.c
@@ -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
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;
+}
diff --git a/fontconfig/src/fcdefault.c b/fontconfig/src/fcdefault.c
index b1bd9cc1f..d1217a4dc 100644
--- a/fontconfig/src/fcdefault.c
+++ b/fontconfig/src/fcdefault.c
@@ -148,11 +148,11 @@ retry:
prgname = FcStrdup ("");
#else
char buf[PATH_MAX + 1];
- unsigned int len;
+ int len;
char *p = NULL;
len = readlink ("/proc/self/exe", buf, sizeof (buf) - 1);
- if (len > 0)
+ if (len != -1)
{
buf[len] = '\0';
p = buf;
diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h
index 3cf526f3d..71b734150 100644
--- a/fontconfig/src/fcint.h
+++ b/fontconfig/src/fcint.h
@@ -724,6 +724,9 @@ FcOpen(const char *pathname, int flags, ...);
FcPrivate int
FcMakeTempfile (char *template);
+FcPrivate int32_t
+FcRandom (void);
+
/* fcdbg.c */
FcPrivate void