#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
-#include <openssl/err.h>
-#include <openssl/opensslv.h>
#include <cynara-client.h>
-#define MUTEX_TYPE pthread_mutex_t
-#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
-#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
-#define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
-#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
-#define THREAD_ID pthread_self()
-
#define SMACK_LABEL_LEN 255
/* This array will store all of the mutexes available to OpenSSL. */
-static MUTEX_TYPE *mutex_buf = NULL;
static bool is_init = false;
bool _http_is_init(void)
return proxy_addr;
}
-static void locking_function(int mode, int n, const char * file, int line)
-{
- if (mode & CRYPTO_LOCK)
- MUTEX_LOCK(mutex_buf[n]);
- else
- MUTEX_UNLOCK(mutex_buf[n]);
-}
-
-static unsigned long id_function(void)
-{
- return ((unsigned long)THREAD_ID);
-}
-
-#if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
-static void threadid_function(CRYPTO_THREADID *threadid)
-{
- CRYPTO_THREADID_set_numeric(threadid, id_function());
-}
-#endif
-
-int thread_setup(void)
-{
- int index = 0;
-
- mutex_buf = malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE));
- if (!mutex_buf)
- return 0;
-
- for (index = 0; index < CRYPTO_num_locks(); index++)
- MUTEX_SETUP(mutex_buf[index]);
-
-#if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
- CRYPTO_THREADID_set_callback(threadid_function);
-#else
- CRYPTO_set_id_callback(id_function);
-#endif
- CRYPTO_set_locking_callback(locking_function);
-
- return 1;
-}
-
-int thread_cleanup(void)
-{
- int index;
-
- if (!mutex_buf)
- return 0;
-
- CRYPTO_set_id_callback(NULL);
- CRYPTO_set_locking_callback(NULL);
-
- for (index = 0; index < CRYPTO_num_locks(); index++)
- MUTEX_CLEANUP(mutex_buf[index]);
-
- free(mutex_buf);
- mutex_buf = NULL;
-
- return 1;
-}
-
API int http_init(void)
{
_retvm_if(_http_is_init(), HTTP_ERROR_INVALID_OPERATION,
"http is already initialized!!");
- int ret = 0;
-
__http_set_init(true);
-
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
DBG("curl_global_init failed, so returning!\n");
return HTTP_ERROR_OPERATION_FAILED;
}
- ret = thread_setup();
- if (!ret) {
- DBG("ssl thread initialization failed!\n");
- return HTTP_ERROR_OPERATION_FAILED;
- }
-
return HTTP_ERROR_NONE;
}
_retvm_if(_http_is_init() == false, HTTP_ERROR_INVALID_OPERATION,
"http is already deinitialized!!");
- int ret = 0;
-
__http_set_init(false);
-
- ret = thread_cleanup();
- if (!ret) {
- DBG("ssl thread de-initialization failed!\n");
- return HTTP_ERROR_OPERATION_FAILED;
- }
-
curl_global_cleanup();
return HTTP_ERROR_NONE;