From 71d44c8fb3c0c41da5569f1812dde7df7429f8b2 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 14 Aug 2009 11:02:54 +0000
Subject: [PATCH] When executing (not loading) a script from a file, 3 new
 properties are created: js.exec_path - full path and filename of file
 executed js.exec_dir - directory of executed file js.exec_file - filename
 executed (with no path)

---
 src/sbbs3/exec.cpp      |  1 +
 src/sbbs3/ftpsrvr.c     |  1 +
 src/sbbs3/js_internal.c | 28 ++++++++++++++++++++++++++++
 src/sbbs3/jsexec.c      |  1 +
 src/sbbs3/mailsrvr.c    |  3 ++-
 src/sbbs3/sbbs.h        |  1 +
 src/sbbs3/services.c    |  2 ++
 src/sbbs3/websrvr.c     |  1 +
 8 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp
index abee3dbc8b..b25de7c048 100644
--- a/src/sbbs3/exec.cpp
+++ b/src/sbbs3/exec.cpp
@@ -647,6 +647,7 @@ long sbbs_t::js_execfile(const char *cmd)
 
 	JS_SetBranchCallback(js_cx, js_BranchCallback);
 
+	js_PrepareToExecute(js_cx, js_scope, path);
 	JS_ExecuteScript(js_cx, js_scope, js_script, &rval);
 
 	JS_GetProperty(js_cx, js_scope, "exit_code", &rval);
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 59b7aeac8a..3fb71ab9c5 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -1000,6 +1000,7 @@ BOOL js_generate_index(JSContext* js_cx, JSObject* parent,
 			break;
 		}
 
+		js_PrepareToExecute(js_cx, parent, spath);
 		if((success=JS_ExecuteScript(js_cx, parent, js_script, &rval))!=TRUE) {
 			lprintf(LOG_ERR,"%04d !JavaScript FAILED to execute script (%s)",sock,spath);
 			break;
diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c
index 160ac41065..ab6d3ccef7 100644
--- a/src/sbbs3/js_internal.c
+++ b/src/sbbs3/js_internal.c
@@ -483,3 +483,31 @@ JSObject* DLLCALL js_CreateInternalJsObject(JSContext* cx, JSObject* parent, js_
 
 	return(obj);
 }
+
+void DLLCALL js_PrepareToExecute(JSContext *cx, JSObject *obj, const char *filename)
+{
+	JSString*	str;
+	jsval		val;
+
+	if(JS_GetProperty(cx, obj, "js", &val) && JSVAL_IS_OBJECT(val)) {
+		JSObject* js = JSVAL_TO_OBJECT(val);
+		char	dir[MAX_PATH+1];
+
+		if(filename!=NULL) {
+			char* p;
+
+			if((str=JS_NewStringCopyZ(cx, filename)) != NULL)
+				JS_DefineProperty(cx, js, "exec_path", STRING_TO_JSVAL(str)
+					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
+			if((str=JS_NewStringCopyZ(cx, getfname(filename))) != NULL)
+				JS_DefineProperty(cx, js, "exec_file", STRING_TO_JSVAL(str)
+					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
+			SAFECOPY(dir,filename);
+			p=getfname(dir);
+			*p=0;
+			if((str=JS_NewStringCopyZ(cx, dir)) != NULL)
+				JS_DefineProperty(cx, js, "exec_dir", STRING_TO_JSVAL(str)
+					,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
+		}
+	}
+}
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 5d5c7bcbfa..114a4fdc22 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -802,6 +802,7 @@ long js_exec(const char *fname, char** args)
 			,path
 			,diff);
 
+	js_PrepareToExecute(js_cx, js_glob, fname==NULL ? NULL : path);
 	start=xp_timer();
 	JS_ExecuteScript(js_cx, js_glob, js_script, &rval);
 	JS_GetProperty(js_cx, js_glob, "exit_code", &rval);
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index f3da545273..ee01fcaa00 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -1784,7 +1784,8 @@ js_mailproc(SOCKET sock, client_t* client, user_t* user, struct mailproc* mailpr
 		} else {
 			lprintf(LOG_DEBUG,"%04d %s Executing: %s"
 				,sock, log_prefix, cmdline);
-			js_script=JS_CompileFile(*js_cx, js_scope, path);
+			if((js_script=JS_CompileFile(*js_cx, js_scope, path)) != NULL)
+				js_PrepareToExecute(*js_cx, js_scope, path);
 		}
 		if(js_script==NULL)
 			break;
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 0007b9b97f..43bb75e426 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1020,6 +1020,7 @@ extern "C" {
 	DLLEXPORT JSObject* DLLCALL js_CreateInternalJsObject(JSContext*, JSObject* parent, js_branch_t*, js_startup_t*);
 	DLLEXPORT JSBool	DLLCALL js_CommonBranchCallback(JSContext*, js_branch_t*);
 	DLLEXPORT void		DLLCALL js_EvalOnExit(JSContext*, JSObject*, js_branch_t*);
+	DLLEXPORT void		DLLCALL	js_PrepareToExecute(JSContext*, JSObject*, const char *filename);
 
 	/* js_system.c */
 	DLLEXPORT JSObject* DLLCALL js_CreateSystemObject(JSContext* cx, JSObject* parent
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 9e4813f284..7600dacaf3 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1164,6 +1164,7 @@ static void js_service_thread(void* arg)
 	if(js_script==NULL) 
 		lprintf(LOG_ERR,"%04d !JavaScript FAILED to compile script (%s)",socket,spath);
 	else  {
+		js_PrepareToExecute(js_cx, js_glob, spath);
 		JS_SetBranchCallback(js_cx, js_BranchCallback);
 		JS_ExecuteScript(js_cx, js_glob, js_script, &rval);
 		js_EvalOnExit(js_cx, js_glob, &service_client.branch);
@@ -1267,6 +1268,7 @@ static void js_static_service_thread(void* arg)
 			break;
 		}
 
+		js_PrepareToExecute(js_cx, js_glob, spath);
 		JS_ExecuteScript(js_cx, js_glob, js_script, &rval);
 		js_EvalOnExit(js_cx, js_glob, &service_client.branch);
 		JS_DestroyScript(js_cx, js_script);
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index 88f762e232..067643d178 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -4620,6 +4620,7 @@ static BOOL exec_ssjs(http_session_t* session, char* script)  {
 
 		lprintf(LOG_DEBUG,"%04d JavaScript: Executing script: %s",session->socket,script);
 		start=xp_timer();
+		js_PrepareToExecute(session->js_cx, session->js_glob, script);
 		JS_ExecuteScript(session->js_cx, session->js_glob, js_script, &rval);
 		js_EvalOnExit(session->js_cx, session->js_glob, &session->js_branch);
 		lprintf(LOG_DEBUG,"%04d JavaScript: Done executing script: %s (%.2Lf seconds)"
-- 
GitLab