From 3154f04fb908ddf0066fe1d07cab2bbc0e9e67f4 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Sat, 23 Feb 2008 23:00:24 +0000
Subject: [PATCH] now builds and runs with GnuTLS-built libcurls too

---
 docs/examples/threaded-ssl.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/docs/examples/threaded-ssl.c b/docs/examples/threaded-ssl.c
index e49443d40f..c3455369b6 100644
--- a/docs/examples/threaded-ssl.c
+++ b/docs/examples/threaded-ssl.c
@@ -8,20 +8,26 @@
  * $Id$
  *
  * A multi-threaded example that uses pthreads and fetches 4 remote files at
- * once over HTTPS. The lock callbacks and stuff assume OpenSSL so far.
- * Should be expanded to do optional GnuTLS style locking.
+ * once over HTTPS. The lock callbacks and stuff assume OpenSSL or GnuTLS
+ * (libgcrypt) so far.
  *
- * OpenSSL docs for this: http://www.openssl.org/docs/crypto/threads.html
+ * OpenSSL docs for this:
+ *   http://www.openssl.org/docs/crypto/threads.html
+ * gcrypt docs for this:
+ *   http://gnupg.org/documentation/manuals/gcrypt/Multi_002dThreading.html
  */
 
+#define USE_OPENSSL /* or USE_GNUTLS accordingly */
+
 #include <stdio.h>
 #include <pthread.h>
 #include <curl/curl.h>
-#include <openssl/crypto.h>
 
 /* we have this global to let the callback get easy access to it */
 static pthread_mutex_t *lockarray;
 
+#ifdef USE_OPENSSL
+#include <openssl/crypto.h>
 static void lock_callback(int mode, int type, char *file, int line)
 {
   (void)file;
@@ -66,6 +72,21 @@ static void kill_locks(void)
 
   OPENSSL_free(lockarray);
 }
+#endif
+
+#ifdef USE_GNUTLS
+#include <gcrypt.h>
+#include <errno.h>
+
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
+
+void init_locks(void)
+{
+  gcry_control(GCRYCTL_SET_THREAD_CBS);
+}
+
+#define kill_locks()
+#endif
 
 /* List of URLs to fetch.*/
 const char *urls[]= {
-- 
GitLab