diff --git a/build-aux/.gitignore b/build-aux/.gitignore index 72e8ffc0db..a1b5d3bf74 100644 --- a/build-aux/.gitignore +++ b/build-aux/.gitignore @@ -1 +1,3 @@ * +/link-warning.h +/mktempd diff --git a/configure.in b/configure.in index 6ed2efde58..c86ee97d35 100644 --- a/configure.in +++ b/configure.in @@ -547,7 +547,9 @@ if test "$GNUTLS_FOUND" = "no"; then test $fail = 1 && AC_MSG_ERROR([You must install the GnuTLS library in order to compile and run libvirt]) - GNUTLS_LIBS=$LIBS + dnl Not all versions of gnutls include -lgcrypt, and so we add + dnl it explicitly for the calls to gcry_control/check_version + GNUTLS_LIBS="$LIBS -lgcrypt" LIBS="$old_libs" fi diff --git a/src/libvirt.c b/src/libvirt.c index 103b3312dd..cad33c2a73 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -22,6 +22,7 @@ #include #endif #include +#include #include #include @@ -251,6 +252,55 @@ winsock_init (void) } #endif +static int virTLSMutexInit (void **priv) +{ \ + virMutexPtr lock = NULL; + + if (VIR_ALLOC(lock) < 0) + return ENOMEM; + + if (virMutexInit(lock) < 0) { + VIR_FREE(lock); + return errno; + } + + *priv = lock; + return 0; +} + +static int virTLSMutexDestroy(void **priv) +{ + virMutexPtr lock = *priv; + virMutexDestroy(lock); + VIR_FREE(lock); + return 0; +} + +static int virTLSMutexLock(void **priv) +{ + virMutexPtr lock = *priv; + virMutexLock(lock); + return 0; +} + +static int virTLSMutexUnlock(void **priv) +{ + virMutexPtr lock = *priv; + virMutexUnlock(lock); + return 0; +} + +static struct gcry_thread_cbs virTLSThreadImpl = { + (GCRY_THREAD_OPTION_PTHREAD | (GCRY_THREAD_OPTION_VERSION << 8)), + NULL, + virTLSMutexInit, + virTLSMutexDestroy, + virTLSMutexLock, + virTLSMutexUnlock, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL +}; + + /** * virInitialize: * @@ -273,6 +323,9 @@ virInitialize(void) virRandomInitialize(time(NULL) ^ getpid())) return -1; + gcry_control(GCRYCTL_SET_THREAD_CBS, &virTLSThreadImpl); + gcry_check_version(NULL); + virLogSetFromEnv(); DEBUG0("register drivers");