Commit b8b562c7 authored by Jiri Zouhar's avatar Jiri Zouhar

allow user to disable openssl library init

Signed-off-by: 's avatarJiri Zouhar <jzouhar@netio.eu>
parent d1538480
...@@ -60,6 +60,13 @@ ...@@ -60,6 +60,13 @@
#include "VersionInfo.h" #include "VersionInfo.h"
void MQTTAsync_global_init(int handle_openssl_init)
{
#if defined(OPENSSL)
SSLSocket_handleOpensslInit(handle_openssl_init);
#endif
}
char* client_timestamp_eye = "MQTTAsyncV3_Timestamp " BUILD_TIMESTAMP; char* client_timestamp_eye = "MQTTAsyncV3_Timestamp " BUILD_TIMESTAMP;
char* client_version_eye = "MQTTAsyncV3_Version " CLIENT_VERSION; char* client_version_eye = "MQTTAsyncV3_Version " CLIENT_VERSION;
...@@ -1322,11 +1329,8 @@ void MQTTAsync_checkTimeouts() ...@@ -1322,11 +1329,8 @@ void MQTTAsync_checkTimeouts()
MQTTAsyncs* m = (MQTTAsyncs*)(current->content); MQTTAsyncs* m = (MQTTAsyncs*)(current->content);
/* check disconnect timeout */
if (m->c->connect_state == -2)
MQTTAsync_checkDisconnect(m, &m->disconnect);
/* check connect timeout */ /* check connect timeout */
else if (m->c->connect_state != 0 && MQTTAsync_elapsed(m->connect.start_time) > (m->connectTimeout * 1000)) if (m->c->connect_state != 0 && MQTTAsync_elapsed(m->connect.start_time) > (m->connectTimeout * 1000))
{ {
if (MQTTAsync_checkConn(&m->connect, m)) if (MQTTAsync_checkConn(&m->connect, m))
{ {
...@@ -1359,6 +1363,10 @@ void MQTTAsync_checkTimeouts() ...@@ -1359,6 +1363,10 @@ void MQTTAsync_checkTimeouts()
continue; continue;
} }
/* check disconnect timeout */
if (m->c->connect_state == -2)
MQTTAsync_checkDisconnect(m, &m->disconnect);
timed_out_count = 0; timed_out_count = 0;
/* check response timeouts */ /* check response timeouts */
while (ListNextElement(m->responses, &cur_response)) while (ListNextElement(m->responses, &cur_response))
......
...@@ -177,6 +177,13 @@ ...@@ -177,6 +177,13 @@
*/ */
#define MQTT_BAD_SUBSCRIBE 0x80 #define MQTT_BAD_SUBSCRIBE 0x80
/**
* Global init of mqtt library. Call once on program start to set global behaviour.
* handle_openssl_init - if mqtt library should handle openssl init (1) or rely on the caller to init it before using mqtt (0)
*/
void MQTTAsync_global_init(int handle_openssl_init);
/** /**
* A handle representing an MQTT client. A valid client handle is available * A handle representing an MQTT client. A valid client handle is available
* following a successful call to MQTTAsync_create(). * following a successful call to MQTTAsync_create().
......
...@@ -64,6 +64,13 @@ ...@@ -64,6 +64,13 @@
#include "VersionInfo.h" #include "VersionInfo.h"
void MQTTClient_global_init(int handle_openssl_init)
{
#if defined(OPENSSL)
SSLSocket_handleOpensslInit(handle_openssl_init);
#endif
}
char* client_timestamp_eye = "MQTTClientV3_Timestamp " BUILD_TIMESTAMP; char* client_timestamp_eye = "MQTTClientV3_Timestamp " BUILD_TIMESTAMP;
char* client_version_eye = "MQTTClientV3_Version " CLIENT_VERSION; char* client_version_eye = "MQTTClientV3_Version " CLIENT_VERSION;
......
...@@ -184,6 +184,12 @@ ...@@ -184,6 +184,12 @@
*/ */
#define MQTT_BAD_SUBSCRIBE 0x80 #define MQTT_BAD_SUBSCRIBE 0x80
/**
* Global init of mqtt library. Call once on program start to set global behaviour.
* handle_openssl_init - if mqtt library should handle openssl init (1) or rely on the caller to init it before using mqtt (0)
*/
void MQTTClient_global_init(int handle_openssl_init);
/** /**
* A handle representing an MQTT client. A valid client handle is available * A handle representing an MQTT client. A valid client handle is available
* following a successful call to MQTTClient_create(). * following a successful call to MQTTClient_create().
...@@ -628,7 +634,7 @@ typedef struct ...@@ -628,7 +634,7 @@ typedef struct
} returned; } returned;
} MQTTClient_connectOptions; } MQTTClient_connectOptions;
#define MQTTClient_connectOptions_initializer { {'M', 'Q', 'T', 'C'}, 4, 60, 1, 1, NULL, NULL, NULL, 30, 20, NULL, 0, NULL, 0} #define MQTTClient_connectOptions_initializer { {'M', 'Q', 'T', 'C'}, 4, 60, 1, 1, NULL, NULL, NULL, 30, 20, NULL, 0, NULL, 0, {NULL, 0, 0}}
/** /**
* MQTTClient_libraryInfo is used to store details relating to the currently used * MQTTClient_libraryInfo is used to store details relating to the currently used
......
...@@ -43,6 +43,8 @@ extern Sockets s; ...@@ -43,6 +43,8 @@ extern Sockets s;
void SSLSocket_addPendingRead(int sock); void SSLSocket_addPendingRead(int sock);
/// 1 ~ we are responsible for initializing openssl; 0 ~ openssl init is done externally
static int handle_openssl_init = 1;
static ssl_mutex_type* sslLocks = NULL; static ssl_mutex_type* sslLocks = NULL;
static ssl_mutex_type sslCoreMutex; static ssl_mutex_type sslCoreMutex;
...@@ -392,6 +394,11 @@ extern void SSLLocks_callback(int mode, int n, const char *file, int line) ...@@ -392,6 +394,11 @@ extern void SSLLocks_callback(int mode, int n, const char *file, int line)
} }
} }
void SSLSocket_handleOpensslInit(int bool_value)
{
handle_openssl_init = bool_value;
}
int SSLSocket_initialize() int SSLSocket_initialize()
{ {
int rc = 0; int rc = 0;
...@@ -401,41 +408,45 @@ int SSLSocket_initialize() ...@@ -401,41 +408,45 @@ int SSLSocket_initialize()
FUNC_ENTRY; FUNC_ENTRY;
if ((rc = SSL_library_init()) != 1) if (handle_openssl_init)
rc = -1; {
if ((rc = SSL_library_init()) != 1)
rc = -1;
ERR_load_crypto_strings();
SSL_load_error_strings();
ERR_load_crypto_strings(); /* OpenSSL 0.9.8o and 1.0.0a and later added SHA2 algorithms to SSL_library_init().
SSL_load_error_strings(); Applications which need to use SHA2 in earlier versions of OpenSSL should call
OpenSSL_add_all_algorithms() as well. */
/* OpenSSL 0.9.8o and 1.0.0a and later added SHA2 algorithms to SSL_library_init().
Applications which need to use SHA2 in earlier versions of OpenSSL should call OpenSSL_add_all_algorithms();
OpenSSL_add_all_algorithms() as well. */
lockMemSize = CRYPTO_num_locks() * sizeof(ssl_mutex_type);
OpenSSL_add_all_algorithms();
lockMemSize = CRYPTO_num_locks() * sizeof(ssl_mutex_type);
sslLocks = malloc(lockMemSize); sslLocks = malloc(lockMemSize);
if (!sslLocks) if (!sslLocks)
{ {
rc = -1; rc = -1;
goto exit; goto exit;
} }
else else
memset(sslLocks, 0, lockMemSize); memset(sslLocks, 0, lockMemSize);
for (i = 0; i < CRYPTO_num_locks(); i++) for (i = 0; i < CRYPTO_num_locks(); i++)
{ {
/* prc = */SSL_create_mutex(&sslLocks[i]); /* prc = */SSL_create_mutex(&sslLocks[i]);
} }
#if (OPENSSL_VERSION_NUMBER >= 0x010000000) #if (OPENSSL_VERSION_NUMBER >= 0x010000000)
CRYPTO_THREADID_set_callback(SSLThread_id); CRYPTO_THREADID_set_callback(SSLThread_id);
#else #else
CRYPTO_set_id_callback(SSLThread_id); CRYPTO_set_id_callback(SSLThread_id);
#endif #endif
CRYPTO_set_locking_callback(SSLLocks_callback); CRYPTO_set_locking_callback(SSLLocks_callback);
}
SSL_create_mutex(&sslCoreMutex); SSL_create_mutex(&sslCoreMutex);
exit: exit:
...@@ -446,19 +457,26 @@ exit: ...@@ -446,19 +457,26 @@ exit:
void SSLSocket_terminate() void SSLSocket_terminate()
{ {
FUNC_ENTRY; FUNC_ENTRY;
EVP_cleanup();
ERR_free_strings(); if (handle_openssl_init)
CRYPTO_set_locking_callback(NULL);
if (sslLocks)
{ {
int i = 0; EVP_cleanup();
ERR_free_strings();
for (i = 0; i < CRYPTO_num_locks(); i++) CRYPTO_set_locking_callback(NULL);
if (sslLocks)
{ {
SSL_destroy_mutex(&sslLocks[i]); int i = 0;
for (i = 0; i < CRYPTO_num_locks(); i++)
{
SSL_destroy_mutex(&sslLocks[i]);
}
free(sslLocks);
} }
free(sslLocks);
} }
SSL_destroy_mutex(&sslCoreMutex);
FUNC_EXIT; FUNC_EXIT;
} }
......
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
#define URI_SSL "ssl://" #define URI_SSL "ssl://"
/** if we should handle openssl initialization (bool_value == 1) or depend on it to be initalized externally (bool_value == 0) */
void SSLSocket_handleOpensslInit(int bool_value);
int SSLSocket_initialize(); int SSLSocket_initialize();
void SSLSocket_terminate(); void SSLSocket_terminate();
int SSLSocket_setSocketForSSL(networkHandles* net, MQTTClient_SSLOptions* opts); int SSLSocket_setSocketForSSL(networkHandles* net, MQTTClient_SSLOptions* opts);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment