diff --git a/ChangeLog.txt b/ChangeLog.txt index d4c3ce2e..d824a74f 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -77,6 +77,8 @@ Client library: - Fix missing mach/mach_time.h header on OS X. Closes #1831. - Add MOSQ_OPT_BIND_ADDRESS to allow setting of a bind address independently of the `mosquitto_connect*()` call. +- Fix connect properties not being sent when the client automatically + reconnects. Closes #1846. Clients: - Add timeout return code (27) for `mosquitto_sub -W ` and diff --git a/lib/connect.c b/lib/connect.c index 01cbcf91..eae1fb0f 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -32,7 +32,7 @@ Contributors: static char alphanum[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; -static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking, const mosquitto_property *properties); +static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking); static int mosquitto__connect_init(struct mosquitto *mosq, const char *host, int port, int keepalive); @@ -97,9 +97,14 @@ int mosquitto_connect_bind_v5(struct mosquitto *mosq, const char *host, int port rc = mosquitto_string_option(mosq, MOSQ_OPT_BIND_ADDRESS, bind_address); if(rc) return rc; + mosquitto_property_free_all(&mosq->connect_properties); if(properties){ rc = mosquitto_property_check_all(CMD_CONNECT, properties); if(rc) return rc; + + rc = mosquitto_property_copy_all(&mosq->connect_properties, properties); + if(rc) return rc; + mosq->connect_properties->client_generated = true; } rc = mosquitto__connect_init(mosq, host, port, keepalive); @@ -107,7 +112,7 @@ int mosquitto_connect_bind_v5(struct mosquitto *mosq, const char *host, int port mosquitto__set_state(mosq, mosq_cs_new); - return mosquitto__reconnect(mosq, true, properties); + return mosquitto__reconnect(mosq, true); } @@ -127,23 +132,23 @@ int mosquitto_connect_bind_async(struct mosquitto *mosq, const char *host, int p rc = mosquitto__connect_init(mosq, host, port, keepalive); if(rc) return rc; - return mosquitto__reconnect(mosq, false, NULL); + return mosquitto__reconnect(mosq, false); } int mosquitto_reconnect_async(struct mosquitto *mosq) { - return mosquitto__reconnect(mosq, false, NULL); + return mosquitto__reconnect(mosq, false); } int mosquitto_reconnect(struct mosquitto *mosq) { - return mosquitto__reconnect(mosq, true, NULL); + return mosquitto__reconnect(mosq, true); } -static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking, const mosquitto_property *properties) +static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking) { const mosquitto_property *outgoing_properties = NULL; mosquitto_property local_property; @@ -151,13 +156,14 @@ static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking, const mos if(!mosq) return MOSQ_ERR_INVAL; if(!mosq->host || mosq->port < 0) return MOSQ_ERR_INVAL; - if(mosq->protocol != mosq_p_mqtt5 && properties) return MOSQ_ERR_NOT_SUPPORTED; - if(properties){ - if(properties->client_generated){ - outgoing_properties = properties; + if(mosq->connect_properties){ + if(mosq->protocol != mosq_p_mqtt5) return MOSQ_ERR_NOT_SUPPORTED; + + if(mosq->connect_properties->client_generated){ + outgoing_properties = mosq->connect_properties; }else{ - memcpy(&local_property, properties, sizeof(mosquitto_property)); + memcpy(&local_property, mosq->connect_properties, sizeof(mosquitto_property)); local_property.client_generated = true; local_property.next = NULL; outgoing_properties = &local_property; diff --git a/lib/mosquitto.c b/lib/mosquitto.c index 6cd13f31..46ddd756 100644 --- a/lib/mosquitto.c +++ b/lib/mosquitto.c @@ -293,6 +293,8 @@ void mosquitto__destroy(struct mosquitto *mosq) mosquitto__free(mosq->bind_address); mosq->bind_address = NULL; + mosquitto_property_free_all(&mosq->connect_properties); + /* Out packet cleanup */ if(mosq->out_packet && !mosq->current_out_packet){ mosq->current_out_packet = mosq->out_packet; diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h index fe73a61e..47b19a37 100644 --- a/lib/mosquitto_internal.h +++ b/lib/mosquitto_internal.h @@ -330,6 +330,7 @@ struct mosquitto { bool reconnect_exponential_backoff; char threaded; struct mosquitto__packet *out_packet_last; + mosquitto_property *connect_properties; # ifdef WITH_SRV ares_channel achan; # endif