int app_lua_run_ex(sip_msg_t *msg, char *func, char *p1, char *p2, char *p3, int emode) { int n; int ret; str txt; sip_msg_t *bmsg; if(_sr_L_env.LL==NULL) { LM_ERR("lua loading state not initialized (call: %s)\n", func); return -1; } if(_app_lua_sr_reload!=0) { /* check the script version loaded */ if(!sr_lua_reload_script()) { LM_ERR("lua reload failed\n"); return -1; } } else LM_DBG("reload deactivated\n"); LM_DBG("executing Lua function: [[%s]]\n", func); LM_DBG("lua top index is: %d\n", lua_gettop(_sr_L_env.LL)); lua_getglobal(_sr_L_env.LL, func); if(!lua_isfunction(_sr_L_env.LL, -1)) { if(emode) { LM_ERR("no such function [%s] in lua scripts\n", func); LM_ERR("top stack type [%d - %s]\n", lua_type(_sr_L_env.LL, -1), lua_typename(_sr_L_env.LL,lua_type(_sr_L_env.LL, -1))); txt.s = (char*)lua_tostring(_sr_L_env.LL, -1); LM_ERR("error from Lua: %s\n", (txt.s)?txt.s:"unknown"); return -1; } else { return 1; } } n = 0; if(p1!=NULL) { lua_pushstring(_sr_L_env.LL, p1); n++; if(p2!=NULL) { lua_pushstring(_sr_L_env.LL, p2); n++; if(p3!=NULL) { lua_pushstring(_sr_L_env.LL, p3); n++; } } } bmsg = _sr_L_env.msg; _sr_L_env.msg = msg; ret = lua_pcall(_sr_L_env.LL, n, 0, 0); _sr_L_env.msg = bmsg; if(ret!=0) { txt.s = (char*)lua_tostring(_sr_L_env.LL, -1); n = 0; if(txt.s!=NULL) { for(n=0; txt.s[n]!='\0' && _sr_kemi_lua_exit_string.s[n]!='\0'; n++) { if(txt.s[n] != _sr_kemi_lua_exit_string.s[n]) break; } if(txt.s[n]!='\0' || _sr_kemi_lua_exit_string.s[n]!='\0') { LM_ERR("error from Lua: %s\n", txt.s); n = 0; } else { LM_DBG("ksr error call from Lua: %s\n", txt.s); n = 1; } } else { LM_ERR("error from Lua: unknown\n"); } lua_pop(_sr_L_env.LL, 1); if(n==1) { return 1; } else { LM_ERR("error executing: %s (err: %d)\n", func, ret); return -1; } } return 1; }
int app_lua_run(struct sip_msg *msg, char *func, char *p1, char *p2, char *p3) { int n; int ret; char *txt; if(_sr_L_env.LL==NULL) { LM_ERR("lua loading state not initialized (call: %s)\n", func); return -1; } if(_app_lua_sr_reload!=0) { /* check the script version loaded */ if(!sr_lua_reload_script()) { LM_ERR("lua reload failed\n"); return -1; } } else LM_DBG("reload deactivated\n"); LM_DBG("executing Lua function: [[%s]]\n", func); LM_DBG("lua top index is: %d\n", lua_gettop(_sr_L_env.LL)); lua_getglobal(_sr_L_env.LL, func); if(!lua_isfunction(_sr_L_env.LL, -1)) { LM_ERR("no such function [%s] in lua scripts\n", func); LM_ERR("top stack type [%d - %s]\n", lua_type(_sr_L_env.LL, -1), lua_typename(_sr_L_env.LL,lua_type(_sr_L_env.LL, -1))); txt = (char*)lua_tostring(_sr_L_env.LL, -1); LM_ERR("error from Lua: %s\n", (txt)?txt:"unknown"); return -1; } n = 0; if(p1!=NULL) { lua_pushstring(_sr_L_env.LL, p1); n++; if(p2!=NULL) { lua_pushstring(_sr_L_env.LL, p2); n++; if(p3!=NULL) { lua_pushstring(_sr_L_env.LL, p3); n++; } } } _sr_L_env.msg = msg; ret = lua_pcall(_sr_L_env.LL, n, 0, 0); _sr_L_env.msg = 0; if(ret!=0) { LM_ERR("error executing: %s (err: %d)\n", func, ret); txt = (char*)lua_tostring(_sr_L_env.LL, -1); LM_ERR("error from Lua: %s\n", (txt)?txt:"unknown"); lua_pop(_sr_L_env.LL, 1); return -1; } return 1; }