From 20ea82903fdb3bb65b608a979dff022c90021221 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 9 Sep 2003 10:32:46 +0000
Subject: [PATCH] log() method now prints linefeeds automatically. script FILE*
 is now closed before executing script (don't leave open/locked). Installs
 Ctrl-C/break/logoff/shutdown handler for Win32, sets [server.]terminated
 property to true.

---
 src/sbbs3/jsexec.c | 48 ++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 42 insertions(+), 6 deletions(-)

diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 186f484432..f0f5ee1da5 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -55,6 +55,7 @@ FILE*		statfp;
 char		revision[16];
 BOOL		pause_on_exit=FALSE;
 BOOL		pause_on_error=FALSE;
+BOOL		terminated=FALSE;
 
 void banner(FILE* fp)
 {
@@ -94,7 +95,7 @@ void usage(FILE* fp)
 		);
 }
 
-#ifdef _WINSOCKAPI_
+#if defined(_WINSOCKAPI_)
 
 WSADATA WSAData;
 static BOOL WSAInitialized=FALSE;
@@ -122,7 +123,7 @@ static BOOL winsock_startup(void)
 void bail(int code)
 {
 
-#ifdef _WINSOCKAPI_
+#if defined(_WINSOCKAPI_)
 	if(WSAInitialized && WSACleanup()!=0) 
 		fprintf(errfp,"!WSACleanup ERROR %d\n",ERROR_VALUE);
 #endif
@@ -148,6 +149,8 @@ js_log(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		    return(JS_FALSE);
 		fprintf(errfp,JS_GetStringBytes(str));
 	}
+	if(argc)
+		fprintf(errfp,"\n");
 
 	*rval = JSVAL_VOID;
     return(JS_TRUE);
@@ -376,6 +379,9 @@ js_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
 static JSBool
 js_BranchCallback(JSContext *cx, JSScript *script)
 {
+	JSObject*	obj=js_glob;
+	jsval		val=JSVAL_VOID;
+
 	branch.counter++;
 
 	/* Infinite loop? */
@@ -391,6 +397,17 @@ js_BranchCallback(JSContext *cx, JSScript *script)
 	if(branch.gc_freq && (branch.counter%branch.gc_freq)==0)
 		JS_MaybeGC(cx);
 
+	if(terminated) {
+	
+		if(JS_GetProperty(js_cx, js_glob, "server", &val) && val!=JSVAL_VOID)
+			obj=JSVAL_TO_OBJECT(val);
+
+		val=JSVAL_TRUE;
+		JS_SetProperty(js_cx, obj, "terminated", &val);
+
+		terminated=FALSE;	/* No need to repeat this */
+	}
+
     return(JS_TRUE);
 }
 
@@ -558,7 +575,7 @@ long js_exec(const char *fname, char** args)
 		if(!fgets(line,sizeof(line),fp))
 			break;
 		line_no++;
-#ifdef __unix__	/* Support Unix Shell Scripts that start with #!/path/to/jsexec */
+#if defined(__unix__)	/* Support Unix Shell Scripts that start with #!/path/to/jsexec */
 		if(line_no==1 && strncmp(line,"#!",2)==0)
 			strcpy(line,"\n");	/* To keep line count correct */
 #endif
@@ -571,6 +588,9 @@ long js_exec(const char *fname, char** args)
 		memcpy(js_buf+js_buflen,line,len);
 		js_buflen+=len;
 	}
+	if(fp!=NULL && fp!=stdin)
+		fclose(fp);
+
 	if((js_script=JS_CompileScript(js_cx, js_scope, js_buf, js_buflen, fname==NULL ? NULL : path, 1))==NULL) {
 		fprintf(errfp,"!Error compiling script from %s\n",path);
 		return(-1);
@@ -590,15 +610,26 @@ long js_exec(const char *fname, char** args)
 
 	JS_GC(js_cx);
 
-	if(fp!=NULL && fp!=stdin)
-		fclose(fp);
-
 	if(js_buf!=NULL)
 		free(js_buf);
 
 	return(result);
 }
 
+void break_handler(void)
+{
+	fprintf(stderr,"\n-> Terminated Locally <-\n");
+	terminated=TRUE;
+}
+
+#if defined(_WIN32)
+BOOL WINAPI ControlHandler(DWORD CtrlType)
+{
+	break_handler();
+	return TRUE;
+}
+#endif
+
 /*********************/
 /* Entry point (duh) */
 /*********************/
@@ -715,6 +746,11 @@ int main(int argc, char **argv, char** environ)
 	}
 	fprintf(statfp,"\n");
 
+	/* Install Ctrl-C/Break signal handler here */
+#if defined(_WIN32)
+	SetConsoleCtrlHandler(ControlHandler, TRUE /* Add */);
+#endif
+
 	result=js_exec(module,&argv[argn]);
 
 	fprintf(statfp,"\n");
-- 
GitLab