Module: sip-router Branch: master Commit: 0026a3b553ab3c8ac539cbfcd8fd99fc6f1cb799 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0026a3b5...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Wed Nov 17 11:47:03 2010 +0100
app_lua: added several core functions to sr package
---
modules/app_lua/app_lua_sr.c | 425 +++++++++++++++++++++++++++++++++++++++++- 1 files changed, 420 insertions(+), 5 deletions(-)
diff --git a/modules/app_lua/app_lua_sr.c b/modules/app_lua/app_lua_sr.c index 51da16b..7a8575a 100644 --- a/modules/app_lua/app_lua_sr.c +++ b/modules/app_lua/app_lua_sr.c @@ -34,6 +34,10 @@ #include "../../mem/mem.h" #include "../../data_lump.h" #include "../../data_lump_rpl.h" +#include "../../forward.h" +#include "../../flags.h" +#include "../../dset.h" +#include "../../parser/parse_uri.h" #include "../../lib/kcore/cmpapi.h"
#include "app_lua_api.h" @@ -274,12 +278,423 @@ error: /** * */ +static int lua_sr_is_myself (lua_State *L) +{ + str uri; + struct sip_uri puri; + int ret; + + uri.s = (char*)lua_tostring(L, -1); + if(uri.s==NULL) + { + LM_ERR("invalid uri parameter\n"); + return app_lua_return_false(L); + } + uri.len = strlen(uri.s); + if(uri.len>4 && (strncmp(uri.s, "sip:", 4)==0 + || strncmp(uri.s, "sips:", 5)==0)) + { + if(parse_uri(uri.s, uri.len, &puri)!=0) + { + LM_ERR("failed to parse uri [%s]\n", uri.s); + return app_lua_return_false(L); + } + ret = check_self(&puri.host, (puri.port.s)?puri.port_no:0, + (puri.transport_val.s)?puri.proto:0); + } else { + ret = check_self(&uri, 0, 0); + } + if(ret==1) + return app_lua_return_true(L); + return app_lua_return_false(L); +} + +/** + * + */ +static int lua_sr_setflag (lua_State *L) +{ + int flag; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + flag = lua_tointeger(L, -1); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (!flag_in_range(flag)) + { + LM_ERR("invalid flag parameter %d\n", flag); + return app_lua_return_false(L); + } + + setflag(env_L->msg, flag); + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_resetflag (lua_State *L) +{ + int flag; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + flag = lua_tointeger(L, -1); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (!flag_in_range(flag)) + { + LM_ERR("invalid flag parameter %d\n", flag); + return app_lua_return_false(L); + } + + resetflag(env_L->msg, flag); + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_isflagset (lua_State *L) +{ + int flag; + int ret; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + flag = lua_tointeger(L, -1); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (!flag_in_range(flag)) + { + LM_ERR("invalid flag parameter %d\n", flag); + return app_lua_return_false(L); + } + + ret = isflagset(env_L->msg, flag); + if(ret>0) + return app_lua_return_true(L); + return app_lua_return_false(L); +} + +/** + * + */ +static int lua_sr_setbflag (lua_State *L) +{ + int flag; + int branch; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + if(lua_gettop(L)==1) + { + flag = lua_tointeger(L, -1); + branch = 0; + } else if(lua_gettop(L)==2) { + flag = lua_tointeger(L, -2); + branch = lua_tointeger(L, -1); + } else { + LM_WARN("invalid number of parameters from Lua\n"); + return app_lua_return_false(L); + } + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (!flag_in_range(flag)) + { + LM_ERR("invalid flag parameter %d\n", flag); + return app_lua_return_false(L); + } + + setbflag(branch, flag); + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_resetbflag (lua_State *L) +{ + int flag; + int branch; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + if(lua_gettop(L)==1) + { + flag = lua_tointeger(L, -1); + branch = 0; + } else if(lua_gettop(L)==2) { + flag = lua_tointeger(L, -2); + branch = lua_tointeger(L, -1); + } else { + LM_WARN("invalid number of parameters from Lua\n"); + return app_lua_return_false(L); + } + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (!flag_in_range(flag)) + { + LM_ERR("invalid flag parameter %d\n", flag); + return app_lua_return_false(L); + } + + resetbflag(branch, flag); + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_isbflagset (lua_State *L) +{ + int flag; + int branch; + int ret; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + if(lua_gettop(L)==1) + { + flag = lua_tointeger(L, -1); + branch = 0; + } else if(lua_gettop(L)==2) { + flag = lua_tointeger(L, -2); + branch = lua_tointeger(L, -1); + } else { + LM_WARN("invalid number of parameters from Lua\n"); + return app_lua_return_false(L); + } + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (!flag_in_range(flag)) + { + LM_ERR("invalid flag parameter %d\n", flag); + return app_lua_return_false(L); + } + + ret = isbflagset(branch, flag); + if(ret>0) + return app_lua_return_true(L); + return app_lua_return_false(L); +} + +/** + * + */ +static int lua_sr_seturi (lua_State *L) +{ + struct action act; + struct run_act_ctx h; + str uri; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + uri.s = (char*)lua_tostring(L, -1); + if(uri.s==NULL) + { + LM_ERR("invalid uri parameter\n"); + return app_lua_return_false(L); + } + uri.len = strlen(uri.s); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + memset(&act, 0, sizeof(act)); + act.val[0].type = STRING_ST; + act.val[0].u.string = uri.s; + act.type = SET_URI_T; + init_run_actions_ctx(&h); + if (do_action(&h, &act, env_L->msg)<0) + { + LM_ERR("do action failed\n"); + return app_lua_return_false(L); + } + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_setuser (lua_State *L) +{ + struct action act; + struct run_act_ctx h; + str uri; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + uri.s = (char*)lua_tostring(L, -1); + if(uri.s==NULL) + { + LM_ERR("invalid uri parameter\n"); + return app_lua_return_false(L); + } + uri.len = strlen(uri.s); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + memset(&act, 0, sizeof(act)); + act.val[0].type = STRING_ST; + act.val[0].u.string = uri.s; + act.type = SET_USER_T; + init_run_actions_ctx(&h); + if (do_action(&h, &act, env_L->msg)<0) + { + LM_ERR("do action failed\n"); + return app_lua_return_false(L); + } + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_sethost (lua_State *L) +{ + struct action act; + struct run_act_ctx h; + str uri; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + uri.s = (char*)lua_tostring(L, -1); + if(uri.s==NULL) + { + LM_ERR("invalid uri parameter\n"); + return app_lua_return_false(L); + } + uri.len = strlen(uri.s); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + memset(&act, 0, sizeof(act)); + act.val[0].type = STRING_ST; + act.val[0].u.string = uri.s; + act.type = SET_HOST_T; + init_run_actions_ctx(&h); + if (do_action(&h, &act, env_L->msg)<0) + { + LM_ERR("do action failed\n"); + return app_lua_return_false(L); + } + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_setdsturi (lua_State *L) +{ + str uri; + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + uri.s = (char*)lua_tostring(L, -1); + if(uri.s==NULL) + { + LM_ERR("invalid uri parameter\n"); + return app_lua_return_false(L); + } + uri.len = strlen(uri.s); + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + if (set_dst_uri(env_L->msg, &uri)<0) + { + LM_ERR("setting dst uri failed\n"); + return app_lua_return_false(L); + } + return app_lua_return_true(L); +} + +/** + * + */ +static int lua_sr_resetdsturi (lua_State *L) +{ + sr_lua_env_t *env_L; + + env_L = sr_lua_env_get(); + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_false(L); + } + + reset_dst_uri(env_L->msg); + return app_lua_return_true(L); +} + + +/** + * + */ static const luaL_reg _sr_core_Map [] = { - {"probe", lua_sr_probe}, - {"dbg", lua_sr_dbg}, - {"err", lua_sr_err}, - {"log", lua_sr_log}, - {"modf", lua_sr_modf}, + {"probe", lua_sr_probe}, + {"dbg", lua_sr_dbg}, + {"err", lua_sr_err}, + {"log", lua_sr_log}, + {"modf", lua_sr_modf}, + {"is_myself", lua_sr_is_myself}, + {"setflag", lua_sr_setflag}, + {"resetflag", lua_sr_resetflag}, + {"isflagset", lua_sr_isflagset}, + {"setbflag", lua_sr_setbflag}, + {"resetbflag", lua_sr_resetbflag}, + {"isbflagset", lua_sr_isbflagset}, + {"seturi", lua_sr_seturi}, + {"setuser", lua_sr_setuser}, + {"sethost", lua_sr_sethost}, + {"setdsturi", lua_sr_setdsturi}, + {"resetdsturi", lua_sr_resetdsturi}, {NULL, NULL} };