diff options
Diffstat (limited to 'src/threads.c')
-rw-r--r-- | src/threads.c | 25 |
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 */ |