Commit 96faf843 authored by rxiang's avatar rxiang

43204 review

Signed-off-by: 's avatarrxiang <xiangr@cn.ibm.com>
parent 62db601e
...@@ -110,9 +110,9 @@ CCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden ...@@ -110,9 +110,9 @@ CCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden
FLAGS_EXE = -I ${srcdir} -lpthread -L ${blddir} FLAGS_EXE = -I ${srcdir} -lpthread -L ${blddir}
LDFLAGS_C = -shared -Wl,-soname,lib$(MQTTLIB_C).so.${MAJOR_VERSION} -Wl,-init,MQTTClient_init -lpthread LDFLAGS_C = -shared -Wl,-soname,lib$(MQTTLIB_C).so.${MAJOR_VERSION} -Wl,-init,MQTTClient_init -lpthread
LDFLAGS_CS = -shared -Wl,-soname,lib$(MQTTLIB_CS).so.${MAJOR_VERSION} -lpthread -ldl -lcrypto -lssl -Wl,-no-whole-archive -Wl,-init,MQTTClient_init LDFLAGS_CS = -shared -Wl,-soname,lib$(MQTTLIB_CS).so.${MAJOR_VERSION} -lpthread -ldl -lssl -lcrypto -Wl,-no-whole-archive -Wl,-init,MQTTClient_init
LDFLAGS_A = -shared -Wl,-soname,lib${MQTTLIB_A}.so.${MAJOR_VERSION} -Wl,-init,MQTTAsync_init -lpthread LDFLAGS_A = -shared -Wl,-soname,lib${MQTTLIB_A}.so.${MAJOR_VERSION} -Wl,-init,MQTTAsync_init -lpthread
LDFLAGS_AS = -shared -Wl,-soname,lib${MQTTLIB_AS}.so.${MAJOR_VERSION} -lpthread -ldl -lcrypto -lssl -Wl,-no-whole-archive -Wl,-init,MQTTAsync_init LDFLAGS_AS = -shared -Wl,-soname,lib${MQTTLIB_AS}.so.${MAJOR_VERSION} -lpthread -ldl -lssl -lcrypto -Wl,-no-whole-archive -Wl,-init,MQTTAsync_init
all: build all: build
...@@ -236,9 +236,9 @@ CCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden -Wno-deprecated-declarations ...@@ -236,9 +236,9 @@ CCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden -Wno-deprecated-declarations
FLAGS_EXE = -I ${srcdir} -lpthread -L ${blddir} FLAGS_EXE = -I ${srcdir} -lpthread -L ${blddir}
LDFLAGS_C = -shared -Wl,-install_name,lib$(MQTTLIB_C).so.${MAJOR_VERSION} -Wl,-init,_MQTTClient_init -lpthread LDFLAGS_C = -shared -Wl,-install_name,lib$(MQTTLIB_C).so.${MAJOR_VERSION} -Wl,-init,_MQTTClient_init -lpthread
LDFLAGS_CS = -shared -Wl,-install_name,lib$(MQTTLIB_CS).so.${MAJOR_VERSION} -lpthread -ldl -lcrypto -lssl -Wl,-init,_MQTTClient_init LDFLAGS_CS = -shared -Wl,-install_name,lib$(MQTTLIB_CS).so.${MAJOR_VERSION} -lpthread -ldl -lssl -lcrypto -Wl,-init,_MQTTClient_init
LDFLAGS_A = -shared -Wl,-install_name,lib${MQTTLIB_A}.so.${MAJOR_VERSION} -Wl,-init,_MQTTAsync_init -lpthread LDFLAGS_A = -shared -Wl,-install_name,lib${MQTTLIB_A}.so.${MAJOR_VERSION} -Wl,-init,_MQTTAsync_init -lpthread
LDFLAGS_AS = -shared -Wl,-install_name,lib${MQTTLIB_AS}.so.${MAJOR_VERSION} -lpthread -ldl -lcrypto -lssl -Wl,-init,_MQTTAsync_init LDFLAGS_AS = -shared -Wl,-install_name,lib${MQTTLIB_AS}.so.${MAJOR_VERSION} -lpthread -ldl -lssl -lcrypto -Wl,-init,_MQTTAsync_init
all: build all: build
......
...@@ -162,8 +162,8 @@ typedef struct ...@@ -162,8 +162,8 @@ typedef struct
typedef struct typedef struct
{ {
char* clientID; /**< the string id of the client */ char* clientID; /**< the string id of the client */
char* username; /**< MQTT v3.1 user name */ const char* username; /**< MQTT v3.1 user name */
char* password; /**< MQTT v3.1 password */ const char* password; /**< MQTT v3.1 password */
unsigned int cleansession : 1; /**< MQTT clean session flag */ unsigned int cleansession : 1; /**< MQTT clean session flag */
unsigned int connected : 1; /**< whether it is currently connected */ unsigned int connected : 1; /**< whether it is currently connected */
unsigned int good : 1; /**< if we have an error on the socket we turn this off */ unsigned int good : 1; /**< if we have an error on the socket we turn this off */
...@@ -197,7 +197,7 @@ int clientSocketCompare(void* a, void* b); ...@@ -197,7 +197,7 @@ int clientSocketCompare(void* a, void* b);
*/ */
typedef struct typedef struct
{ {
char* version; const char* version;
List* clients; List* clients;
} ClientStates; } ClientStates;
......
...@@ -289,7 +289,7 @@ typedef struct ...@@ -289,7 +289,7 @@ typedef struct
void MQTTAsync_freeCommand(MQTTAsync_queuedCommand *command); void MQTTAsync_freeCommand(MQTTAsync_queuedCommand *command);
void MQTTAsync_freeCommand1(MQTTAsync_queuedCommand *command); void MQTTAsync_freeCommand1(MQTTAsync_queuedCommand *command);
int MQTTAsync_deliverMessage(MQTTAsyncs* m, char* topicName, int topicLen, MQTTAsync_message* mm); int MQTTAsync_deliverMessage(MQTTAsyncs* m, char* topicName, size_t topicLen, MQTTAsync_message* mm);
#if !defined(NO_PERSISTENCE) #if !defined(NO_PERSISTENCE)
int MQTTAsync_restoreCommands(MQTTAsyncs* client); int MQTTAsync_restoreCommands(MQTTAsyncs* client);
#endif #endif
...@@ -347,7 +347,7 @@ int MQTTAsync_checkConn(MQTTAsync_command* command, MQTTAsyncs* client) ...@@ -347,7 +347,7 @@ int MQTTAsync_checkConn(MQTTAsync_command* command, MQTTAsyncs* client)
} }
int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientId, int MQTTAsync_create(MQTTAsync* handle, const char* serverURI, const char* clientId,
int persistence_type, void* persistence_context) int persistence_type, void* persistence_context)
{ {
int rc = 0; int rc = 0;
...@@ -397,7 +397,7 @@ int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientId, ...@@ -397,7 +397,7 @@ int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientId,
} }
#endif #endif
m->serverURI = malloc(strlen(serverURI)+1); m->serverURI = malloc(strlen(serverURI)+1);
strcpy(m->serverURI, serverURI); MQTTStrncpy(m->serverURI, serverURI,strlen(serverURI)+1);
m->responses = ListInitialize(); m->responses = ListInitialize();
ListAppend(handles, m, sizeof(MQTTAsyncs)); ListAppend(handles, m, sizeof(MQTTAsyncs));
...@@ -408,7 +408,7 @@ int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientId, ...@@ -408,7 +408,7 @@ int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientId,
m->c->inboundMsgs = ListInitialize(); m->c->inboundMsgs = ListInitialize();
m->c->messageQueue = ListInitialize(); m->c->messageQueue = ListInitialize();
m->c->clientID = malloc(strlen(clientId)+1); m->c->clientID = malloc(strlen(clientId)+1);
strcpy(m->c->clientID, clientId); MQTTStrncpy(m->c->clientID, clientId,strlen(clientId)+1);
#if !defined(NO_PERSISTENCE) #if !defined(NO_PERSISTENCE)
rc = MQTTPersistence_create(&(m->c->persistence), persistence_type, persistence_context); rc = MQTTPersistence_create(&(m->c->persistence), persistence_type, persistence_context);
...@@ -1349,7 +1349,7 @@ void MQTTAsync_destroy(MQTTAsync* handle) ...@@ -1349,7 +1349,7 @@ void MQTTAsync_destroy(MQTTAsync* handle)
{ {
int saved_socket = m->c->net.socket; int saved_socket = m->c->net.socket;
char* saved_clientid = malloc(strlen(m->c->clientID)+1); char* saved_clientid = malloc(strlen(m->c->clientID)+1);
strcpy(saved_clientid, m->c->clientID); MQTTStrncpy(saved_clientid, m->c->clientID,strlen(m->c->clientID)+1);
#if !defined(NO_PERSISTENCE) #if !defined(NO_PERSISTENCE)
MQTTPersistence_close(m->c); MQTTPersistence_close(m->c);
#endif #endif
...@@ -1802,7 +1802,7 @@ int MQTTAsync_cleanSession(Clients* client) ...@@ -1802,7 +1802,7 @@ int MQTTAsync_cleanSession(Clients* client)
int MQTTAsync_deliverMessage(MQTTAsyncs* m, char* topicName, int topicLen, MQTTAsync_message* mm) int MQTTAsync_deliverMessage(MQTTAsyncs* m, char* topicName, size_t topicLen, MQTTAsync_message* mm)
{ {
int rc; int rc;
...@@ -1877,7 +1877,7 @@ void Protocol_processPublication(Publish* publish, Clients* client) ...@@ -1877,7 +1877,7 @@ void Protocol_processPublication(Publish* publish, Clients* client)
} }
int MQTTAsync_connect(MQTTAsync handle, MQTTAsync_connectOptions* options) int MQTTAsync_connect(MQTTAsync handle, const MQTTAsync_connectOptions* options)
{ {
MQTTAsyncs* m = handle; MQTTAsyncs* m = handle;
int rc = MQTTASYNC_SUCCESS; int rc = MQTTASYNC_SUCCESS;
...@@ -1965,11 +1965,11 @@ int MQTTAsync_connect(MQTTAsync handle, MQTTAsync_connectOptions* options) ...@@ -1965,11 +1965,11 @@ int MQTTAsync_connect(MQTTAsync handle, MQTTAsync_connectOptions* options)
{ {
m->c->will = malloc(sizeof(willMessages)); m->c->will = malloc(sizeof(willMessages));
m->c->will->msg = malloc(strlen(options->will->message) + 1); m->c->will->msg = malloc(strlen(options->will->message) + 1);
strcpy(m->c->will->msg, options->will->message); MQTTStrncpy(m->c->will->msg, options->will->message,strlen(options->will->message) + 1);
m->c->will->qos = options->will->qos; m->c->will->qos = options->will->qos;
m->c->will->retained = options->will->retained; m->c->will->retained = options->will->retained;
m->c->will->topic = malloc(strlen(options->will->topicName) + 1); m->c->will->topic = malloc(strlen(options->will->topicName) + 1);
strcpy(m->c->will->topic, options->will->topicName); MQTTStrncpy(m->c->will->topic, options->will->topicName,strlen(options->will->topicName) + 1);
} }
#if defined(OPENSSL) #if defined(OPENSSL)
...@@ -2046,7 +2046,7 @@ int MQTTAsync_connect(MQTTAsync handle, MQTTAsync_connectOptions* options) ...@@ -2046,7 +2046,7 @@ int MQTTAsync_connect(MQTTAsync handle, MQTTAsync_connectOptions* options)
for (i = 0; i < options->serverURIcount; ++i) for (i = 0; i < options->serverURIcount; ++i)
{ {
conn->command.details.conn.serverURIs[i] = malloc(strlen(options->serverURIs[i]) + 1); conn->command.details.conn.serverURIs[i] = malloc(strlen(options->serverURIs[i]) + 1);
strcpy(conn->command.details.conn.serverURIs[i], options->serverURIs[i]); MQTTStrncpy(conn->command.details.conn.serverURIs[i], options->serverURIs[i],strlen(options->serverURIs[i]) + 1);
} }
conn->command.details.conn.currentURI = 0; conn->command.details.conn.currentURI = 0;
} }
...@@ -2060,7 +2060,7 @@ exit: ...@@ -2060,7 +2060,7 @@ exit:
} }
int MQTTAsync_disconnect1(MQTTAsync handle, MQTTAsync_disconnectOptions* options, int internal) int MQTTAsync_disconnect1(MQTTAsync handle, const MQTTAsync_disconnectOptions* options, int internal)
{ {
MQTTAsyncs* m = handle; MQTTAsyncs* m = handle;
int rc = MQTTASYNC_SUCCESS; int rc = MQTTASYNC_SUCCESS;
...@@ -2114,7 +2114,7 @@ void MQTTProtocol_closeSession(Clients* c, int sendwill) ...@@ -2114,7 +2114,7 @@ void MQTTProtocol_closeSession(Clients* c, int sendwill)
} }
int MQTTAsync_disconnect(MQTTAsync handle, MQTTAsync_disconnectOptions* options) int MQTTAsync_disconnect(MQTTAsync handle, const MQTTAsync_disconnectOptions* options)
{ {
return MQTTAsync_disconnect1(handle, options, 0); return MQTTAsync_disconnect1(handle, options, 0);
} }
...@@ -2135,10 +2135,10 @@ int MQTTAsync_isConnected(MQTTAsync handle) ...@@ -2135,10 +2135,10 @@ int MQTTAsync_isConnected(MQTTAsync handle)
} }
int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char** topic, int* qos, MQTTAsync_responseOptions* response) int MQTTAsync_subscribeMany(MQTTAsync handle, size_t count, char* const* topic, int* qos, MQTTAsync_responseOptions* response)
{ {
MQTTAsyncs* m = handle; MQTTAsyncs* m = handle;
int i = 0; size_t i = 0;
int rc = MQTTASYNC_FAILURE; int rc = MQTTASYNC_FAILURE;
MQTTAsync_queuedCommand* sub; MQTTAsync_queuedCommand* sub;
...@@ -2189,7 +2189,7 @@ int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char** topic, int* qos, ...@@ -2189,7 +2189,7 @@ int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char** topic, int* qos,
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
sub->command.details.sub.topics[i] = malloc(strlen(topic[i]) + 1); sub->command.details.sub.topics[i] = malloc(strlen(topic[i]) + 1);
strcpy(sub->command.details.sub.topics[i], topic[i]); MQTTStrncpy(sub->command.details.sub.topics[i], topic[i],strlen(topic[i]) + 1);
sub->command.details.sub.qoss[i] = qos[i]; sub->command.details.sub.qoss[i] = qos[i];
} }
rc = MQTTAsync_addCommand(sub, sizeof(sub)); rc = MQTTAsync_addCommand(sub, sizeof(sub));
...@@ -2200,21 +2200,21 @@ exit: ...@@ -2200,21 +2200,21 @@ exit:
} }
int MQTTAsync_subscribe(MQTTAsync handle, char* topic, int qos, MQTTAsync_responseOptions* response) int MQTTAsync_subscribe(MQTTAsync handle, const char* topic, int qos, MQTTAsync_responseOptions* response)
{ {
int rc = 0; int rc = 0;
char *const topics[] = {(char*)topic};
FUNC_ENTRY; FUNC_ENTRY;
rc = MQTTAsync_subscribeMany(handle, 1, &topic, &qos, response); rc = MQTTAsync_subscribeMany(handle, 1, topics, &qos, response);
FUNC_EXIT_RC(rc); FUNC_EXIT_RC(rc);
return rc; return rc;
} }
int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char** topic, MQTTAsync_responseOptions* response) int MQTTAsync_unsubscribeMany(MQTTAsync handle, size_t count, char* const* topic, MQTTAsync_responseOptions* response)
{ {
MQTTAsyncs* m = handle; MQTTAsyncs* m = handle;
int i = 0; size_t i = 0;
int rc = SOCKET_ERROR; int rc = SOCKET_ERROR;
MQTTAsync_queuedCommand* unsub; MQTTAsync_queuedCommand* unsub;
...@@ -2259,7 +2259,7 @@ int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char** topic, MQTTAsy ...@@ -2259,7 +2259,7 @@ int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char** topic, MQTTAsy
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
unsub->command.details.unsub.topics[i] = malloc(strlen(topic[i]) + 1); unsub->command.details.unsub.topics[i] = malloc(strlen(topic[i]) + 1);
strcpy(unsub->command.details.unsub.topics[i], topic[i]); MQTTStrncpy(unsub->command.details.unsub.topics[i], topic[i],strlen(topic[i]) + 1);
} }
rc = MQTTAsync_addCommand(unsub, sizeof(unsub)); rc = MQTTAsync_addCommand(unsub, sizeof(unsub));
...@@ -2269,18 +2269,18 @@ exit: ...@@ -2269,18 +2269,18 @@ exit:
} }
int MQTTAsync_unsubscribe(MQTTAsync handle, char* topic, MQTTAsync_responseOptions* response) int MQTTAsync_unsubscribe(MQTTAsync handle, const char* topic, MQTTAsync_responseOptions* response)
{ {
int rc = 0; int rc = 0;
char *const topics[] = {(char*)topic};
FUNC_ENTRY; FUNC_ENTRY;
rc = MQTTAsync_unsubscribeMany(handle, 1, &topic, response); rc = MQTTAsync_unsubscribeMany(handle, 1, topics, response);
FUNC_EXIT_RC(rc); FUNC_EXIT_RC(rc);
return rc; return rc;
} }
int MQTTAsync_send(MQTTAsync handle, char* destinationName, int payloadlen, void* payload, int MQTTAsync_send(MQTTAsync handle, const char* destinationName, size_t payloadlen, void* payload,
int qos, int retained, MQTTAsync_responseOptions* response) int qos, int retained, MQTTAsync_responseOptions* response)
{ {
int rc = MQTTASYNC_SUCCESS; int rc = MQTTASYNC_SUCCESS;
...@@ -2314,7 +2314,7 @@ int MQTTAsync_send(MQTTAsync handle, char* destinationName, int payloadlen, void ...@@ -2314,7 +2314,7 @@ int MQTTAsync_send(MQTTAsync handle, char* destinationName, int payloadlen, void
pub->command.context = response->context; pub->command.context = response->context;
} }
pub->command.details.pub.destinationName = malloc(strlen(destinationName) + 1); pub->command.details.pub.destinationName = malloc(strlen(destinationName) + 1);
strcpy(pub->command.details.pub.destinationName, destinationName); MQTTStrncpy(pub->command.details.pub.destinationName, destinationName,strlen(destinationName) + 1);
pub->command.details.pub.payloadlen = payloadlen; pub->command.details.pub.payloadlen = payloadlen;
pub->command.details.pub.payload = malloc(payloadlen); pub->command.details.pub.payload = malloc(payloadlen);
memcpy(pub->command.details.pub.payload, payload, payloadlen); memcpy(pub->command.details.pub.payload, payload, payloadlen);
...@@ -2329,7 +2329,7 @@ exit: ...@@ -2329,7 +2329,7 @@ exit:
int MQTTAsync_sendMessage(MQTTAsync handle, char* destinationName, MQTTAsync_message* message, int MQTTAsync_sendMessage(MQTTAsync handle, const char* destinationName, const MQTTAsync_message* message,
MQTTAsync_responseOptions* response) MQTTAsync_responseOptions* response)
{ {
int rc = MQTTASYNC_SUCCESS; int rc = MQTTASYNC_SUCCESS;
......
...@@ -76,6 +76,10 @@ ...@@ -76,6 +76,10 @@
/// @cond EXCLUDE /// @cond EXCLUDE
#if defined(__cplusplus)
extern "C" {
#endif
#if !defined(MQTTASYNC_H) #if !defined(MQTTASYNC_H)
#define MQTTASYNC_H #define MQTTASYNC_H
...@@ -476,7 +480,7 @@ DLLExport int MQTTAsync_setCallbacks(MQTTAsync handle, void* context, MQTTAsync_ ...@@ -476,7 +480,7 @@ DLLExport int MQTTAsync_setCallbacks(MQTTAsync handle, void* context, MQTTAsync_
* @return ::MQTTASYNC_SUCCESS if the client is successfully created, otherwise * @return ::MQTTASYNC_SUCCESS if the client is successfully created, otherwise
* an error code is returned. * an error code is returned.
*/ */
DLLExport int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientId, DLLExport int MQTTAsync_create(MQTTAsync* handle, const char* serverURI, const char* clientId,
int persistence_type, void* persistence_context); int persistence_type, void* persistence_context);
/** /**
...@@ -494,13 +498,13 @@ DLLExport int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientI ...@@ -494,13 +498,13 @@ DLLExport int MQTTAsync_create(MQTTAsync* handle, char* serverURI, char* clientI
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. must be MQTW. */ /** The eyecatcher for this structure. must be MQTW. */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0 */ /** The version number of this structure. Must be 0 */
int struct_version; int struct_version;
/** The LWT topic to which the LWT message will be published. */ /** The LWT topic to which the LWT message will be published. */
char* topicName; const char* topicName;
/** The LWT payload. */ /** The LWT payload. */
char* message; const char* message;
/** /**
* The retained flag for the LWT message (see MQTTAsync_message.retained). * The retained flag for the LWT message (see MQTTAsync_message.retained).
*/ */
...@@ -529,24 +533,24 @@ typedef struct ...@@ -529,24 +533,24 @@ typedef struct
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. Must be MQTS */ /** The eyecatcher for this structure. Must be MQTS */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0 */ /** The version number of this structure. Must be 0 */
int struct_version; int struct_version;
/** The file in PEM format containing the public digital certificates trusted by the client. */ /** The file in PEM format containing the public digital certificates trusted by the client. */
char* trustStore; const char* trustStore;
/** The file in PEM format containing the public certificate chain of the client. It may also include /** The file in PEM format containing the public certificate chain of the client. It may also include
* the client's private key. * the client's private key.
*/ */
char* keyStore; const char* keyStore;
/** If not included in the sslKeyStore, this setting points to the file in PEM format containing /** If not included in the sslKeyStore, this setting points to the file in PEM format containing
* the client's private key. * the client's private key.
*/ */
char* privateKey; const char* privateKey;
/** The password to load the client's privateKey if encrypted. */ /** The password to load the client's privateKey if encrypted. */
char* privateKeyPassword; const char* privateKeyPassword;
/** /**
* The list of cipher suites that the client will present to the server during the SSL handshake. For a * The list of cipher suites that the client will present to the server during the SSL handshake. For a
...@@ -556,7 +560,7 @@ typedef struct ...@@ -556,7 +560,7 @@ typedef struct
* those offering no encryption- will be considered. * those offering no encryption- will be considered.
* This setting can be used to set an SSL anonymous connection ("aNULL" string value, for instance). * This setting can be used to set an SSL anonymous connection ("aNULL" string value, for instance).
*/ */
char* enabledCipherSuites; const char* enabledCipherSuites;
/** True/False option to enable verification of the server certificate **/ /** True/False option to enable verification of the server certificate **/
int enableServerCertAuth; int enableServerCertAuth;
...@@ -573,8 +577,8 @@ typedef struct ...@@ -573,8 +577,8 @@ typedef struct
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. must be MQTC. */ /** The eyecatcher for this structure. must be MQTC. */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0, 1, 2 or 3. /** The version number of this structure. Must be 0, 1 or 2.
* 0 signifies no SSL options and no serverURIs * 0 signifies no SSL options and no serverURIs
* 1 signifies no serverURIs * 1 signifies no serverURIs
* 2 signifies no MQTTVersion * 2 signifies no MQTTVersion
...@@ -628,13 +632,13 @@ typedef struct ...@@ -628,13 +632,13 @@ typedef struct
* and authorisation by user name and password. This is the user name * and authorisation by user name and password. This is the user name
* parameter. * parameter.
*/ */
char* username; const char* username;
/** /**
* MQTT servers that support the MQTT v3.1 protocol provide authentication * MQTT servers that support the MQTT v3.1 protocol provide authentication
* and authorisation by user name and password. This is the password * and authorisation by user name and password. This is the password
* parameter. * parameter.
*/ */
char* password; const char* password;
/** /**
* The time interval in seconds to allow a connect to complete. * The time interval in seconds to allow a connect to complete.
*/ */
...@@ -678,7 +682,7 @@ typedef struct ...@@ -678,7 +682,7 @@ typedef struct
* a server running on the local machines with the default MQTT port, specify * a server running on the local machines with the default MQTT port, specify
* <i>tcp://localhost:1883</i>. * <i>tcp://localhost:1883</i>.
*/ */
char** serverURIs; char* const* serverURIs;
/** /**
* Sets the version of MQTT to be used on the connect. * Sets the version of MQTT to be used on the connect.
* MQTTVERSION_DEFAULT (0) = default: start with 3.1.1, and if that fails, fall back to 3.1 * MQTTVERSION_DEFAULT (0) = default: start with 3.1.1, and if that fails, fall back to 3.1
...@@ -711,13 +715,13 @@ typedef struct ...@@ -711,13 +715,13 @@ typedef struct
* <b>5</b>: Connection refused: Not authorized<br> * <b>5</b>: Connection refused: Not authorized<br>
* <b>6-255</b>: Reserved for future use<br> * <b>6-255</b>: Reserved for future use<br>
*/ */
DLLExport int MQTTAsync_connect(MQTTAsync handle, MQTTAsync_connectOptions* options); DLLExport int MQTTAsync_connect(MQTTAsync handle, const MQTTAsync_connectOptions* options);
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. Must be MQTD. */ /** The eyecatcher for this structure. Must be MQTD. */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0 or 1. 0 signifies no SSL options */ /** The version number of this structure. Must be 0 or 1. 0 signifies no SSL options */
int struct_version; int struct_version;
/** /**
...@@ -766,7 +770,7 @@ typedef struct ...@@ -766,7 +770,7 @@ typedef struct
* the server. An error code is returned if the client was unable to disconnect * the server. An error code is returned if the client was unable to disconnect
* from the server * from the server
*/ */
DLLExport int MQTTAsync_disconnect(MQTTAsync handle, MQTTAsync_disconnectOptions* options); DLLExport int MQTTAsync_disconnect(MQTTAsync handle, const MQTTAsync_disconnectOptions* options);
/** /**
...@@ -793,7 +797,7 @@ DLLExport int MQTTAsync_isConnected(MQTTAsync handle); ...@@ -793,7 +797,7 @@ DLLExport int MQTTAsync_isConnected(MQTTAsync handle);
* An error code is returned if there was a problem registering the * An error code is returned if there was a problem registering the
* subscription. * subscription.
*/ */
DLLExport int MQTTAsync_subscribe(MQTTAsync handle, char* topic, int qos, MQTTAsync_responseOptions* response); DLLExport int MQTTAsync_subscribe(MQTTAsync handle, const char* topic, int qos, MQTTAsync_responseOptions* response);
/** /**
...@@ -813,7 +817,7 @@ DLLExport int MQTTAsync_subscribe(MQTTAsync handle, char* topic, int qos, MQTTAs ...@@ -813,7 +817,7 @@ DLLExport int MQTTAsync_subscribe(MQTTAsync handle, char* topic, int qos, MQTTAs
* An error code is returned if there was a problem registering the * An error code is returned if there was a problem registering the
* subscriptions. * subscriptions.
*/ */
DLLExport int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char** topic, int* qos, MQTTAsync_responseOptions* response); DLLExport int MQTTAsync_subscribeMany(MQTTAsync handle, size_t count, char* const* topic, int* qos, MQTTAsync_responseOptions* response);
/** /**
* This function attempts to remove an existing subscription made by the * This function attempts to remove an existing subscription made by the
...@@ -827,7 +831,7 @@ DLLExport int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char** topic, ...@@ -827,7 +831,7 @@ DLLExport int MQTTAsync_subscribeMany(MQTTAsync handle, int count, char** topic,
* An error code is returned if there was a problem removing the * An error code is returned if there was a problem removing the
* subscription. * subscription.
*/ */
DLLExport int MQTTAsync_unsubscribe(MQTTAsync handle, char* topic, MQTTAsync_responseOptions* response); DLLExport int MQTTAsync_unsubscribe(MQTTAsync handle, const char* topic, MQTTAsync_responseOptions* response);
/** /**
* This function attempts to remove existing subscriptions to a list of topics * This function attempts to remove existing subscriptions to a list of topics
...@@ -841,7 +845,7 @@ DLLExport int MQTTAsync_unsubscribe(MQTTAsync handle, char* topic, MQTTAsync_res ...@@ -841,7 +845,7 @@ DLLExport int MQTTAsync_unsubscribe(MQTTAsync handle, char* topic, MQTTAsync_res
* @return ::MQTTASYNC_SUCCESS if the subscriptions are removed. * @return ::MQTTASYNC_SUCCESS if the subscriptions are removed.
* An error code is returned if there was a problem removing the subscriptions. * An error code is returned if there was a problem removing the subscriptions.
*/ */
DLLExport int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char** topic, MQTTAsync_responseOptions* response); DLLExport int MQTTAsync_unsubscribeMany(MQTTAsync handle, size_t count, char* const* topic, MQTTAsync_responseOptions* response);
/** /**
...@@ -862,7 +866,7 @@ DLLExport int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char** topi ...@@ -862,7 +866,7 @@ DLLExport int MQTTAsync_unsubscribeMany(MQTTAsync handle, int count, char** topi
* @return ::MQTTASYNC_SUCCESS if the message is accepted for publication. * @return ::MQTTASYNC_SUCCESS if the message is accepted for publication.
* An error code is returned if there was a problem accepting the message. * An error code is returned if there was a problem accepting the message.
*/ */
DLLExport int MQTTAsync_send(MQTTAsync handle, char* destinationName, int payloadlen, void* payload, int qos, int retained, DLLExport int MQTTAsync_send(MQTTAsync handle, const char* destinationName, size_t payloadlen, void* payload, int qos, int retained,
MQTTAsync_responseOptions* response); MQTTAsync_responseOptions* response);
...@@ -881,7 +885,7 @@ DLLExport int MQTTAsync_send(MQTTAsync handle, char* destinationName, int payloa ...@@ -881,7 +885,7 @@ DLLExport int MQTTAsync_send(MQTTAsync handle, char* destinationName, int payloa
* @return ::MQTTASYNC_SUCCESS if the message is accepted for publication. * @return ::MQTTASYNC_SUCCESS if the message is accepted for publication.
* An error code is returned if there was a problem accepting the message. * An error code is returned if there was a problem accepting the message.
*/ */
DLLExport int MQTTAsync_sendMessage(MQTTAsync handle, char* destinationName, MQTTAsync_message* msg, MQTTAsync_responseOptions* response); DLLExport int MQTTAsync_sendMessage(MQTTAsync handle, const char* destinationName, const MQTTAsync_message* msg, MQTTAsync_responseOptions* response);
/** /**
...@@ -1506,3 +1510,7 @@ exit: ...@@ -1506,3 +1510,7 @@ exit:
#endif #endif
#ifdef __cplusplus
}
#endif
...@@ -228,7 +228,7 @@ long MQTTClient_elapsed(struct timeval start) ...@@ -228,7 +228,7 @@ long MQTTClient_elapsed(struct timeval start)
#endif #endif
int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId, int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId,
int persistence_type, void* persistence_context) int persistence_type, void* persistence_context)
{ {
int rc = 0; int rc = 0;
...@@ -277,7 +277,7 @@ int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId, ...@@ -277,7 +277,7 @@ int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId,
} }
#endif #endif
m->serverURI = malloc(strlen(serverURI)+1); m->serverURI = malloc(strlen(serverURI)+1);
strcpy(m->serverURI, serverURI); MQTTStrncpy(m->serverURI, serverURI,strlen(serverURI)+1);
ListAppend(handles, m, sizeof(MQTTClients)); ListAppend(handles, m, sizeof(MQTTClients));
m->c = malloc(sizeof(Clients)); m->c = malloc(sizeof(Clients));
...@@ -287,7 +287,7 @@ int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId, ...@@ -287,7 +287,7 @@ int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId,
m->c->inboundMsgs = ListInitialize(); m->c->inboundMsgs = ListInitialize();
m->c->messageQueue = ListInitialize(); m->c->messageQueue = ListInitialize();
m->c->clientID = malloc(strlen(clientId)+1); m->c->clientID = malloc(strlen(clientId)+1);
strcpy(m->c->clientID, clientId); MQTTStrncpy(m->c->clientID, clientId,strlen(clientId)+1);
m->connect_sem = Thread_create_sem(); m->connect_sem = Thread_create_sem();
m->connack_sem = Thread_create_sem(); m->connack_sem = Thread_create_sem();
m->suback_sem = Thread_create_sem(); m->suback_sem = Thread_create_sem();
...@@ -368,7 +368,7 @@ void MQTTClient_destroy(MQTTClient* handle) ...@@ -368,7 +368,7 @@ void MQTTClient_destroy(MQTTClient* handle)
{ {
int saved_socket = m->c->net.socket; int saved_socket = m->c->net.socket;
char* saved_clientid = malloc(strlen(m->c->clientID)+1); char* saved_clientid = malloc(strlen(m->c->clientID)+1);
strcpy(saved_clientid, m->c->clientID); MQTTStrncpy(saved_clientid, m->c->clientID,strlen(m->c->clientID)+1);
#if !defined(NO_PERSISTENCE) #if !defined(NO_PERSISTENCE)
MQTTPersistence_close(m->c); MQTTPersistence_close(m->c);
#endif #endif
...@@ -758,7 +758,7 @@ void Protocol_processPublication(Publish* publish, Clients* client) ...@@ -758,7 +758,7 @@ void Protocol_processPublication(Publish* publish, Clients* client)
} }
int MQTTClient_connectURIVersion(MQTTClient handle, MQTTClient_connectOptions* options, char* serverURI, int MQTTVersion, int MQTTClient_connectURIVersion(MQTTClient handle, MQTTClient_connectOptions* options, const char* serverURI, int MQTTVersion,
START_TIME_TYPE start, long millisecsTimeout) START_TIME_TYPE start, long millisecsTimeout)
{ {
MQTTClients* m = handle; MQTTClients* m = handle;
...@@ -935,7 +935,7 @@ exit: ...@@ -935,7 +935,7 @@ exit:
} }
int MQTTClient_connectURI(MQTTClient handle, MQTTClient_connectOptions* options, char* serverURI) int MQTTClient_connectURI(MQTTClient handle, MQTTClient_connectOptions* options, const char* serverURI)
{ {
MQTTClients* m = handle; MQTTClients* m = handle;
START_TIME_TYPE start; START_TIME_TYPE start;
...@@ -963,11 +963,11 @@ int MQTTClient_connectURI(MQTTClient handle, MQTTClient_connectOptions* options, ...@@ -963,11 +963,11 @@ int MQTTClient_connectURI(MQTTClient handle, MQTTClient_connectOptions* options,
{ {
m->c->will = malloc(sizeof(willMessages)); m->c->will = malloc(sizeof(willMessages));
m->c->will->msg = malloc(strlen(options->will->message) + 1); m->c->will->msg = malloc(strlen(options->will->message) + 1);
strcpy(m->c->will->msg, options->will->message); MQTTStrncpy(m->c->will->msg , options->will->message,strlen(options->will->message) + 1);
m->c->will->qos = options->will->qos; m->c->will->qos = options->will->qos;
m->c->will->retained = options->will->retained; m->c->will->retained = options->will->retained;
m->c->will->topic = malloc(strlen(options->will->topicName) + 1); m->c->will->topic = malloc(strlen(options->will->topicName) + 1);
strcpy(m->c->will->topic, options->will->topicName); MQTTStrncpy(m->c->will->topic , options->will->topicName,strlen(options->will->topicName) + 1);
} }
#if defined(OPENSSL) #if defined(OPENSSL)
...@@ -994,27 +994,27 @@ int MQTTClient_connectURI(MQTTClient handle, MQTTClient_connectOptions* options, ...@@ -994,27 +994,27 @@ int MQTTClient_connectURI(MQTTClient handle, MQTTClient_connectOptions* options,
if (options->ssl->trustStore) if (options->ssl->trustStore)
{ {
m->c->sslopts->trustStore = malloc(strlen(options->ssl->trustStore) + 1); m->c->sslopts->trustStore = malloc(strlen(options->ssl->trustStore) + 1);
strcpy(m->c->sslopts->trustStore, options->ssl->trustStore); MQTTStrncpy(m->c->sslopts->trustStore , options->ssl->trustStore,strlen(options->ssl->trustStore)+1);
} }
if (options->ssl->keyStore) if (options->ssl->keyStore)
{ {
m->c->sslopts->keyStore = malloc(strlen(options->ssl->keyStore) + 1); m->c->sslopts->keyStore = malloc(strlen(options->ssl->keyStore) + 1);
strcpy(m->c->sslopts->keyStore, options->ssl->keyStore); MQTTStrncpy(m->c->sslopts->keyStore , options->ssl->keyStore,strlen(options->ssl->keyStore)+1);
} }
if (options->ssl->privateKey) if (options->ssl->privateKey)
{ {
m->c->sslopts->privateKey = malloc(strlen(options->ssl->privateKey) + 1); m->c->sslopts->privateKey = malloc(strlen(options->ssl->privateKey) + 1);
strcpy(m->c->sslopts->privateKey, options->ssl->privateKey); MQTTStrncpy(m->c->sslopts->privateKey , options->ssl->privateKey,strlen(options->ssl->privateKey)+1);
} }
if (options->ssl->privateKeyPassword) if (options->ssl->privateKeyPassword)
{ {
m->c->sslopts->privateKeyPassword = malloc(strlen(options->ssl->privateKeyPassword) + 1); m->c->sslopts->privateKeyPassword = malloc(strlen(options->ssl->privateKeyPassword) + 1);
strcpy(m->c->sslopts->privateKeyPassword, options->ssl->privateKeyPassword); MQTTStrncpy(m->c->sslopts->privateKeyPassword , options->ssl->privateKeyPassword,strlen(options->ssl->privateKeyPassword)+1);
} }
if (options->ssl->enabledCipherSuites) if (options->ssl->enabledCipherSuites)
{ {
m->c->sslopts->enabledCipherSuites = malloc(strlen(options->ssl->enabledCipherSuites) + 1); m->c->sslopts->enabledCipherSuites = malloc(strlen(options->ssl->enabledCipherSuites) + 1);
strcpy(m->c->sslopts->enabledCipherSuites, options->ssl->enabledCipherSuites); MQTTStrncpy(m->c->sslopts->enabledCipherSuites , options->ssl->enabledCipherSuites,strlen(options->ssl->enabledCipherSuites)+1);
} }
m->c->sslopts->enableServerCertAuth = options->ssl->enableServerCertAuth; m->c->sslopts->enableServerCertAuth = options->ssl->enableServerCertAuth;
} }
...@@ -1219,7 +1219,7 @@ int MQTTClient_isConnected(MQTTClient handle) ...@@ -1219,7 +1219,7 @@ int MQTTClient_isConnected(MQTTClient handle)
} }
int MQTTClient_subscribeMany(MQTTClient handle, int count, char** topic, int* qos) int MQTTClient_subscribeMany(MQTTClient handle, int count, char* const* topic, int* qos)
{ {
MQTTClients* m = handle; MQTTClients* m = handle;
List* topics = ListInitialize(); List* topics = ListInitialize();
...@@ -1304,12 +1304,13 @@ exit: ...@@ -1304,12 +1304,13 @@ exit:
} }
int MQTTClient_subscribe(MQTTClient handle, char* topic, int qos) int MQTTClient_subscribe(MQTTClient handle, const char* topic, int qos)
{ {
int rc = 0; int rc = 0;
char *const topics[] = {(char*)topic};
FUNC_ENTRY; FUNC_ENTRY;
rc = MQTTClient_subscribeMany(handle, 1, &topic, &qos); rc = MQTTClient_subscribeMany(handle, 1, topics, &qos);
if (qos == MQTT_BAD_SUBSCRIBE) /* addition for MQTT 3.1.1 - error code from subscribe */ if (qos == MQTT_BAD_SUBSCRIBE) /* addition for MQTT 3.1.1 - error code from subscribe */
rc = MQTT_BAD_SUBSCRIBE; rc = MQTT_BAD_SUBSCRIBE;
FUNC_EXIT_RC(rc); FUNC_EXIT_RC(rc);
...@@ -1317,7 +1318,7 @@ int MQTTClient_subscribe(MQTTClient handle, char* topic, int qos) ...@@ -1317,7 +1318,7 @@ int MQTTClient_subscribe(MQTTClient handle, char* topic, int qos)
} }
int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char** topic) int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char* const* topic)
{ {
MQTTClients* m = handle; MQTTClients* m = handle;
List* topics = ListInitialize(); List* topics = ListInitialize();
...@@ -1382,18 +1383,18 @@ exit: ...@@ -1382,18 +1383,18 @@ exit:
} }
int MQTTClient_unsubscribe(MQTTClient handle, char* topic) int MQTTClient_unsubscribe(MQTTClient handle, const char* topic)
{ {
int rc = 0; int rc = 0;
char *const topics[] = {(char*)topic};
FUNC_ENTRY; FUNC_ENTRY;
rc = MQTTClient_unsubscribeMany(handle, 1, &topic); rc = MQTTClient_unsubscribeMany(handle, 1, topics);
FUNC_EXIT_RC(rc); FUNC_EXIT_RC(rc);
return rc; return rc;
} }
int MQTTClient_publish(MQTTClient handle, char* topicName, int payloadlen, void* payload, int MQTTClient_publish(MQTTClient handle, const char* topicName, int payloadlen, void* payload,
int qos, int retained, MQTTClient_deliveryToken* deliveryToken) int qos, int retained, MQTTClient_deliveryToken* deliveryToken)
{ {
int rc = MQTTCLIENT_SUCCESS; int rc = MQTTCLIENT_SUCCESS;
...@@ -1439,7 +1440,7 @@ int MQTTClient_publish(MQTTClient handle, char* topicName, int payloadlen, void* ...@@ -1439,7 +1440,7 @@ int MQTTClient_publish(MQTTClient handle, char* topicName, int payloadlen, void*
p->payload = payload; p->payload = payload;
p->payloadlen = payloadlen; p->payloadlen = payloadlen;
p->topic = topicName; p->topic = (char*)topicName;
p->msgId = -1; p->msgId = -1;
rc = MQTTProtocol_startPublish(m->c, p, qos, retained, &msg); rc = MQTTProtocol_startPublish(m->c, p, qos, retained, &msg);
...@@ -1482,7 +1483,7 @@ exit: ...@@ -1482,7 +1483,7 @@ exit:
int MQTTClient_publishMessage(MQTTClient handle, char* topicName, MQTTClient_message* message, int MQTTClient_publishMessage(MQTTClient handle, const char* topicName, MQTTClient_message* message,
MQTTClient_deliveryToken* deliveryToken) MQTTClient_deliveryToken* deliveryToken)
{ {
int rc = MQTTCLIENT_SUCCESS; int rc = MQTTCLIENT_SUCCESS;
......
...@@ -97,6 +97,9 @@ ...@@ -97,6 +97,9 @@
*/ */
/// @cond EXCLUDE /// @cond EXCLUDE
#if defined(__cplusplus)
extern "C" {
#endif
#if !defined(MQTTCLIENT_H) #if !defined(MQTTCLIENT_H)
#define MQTTCLIENT_H #define MQTTCLIENT_H
...@@ -401,7 +404,7 @@ DLLExport int MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClie ...@@ -401,7 +404,7 @@ DLLExport int MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClie
* @return ::MQTTCLIENT_SUCCESS if the client is successfully created, otherwise * @return ::MQTTCLIENT_SUCCESS if the client is successfully created, otherwise
* an error code is returned. * an error code is returned.
*/ */
DLLExport int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clientId, DLLExport int MQTTClient_create(MQTTClient* handle, const char* serverURI, const char* clientId,
int persistence_type, void* persistence_context); int persistence_type, void* persistence_context);
/** /**
...@@ -419,13 +422,13 @@ DLLExport int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clien ...@@ -419,13 +422,13 @@ DLLExport int MQTTClient_create(MQTTClient* handle, char* serverURI, char* clien
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. must be MQTW. */ /** The eyecatcher for this structure. must be MQTW. */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0 */ /** The version number of this structure. Must be 0 */
int struct_version; int struct_version;
/** The LWT topic to which the LWT message will be published. */ /** The LWT topic to which the LWT message will be published. */
char* topicName; const char* topicName;
/** The LWT payload. */ /** The LWT payload. */
char* message; const char* message;
/** /**
* The retained flag for the LWT message (see MQTTClient_message.retained). * The retained flag for the LWT message (see MQTTClient_message.retained).
*/ */
...@@ -454,7 +457,7 @@ typedef struct ...@@ -454,7 +457,7 @@ typedef struct
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. Must be MQTS */ /** The eyecatcher for this structure. Must be MQTS */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0 */ /** The version number of this structure. Must be 0 */
int struct_version; int struct_version;
...@@ -507,7 +510,7 @@ typedef struct ...@@ -507,7 +510,7 @@ typedef struct
typedef struct typedef struct
{ {
/** The eyecatcher for this structure. must be MQTC. */ /** The eyecatcher for this structure. must be MQTC. */
char struct_id[4]; const char struct_id[4];
/** The version number of this structure. Must be 0, 1, 2, 3 or 4. /** The version number of this structure. Must be 0, 1, 2, 3 or 4.
* 0 signifies no SSL options and no serverURIs * 0 signifies no SSL options and no serverURIs
* 1 signifies no serverURIs * 1 signifies no serverURIs
...@@ -568,13 +571,13 @@ typedef struct ...@@ -568,13 +571,13 @@ typedef struct
* and authorisation by user name and password. This is the user name * and authorisation by user name and password. This is the user name
* parameter. * parameter.
*/ */
char* username; const char* username;
/** /**
* MQTT servers that support the MQTT v3.1 protocol provide authentication * MQTT servers that support the MQTT v3.1 protocol provide authentication
* and authorisation by user name and password. This is the password * and authorisation by user name and password. This is the password
* parameter. * parameter.
*/ */
char* password; const char* password;
/** /**
* The time interval in seconds to allow a connect to complete. * The time interval in seconds to allow a connect to complete.
*/ */
...@@ -602,7 +605,7 @@ typedef struct ...@@ -602,7 +605,7 @@ typedef struct
* If this list is empty (the default), the server URI specified on MQTTClient_create() * If this list is empty (the default), the server URI specified on MQTTClient_create()
* is used. * is used.
*/ */
char** serverURIs; char* const* serverURIs;
/** /**
* Sets the version of MQTT to be used on the connect. * Sets the version of MQTT to be used on the connect.
* MQTTVERSION_DEFAULT (0) = default: start with 3.1.1, and if that fails, fall back to 3.1 * MQTTVERSION_DEFAULT (0) = default: start with 3.1.1, and if that fails, fall back to 3.1
...@@ -615,7 +618,7 @@ typedef struct ...@@ -615,7 +618,7 @@ typedef struct
*/ */
struct struct
{ {
char* serverURI; /**< the serverURI connected to */ const char* serverURI; /**< the serverURI connected to */
int MQTTVersion; /**< the MQTT version used to connect with */ int MQTTVersion; /**< the MQTT version used to connect with */
int sessionPresent; /**< if the MQTT version is 3.1.1, the value of sessionPresent returned in the connack */ int sessionPresent; /**< if the MQTT version is 3.1.1, the value of sessionPresent returned in the connack */
} returned; } returned;
...@@ -711,7 +714,7 @@ DLLExport int MQTTClient_isConnected(MQTTClient handle); ...@@ -711,7 +714,7 @@ DLLExport int MQTTClient_isConnected(MQTTClient handle);
* An error code is returned if there was a problem registering the * An error code is returned if there was a problem registering the
* subscription. * subscription.
*/ */
DLLExport int MQTTClient_subscribe(MQTTClient handle, char* topic, int qos); DLLExport int MQTTClient_subscribe(MQTTClient handle, const char* topic, int qos);
/** /**
* This function attempts to subscribe a client to a list of topics, which may * This function attempts to subscribe a client to a list of topics, which may
...@@ -729,7 +732,7 @@ DLLExport int MQTTClient_subscribe(MQTTClient handle, char* topic, int qos); ...@@ -729,7 +732,7 @@ DLLExport int MQTTClient_subscribe(MQTTClient handle, char* topic, int qos);
* An error code is returned if there was a problem registering the * An error code is returned if there was a problem registering the
* subscriptions. * subscriptions.
*/ */
DLLExport int MQTTClient_subscribeMany(MQTTClient handle, int count, char** topic, int* qos); DLLExport int MQTTClient_subscribeMany(MQTTClient handle, int count, char* const* topic, int* qos);
/** /**
* This function attempts to remove an existing subscription made by the * This function attempts to remove an existing subscription made by the
...@@ -742,7 +745,7 @@ DLLExport int MQTTClient_subscribeMany(MQTTClient handle, int count, char** topi ...@@ -742,7 +745,7 @@ DLLExport int MQTTClient_subscribeMany(MQTTClient handle, int count, char** topi
* An error code is returned if there was a problem removing the * An error code is returned if there was a problem removing the
* subscription. * subscription.
*/ */
DLLExport int MQTTClient_unsubscribe(MQTTClient handle, char* topic); DLLExport int MQTTClient_unsubscribe(MQTTClient handle, const char* topic);
/** /**
* This function attempts to remove existing subscriptions to a list of topics * This function attempts to remove existing subscriptions to a list of topics
...@@ -755,7 +758,7 @@ DLLExport int MQTTClient_unsubscribe(MQTTClient handle, char* topic); ...@@ -755,7 +758,7 @@ DLLExport int MQTTClient_unsubscribe(MQTTClient handle, char* topic);
* @return ::MQTTCLIENT_SUCCESS if the subscriptions are removed. * @return ::MQTTCLIENT_SUCCESS if the subscriptions are removed.
* An error code is returned if there was a problem removing the subscriptions. * An error code is returned if there was a problem removing the subscriptions.
*/ */
DLLExport int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char** topic); DLLExport int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char* const* topic);
/** /**
* This function attempts to publish a message to a given topic (see also * This function attempts to publish a message to a given topic (see also
...@@ -778,7 +781,7 @@ DLLExport int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char** to ...@@ -778,7 +781,7 @@ DLLExport int MQTTClient_unsubscribeMany(MQTTClient handle, int count, char** to
* @return ::MQTTCLIENT_SUCCESS if the message is accepted for publication. * @return ::MQTTCLIENT_SUCCESS if the message is accepted for publication.
* An error code is returned if there was a problem accepting the message. * An error code is returned if there was a problem accepting the message.
*/ */
DLLExport int MQTTClient_publish(MQTTClient handle, char* topicName, int payloadlen, void* payload, int qos, int retained, DLLExport int MQTTClient_publish(MQTTClient handle, const char* topicName, int payloadlen, void* payload, int qos, int retained,
MQTTClient_deliveryToken* dt); MQTTClient_deliveryToken* dt);
/** /**
* This function attempts to publish a message to a given topic (see also * This function attempts to publish a message to a given topic (see also
...@@ -799,7 +802,7 @@ DLLExport int MQTTClient_publish(MQTTClient handle, char* topicName, int payload ...@@ -799,7 +802,7 @@ DLLExport int MQTTClient_publish(MQTTClient handle, char* topicName, int payload
* @return ::MQTTCLIENT_SUCCESS if the message is accepted for publication. * @return ::MQTTCLIENT_SUCCESS if the message is accepted for publication.
* An error code is returned if there was a problem accepting the message. * An error code is returned if there was a problem accepting the message.
*/ */
DLLExport int MQTTClient_publishMessage(MQTTClient handle, char* topicName, MQTTClient_message* msg, MQTTClient_deliveryToken* dt); DLLExport int MQTTClient_publishMessage(MQTTClient handle, const char* topicName, MQTTClient_message* msg, MQTTClient_deliveryToken* dt);
/** /**
...@@ -914,6 +917,9 @@ DLLExport void MQTTClient_free(void* ptr); ...@@ -914,6 +917,9 @@ DLLExport void MQTTClient_free(void* ptr);
DLLExport void MQTTClient_destroy(MQTTClient* handle); DLLExport void MQTTClient_destroy(MQTTClient* handle);
#endif #endif
#ifdef __cplusplus
}
#endif
/** /**
* @cond MQTTClient_main * @cond MQTTClient_main
......
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
* @return Return 0 if the function completes successfully, otherwise return * @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR. * ::MQTTCLIENT_PERSISTENCE_ERROR.
*/ */
typedef int (*Persistence_open)(void** handle, char* clientID, char* serverURI, void* context); typedef int (*Persistence_open)(void** handle, const char* clientID, const char* serverURI, void* context);
/** /**
* @brief Close the persistent store referred to by the handle. * @brief Close the persistent store referred to by the handle.
......
...@@ -97,6 +97,7 @@ void* MQTTPacket_Factory(networkHandles* net, int* error) ...@@ -97,6 +97,7 @@ void* MQTTPacket_Factory(networkHandles* net, int* error)
char* data = NULL; char* data = NULL;
static Header header; static Header header;
int remaining_length, ptype; int remaining_length, ptype;
size_t remaining_length_new;
void* pack = NULL; void* pack = NULL;
int actual_len = 0; int actual_len = 0;
...@@ -147,8 +148,9 @@ void* MQTTPacket_Factory(networkHandles* net, int* error) ...@@ -147,8 +148,9 @@ void* MQTTPacket_Factory(networkHandles* net, int* error)
char *buf = malloc(10); char *buf = malloc(10);
buf[0] = header.byte; buf[0] = header.byte;
buf0len = 1 + MQTTPacket_encode(&buf[1], remaining_length); buf0len = 1 + MQTTPacket_encode(&buf[1], remaining_length);
remaining_length_new = remaining_length;
*error = MQTTPersistence_put(net->socket, buf, buf0len, 1, *error = MQTTPersistence_put(net->socket, buf, buf0len, 1,
&data, &remaining_length, header.bits.type, ((Publish *)pack)->msgId, 1); &data, &remaining_length_new, header.bits.type, ((Publish *)pack)->msgId, 1);
free(buf); free(buf);
} }
#endif #endif
...@@ -168,7 +170,7 @@ exit: ...@@ -168,7 +170,7 @@ exit:
* @param buflen the length of the data in buffer to be written * @param buflen the length of the data in buffer to be written
* @return the completion code (TCPSOCKET_COMPLETE etc) * @return the completion code (TCPSOCKET_COMPLETE etc)
*/ */
int MQTTPacket_send(networkHandles* net, Header header, char* buffer, int buflen, int free) int MQTTPacket_send(networkHandles* net, Header header, char* buffer, size_t buflen, int free)
{ {
int rc, buf0len; int rc, buf0len;
char *buf; char *buf;
...@@ -214,7 +216,7 @@ int MQTTPacket_send(networkHandles* net, Header header, char* buffer, int buflen ...@@ -214,7 +216,7 @@ int MQTTPacket_send(networkHandles* net, Header header, char* buffer, int buflen
* @param buflens the lengths of the data in the array of buffers to be written * @param buflens the lengths of the data in the array of buffers to be written
* @return the completion code (TCPSOCKET_COMPLETE etc) * @return the completion code (TCPSOCKET_COMPLETE etc)
*/ */
int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, int* buflens, int* frees) int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, size_t* buflens, int* frees)
{ {
int i, rc, buf0len, total = 0; int i, rc, buf0len, total = 0;
char *buf; char *buf;
...@@ -423,7 +425,7 @@ void writeInt(char** pptr, int anInt) ...@@ -423,7 +425,7 @@ void writeInt(char** pptr, int anInt)
* @param pptr pointer to the output buffer - incremented by the number of bytes used & returned * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned
* @param string the C string to write * @param string the C string to write
*/ */
void writeUTF(char** pptr, char* string) void writeUTF(char** pptr, const char* string)
{ {
int len = strlen(string); int len = strlen(string);
writeInt(pptr, len); writeInt(pptr, len);
...@@ -439,7 +441,7 @@ void writeUTF(char** pptr, char* string) ...@@ -439,7 +441,7 @@ void writeUTF(char** pptr, char* string)
* @param datalen the length of the rest of the packet * @param datalen the length of the rest of the packet
* @return pointer to the packet structure * @return pointer to the packet structure
*/ */
void* MQTTPacket_header_only(unsigned char aHeader, char* data, int datalen) void* MQTTPacket_header_only(unsigned char aHeader, char* data, size_t datalen)
{ {
static unsigned char header = 0; static unsigned char header = 0;
header = aHeader; header = aHeader;
...@@ -452,7 +454,7 @@ void* MQTTPacket_header_only(unsigned char aHeader, char* data, int datalen) ...@@ -452,7 +454,7 @@ void* MQTTPacket_header_only(unsigned char aHeader, char* data, int datalen)
* @param socket the open socket to send the data to * @param socket the open socket to send the data to
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_disconnect(networkHandles *net, char* clientID) int MQTTPacket_send_disconnect(networkHandles *net, const char* clientID)
{ {
Header header; Header header;
int rc = 0; int rc = 0;
...@@ -474,7 +476,7 @@ int MQTTPacket_send_disconnect(networkHandles *net, char* clientID) ...@@ -474,7 +476,7 @@ int MQTTPacket_send_disconnect(networkHandles *net, char* clientID)
* @param datalen the length of the rest of the packet * @param datalen the length of the rest of the packet
* @return pointer to the packet structure * @return pointer to the packet structure
*/ */
void* MQTTPacket_publish(unsigned char aHeader, char* data, int datalen) void* MQTTPacket_publish(unsigned char aHeader, char* data, size_t datalen)
{ {
Publish* pack = malloc(sizeof(Publish)); Publish* pack = malloc(sizeof(Publish));
char* curdata = data; char* curdata = data;
...@@ -550,7 +552,7 @@ int MQTTPacket_send_ack(int type, int msgid, int dup, networkHandles *net) ...@@ -550,7 +552,7 @@ int MQTTPacket_send_ack(int type, int msgid, int dup, networkHandles *net)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_puback(int msgid, networkHandles* net, char* clientID) int MQTTPacket_send_puback(int msgid, networkHandles* net, const char* clientID)
{ {
int rc = 0; int rc = 0;
...@@ -583,7 +585,7 @@ void MQTTPacket_freeSuback(Suback* pack) ...@@ -583,7 +585,7 @@ void MQTTPacket_freeSuback(Suback* pack)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_pubrec(int msgid, networkHandles* net, char* clientID) int MQTTPacket_send_pubrec(int msgid, networkHandles* net, const char* clientID)
{ {
int rc = 0; int rc = 0;
...@@ -603,7 +605,7 @@ int MQTTPacket_send_pubrec(int msgid, networkHandles* net, char* clientID) ...@@ -603,7 +605,7 @@ int MQTTPacket_send_pubrec(int msgid, networkHandles* net, char* clientID)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, char* clientID) int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, const char* clientID)
{ {
int rc = 0; int rc = 0;
...@@ -622,7 +624,7 @@ int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, char* client ...@@ -622,7 +624,7 @@ int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, char* client
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, char* clientID) int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, const char* clientID)
{ {
int rc = 0; int rc = 0;
...@@ -641,7 +643,7 @@ int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, char* clientID) ...@@ -641,7 +643,7 @@ int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, char* clientID)
* @param datalen the length of the rest of the packet * @param datalen the length of the rest of the packet
* @return pointer to the packet structure * @return pointer to the packet structure
*/ */
void* MQTTPacket_ack(unsigned char aHeader, char* data, int datalen) void* MQTTPacket_ack(unsigned char aHeader, char* data, size_t datalen)
{ {
Ack* pack = malloc(sizeof(Ack)); Ack* pack = malloc(sizeof(Ack));
char* curdata = data; char* curdata = data;
...@@ -664,7 +666,7 @@ void* MQTTPacket_ack(unsigned char aHeader, char* data, int datalen) ...@@ -664,7 +666,7 @@ void* MQTTPacket_ack(unsigned char aHeader, char* data, int datalen)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, char* clientID) int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, const char* clientID)
{ {
Header header; Header header;
char *topiclen; char *topiclen;
...@@ -682,7 +684,7 @@ int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, netwo ...@@ -682,7 +684,7 @@ int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, netwo
char *buf = malloc(2); char *buf = malloc(2);
char *ptr = buf; char *ptr = buf;
char* bufs[4] = {topiclen, pack->topic, buf, pack->payload}; char* bufs[4] = {topiclen, pack->topic, buf, pack->payload};
int lens[4] = {2, strlen(pack->topic), 2, pack->payloadlen}; size_t lens[4] = {2, strlen(pack->topic), 2, pack->payloadlen};
int frees[4] = {1, 0, 1, 0}; int frees[4] = {1, 0, 1, 0};
writeInt(&ptr, pack->msgId); writeInt(&ptr, pack->msgId);
...@@ -696,7 +698,7 @@ int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, netwo ...@@ -696,7 +698,7 @@ int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, netwo
{ {
char* ptr = topiclen; char* ptr = topiclen;
char* bufs[3] = {topiclen, pack->topic, pack->payload}; char* bufs[3] = {topiclen, pack->topic, pack->payload};
int lens[3] = {2, strlen(pack->topic), pack->payloadlen}; size_t lens[3] = {2, strlen(pack->topic), pack->payloadlen};
int frees[3] = {1, 0, 0}; int frees[3] = {1, 0, 0};
writeInt(&ptr, lens[1]); writeInt(&ptr, lens[1]);
......
...@@ -33,7 +33,7 @@ include "Clients" ...@@ -33,7 +33,7 @@ include "Clients"
BE*/ BE*/
typedef unsigned int bool; typedef unsigned int bool;
typedef void* (*pf)(unsigned char, char*, int); typedef void* (*pf)(unsigned char, char*, size_t);
#define BAD_MQTT_PACKET -4 #define BAD_MQTT_PACKET -4
...@@ -223,27 +223,27 @@ char* readUTF(char** pptr, char* enddata); ...@@ -223,27 +223,27 @@ char* readUTF(char** pptr, char* enddata);
unsigned char readChar(char** pptr); unsigned char readChar(char** pptr);
void writeChar(char** pptr, char c); void writeChar(char** pptr, char c);
void writeInt(char** pptr, int anInt); void writeInt(char** pptr, int anInt);
void writeUTF(char** pptr, char* string); void writeUTF(char** pptr, const char* string);
char* MQTTPacket_name(int ptype); char* MQTTPacket_name(int ptype);
void* MQTTPacket_Factory(networkHandles* net, int* error); void* MQTTPacket_Factory(networkHandles* net, int* error);
int MQTTPacket_send(networkHandles* net, Header header, char* buffer, int buflen, int free); int MQTTPacket_send(networkHandles* net, Header header, char* buffer, size_t buflen, int free);
int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, int* buflens, int* frees); int MQTTPacket_sends(networkHandles* net, Header header, int count, char** buffers, size_t* buflens, int* frees);
void* MQTTPacket_header_only(unsigned char aHeader, char* data, int datalen); void* MQTTPacket_header_only(unsigned char aHeader, char* data, size_t datalen);
int MQTTPacket_send_disconnect(networkHandles* net, char* clientID); int MQTTPacket_send_disconnect(networkHandles* net, const char* clientID);
void* MQTTPacket_publish(unsigned char aHeader, char* data, int datalen); void* MQTTPacket_publish(unsigned char aHeader, char* data, size_t datalen);
void MQTTPacket_freePublish(Publish* pack); void MQTTPacket_freePublish(Publish* pack);
int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, char* clientID); int MQTTPacket_send_publish(Publish* pack, int dup, int qos, int retained, networkHandles* net, const char* clientID);
int MQTTPacket_send_puback(int msgid, networkHandles* net, char* clientID); int MQTTPacket_send_puback(int msgid, networkHandles* net, const char* clientID);
void* MQTTPacket_ack(unsigned char aHeader, char* data, int datalen); void* MQTTPacket_ack(unsigned char aHeader, char* data, size_t datalen);
void MQTTPacket_freeSuback(Suback* pack); void MQTTPacket_freeSuback(Suback* pack);
int MQTTPacket_send_pubrec(int msgid, networkHandles* net, char* clientID); int MQTTPacket_send_pubrec(int msgid, networkHandles* net, const char* clientID);
int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, char* clientID); int MQTTPacket_send_pubrel(int msgid, int dup, networkHandles* net, const char* clientID);
int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, char* clientID); int MQTTPacket_send_pubcomp(int msgid, networkHandles* net, const char* clientID);
void MQTTPacket_free_packet(MQTTPacket* pack); void MQTTPacket_free_packet(MQTTPacket* pack);
......
...@@ -116,7 +116,7 @@ exit: ...@@ -116,7 +116,7 @@ exit:
* @param datalen the length of the rest of the packet * @param datalen the length of the rest of the packet
* @return pointer to the packet structure * @return pointer to the packet structure
*/ */
void* MQTTPacket_connack(unsigned char aHeader, char* data, int datalen) void* MQTTPacket_connack(unsigned char aHeader, char* data, size_t datalen)
{ {
Connack* pack = malloc(sizeof(Connack)); Connack* pack = malloc(sizeof(Connack));
char* curdata = data; char* curdata = data;
...@@ -136,15 +136,16 @@ void* MQTTPacket_connack(unsigned char aHeader, char* data, int datalen) ...@@ -136,15 +136,16 @@ void* MQTTPacket_connack(unsigned char aHeader, char* data, int datalen)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_pingreq(networkHandles* net, char* clientID) int MQTTPacket_send_pingreq(networkHandles* net, const char* clientID)
{ {
Header header; Header header;
int rc = 0; int rc = 0;
size_t buflen = 0;
FUNC_ENTRY; FUNC_ENTRY;
header.byte = 0; header.byte = 0;
header.bits.type = PINGREQ; header.bits.type = PINGREQ;
rc = MQTTPacket_send(net, header, NULL, 0, 0); rc = MQTTPacket_send(net, header, NULL, buflen,0);
Log(LOG_PROTOCOL, 20, NULL, net->socket, clientID, rc); Log(LOG_PROTOCOL, 20, NULL, net->socket, clientID, rc);
FUNC_EXIT_RC(rc); FUNC_EXIT_RC(rc);
return rc; return rc;
...@@ -161,7 +162,7 @@ int MQTTPacket_send_pingreq(networkHandles* net, char* clientID) ...@@ -161,7 +162,7 @@ int MQTTPacket_send_pingreq(networkHandles* net, char* clientID)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_subscribe(List* topics, List* qoss, int msgid, int dup, networkHandles* net, char* clientID) int MQTTPacket_send_subscribe(List* topics, List* qoss, int msgid, int dup, networkHandles* net, const char* clientID)
{ {
Header header; Header header;
char *data, *ptr; char *data, *ptr;
...@@ -204,7 +205,7 @@ int MQTTPacket_send_subscribe(List* topics, List* qoss, int msgid, int dup, netw ...@@ -204,7 +205,7 @@ int MQTTPacket_send_subscribe(List* topics, List* qoss, int msgid, int dup, netw
* @param datalen the length of the rest of the packet * @param datalen the length of the rest of the packet
* @return pointer to the packet structure * @return pointer to the packet structure
*/ */
void* MQTTPacket_suback(unsigned char aHeader, char* data, int datalen) void* MQTTPacket_suback(unsigned char aHeader, char* data, size_t datalen)
{ {
Suback* pack = malloc(sizeof(Suback)); Suback* pack = malloc(sizeof(Suback));
char* curdata = data; char* curdata = data;
...@@ -234,7 +235,7 @@ void* MQTTPacket_suback(unsigned char aHeader, char* data, int datalen) ...@@ -234,7 +235,7 @@ void* MQTTPacket_suback(unsigned char aHeader, char* data, int datalen)
* @param clientID the string client identifier, only used for tracing * @param clientID the string client identifier, only used for tracing
* @return the completion code (e.g. TCPSOCKET_COMPLETE) * @return the completion code (e.g. TCPSOCKET_COMPLETE)
*/ */
int MQTTPacket_send_unsubscribe(List* topics, int msgid, int dup, networkHandles* net, char* clientID) int MQTTPacket_send_unsubscribe(List* topics, int msgid, int dup, networkHandles* net, const char* clientID)
{ {
Header header; Header header;
char *data, *ptr; char *data, *ptr;
......
...@@ -22,13 +22,13 @@ ...@@ -22,13 +22,13 @@
#include "MQTTPacket.h" #include "MQTTPacket.h"
int MQTTPacket_send_connect(Clients* client, int MQTTVersion); int MQTTPacket_send_connect(Clients* client, int MQTTVersion);
void* MQTTPacket_connack(unsigned char aHeader, char* data, int datalen); void* MQTTPacket_connack(unsigned char aHeader, char* data, size_t datalen);
int MQTTPacket_send_pingreq(networkHandles* net, char* clientID); int MQTTPacket_send_pingreq(networkHandles* net, const char* clientID);
int MQTTPacket_send_subscribe(List* topics, List* qoss, int msgid, int dup, networkHandles* net, char* clientID); int MQTTPacket_send_subscribe(List* topics, List* qoss, int msgid, int dup, networkHandles* net, const char* clientID);
void* MQTTPacket_suback(unsigned char aHeader, char* data, int datalen); void* MQTTPacket_suback(unsigned char aHeader, char* data, size_t datalen);
int MQTTPacket_send_unsubscribe(List* topics, int msgid, int dup, networkHandles* net, char* clientID); int MQTTPacket_send_unsubscribe(List* topics, int msgid, int dup, networkHandles* net, const char* clientID);
#endif #endif
...@@ -102,7 +102,7 @@ int MQTTPersistence_create(MQTTClient_persistence** persistence, int type, void* ...@@ -102,7 +102,7 @@ int MQTTPersistence_create(MQTTClient_persistence** persistence, int type, void*
* @param serverURI the URI of the remote end. * @param serverURI the URI of the remote end.
* @return 0 if success, #MQTTCLIENT_PERSISTENCE_ERROR otherwise. * @return 0 if success, #MQTTCLIENT_PERSISTENCE_ERROR otherwise.
*/ */
int MQTTPersistence_initialize(Clients *c, char *serverURI) int MQTTPersistence_initialize(Clients *c, const char *serverURI)
{ {
int rc = 0; int rc = 0;
...@@ -264,7 +264,7 @@ int MQTTPersistence_restore(Clients *c) ...@@ -264,7 +264,7 @@ int MQTTPersistence_restore(Clients *c)
* @param buffer the persisted data. * @param buffer the persisted data.
* @param buflen the number of bytes of the data buffer. * @param buflen the number of bytes of the data buffer.
*/ */
void* MQTTPersistence_restorePacket(char* buffer, int buflen) void* MQTTPersistence_restorePacket(char* buffer, size_t buflen)
{ {
void* pack = NULL; void* pack = NULL;
Header header; Header header;
...@@ -302,7 +302,7 @@ void* MQTTPersistence_restorePacket(char* buffer, int buflen) ...@@ -302,7 +302,7 @@ void* MQTTPersistence_restorePacket(char* buffer, int buflen)
* @param content the message to add. * @param content the message to add.
* @param size size of the message. * @param size size of the message.
*/ */
void MQTTPersistence_insertInOrder(List* list, void* content, int size) void MQTTPersistence_insertInOrder(List* list, void* content, size_t size)
{ {
ListElement* index = NULL; ListElement* index = NULL;
ListElement* current = NULL; ListElement* current = NULL;
...@@ -333,8 +333,8 @@ void MQTTPersistence_insertInOrder(List* list, void* content, int size) ...@@ -333,8 +333,8 @@ void MQTTPersistence_insertInOrder(List* list, void* content, int size)
* receiving direction. * receiving direction.
* @return 0 if success, #MQTTCLIENT_PERSISTENCE_ERROR otherwise. * @return 0 if success, #MQTTCLIENT_PERSISTENCE_ERROR otherwise.
*/ */
int MQTTPersistence_put(int socket, char* buf0, int buf0len, int count, int MQTTPersistence_put(int socket, char* buf0, size_t buf0len, int count,
char** buffers, int* buflens, int htype, int msgId, int scr ) char** buffers, size_t* buflens, int htype, int msgId, int scr )
{ {
int rc = 0; int rc = 0;
extern ClientStates* bstate; extern ClientStates* bstate;
...@@ -531,7 +531,7 @@ int MQTTPersistence_persistQueueEntry(Clients* aclient, MQTTPersistence_qEntry* ...@@ -531,7 +531,7 @@ int MQTTPersistence_persistQueueEntry(Clients* aclient, MQTTPersistence_qEntry*
} }
MQTTPersistence_qEntry* MQTTPersistence_restoreQueueEntry(char* buffer, int buflen) MQTTPersistence_qEntry* MQTTPersistence_restoreQueueEntry(char* buffer, size_t buflen)
{ {
MQTTPersistence_qEntry* qe = NULL; MQTTPersistence_qEntry* qe = NULL;
char* ptr = buffer; char* ptr = buffer;
...@@ -577,7 +577,7 @@ MQTTPersistence_qEntry* MQTTPersistence_restoreQueueEntry(char* buffer, int bufl ...@@ -577,7 +577,7 @@ MQTTPersistence_qEntry* MQTTPersistence_restoreQueueEntry(char* buffer, int bufl
} }
void MQTTPersistence_insertInSeqOrder(List* list, MQTTPersistence_qEntry* qEntry, int size) void MQTTPersistence_insertInSeqOrder(List* list, MQTTPersistence_qEntry* qEntry, size_t size)
{ {
ListElement* index = NULL; ListElement* index = NULL;
ListElement* current = NULL; ListElement* current = NULL;
......
...@@ -16,6 +16,10 @@ ...@@ -16,6 +16,10 @@
* Ian Craggs - fix for bug 432903 - queue persistence * Ian Craggs - fix for bug 432903 - queue persistence
*******************************************************************************/ *******************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif
#include "Clients.h" #include "Clients.h"
/** Stem of the key for a sent PUBLISH QoS1 or QoS2 */ /** Stem of the key for a sent PUBLISH QoS1 or QoS2 */
...@@ -31,14 +35,14 @@ ...@@ -31,14 +35,14 @@
#define PERSISTENCE_MAX_KEY_LENGTH 8 #define PERSISTENCE_MAX_KEY_LENGTH 8
int MQTTPersistence_create(MQTTClient_persistence** per, int type, void* pcontext); int MQTTPersistence_create(MQTTClient_persistence** per, int type, void* pcontext);
int MQTTPersistence_initialize(Clients* c, char* serverURI); int MQTTPersistence_initialize(Clients* c, const char* serverURI);
int MQTTPersistence_close(Clients* c); int MQTTPersistence_close(Clients* c);
int MQTTPersistence_clear(Clients* c); int MQTTPersistence_clear(Clients* c);
int MQTTPersistence_restore(Clients* c); int MQTTPersistence_restore(Clients* c);
void* MQTTPersistence_restorePacket(char* buffer, int buflen); void* MQTTPersistence_restorePacket(char* buffer, size_t buflen);
void MQTTPersistence_insertInOrder(List* list, void* content, int size); void MQTTPersistence_insertInOrder(List* list, void* content, size_t size);
int MQTTPersistence_put(int socket, char* buf0, int buf0len, int count, int MQTTPersistence_put(int socket, char* buf0, size_t buf0len, int count,
char** buffers, int* buflens, int htype, int msgId, int scr); char** buffers, size_t* buflens, int htype, int msgId, int scr);
int MQTTPersistence_remove(Clients* c, char* type, int qos, int msgId); int MQTTPersistence_remove(Clients* c, char* type, int qos, int msgId);
void MQTTPersistence_wrapMsgID(Clients *c); void MQTTPersistence_wrapMsgID(Clients *c);
...@@ -65,3 +69,6 @@ typedef struct ...@@ -65,3 +69,6 @@ typedef struct
int MQTTPersistence_unpersistQueueEntry(Clients* client, MQTTPersistence_qEntry* qe); int MQTTPersistence_unpersistQueueEntry(Clients* client, MQTTPersistence_qEntry* qe);
int MQTTPersistence_persistQueueEntry(Clients* aclient, MQTTPersistence_qEntry* qe); int MQTTPersistence_persistQueueEntry(Clients* aclient, MQTTPersistence_qEntry* qe);
int MQTTPersistence_restoreMessageQueue(Clients* c); int MQTTPersistence_restoreMessageQueue(Clients* c);
#ifdef __cplusplus
}
#endif
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
* See ::Persistence_open * See ::Persistence_open
*/ */
int pstopen(void **handle, char* clientID, char* serverURI, void* context) int pstopen(void **handle, const char* clientID, const char* serverURI, void* context)
{ {
int rc = 0; int rc = 0;
char *dataDir = context; char *dataDir = context;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#define MESSAGE_FILENAME_EXTENSION ".msg" #define MESSAGE_FILENAME_EXTENSION ".msg"
/* prototypes of the functions for the default file system persistence */ /* prototypes of the functions for the default file system persistence */
int pstopen(void** handle, char* clientID, char* serverURI, void* context); int pstopen(void** handle, const char* clientID, const char* serverURI, void* context);
int pstclose(void* handle); int pstclose(void* handle);
int pstput(void* handle, char* key, int bufcount, char* buffers[], int buflens[]); int pstput(void* handle, char* key, int bufcount, char* buffers[], int buflens[]);
int pstget(void* handle, char* key, char** buffer, int* buflen); int pstget(void* handle, char* key, char** buffer, int* buflen);
......
...@@ -714,3 +714,30 @@ void MQTTProtocol_freeMessageList(List* msgList) ...@@ -714,3 +714,30 @@ void MQTTProtocol_freeMessageList(List* msgList)
FUNC_EXIT; FUNC_EXIT;
} }
/**
* Copy not more than dest_size characters from the string pointed to by src to the array pointed to by dest.
* @param dest the array which characters copy to
* @param src the source string which characters copy from
* @param dest_size the length of characters need copy
* @return the destination string pointer
*/
char *MQTTStrncpy(char *dest, const char *src, size_t dest_size)
{
size_t count = dest_size;
char *temp = dest;
FUNC_ENTRY;
if (dest_size < strlen(src))
Log(TRACE_MIN, -1, "the src string is truncated");
/* We must copy only the first (dest_size - 1) bytes */
while (count > 1 && (*temp++ = *src++))
count--;
*temp = '\0';
FUNC_EXIT;
return dest;
}
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#define MAX_MSG_ID 65535 #define MAX_MSG_ID 65535
#define MAX_CLIENTID_LEN 65535 #define MAX_CLIENTID_LEN 65535
int MQTTProtocol_assignMsgId(Clients* client);
int MQTTProtocol_startPublish(Clients* pubclient, Publish* publish, int qos, int retained, Messages** m); int MQTTProtocol_startPublish(Clients* pubclient, Publish* publish, int qos, int retained, Messages** m);
Messages* MQTTProtocol_createMessage(Publish* publish, Messages** mm, int qos, int retained); Messages* MQTTProtocol_createMessage(Publish* publish, Messages** mm, int qos, int retained);
Publications* MQTTProtocol_storePublication(Publish* publish, int* len); Publications* MQTTProtocol_storePublication(Publish* publish, int* len);
...@@ -48,4 +47,5 @@ void MQTTProtocol_freeClient(Clients* client); ...@@ -48,4 +47,5 @@ void MQTTProtocol_freeClient(Clients* client);
void MQTTProtocol_emptyMessageList(List* msgList); void MQTTProtocol_emptyMessageList(List* msgList);
void MQTTProtocol_freeMessageList(List* msgList); void MQTTProtocol_freeMessageList(List* msgList);
char *MQTTStrncpy(char *dest, const char *src, size_t num);
#endif #endif
...@@ -40,10 +40,10 @@ extern ClientStates* bstate; ...@@ -40,10 +40,10 @@ extern ClientStates* bstate;
* @param port the returned port integer * @param port the returned port integer
* @return the address string * @return the address string
*/ */
char* MQTTProtocol_addressPort(char* uri, int* port) char* MQTTProtocol_addressPort(const char* uri, int* port)
{ {
char* colon_pos = strrchr(uri, ':'); /* reverse find to allow for ':' in IPv6 addresses */ char* colon_pos = strrchr(uri, ':'); /* reverse find to allow for ':' in IPv6 addresses */
char* buf = uri; char* buf;
int len; int len;
FUNC_ENTRY; FUNC_ENTRY;
...@@ -58,11 +58,17 @@ char* MQTTProtocol_addressPort(char* uri, int* port) ...@@ -58,11 +58,17 @@ char* MQTTProtocol_addressPort(char* uri, int* port)
int addr_len = colon_pos - uri; int addr_len = colon_pos - uri;
buf = malloc(addr_len + 1); buf = malloc(addr_len + 1);
*port = atoi(colon_pos + 1); *port = atoi(colon_pos + 1);
strncpy(buf, uri, addr_len); MQTTStrncpy(buf, uri, addr_len+1);
buf[addr_len] = '\0'; buf[addr_len] = '\0';
} }
else else
{
int addr_len = strlen(uri)+1;
*port = DEFAULT_PORT; *port = DEFAULT_PORT;
buf = malloc(addr_len);
MQTTStrncpy(buf, uri, addr_len+1);
buf[addr_len] = '\0';
}
len = strlen(buf); len = strlen(buf);
if (buf[len - 1] == ']') if (buf[len - 1] == ']')
...@@ -82,9 +88,9 @@ char* MQTTProtocol_addressPort(char* uri, int* port) ...@@ -82,9 +88,9 @@ char* MQTTProtocol_addressPort(char* uri, int* port)
* @return return code * @return return code
*/ */
#if defined(OPENSSL) #if defined(OPENSSL)
int MQTTProtocol_connect(char* ip_address, Clients* aClient, int ssl, int MQTTVersion) int MQTTProtocol_connect(const char* ip_address, Clients* aClient, int ssl, int MQTTVersion)
#else #else
int MQTTProtocol_connect(char* ip_address, Clients* aClient, int MQTTVersion) int MQTTProtocol_connect(const char* ip_address, Clients* aClient, int MQTTVersion)
#endif #endif
{ {
int rc, port; int rc, port;
......
...@@ -29,11 +29,11 @@ ...@@ -29,11 +29,11 @@
#define DEFAULT_PORT 1883 #define DEFAULT_PORT 1883
void MQTTProtocol_reconnect(char* ip_address, Clients* client); void MQTTProtocol_reconnect(const char* ip_address, Clients* client);
#if defined(OPENSSL) #if defined(OPENSSL)
int MQTTProtocol_connect(char* ip_address, Clients* acClients, int ssl, int MQTTVersion); int MQTTProtocol_connect(const char* ip_address, Clients* acClients, int ssl, int MQTTVersion);
#else #else
int MQTTProtocol_connect(char* ip_address, Clients* acClients, int MQTTVersion); int MQTTProtocol_connect(const char* ip_address, Clients* acClients, int MQTTVersion);
#endif #endif
int MQTTProtocol_handlePingresps(void* pack, int sock); int MQTTProtocol_handlePingresps(void* pack, int sock);
int MQTTProtocol_subscribe(Clients* client, List* topics, List* qoss); int MQTTProtocol_subscribe(Clients* client, List* topics, List* qoss);
......
...@@ -703,7 +703,7 @@ int SSLSocket_close(networkHandles* net) ...@@ -703,7 +703,7 @@ int SSLSocket_close(networkHandles* net)
/* No SSL_writev() provided by OpenSSL. Boo. */ /* No SSL_writev() provided by OpenSSL. Boo. */
int SSLSocket_putdatas(SSL* ssl, int socket, char* buf0, int buf0len, int count, char** buffers, int* buflens, int* frees) int SSLSocket_putdatas(SSL* ssl, int socket, char* buf0, size_t buf0len, int count, char** buffers, size_t* buflens, int* frees)
{ {
int rc = 0; int rc = 0;
int i; int i;
......
...@@ -37,7 +37,7 @@ int SSLSocket_getch(SSL* ssl, int socket, char* c); ...@@ -37,7 +37,7 @@ int SSLSocket_getch(SSL* ssl, int socket, char* c);
char *SSLSocket_getdata(SSL* ssl, int socket, int bytes, int* actual_len); char *SSLSocket_getdata(SSL* ssl, int socket, int bytes, int* actual_len);
int SSLSocket_close(networkHandles* net); int SSLSocket_close(networkHandles* net);
int SSLSocket_putdatas(SSL* ssl, int socket, char* buf0, int buf0len, int count, char** buffers, int* buflens, int* frees); int SSLSocket_putdatas(SSL* ssl, int socket, char* buf0, size_t buf0len, int count, char** buffers, size_t* buflens, int* frees);
int SSLSocket_connect(SSL* ssl, int socket); int SSLSocket_connect(SSL* ssl, int socket);
int SSLSocket_getPendingRead(); int SSLSocket_getPendingRead();
......
...@@ -433,7 +433,7 @@ int Socket_writev(int socket, iobuf* iovecs, int count, unsigned long* bytes) ...@@ -433,7 +433,7 @@ int Socket_writev(int socket, iobuf* iovecs, int count, unsigned long* bytes)
* @param buflens an array of corresponding buffer lengths * @param buflens an array of corresponding buffer lengths
* @return completion code, especially TCPSOCKET_INTERRUPTED * @return completion code, especially TCPSOCKET_INTERRUPTED
*/ */
int Socket_putdatas(int socket, char* buf0, int buf0len, int count, char** buffers, int* buflens, int* frees) int Socket_putdatas(int socket, char* buf0, size_t buf0len, int count, char** buffers, size_t* buflens, int* frees)
{ {
unsigned long bytes = 0L; unsigned long bytes = 0L;
iobuf iovecs[5]; iobuf iovecs[5];
......
...@@ -114,7 +114,7 @@ void Socket_outTerminate(void); ...@@ -114,7 +114,7 @@ void Socket_outTerminate(void);
int Socket_getReadySocket(int more_work, struct timeval *tp); int Socket_getReadySocket(int more_work, struct timeval *tp);
int Socket_getch(int socket, char* c); int Socket_getch(int socket, char* c);
char *Socket_getdata(int socket, int bytes, int* actual_len); char *Socket_getdata(int socket, int bytes, int* actual_len);
int Socket_putdatas(int socket, char* buf0, int buf0len, int count, char** buffers, int* buflens, int* frees); int Socket_putdatas(int socket, char* buf0, size_t buf0len, int count, char** buffers, size_t* buflens, int* frees);
void Socket_close(int socket); void Socket_close(int socket);
int Socket_new(char* addr, int port, int* socket); int Socket_new(char* addr, int port, int* socket);
......
...@@ -69,12 +69,12 @@ valid_ranges[] = ...@@ -69,12 +69,12 @@ valid_ranges[] =
* @param data the bytes to check for a valid UTF-8 char * @param data the bytes to check for a valid UTF-8 char
* @return pointer to the start of the next UTF-8 character in "data" * @return pointer to the start of the next UTF-8 character in "data"
*/ */
char* UTF8_char_validate(int len, char* data) const char* UTF8_char_validate(int len, const char* data)
{ {
int good = 0; int good = 0;
int charlen = 2; int charlen = 2;
int i, j; int i, j;
char *rc = NULL; const char *rc = NULL;
FUNC_ENTRY; FUNC_ENTRY;
/* first work out how many bytes this char is encoded in */ /* first work out how many bytes this char is encoded in */
...@@ -121,9 +121,9 @@ char* UTF8_char_validate(int len, char* data) ...@@ -121,9 +121,9 @@ char* UTF8_char_validate(int len, char* data)
* @param data the bytes to check for valid UTF-8 characters * @param data the bytes to check for valid UTF-8 characters
* @return 1 (true) if the string has only UTF-8 characters, 0 (false) otherwise * @return 1 (true) if the string has only UTF-8 characters, 0 (false) otherwise
*/ */
int UTF8_validate(int len, char* data) int UTF8_validate(int len, const char* data)
{ {
char* curdata = NULL; const char* curdata = NULL;
int rc = 0; int rc = 0;
FUNC_ENTRY; FUNC_ENTRY;
...@@ -148,7 +148,7 @@ exit: ...@@ -148,7 +148,7 @@ exit:
* @param string the string to check for valid UTF-8 characters * @param string the string to check for valid UTF-8 characters
* @return 1 (true) if the string has only UTF-8 characters, 0 (false) otherwise * @return 1 (true) if the string has only UTF-8 characters, 0 (false) otherwise
*/ */
int UTF8_validateString(char* string) int UTF8_validateString(const char* string)
{ {
int rc = 0; int rc = 0;
......
...@@ -18,6 +18,6 @@ ...@@ -18,6 +18,6 @@
#define UTF8_H #define UTF8_H
int UTF8_validate(int len, char* data); int UTF8_validate(int len, char* data);
int UTF8_validateString(char* string); int UTF8_validateString(const char* string);
#endif #endif
...@@ -64,6 +64,8 @@ openssl ca -config openssl.cnf -name CA_signing -revoke client-revoked.crt ...@@ -64,6 +64,8 @@ openssl ca -config openssl.cnf -name CA_signing -revoke client-revoked.crt
openssl ca -config openssl.cnf -name CA_signing -gencrl -out crl.pem openssl ca -config openssl.cnf -name CA_signing -gencrl -out crl.pem
cat test-signing-ca.crt test-root-ca.crt > all-ca.crt cat test-signing-ca.crt test-root-ca.crt > all-ca.crt
cat client.crt client.key all-ca.crt > client.pem
#mkdir certs #mkdir certs
#cp test-signing-ca.crt certs/test-signing-ca.pem #cp test-signing-ca.crt certs/test-signing-ca.pem
#cp test-root-ca.crt certs/test-root.ca.pem #cp test-root-ca.crt certs/test-root.ca.pem
......
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