aboutsummaryrefslogtreecommitdiff
path: root/src/threads.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/threads.c')
-rw-r--r--src/threads.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/threads.c b/src/threads.c
index 107c65d2..7f3a304e 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -59,8 +59,28 @@ struct ssh_threads_callbacks_struct *ssh_threads_get_noop(void) {
static struct ssh_threads_callbacks_struct *user_callbacks =&ssh_threads_noop;
#ifdef HAVE_LIBGCRYPT
+#if (GCRYPT_VERSION_NUMBER >= 0x010600)
+/* libgcrypt >= 1.6 does not support custom callbacks */
+GCRY_THREAD_OPTION_PTHREAD_IMPL;
-/* Libgcrypt specific way of handling thread callbacks */
+static int libgcrypt_thread_init(void){
+ if(user_callbacks == NULL)
+ return SSH_ERROR;
+ if(user_callbacks == &ssh_threads_noop)
+ return SSH_OK;
+ if (strcmp(user_callbacks->type, "threads_pthread") == 0){
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+ return SSH_OK;
+ } else {
+ /* not supported */
+ SSH_LOG(SSH_LOG_WARN, "Custom thread handlers not supported with libgcrypt >=1.6, using pthreads");
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+ return SSH_OK;
+ }
+}
+
+#else
+/* Libgcrypt < 1.6 specific way of handling thread callbacks */
static struct gcry_thread_cbs gcrypt_threads_callbacks;
@@ -79,7 +99,8 @@ static int libgcrypt_thread_init(void){
gcry_control(GCRYCTL_SET_THREAD_CBS, &gcrypt_threads_callbacks);
return SSH_OK;
}
-#else
+#endif /* GCRYPT_VERSION_NUMBER */
+#else /* HAVE_LIBGCRYPT */
/* Libcrypto specific stuff */