From c9fba31fb81bde6a61c8312104724b9dfd74892e Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 15 Jul 2003 00:46:22 +0000
Subject: [PATCH] Global exit() method can now accept an optional numeric
 argument, which it will use to set the global property, exit_code, used by
 jsexec and bbs.exec() for numeric return codes. Bugfix: No .js extension
 required for scripts in mods dir.

---
 src/sbbs3/jsexec.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index aadfaa6c17..dc518a0a57 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -131,6 +131,9 @@ void bail(int code)
 		fprintf(statfp,"\nHit enter to continue...");
 		getchar();
 	}
+
+	if(code)
+		fprintf(statfp,"\nReturning error code: %d\n",code);
 	exit(code);
 }
 
@@ -476,6 +479,13 @@ static BOOL js_init(char** environ)
 	return(TRUE);
 }
 
+static const char* js_ext(const char* fname)
+{
+	if(strchr(fname,'.')==NULL)
+		return(".js");
+	return("");
+}
+
 long js_exec(const char *fname, char** args)
 {
 	int			argc=0;
@@ -489,20 +499,19 @@ long js_exec(const char *fname, char** args)
 	int32		result=0;
 	
 	if(strcspn(fname,"/\\")==strlen(fname)) {
-		sprintf(path,"%s%s",scfg.mods_dir,fname);
+		sprintf(path,"%s%s%s",scfg.mods_dir,fname,js_ext(fname));
 		if(scfg.mods_dir[0]==0 || !fexistcase(path))
-			sprintf(path,"%s%s",scfg.exec_dir,fname);
+			sprintf(path,"%s%s%s",scfg.exec_dir,fname,js_ext(fname));
 	} else
-		sprintf(path,"%.*s",(int)sizeof(path)-4,fname);
-	/* Add extension if not specified */
-	if(!strchr(path,'.'))
-		strcat(path,".js");
+		sprintf(path,"%s%s",fname,js_ext(fname));
 
 	if(!fexistcase(path)) {
 		fprintf(errfp,"!Module file (%s) doesn't exist\n",path);
 		return(-1); 
 	}
 
+	JS_ClearPendingException(js_cx);
+
 	js_scope=JS_NewObject(js_cx, NULL, NULL, js_glob);
 
 	if(js_scope==NULL) {
@@ -526,14 +535,20 @@ long js_exec(const char *fname, char** args)
 		,NULL,NULL,JSPROP_READONLY|JSPROP_ENUMERATE);
 
 	if((js_script=JS_CompileFile(js_cx, js_scope, path))==NULL) {
-		fprintf(errfp,"!Error executing %s\n",fname);
+		fprintf(errfp,"!Error compiling %s\n",path);
 		return(-1);
 	}
 
 	JS_SetBranchCallback(js_cx, js_BranchCallback);
 
-	if(!JS_ExecuteScript(js_cx, js_scope, js_script, &rval))
-		result=-1;
+	JS_ExecuteScript(js_cx, js_scope, js_script, &rval);
+
+	JS_GetProperty(js_cx, js_glob, "exit_code", &rval);
+
+	if(rval!=JSVAL_VOID) {
+		fprintf(statfp,"Using JavaScript exit_code: %s\n",JS_GetStringBytes(JS_ValueToString(js_cx,rval)));
+		JS_ValueToInt32(js_cx,rval,&result);
+	}
 
 	JS_DestroyScript(js_cx, js_script);
 
@@ -541,9 +556,6 @@ long js_exec(const char *fname, char** args)
 
 	JS_GC(js_cx);
 
-	if(result==0 && rval!=JSVAL_VOID)	/* No error? Use script result */
-		JS_ValueToInt32(js_cx,rval,&result);
-
 	return(result);
 }
 
-- 
GitLab