mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
Initialize gcrypt threading
GNUTLS uses gcrypt for its crypto functions. gcrypt requires that the app/library initializes threading before using it. We don't want to force apps using libvirt to know about gcrypt, so we make virInitialize init threading on their behalf. This location also ensures libvirtd has initialized it correctly. This initialization is required even if libvirt itself were only using one thread, since another non-libvirt library (eg GTK-VNC) could also be using gcrypt from another thread * src/libvirt.c: Register thread functions for gcrypt * configure.in: Add -lgcrypt to linker flags
This commit is contained in:
parent
84961bd3f4
commit
33a198c1f6
2
build-aux/.gitignore
vendored
2
build-aux/.gitignore
vendored
@ -1 +1,3 @@
|
||||
*
|
||||
/link-warning.h
|
||||
/mktempd
|
||||
|
@ -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
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <sys/wait.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
#include <gcrypt.h>
|
||||
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/xpath.h>
|
||||
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user