using namespace LUA;
extern "C" {
- int docall(lua_State * L, int narg, int nresults, int perror);
+ int docall(lua_State * L, int narg, int nresults, int perror, int fatal);
};
Session::Session():CoreSession()
arg_count++;
}
- docall(L, arg_count, 1, 1);
+ docall(L, arg_count, 1, 1, 0);
const char *err = lua_tostring(L, -1);
switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
char str[3] = "";
int arg_count = 3;
+ int r;
lua_getfield(L, LUA_GLOBALSINDEX, (char *) cb_function);
lua_getfield(L, LUA_GLOBALSINDEX, uuid);
arg_count++;
}
- docall(L, arg_count, 1, 1);
+ r = docall(L, arg_count, 1, 1, 0);
- ret = lua_tostring(L, -1);
- lua_pop(L, 1);
+ if (!r) {
+ ret = lua_tostring(L, -1);
+ lua_pop(L, 1);
+ } else {
+ ret = "SCRIPT_ERROR";
+ }
return process_callback_result((char *) ret);
}
arg_count++;
}
- docall(L, arg_count, 1, 1);
- ret = lua_tostring(L, -1);
- lua_pop(L, 1);
+ if (!docall(L, arg_count, 1, 1, 0)) {
+ ret = lua_tostring(L, -1);
+ lua_pop(L, 1);
+ } else {
+ ret = "SCRIPT_ERROR";
+ }
return process_callback_result((char *) ret);
}
lua_settable(lua_fun->L, -3);
}
- docall(lua_fun->L, 1, 1, 1);
- ret = lua_tonumber(lua_fun->L, -1);
- lua_pop(lua_fun->L, 1);
-
- if (ret != 0) {
- return 1;
- }
+ if (docall(lua_fun->L, 1, 1, 1, 0)) {
+ return 1;
+ }
+ ret = lua_tonumber(lua_fun->L, -1);
+ lua_pop(lua_fun->L, 1);
+
+ if (ret != 0) {
+ return 1;
+ }
+
return 0; /* 0 to continue with next row */
}
return 1;
}
-int docall(lua_State * L, int narg, int nresults, int perror)
+int docall(lua_State * L, int narg, int nresults, int perror, int fatal)
{
int status;
int base = lua_gettop(L) - narg; /* function index */
if (!zstr(err)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s\n", err);
}
- //lua_pop(L, 1); /* pop error message from the stack */
+
// pass error up to top
- lua_error(L);
+ if (fatal) {
+ lua_error(L);
+ } else {
+ lua_pop(L, 1); /* pop error message from the stack */
+ }
}
return status;
luaopen_freeswitch(L);
lua_gc(L, LUA_GCRESTART, 0);
lua_atpanic(L, panic);
- error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0);
+ error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1);
}
return L;
}
if (*input_code == '~') {
char *buff = input_code + 1;
- error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0); //lua_pcall(L, 0, 0, 0);
+ error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1); //lua_pcall(L, 0, 0, 0);
} else if (!strncasecmp(input_code, "#!/lua", 6)) {
char *buff = input_code + 6;
- error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0); //lua_pcall(L, 0, 0, 0);
+ error = luaL_loadbuffer(L, buff, strlen(buff), "line") || docall(L, 0, 0, 0, 1); //lua_pcall(L, 0, 0, 0);
} else {
char *args = strchr(input_code, ' ');
if (args) {
}
if (code) {
- error = luaL_loadbuffer(L, code, strlen(code), "line") || docall(L, 0, 0, 0);
+ error = luaL_loadbuffer(L, code, strlen(code), "line") || docall(L, 0, 0, 0, 1);
switch_safe_free(code);
}
} else {
// Force empty argv table
char *code = NULL;
code = switch_mprintf("argv = {[0]='%s'};", input_code);
- error = luaL_loadbuffer(L, code, strlen(code), "line") || docall(L, 0, 0, 0);
+ error = luaL_loadbuffer(L, code, strlen(code), "line") || docall(L, 0, 0, 0, 1);
switch_safe_free(code);
}
switch_assert(fdup);
file = fdup;
}
- error = luaL_loadfile(L, file) || docall(L, 0, 0, 0);
+ error = luaL_loadfile(L, file) || docall(L, 0, 0, 0, 1);
switch_safe_free(fdup);
}
}