From 741a8a9cc379c9e2927421e52605cb11d3ab2d8f Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 1 Nov 2018 11:57:47 +0000 Subject: [PATCH] Client disconnect property support, plus disconnect packet fix. --- client/pub_client.c | 12 +++++----- client/sub_client.c | 56 +++++++++++++++++-------------------------- lib/linker.version | 1 + lib/send_disconnect.c | 4 +++- 4 files changed, 32 insertions(+), 41 deletions(-) diff --git a/client/pub_client.c b/client/pub_client.c index ffeb2ec1..cd950d92 100644 --- a/client/pub_client.c +++ b/client/pub_client.c @@ -94,7 +94,7 @@ void my_connect_callback(struct mosquitto *mosq, void *obj, int result) break; } } - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); } }else{ if(result && !quiet){ @@ -113,11 +113,11 @@ void my_publish_callback(struct mosquitto *mosq, void *obj, int mid) last_mid_sent = mid; if(mode == MSGMODE_STDIN_LINE){ if(mid == last_mid){ - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); disconnect_sent = true; } }else if(disconnect_sent == false){ - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); disconnect_sent = true; } } @@ -419,7 +419,7 @@ int main(int argc, char *argv[]) rc2 = mosquitto_publish_with_properties(mosq, &mid_sent, topic, buf_len_actual-1, buf, qos, retain, cfg.publish_props); if(rc2){ if(!quiet) fprintf(stderr, "Error: Publish returned %d, disconnecting.\n", rc2); - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); } break; }else{ @@ -438,7 +438,7 @@ int main(int argc, char *argv[]) if(feof(stdin)){ if(last_mid == -1){ /* Empty file */ - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); disconnect_sent = true; status = STATUS_DISCONNECTING; }else{ @@ -448,7 +448,7 @@ int main(int argc, char *argv[]) } }else if(status == STATUS_WAITING){ if(last_mid_sent == last_mid && disconnect_sent == false){ - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); disconnect_sent = true; } #ifdef WIN32 diff --git a/client/sub_client.c b/client/sub_client.c index 5e9a972d..355d2bb1 100644 --- a/client/sub_client.c +++ b/client/sub_client.c @@ -34,6 +34,7 @@ Contributors: #include #include "client_shared.h" +static struct mosq_config cfg; bool process_messages = true; int msg_count = 0; struct mosquitto *mosq = NULL; @@ -43,7 +44,7 @@ void my_signal_handler(int signum) { if(signum == SIGALRM){ process_messages = false; - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); } } #endif @@ -53,36 +54,32 @@ void print_message(struct mosq_config *cfg, const struct mosquitto_message *mess void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) { - struct mosq_config *cfg; int i; bool res; if(process_messages == false) return; - assert(obj); - cfg = (struct mosq_config *)obj; - - if(cfg->retained_only && !message->retain && process_messages){ + if(cfg.retained_only && !message->retain && process_messages){ process_messages = false; - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); return; } - if(message->retain && cfg->no_retain) return; - if(cfg->filter_outs){ - for(i=0; ifilter_out_count; i++){ - mosquitto_topic_matches_sub(cfg->filter_outs[i], message->topic, &res); + if(message->retain && cfg.no_retain) return; + if(cfg.filter_outs){ + for(i=0; itopic, &res); if(res) return; } } - print_message(cfg, message); + print_message(&cfg, message); - if(cfg->msg_count>0){ + if(cfg.msg_count>0){ msg_count++; - if(cfg->msg_count == msg_count){ + if(cfg.msg_count == msg_count){ process_messages = false; - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); } } } @@ -90,41 +87,33 @@ void my_message_callback(struct mosquitto *mosq, void *obj, const struct mosquit void my_connect_callback(struct mosquitto *mosq, void *obj, int result, int flags) { int i; - struct mosq_config *cfg; - - assert(obj); - cfg = (struct mosq_config *)obj; if(!result){ - mosquitto_subscribe_multiple(mosq, NULL, cfg->topic_count, cfg->topics, cfg->qos, cfg->subscribe_props); + mosquitto_subscribe_multiple(mosq, NULL, cfg.topic_count, cfg.topics, cfg.qos, cfg.subscribe_props); - for(i=0; iunsub_topic_count; i++){ - mosquitto_unsubscribe(mosq, NULL, cfg->unsub_topics[i]); + for(i=0; iquiet){ + if(result && !cfg.quiet){ fprintf(stderr, "%s\n", mosquitto_connack_string(result)); } - mosquitto_disconnect(mosq); + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); } } void my_subscribe_callback(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos) { int i; - struct mosq_config *cfg; - - assert(obj); - cfg = (struct mosq_config *)obj; - if(!cfg->quiet) printf("Subscribed (mid: %d): %d", mid, granted_qos[0]); + if(!cfg.quiet) printf("Subscribed (mid: %d): %d", mid, granted_qos[0]); for(i=1; iquiet) printf(", %d", granted_qos[i]); + if(!cfg.quiet) printf(", %d", granted_qos[i]); } - if(!cfg->quiet) printf("\n"); + if(!cfg.quiet) printf("\n"); - if(cfg->exit_after_sub){ - mosquitto_disconnect(mosq); + if(cfg.exit_after_sub){ + mosquitto_disconnect_with_properties(mosq, cfg.disconnect_props); } } @@ -240,7 +229,6 @@ void print_usage(void) int main(int argc, char *argv[]) { - struct mosq_config cfg; int rc; #ifndef WIN32 struct sigaction sigact; diff --git a/lib/linker.version b/lib/linker.version index c12be67e..83476ccc 100644 --- a/lib/linker.version +++ b/lib/linker.version @@ -95,6 +95,7 @@ MOSQ_1.5 { MOSQ_1.6 { global: mosquitto_connect_bind_with_properties; + mosquitto_disconnect_with_properties; mosquitto_property_add_binary; mosquitto_property_add_byte; mosquitto_property_add_int16; diff --git a/lib/send_disconnect.c b/lib/send_disconnect.c index 9593ea2e..d998c3f6 100644 --- a/lib/send_disconnect.c +++ b/lib/send_disconnect.c @@ -54,7 +54,8 @@ int send__disconnect(struct mosquitto *mosq, const struct mqtt5__property *prope if(mosq->protocol == mosq_p_mqtt5){ proplen = property__get_length_all(properties); varbytes = packet__varint_bytes(proplen); - packet->remaining_length = proplen+varbytes; + /* 1 here is the reason code */ + packet->remaining_length = 1 + proplen + varbytes; }else{ packet->remaining_length = 0; } @@ -65,6 +66,7 @@ int send__disconnect(struct mosquitto *mosq, const struct mqtt5__property *prope return rc; } if(mosq->protocol == mosq_p_mqtt5){ + packet__write_byte(packet, 0); property__write_all(packet, properties); }