From 8e0d6a98fe358a52aa6e7af9d4000a827d5efbac Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Tue, 10 May 2022 17:03:33 -0700
Subject: [PATCH] Allow a per-service "LowestLogLevel" setting

Have a service (e.g. imapservice.js) that logs errors that you'd rather not fill your error.log file with? Set that service's "LowestLogLevel" to "Warning" in your services.ini file ("lower" means "more severe" when it comes to log levels, so this would set the maximum severity to Warning).
---
 src/sbbs3/services.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index e9501354ca..c7b5b18e52 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -78,6 +78,7 @@ typedef struct {
 	uint32_t		options;
 	int				listen_backlog;
 	int				log_level;
+	int				lowest_log_level;	// highest severity from JS
 	uint32_t		stack_size;
 	js_startup_t	js;
 	js_server_props_t js_server_props;
@@ -306,8 +307,12 @@ js_log(JSContext *cx, uintN argc, jsval *arglist)
 	rc=JS_SUSPENDREQUEST(cx);
 	if(service==NULL)
 		lprintf(level,"%04d %s",client->socket,str);
-	else if(level <= client->service->log_level)
-		lprintf(level,"%04d %s %s",client->socket,client->service->protocol,str);
+	else {
+		if(level < client->service->lowest_log_level)
+			level = client->service->lowest_log_level;
+		if(level <= client->service->log_level)
+			lprintf(level,"%04d %s %s",client->socket,client->service->protocol,str);
+	}
 	JS_RESUMEREQUEST(cx, rc);
 
 	JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, str)));
@@ -1603,6 +1608,7 @@ static service_t* read_services_ini(const char* services_ini, service_t* service
 		serv.stack_size=(uint32_t)iniGetBytes(list,sec_list[i],"StackSize",1,stack_size);
 		serv.options=iniGetBitField(list,sec_list[i],"Options",service_options,options);
 		serv.log_level=iniGetLogLevel(list,sec_list[i],"LogLevel",log_level);
+		serv.lowest_log_level=iniGetLogLevel(list,sec_list[i],"LowestLogLevel",0);
 		SAFECOPY(serv.cmd,iniGetString(list,sec_list[i],"Command","",cmd));
 
 		p=iniGetString(list,sec_list[i],"Port",serv.protocol,portstr);
-- 
GitLab