[sr-dev] git:master:03763216: app_sqlang: implemented KSR.x.exit() using context field

Daniel-Constantin Mierla miconda at gmail.com
Thu Apr 20 20:08:16 CEST 2017


Module: kamailio
Branch: master
Commit: 037632161767262c3c562d20985ae8c66637f0d8
URL: https://github.com/kamailio/kamailio/commit/037632161767262c3c562d20985ae8c66637f0d8

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2017-04-20T20:07:55+02:00

app_sqlang: implemented KSR.x.exit() using context field

---

Modified: src/modules/app_sqlang/app_sqlang_api.c

---

Diff:  https://github.com/kamailio/kamailio/commit/037632161767262c3c562d20985ae8c66637f0d8.diff
Patch: https://github.com/kamailio/kamailio/commit/037632161767262c3c562d20985ae8c66637f0d8.patch

---

diff --git a/src/modules/app_sqlang/app_sqlang_api.c b/src/modules/app_sqlang/app_sqlang_api.c
index d5e3f86..e654cdc 100644
--- a/src/modules/app_sqlang/app_sqlang_api.c
+++ b/src/modules/app_sqlang/app_sqlang_api.c
@@ -52,7 +52,9 @@ void sqlang_sr_kemi_register_libs(HSQUIRRELVM J);
 typedef struct _sr_sqlang_env
 {
 	HSQUIRRELVM J;
+	int J_exit;
 	HSQUIRRELVM JJ;
+	int JJ_exit;
 	sip_msg_t *msg;
 	unsigned int flags;
 	unsigned int nload; /* number of scripts loaded */
@@ -248,7 +250,15 @@ static int sqlang_isfunction(HSQUIRRELVM J, int idx)
 
 static char* sqlang_safe_tostring(HSQUIRRELVM J, int idx)
 {
-	return "Error on sqlang";
+	const SQChar *s = NULL;
+
+	if(idx>=0) {
+		idx += 2;
+	}
+	if(sqlang_isstring(J, idx)) {
+		sq_getstring(J, idx, &s);
+	}
+	return (s)?(char*)s:"Error on sqlang";
 }
 
 static int sqlang_gettype(HSQUIRRELVM J, int idx)
@@ -508,6 +518,11 @@ const SQRegFunction _sr_kemi_pv_J_Map[] = {
  */
 static SQInteger sqlang_sr_exit (HSQUIRRELVM J)
 {
+	if(_sr_J_env.JJ==J) {
+		_sr_J_env.JJ_exit = 1;
+	} else {
+		_sr_J_env.J_exit = 1;
+	}
 	return sq_throwerror(J, _SC("~~ksr~exit~~"));
 }
 
@@ -516,6 +531,11 @@ static SQInteger sqlang_sr_exit (HSQUIRRELVM J)
  */
 static SQInteger sqlang_sr_drop (HSQUIRRELVM J)
 {
+	if(_sr_J_env.JJ==J) {
+		_sr_J_env.JJ_exit = 1;
+	} else {
+		_sr_J_env.J_exit = 1;
+	}
 	sr_kemi_core_drop(NULL);
 	return sq_throwerror(J, _SC("~~ksr~exit~~"));
 }
@@ -693,11 +713,23 @@ const SQRegFunction _sr_kemi_x_J_Map[] = {
 /**
  *
  */
-void sqlang_errorfunc(HSQUIRRELVM SQ_UNUSED_ARG(J), const SQChar *fmt,...)
+void sqlang_errorfunc(HSQUIRRELVM J, const SQChar *fmt, ...)
 {
 	char ebuf[4096];
 	va_list ap;
 
+	if(_sr_J_env.JJ==J) {
+		if(_sr_J_env.JJ_exit == 1) {
+			LM_DBG("exception on ksr exit (JJ)\n");
+			return;
+		}
+	} else {
+		if(_sr_J_env.J_exit == 1) {
+			LM_DBG("exception on ksr exit (J)\n");
+			return;
+		}
+	}
+
 	ebuf[0] = '\0';
 	va_start(ap, fmt);
 	vsnprintf(ebuf, 4094, fmt, ap);
@@ -965,16 +997,23 @@ int app_sqlang_run_ex(sip_msg_t *msg, char *func, char *p1, char *p2,
 	LM_DBG("executing sqlang function: [[%s]] (n: %d)\n", func, n);
 	bmsg = _sr_J_env.msg;
 	_sr_J_env.msg = msg;
+	_sr_J_env.JJ_exit = 0;
 	/* call the function */
 	rv = sq_call(_sr_J_env.JJ, n, SQFalse, SQTrue);
 	if(SQ_SUCCEEDED(rv)) {
 		ret = 1;
 	} else {
-		LM_ERR("failed to execute the func: %s (%d)\n", func, (int)rv);
-		sqstd_printcallstack(_sr_J_env.JJ);
-		ret = -1;
+		if(_sr_J_env.JJ_exit==0) {
+			LM_ERR("failed to execute the func: %s (%d)\n", func, (int)rv);
+			sqstd_printcallstack(_sr_J_env.JJ);
+			ret = -1;
+		} else {
+			LM_DBG("script execution exit\n");
+			ret = 1;
+		}
 	}
 	_sr_J_env.msg = bmsg;
+	_sr_J_env.JJ_exit = 0;
 	sq_settop(_sr_J_env.JJ, (top<=0)?1:top); /* restores the original stack size */
 
 	return ret;




More information about the sr-dev mailing list