From 68e610da686891d7fe198658c56dacf30d834d1c Mon Sep 17 00:00:00 2001
From: "Rob Swindell (on Windows 11)" <rob@synchro.net>
Date: Tue, 14 Jan 2025 17:40:31 -0800
Subject: [PATCH] load_cfg() can now report config file warnings

Log the error string if it's non-blank, as a warning (e.g. unrecognized
text.ini text.dat string ID).

Reduce the number of logged messages when config load failure happens.

Commonize the load_cfg() error log messages.
---
 src/sbbs3/ftpsrvr.c  | 5 +++--
 src/sbbs3/jsexec.c   | 4 +++-
 src/sbbs3/load_cfg.c | 5 +++--
 src/sbbs3/mailsrvr.c | 6 ++++--
 src/sbbs3/main.cpp   | 8 ++++----
 src/sbbs3/sbbscon.c  | 4 +++-
 src/sbbs3/sbbsecho.c | 5 +++--
 src/sbbs3/services.c | 5 +++--
 src/sbbs3/websrvr.c  | 5 +++--
 9 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 218187f424..48df6e48da 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -5230,11 +5230,12 @@ void ftp_server(void* arg)
 		scfg.size = sizeof(scfg);
 		SAFECOPY(error, UNKNOWN_LOAD_ERROR);
 		if (!load_cfg(&scfg, text, /* prep: */ TRUE, /* node: */ FALSE, error, sizeof(error))) {
-			lprintf(LOG_CRIT, "!ERROR %s", error);
-			lprintf(LOG_CRIT, "!Failed to load configuration files");
+			lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", error);
 			cleanup(1, __LINE__);
 			break;
 		}
+		if (error[0] != '\0')
+			lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", error);
 
 		mqtt_startup(&mqtt, &scfg, (struct startup*)startup, ftp_ver(), lputs);
 
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 1cdd9eec2e..78f06189a0 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -1470,7 +1470,9 @@ int main(int argc, char **argv)
 		if (require_cfg)
 			return do_bail(1);
 		prep_dir(scfg.ctrl_dir, scfg.exec_dir, sizeof(scfg.exec_dir));
-	}
+	} else if (error[0] != '\0')
+		lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", error);
+
 	SAFECOPY(scfg.temp_dir, "../temp");
 #endif
 	prep_dir(scfg.ctrl_dir, scfg.temp_dir, sizeof(scfg.temp_dir));
diff --git a/src/sbbs3/load_cfg.c b/src/sbbs3/load_cfg.c
index 26faa4d9e0..0c12a0429e 100644
--- a/src/sbbs3/load_cfg.c
+++ b/src/sbbs3/load_cfg.c
@@ -69,6 +69,8 @@ bool load_cfg(scfg_t* cfg, char* text[], bool prep, bool req_cfg, char* error, s
 		              , cfg->size, sizeof(scfg_t));
 		return false;
 	}
+	if (error != NULL)
+		*error = '\0';
 
 	free_cfg(cfg);  /* free allocated config parameters */
 
@@ -134,8 +136,7 @@ bool load_cfg(scfg_t* cfg, char* text[], bool prep, bool req_cfg, char* error, s
 					safe_snprintf(error, maxerrlen, "%s text ID (%s) not recognized"
 					              , str
 					              , list[i]->name);
-					success = false;
-					break;
+					continue;
 				}
 				free(text[n]);
 				text[n] = strdup(list[i]->value);
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 628eb030ec..b0dc6fca9f 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -6195,11 +6195,13 @@ void mail_server(void* arg)
 		scfg.size = sizeof(scfg);
 		SAFECOPY(error, UNKNOWN_LOAD_ERROR);
 		if (!load_cfg(&scfg, text, /* prep: */ TRUE, /* node: */ FALSE, error, sizeof(error))) {
-			lprintf(LOG_CRIT, "!ERROR %s", error);
-			lprintf(LOG_CRIT, "!Failed to load configuration files");
+			lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", error);
 			cleanup(1);
 			return;
 		}
+		if (error[0] != '\0')
+			lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", error);
+
 
 		mqtt_startup(&mqtt, &scfg, (struct startup*)startup, mail_ver(), lputs);
 
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index d6b78bbab6..dc49938cb1 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -5073,11 +5073,12 @@ void bbs_thread(void* arg)
 		scfg.node_num = startup->first_node;
 		SAFECOPY(logstr, UNKNOWN_LOAD_ERROR);
 		if (!load_cfg(&scfg, text, /* prep: */ true, /* node_req: */ true, logstr, sizeof(logstr))) {
-			lprintf(LOG_CRIT, "!ERROR %s", logstr);
-			lprintf(LOG_CRIT, "!FAILED to load configuration files");
+			lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", logstr);
 			cleanup(1);
 			return;
 		}
