diff --git a/src/sbbs3/mqtt.c b/src/sbbs3/mqtt.c index 2fd029ea5e745a8759b5b1d571412041d7e23cf3..ffbccc7ad6a66ae7634427cecbb370d2e44900db 100644 --- a/src/sbbs3/mqtt.c +++ b/src/sbbs3/mqtt.c @@ -534,6 +534,10 @@ static void mqtt_connect_callback(struct mosquitto* mosq, void* cbdata, int rc) mqtt_subscribe(mqtt, TOPIC_HOST, str, sizeof(str), "pause"); mqtt_subscribe(mqtt, TOPIC_SERVER, str, sizeof(str), "resume"); mqtt_subscribe(mqtt, TOPIC_HOST, str, sizeof(str), "resume"); + if (mqtt->server_version != NULL) { + mqtt_server_startup(mqtt); + mqtt->server_version = NULL; + } } else mqtt->connect_error = rc; @@ -648,6 +652,7 @@ static void mqtt_message_received(struct mosquitto* mosq, void* cbdata, const st } #endif // USE_MOSQUITTO +// 'version' argument should not point to stack memory as it'll be read later (i.e. in connect callback) int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const char* version , int (*lputs)(int level, const char* str)) { @@ -674,6 +679,7 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const lprintf(lputs, LOG_ERR, "MQTT error %d starting pub/sub thread", result); mqtt_close(mqtt); } else { + mqtt->server_version = version; #ifdef USE_MOSQUITTO if (mqtt->handle != NULL) { mosquitto_connect_callback_set(mqtt->handle, mqtt_connect_callback); @@ -692,13 +698,6 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const } } } - mqtt_server_state(mqtt, SERVER_INIT); - mqtt_pub_strval(mqtt, TOPIC_BBS_LEVEL, NULL, mqtt->cfg->sys_name); - mqtt_pub_strval(mqtt, TOPIC_HOST_LEVEL, NULL, startup->host_name); - mqtt_pub_strval(mqtt, TOPIC_SERVER, "version", version); - mqtt_pub_uintval(mqtt, TOPIC_SERVER, "served", mqtt->served); - mqtt_pub_uintval(mqtt, TOPIC_SERVER, "highwater", 0); - mqtt_pub_uintval(mqtt, TOPIC_SERVER, "error_count", mqtt->error_count); #ifdef USE_MOSQUITTO if (mqtt->handle != NULL) @@ -708,6 +707,18 @@ int mqtt_startup(struct mqtt* mqtt, scfg_t* cfg, struct startup* startup, const return result; } +int mqtt_server_startup(struct mqtt* mqtt) +{ + int result = mqtt_server_state(mqtt, SERVER_INIT); + mqtt_pub_strval(mqtt, TOPIC_BBS_LEVEL, NULL, mqtt->cfg->sys_name); + mqtt_pub_strval(mqtt, TOPIC_HOST_LEVEL, NULL, mqtt->startup->host_name); + mqtt_pub_strval(mqtt, TOPIC_SERVER, "version", mqtt->server_version); + mqtt_pub_uintval(mqtt, TOPIC_SERVER, "served", mqtt->served); + mqtt_pub_uintval(mqtt, TOPIC_SERVER, "highwater", 0); + mqtt_pub_uintval(mqtt, TOPIC_SERVER, "error_count", mqtt->error_count); + return result; +} + int mqtt_server_state(struct mqtt* mqtt, enum server_state state) { char str[128]; diff --git a/src/sbbs3/mqtt.h b/src/sbbs3/mqtt.h index 088e728936c6ea05c6ec968132866d737a356596..3a7492a0943b6f4e8d12dd52dc1790f31ee66ecc 100644 --- a/src/sbbs3/mqtt.h +++ b/src/sbbs3/mqtt.h @@ -52,6 +52,7 @@ struct mqtt { link_list_t client_list; struct startup* startup; enum server_state server_state; + const char* server_version; }; enum topic_depth { @@ -78,6 +79,7 @@ DLLEXPORT int mqtt_init(struct mqtt*, scfg_t*, struct startup*); DLLEXPORT int mqtt_startup(struct mqtt*, scfg_t*, struct startup*, const char* version , int (*lputs)(int level, const char* str)); DLLEXPORT int mqtt_online(struct mqtt*); +DLLEXPORT int mqtt_server_startup(struct mqtt*); DLLEXPORT int mqtt_server_state(struct mqtt*, enum server_state); DLLEXPORT int mqtt_errormsg(struct mqtt*, int level, const char*); DLLEXPORT int mqtt_terminating(struct mqtt*);