thermferm/mqtt.c

changeset 561
fcfc3dbe85fa
parent 557
ae17042a6d39
child 563
ca2fafcf3294
--- a/thermferm/mqtt.c	Thu Aug 02 13:39:30 2018 +0200
+++ b/thermferm/mqtt.c	Fri Aug 03 16:13:17 2018 +0200
@@ -284,7 +284,7 @@
     profiles_list       *profile;
     prof_step           *pstep;
 
-    payload = xstrcat(payload, (char *)"{");
+    payload = xstrcpy((char *)"{");
 
     /*
      * Fixed unit values, never change these!
@@ -560,7 +560,7 @@
  */
 void publishDBirthAll(void)
 {
-    char	*payload = NULL;
+    char	*topic = NULL, *payload = NULL, *payloadu = NULL;
     units_list	*unit;
     int		comma = FALSE;
 
@@ -570,13 +570,19 @@
 	if (unit->mode != UNITMODE_OFF) {
 	    if (comma)
 	    	payload = xstrcat(payload, (char *)",");
-	    payload = xstrcat(payload, unit_data(unit, true));
+	    payloadu = unit_data(unit, true);
+	    payload = xstrcat(payload, payloadu);
 	    comma = TRUE;
+	    free(payloadu);
+	    payloadu = NULL;
 	}
     }
     if (comma) {	// Only publish if there is at least one unit active.
     	payload = xstrcat(payload, (char *)"]}}");
-    	publisher(mosq, topic_base((char *)"DBIRTH"), payload, true);
+	topic = topic_base((char *)"DBIRTH");
+    	publisher(mosq, topic, payload, true);
+	free(topic);
+	topic = NULL;
     }
     free(payload);
     payload = NULL;
@@ -586,17 +592,20 @@
 
 void publishDData(units_list *unit)
 {
-    char	*payload = NULL, *topic = NULL;
+    char	*payload = NULL, *payloadu = NULL, *topic = NULL;
 
     if (mqtt_use) {
 	payload = payload_header();
-	payload = xstrcat(payload, unit_data(unit, false));
+	payloadu = unit_data(unit, false);
+	payload = xstrcat(payload, payloadu);
 	payload = xstrcat(payload, (char *)"}");
 	topic = xstrcat(topic_base((char *)"DDATA"), (char *)"/");
 	topic = xstrcat(topic, unit->alias);
 	publisher(mosq, topic, payload, false);
 	free(payload);
 	payload = NULL;
+	free(payloadu);
+	payloadu = NULL;
 	free(topic);
 	topic = NULL;
     }
@@ -778,7 +787,7 @@
 
 void publishNData(bool birth, int flag)
 {
-    char		*payload = NULL, sidx[10], buf[64];
+    char		*topic = NULL, *payload = NULL, sidx[10], buf[64];
     struct utsname	ubuf;
     bool		comma = false;
 
@@ -887,11 +896,15 @@
 neterr:
 
     payload = xstrcat(payload, (char *)"}}");
-    if (birth)
-    	publisher(mosq, topic_base((char *)"NBIRTH"), payload, true);
-    else
-	publisher(mosq, topic_base((char *)"NDATA"), payload, false);
-
+    if (birth) {
+	topic = topic_base((char *)"NBIRTH");
+    	publisher(mosq, topic, payload, true);
+    } else {
+	topic = topic_base((char *)"NDATA");
+	publisher(mosq, topic, payload, false);
+    }
+    free(topic);
+    topic = NULL;
     free(payload);
     payload = NULL;
 
@@ -914,7 +927,7 @@
 
 void mqtt_connect(void)
 {
-    char	*id = NULL;
+    char	*id = NULL, *topic;
     char	err[1024];
     int		rc;
 
@@ -945,16 +958,20 @@
        mosquitto_lib_cleanup();
        return;
     }
+    free(id);
+    id = NULL;
 
     /*
      * Set our will
      */
-    if ((rc = mosquitto_will_set(mosq, topic_base((char *)"NDEATH"), 0, NULL, mqtt_qos, false))) {
+    topic = topic_base((char *)"NDEATH");
+    if ((rc = mosquitto_will_set(mosq, topic, 0, NULL, mqtt_qos, false))) {
 	if (rc > MOSQ_ERR_SUCCESS)
 	    syslog(LOG_NOTICE, "MQTT: mosquitto_will_set: %s", mosquitto_strerror(rc));
         mosquitto_lib_cleanup();
         return;
     }
+    free(topic);
 
     if (debug)
     	mosquitto_log_callback_set(mosq, my_log_callback);
@@ -991,6 +1008,7 @@
 void mqtt_disconnect(void)
 {
     int		rc;
+    char	*topic;
 
     if (mqtt_use) {
         /*
@@ -998,10 +1016,18 @@
 	 * After that, remove the retained topic.
          */
         syslog(LOG_NOTICE, "MQTT disconnecting");
-	publisher(mosq, topic_base((char *)"DBIRTH"), NULL, true);	// Not always needed, but ...
-	publisher(mosq, topic_base((char *)"DDEATH"), NULL, true);
-	publisher(mosq, topic_base((char *)"NBIRTH"), NULL, true);
-	publisher(mosq, topic_base((char *)"NDEATH"), NULL, true);
+	topic = topic_base((char *)"DBIRTH");
+	publisher(mosq, topic, NULL, true);	// Not always needed, but ...
+	free(topic);
+	topic = topic_base((char *)"DDEATH");
+	publisher(mosq, topic, NULL, true);
+	free(topic);
+	topic = topic_base((char *)"NBIRTH");
+	publisher(mosq, topic, NULL, true);
+	free(topic);
+	topic = topic_base((char *)"NDEATH");
+	publisher(mosq, topic, NULL, true);
+	free(topic);
         mqtt_last_mid = mqtt_mid_sent;
         mqtt_status = STATUS_WAITING;
 	mqtt_my_shutdown = TRUE;

mercurial