Add properties member to will struct.
This commit is contained in:
parent
42896112a1
commit
0baf358cf8
@ -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;
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user