#include "ssllib.h" #include #include #include "auxlib.h" #if OPENSSL_VERSION_NUMBER < 0x10100000L static mutex_t *openssl_locks; static void cb_openssl_threadid(CRYPTO_THREADID *tid) { pthread_t me; me = pthread_self(); if (sizeof(me) == sizeof(void *)) CRYPTO_THREADID_set_pointer(tid, (void *) me); else CRYPTO_THREADID_set_numeric(tid, (unsigned long) me); } static void cb_openssl_lock(int mode, int type, const char *file, int line) { if ((mode & CRYPTO_LOCK)) mutex_lock(&openssl_locks[type]); else mutex_unlock(&openssl_locks[type]); } static void make_OpenSSL_thread_safe(void) { int i; openssl_locks = malloc(sizeof(*openssl_locks) * CRYPTO_num_locks()); for (i = 0; i < CRYPTO_num_locks(); i++) mutex_init(&openssl_locks[i]); CRYPTO_THREADID_set_callback(cb_openssl_threadid); CRYPTO_set_locking_callback(cb_openssl_lock); } #else static void make_OpenSSL_thread_safe(void) { ; } #endif void rtpe_ssl_init(void) { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); srandom(ts.tv_sec ^ ts.tv_nsec); SSL_library_init(); SSL_load_error_strings(); make_OpenSSL_thread_safe(); }