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_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_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_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_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); }
int sr_kemi_exec_func(lua_State* L, str *mname, int midx, str *fname) { int pdelta; sr_kemi_t *ket = NULL; sr_lua_env_t *env_L; env_L = sr_lua_env_get(); if(env_L==NULL || env_L->msg==NULL) { LM_ERR("invalid Lua environment attributes\n"); return app_lua_return_false(L); } ket = sr_kemi_lookup(mname, midx, fname); if(ket==NULL) { LM_ERR("cannot find function (%d): %.*s.%.*s\n", midx, (mname && mname->len>0)?mname->len:0, (mname && mname->len>0)?mname->s:"", fname->len, fname->s); return app_lua_return_false(L); } if(mname->len<=0) { pdelta = 1; } else { pdelta = 3; } return sr_kemi_lua_exec_func_ex(L, ket, pdelta); }
int sr_kemi_return(lua_State* L, sr_kemi_t *ket, int rc) { if(ket->rtype==SR_KEMIP_INT) { lua_pushinteger(L, rc); return 1; } if(ket->rtype==SR_KEMIP_BOOL && rc!=SR_KEMI_FALSE) { return app_lua_return_true(L); } return app_lua_return_false(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); }
int sr_kemi_KSR_C(lua_State* L) { str mname = str_init(""); str fname; fname.s = (char*)lua_tostring(L, 1); if(fname.s==NULL) { LM_ERR("null function name"); return app_lua_return_false(L); } fname.len = strlen(fname.s); LM_DBG("function execution of: %s\n", fname.s); return sr_kemi_exec_func(L, &mname, 0, &fname); }
int sr_kemi_KSR_MOD_C(lua_State* L) { str mname; int midx; str fname; mname.s = (char*)lua_tostring(L, 1); midx = lua_tointeger(L, 2); fname.s = (char*)lua_tostring(L, 3); if(mname.s==NULL || fname.s==NULL) { LM_ERR("null params: %p %p\n", mname.s, fname.s); return app_lua_return_false(L); } mname.len = strlen(mname.s); fname.len = strlen(fname.s); LM_DBG("module function execution of: %s.%s (%d)\n", mname.s, fname.s, midx); return sr_kemi_exec_func(L, &mname, midx, &fname); }
int sr_kemi_exec_func(lua_State* L, str *mname, int midx, str *fname) { int i; int pdelta; int argc; int ret; sr_kemi_t *ket = NULL; sr_kemi_val_t vps[SR_KEMI_PARAMS_MAX]; sr_lua_env_t *env_L; env_L = sr_lua_env_get(); if(env_L==NULL || env_L->msg==NULL) { LM_ERR("invalid Lua environment attributes\n"); return app_lua_return_false(L); } ket = sr_kemi_lookup(mname, midx, fname); if(ket==NULL) { return app_lua_return_false(L); } if(mname->len<=0) { pdelta = 1; } else { pdelta = 3; } argc = lua_gettop(L); if(argc==pdelta && ket->ptypes[0]==SR_KEMIP_NONE) { ret = ((sr_kemi_fm_f)(ket->func))(env_L->msg); return sr_kemi_return(L, ket, ret); } if(argc==pdelta && ket->ptypes[0]!=SR_KEMIP_NONE) { LM_ERR("invalid number of parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } if(argc>=SR_KEMI_PARAMS_MAX+pdelta) { LM_ERR("too many parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } memset(vps, 0, SR_KEMI_PARAMS_MAX*sizeof(sr_kemi_val_t)); for(i=0; i<SR_KEMI_PARAMS_MAX; i++) { if(ket->ptypes[i]==SR_KEMIP_NONE) { break; } else if(ket->ptypes[i]==SR_KEMIP_STR) { vps[i].s.s = (char*)lua_tostring(L, i+pdelta+1); vps[i].s.len = strlen(vps[i].s.s); LM_DBG("param[%d] for: %.*s is str: %.*s\n", i, fname->len, fname->s, vps[i].s.len, vps[i].s.s); } else if(ket->ptypes[i]==SR_KEMIP_INT) { vps[i].n = lua_tointeger(L, i+pdelta+1); LM_DBG("param[%d] for: %.*s is int: %d\n", i, fname->len, fname->s, vps[i].n); } else { LM_ERR("unknown parameter type %d (%d)\n", ket->ptypes[i], i); return app_lua_return_false(L); } } switch(i) { case 1: if(ket->ptypes[0]==SR_KEMIP_INT) { ret = ((sr_kemi_fmn_f)(ket->func))(env_L->msg, vps[0].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[0]==SR_KEMIP_STR) { ret = ((sr_kemi_fms_f)(ket->func))(env_L->msg, &vps[0].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 2: if(ket->ptypes[0]==SR_KEMIP_INT) { if(ket->ptypes[1]==SR_KEMIP_INT) { ret = ((sr_kemi_fmnn_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[1]==SR_KEMIP_STR) { ret = ((sr_kemi_fmns_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[0]==SR_KEMIP_STR) { if(ket->ptypes[1]==SR_KEMIP_INT) { ret = ((sr_kemi_fmsn_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[1]==SR_KEMIP_STR) { ret = ((sr_kemi_fmss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 3: if(ket->ptypes[0]==SR_KEMIP_INT) { if(ket->ptypes[1]==SR_KEMIP_INT) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmnnn_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmnns_f)(ket->func))(env_L->msg, vps[0].n, vps[1].n, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[1]==SR_KEMIP_STR) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmnsn_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmnss_f)(ket->func))(env_L->msg, vps[0].n, &vps[1].s, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[0]==SR_KEMIP_STR) { if(ket->ptypes[1]==SR_KEMIP_INT) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmsnn_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmsns_f)(ket->func))(env_L->msg, &vps[0].s, vps[1].n, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else if(ket->ptypes[1]==SR_KEMIP_STR) { if(ket->ptypes[2]==SR_KEMIP_INT) { ret = ((sr_kemi_fmssn_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, vps[2].n); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[2]==SR_KEMIP_STR) { ret = ((sr_kemi_fmsss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 4: if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_STR || ket->ptypes[3]==SR_KEMIP_STR) { ret = ((sr_kemi_fmssss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s); return sr_kemi_return(L, ket, ret); } else if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_INT || ket->ptypes[3]==SR_KEMIP_INT) { ret = ((sr_kemi_fmssnn_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, vps[2].n, vps[3].n); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 5: if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_STR || ket->ptypes[3]==SR_KEMIP_STR || ket->ptypes[4]==SR_KEMIP_STR) { ret = ((sr_kemi_fmsssss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s, &vps[4].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; case 6: if(ket->ptypes[0]==SR_KEMIP_STR || ket->ptypes[1]==SR_KEMIP_STR || ket->ptypes[2]==SR_KEMIP_STR || ket->ptypes[3]==SR_KEMIP_STR || ket->ptypes[4]==SR_KEMIP_STR || ket->ptypes[5]==SR_KEMIP_STR) { ret = ((sr_kemi_fmssssss_f)(ket->func))(env_L->msg, &vps[0].s, &vps[1].s, &vps[2].s, &vps[3].s, &vps[4].s, &vps[5].s); return sr_kemi_return(L, ket, ret); } else { LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } break; default: LM_ERR("invalid parameters for: %.*s\n", fname->len, fname->s); return app_lua_return_false(L); } return app_lua_return_false(L); }