diff options
-rw-r--r-- | doc/threading.dox | 1 | ||||
-rw-r--r-- | include/libssh/callbacks.h | 2 | ||||
-rw-r--r-- | src/threads.c | 25 |
3 files changed, 26 insertions, 2 deletions
diff --git a/doc/threading.dox b/doc/threading.dox index a11c82f7..95eee6bb 100644 --- a/doc/threading.dox +++ b/doc/threading.dox @@ -61,5 +61,6 @@ implement the following methods : - mutex_destroy - thread_id +libgcrypt 1.6 and bigger backend does not support custom callback. Using anything else than pthreads (ssh_threads_get_pthread()) here will fail. Good luck ! */ diff --git a/include/libssh/callbacks.h b/include/libssh/callbacks.h index a841f2e5..9aa8bab7 100644 --- a/include/libssh/callbacks.h +++ b/include/libssh/callbacks.h @@ -801,6 +801,8 @@ struct ssh_threads_callbacks_struct { * * @see ssh_threads_callbacks_struct * @see SSH_THREADS_PTHREAD + * @bug libgcrypt 1.6 and bigger backend does not support custom callback. + * Using anything else than pthreads here will fail. */ LIBSSH_API int ssh_threads_set_callbacks(struct ssh_threads_callbacks_struct *cb); 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 */ |