[libvirt] [PATCH] Initialize gcrypt threading
Daniel Veillard
veillard at redhat.com
Thu Dec 17 09:24:15 UTC 2009
On Wed, Dec 16, 2009 at 06:46:52PM +0000, Daniel P. Berrange wrote:
> 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
> ---
> build-aux/.gitignore | 2 +
> configure.in | 4 ++-
> src/libvirt.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 58 insertions(+), 1 deletions(-)
>
> diff --git a/build-aux/.gitignore b/build-aux/.gitignore
> index 72e8ffc..a1b5d3b 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 6ed2efd..c86ee97 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 103b331..cad33c2 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -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");
Ah, subtle, I wonder how you realized that though :-)
ACK
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list