+		if (logstr[0] != '\0')
+			lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", logstr);
 
 		mqtt_startup(&mqtt, &scfg, (struct startup*)startup, bbs_ver(), lputs);
 
@@ -5763,8 +5764,7 @@ NO_SSH:
 					lprintf(LOG_WARNING, "Node %d LOAD ERROR: %s, falling back to Node %d", cfg->node_num, logstr, first_node);
 					cfg->node_num = first_node;
 					if (!load_cfg(cfg, node_text[node_num - 1], /* prep: */ true, /* node: */ true, logstr, sizeof(logstr))) {
-						lprintf(LOG_CRIT, "!ERROR %s", logstr);
-						lprintf(LOG_CRIT, "!FAILED to load configuration files");
+						lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", logstr);
 						sbbs->bprintf("\r\nFAILED: %s", logstr);
 						client_off(client_socket);
 						SSH_END(client_socket);
diff --git a/src/sbbs3/sbbscon.c b/src/sbbs3/sbbscon.c
index b7b8722b62..a5a272aeca 100644
--- a/src/sbbs3/sbbscon.c
+++ b/src/sbbs3/sbbscon.c
@@ -1706,9 +1706,11 @@ int main(int argc, char** argv)
 	SAFECOPY(error, UNKNOWN_LOAD_ERROR);
 	lprintf(LOG_INFO, "Loading configuration files from %s", scfg.ctrl_dir);
 	if (!load_cfg(&scfg, /* text: */ NULL, /* prep: */ TRUE, /* node: */ FALSE, error, sizeof(error))) {
-		lprintf(LOG_ERR, "!ERROR Loading Configuration Files: %s", error);
+		lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", error);
 		return -1;
 	}
+	if (error[0] != '\0')
+		lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", error);
 
 /* Daemonize / Set uid/gid */
 #ifdef __unix__
diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c
index a6567c84c1..0e3fa7b611 100644
--- a/src/sbbs3/sbbsecho.c
+++ b/src/sbbs3/sbbsecho.c
@@ -6655,11 +6655,12 @@ int main(int argc, char **argv)
 	scfg.size = sizeof(scfg);
 	SAFECOPY(str, UNKNOWN_LOAD_ERROR);
 	if (!load_cfg(&scfg, text, /* prep: */ true, /* node: */ false, str, sizeof(str))) {
-		fprintf(stderr, "!ERROR %s\n", str);
-		fprintf(stderr, "!Failed to load configuration files\n");
+		fprintf(stderr, "!ERROR loading configuration files: %s\n", str);
 		bail(1);
 		return -1;
 	}
+	if (str[0] != '\0')
+		fprintf(stderr, "!WARNING loading configuration files: %s\n", str);
 
 	twit_list = list_of_twits(&scfg);
 
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index ac2601dd81..1ee9eeb8e0 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -2019,11 +2019,12 @@ void services_thread(void* arg)
 		scfg.size = sizeof(scfg);
 		SAFECOPY(error, UNKNOWN_LOAD_ERROR);
 		if (!load_cfg(&scfg, text, /* prep: */ true, /* node: */ false, error, sizeof(error))) {
-			lprintf(LOG_CRIT, "!ERROR %s", error);
-			lprintf(LOG_CRIT, "!Failed to load configuration files");
+			lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", error);
 			cleanup(1);
 			return;
 		}
+		if (error[0] != '\0')
+			lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", error);
 
 		mqtt_startup(&mqtt, &scfg, (struct startup*)startup, services_ver(), lputs);
 
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 6155b18ed8..606261575f 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -7370,11 +7370,12 @@ void web_server(void* arg)
 		scfg.size = sizeof(scfg);
 		SAFECOPY(logstr, UNKNOWN_LOAD_ERROR);
 		if (!load_cfg(&scfg, text, /* prep: */ true, /* node: */ false, logstr, sizeof(logstr))) {
-			lprintf(LOG_CRIT, "!ERROR %s", logstr);
-			lprintf(LOG_CRIT, "!FAILED to load configuration files");
+			lprintf(LOG_CRIT, "!ERROR loading configuration files: %s", logstr);
 			cleanup(1);
 			return;
 		}
+		if (logstr[0] != '\0')
+			lprintf(LOG_WARNING, "!WARNING loading configuration files: %s", logstr);
 
 		mqtt_startup(&mqtt, &scfg, (struct startup*)startup, web_ver(), lputs);
 
-- 
GitLab