Add properties member to will struct.

This commit is contained in:
Roger A. Light 2018-10-24 14:07:09 +01:00
parent 42896112a1
commit 0baf358cf8
5 changed files with 57 additions and 41 deletions

View File

@ -147,6 +147,7 @@ struct mosquitto__packet{
struct mosquitto_message_all{
struct mosquitto_message_all *next;
struct mqtt5__property *properties;
time_t timestamp;
//enum mosquitto_msg_direction direction;
enum mosquitto_msg_state state;
@ -176,7 +177,7 @@ struct mosquitto {
struct mosquitto__packet in_packet;
struct mosquitto__packet *current_out_packet;
struct mosquitto__packet *out_packet;
struct mosquitto_message *will;
struct mosquitto_message_all *will;
#ifdef WITH_TLS
SSL *ssl;
SSL_CTX *ssl_ctx;

View File

@ -80,9 +80,9 @@ int send__connect(struct mosquitto *mosq, uint16_t keepalive, bool clean_session
payloadlen = 2+strlen(clientid);
if(mosq->will){
will = 1;
assert(mosq->will->topic);
assert(mosq->will->msg.topic);
payloadlen += 2+strlen(mosq->will->topic) + 2+mosq->will->payloadlen;
payloadlen += 2+strlen(mosq->will->msg.topic) + 2+mosq->will->msg.payloadlen;
if(mosq->protocol == mosq_p_mqtt5){
payloadlen += 1;
}
@ -117,7 +117,7 @@ int send__connect(struct mosquitto *mosq, uint16_t keepalive, bool clean_session
packet__write_byte(packet, version);
byte = (clean_session&0x1)<<1;
if(will){
byte = byte | ((mosq->will->retain&0x1)<<5) | ((mosq->will->qos&0x3)<<3) | ((will&0x1)<<2);
byte = byte | ((mosq->will->msg.retain&0x1)<<5) | ((mosq->will->msg.qos&0x3)<<3) | ((will&0x1)<<2);
}
if(username){
byte = byte | 0x1<<7;
@ -130,7 +130,7 @@ int send__connect(struct mosquitto *mosq, uint16_t keepalive, bool clean_session
if(mosq->protocol == mosq_p_mqtt5){
/* Write properties */
property__write_all(packet, NULL);
property__write_all(packet, mosq->will->properties);
}
/* Payload */
@ -140,8 +140,8 @@ int send__connect(struct mosquitto *mosq, uint16_t keepalive, bool clean_session
/* Write will properties */
property__write_all(packet, NULL);
}
packet__write_string(packet, mosq->will->topic, strlen(mosq->will->topic));
packet__write_string(packet, (const char *)mosq->will->payload, mosq->will->payloadlen);
packet__write_string(packet, mosq->will->msg.topic, strlen(mosq->will->msg.topic));
packet__write_string(packet, (const char *)mosq->will->msg.payload, mosq->will->msg.payloadlen);
}
if(username){
packet__write_string(packet, username, strlen(username));

View File

@ -46,41 +46,41 @@ int will__set(struct mosquitto *mosq, const char *topic, int payloadlen, const v
if(mosquitto_validate_utf8(topic, strlen(topic))) return MOSQ_ERR_MALFORMED_UTF8;
if(mosq->will){
mosquitto__free(mosq->will->topic);
mosquitto__free(mosq->will->payload);
mosquitto__free(mosq->will->msg.topic);
mosquitto__free(mosq->will->msg.payload);
mosquitto__free(mosq->will);
}
mosq->will = mosquitto__calloc(1, sizeof(struct mosquitto_message));
mosq->will = mosquitto__calloc(1, sizeof(struct mosquitto_message_all));
if(!mosq->will) return MOSQ_ERR_NOMEM;
mosq->will->topic = mosquitto__strdup(topic);
if(!mosq->will->topic){
mosq->will->msg.topic = mosquitto__strdup(topic);
if(!mosq->will->msg.topic){
rc = MOSQ_ERR_NOMEM;
goto cleanup;
}
mosq->will->payloadlen = payloadlen;
if(mosq->will->payloadlen > 0){
mosq->will->msg.payloadlen = payloadlen;
if(mosq->will->msg.payloadlen > 0){
if(!payload){
rc = MOSQ_ERR_INVAL;
goto cleanup;
}
mosq->will->payload = mosquitto__malloc(sizeof(char)*mosq->will->payloadlen);
if(!mosq->will->payload){
mosq->will->msg.payload = mosquitto__malloc(sizeof(char)*mosq->will->msg.payloadlen);
if(!mosq->will->msg.payload){
rc = MOSQ_ERR_NOMEM;
goto cleanup;
}
memcpy(mosq->will->payload, payload, payloadlen);
memcpy(mosq->will->msg.payload, payload, payloadlen);
}
mosq->will->qos = qos;
mosq->will->retain = retain;
mosq->will->msg.qos = qos;
mosq->will->msg.retain = retain;
return MOSQ_ERR_SUCCESS;
cleanup:
if(mosq->will){
mosquitto__free(mosq->will->topic);
mosquitto__free(mosq->will->payload);
mosquitto__free(mosq->will->msg.topic);
mosquitto__free(mosq->will->msg.payload);
mosquitto__free(mosq->will);
mosq->will = NULL;
@ -93,11 +93,11 @@ int will__clear(struct mosquitto *mosq)
{
if(!mosq->will) return MOSQ_ERR_SUCCESS;
mosquitto__free(mosq->will->topic);
mosq->will->topic = NULL;
mosquitto__free(mosq->will->msg.topic);
mosq->will->msg.topic = NULL;
mosquitto__free(mosq->will->payload);
mosq->will->payload = NULL;
mosquitto__free(mosq->will->msg.payload);
mosq->will->msg.payload = NULL;
mosquitto__free(mosq->will);
mosq->will = NULL;

View File

@ -206,15 +206,26 @@ void context__cleanup(struct mosquitto_db *db, struct mosquitto *context, bool d
void context__send_will(struct mosquitto_db *db, struct mosquitto *ctxt)
{
if(ctxt->state != mosq_cs_disconnecting && ctxt->will){
if(mosquitto_acl_check(db, ctxt, ctxt->will->topic, ctxt->will->payloadlen, ctxt->will->payload,
ctxt->will->qos, ctxt->will->retain, MOSQ_ACL_WRITE) == MOSQ_ERR_SUCCESS){
if(mosquitto_acl_check(db, ctxt,
ctxt->will->msg.topic,
ctxt->will->msg.payloadlen,
ctxt->will->msg.payload,
ctxt->will->msg.qos,
ctxt->will->msg.retain,
MOSQ_ACL_WRITE) == MOSQ_ERR_SUCCESS){
/* Unexpected disconnect, queue the client will. */
db__messages_easy_queue(db, ctxt, ctxt->will->topic, ctxt->will->qos, ctxt->will->payloadlen, ctxt->will->payload, ctxt->will->retain);
db__messages_easy_queue(db, ctxt,
ctxt->will->msg.topic,
ctxt->will->msg.qos,
ctxt->will->msg.payloadlen,
ctxt->will->msg.payload,
ctxt->will->msg.retain);
}
}
if(ctxt->will){
mosquitto__free(ctxt->will->topic);
mosquitto__free(ctxt->will->payload);
mosquitto__free(ctxt->will->msg.topic);
mosquitto__free(ctxt->will->msg.payload);
mosquitto__free(ctxt->will);
ctxt->will = NULL;
}

View File

@ -119,7 +119,7 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context)
char *will_payload = NULL, *will_topic = NULL;
char *will_topic_mount;
uint16_t will_payloadlen;
struct mosquitto_message *will_struct = NULL;
struct mosquitto_message_all *will_struct = NULL;
uint8_t will, will_retain, will_qos, clean_session;
uint8_t username_flag, password_flag;
char *username = NULL, *password = NULL;
@ -296,7 +296,7 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context)
}
if(will){
will_struct = mosquitto__calloc(1, sizeof(struct mosquitto_message));
will_struct = mosquitto__calloc(1, sizeof(struct mosquitto_message_all));
if(!will_struct){
rc = MOSQ_ERR_NOMEM;
goto handle_connect_error;
@ -643,16 +643,16 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context)
if(will_struct){
context->will = will_struct;
context->will->topic = will_topic;
context->will->msg.topic = will_topic;
if(will_payload){
context->will->payload = will_payload;
context->will->payloadlen = will_payloadlen;
context->will->msg.payload = will_payload;
context->will->msg.payloadlen = will_payloadlen;
}else{
context->will->payload = NULL;
context->will->payloadlen = 0;
context->will->msg.payload = NULL;
context->will->msg.payloadlen = 0;
}
context->will->qos = will_qos;
context->will->retain = will_retain;
context->will->msg.qos = will_qos;
context->will->msg.retain = will_retain;
}
if(db->config->connection_messages == true){
@ -671,8 +671,12 @@ int handle__connect(struct mosquitto_db *db, struct mosquitto *context)
}
if(context->will) {
log__printf(NULL, MOSQ_LOG_DEBUG, "Will message specified (%ld bytes) (r%d, q%d).", (long)context->will->payloadlen, context->will->retain, context->will->qos);
log__printf(NULL, MOSQ_LOG_DEBUG, "\t%s", context->will->topic);
log__printf(NULL, MOSQ_LOG_DEBUG, "Will message specified (%ld bytes) (r%d, q%d).",
(long)context->will->msg.payloadlen,
context->will->msg.retain,
context->will->msg.qos);
log__printf(NULL, MOSQ_LOG_DEBUG, "\t%s", context->will->msg.topic);
} else {
log__printf(NULL, MOSQ_LOG_DEBUG, "No will message specified.");
}