Module: sip-router Branch: master Commit: fcbe9878c6f09adc000edaffb0f292b555eb6b48 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=fcbe9878...
Author: pd peter.dunkley@crocodile-rcs.com Committer: pd peter.dunkley@crocodile-rcs.com Date: Sun Nov 20 22:05:14 2011 +0000
modules/app_lua, modules_k/siputils, modules_k/uac: Added siputils.is_uri_user_e164 and uac.replace_from to app_lua
---
modules/app_lua/app_lua_exp.c | 118 +++++++++++++++++++++++++++++++++++++++++ modules_k/siputils/checks.c | 22 +++++--- modules_k/siputils/checks.h | 3 +- modules_k/siputils/siputils.c | 4 +- modules_k/siputils/siputils.h | 2 + modules_k/uac/api.h | 25 +++++++++ modules_k/uac/uac.c | 16 +++++- 7 files changed, 180 insertions(+), 10 deletions(-)
diff --git a/modules/app_lua/app_lua_exp.c b/modules/app_lua/app_lua_exp.c index 93db02b..3b15fb7 100644 --- a/modules/app_lua/app_lua_exp.c +++ b/modules/app_lua/app_lua_exp.c @@ -50,6 +50,7 @@ #include "../../modules_k/rls/api.h" #include "../../modules_k/alias_db/api.h" #include "../../modules_k/msilo/api.h" +#include "../../modules_k/uac/api.h"
#include "app_lua_api.h"
@@ -72,6 +73,7 @@ #define SR_LUA_EXP_MOD_RLS (1<<16) #define SR_LUA_EXP_MOD_ALIAS_DB (1<<17) #define SR_LUA_EXP_MOD_MSILO (1<<18) +#define SR_LUA_EXP_MOD_UAC (1<<19)
/** * @@ -175,6 +177,11 @@ static alias_db_api_t _lua_alias_dbb; static msilo_api_t _lua_msilob;
/** + * uac + */ +static uac_api_t _lua_uacb; + +/** * */ static int lua_sr_sl_send_reply (lua_State *L) @@ -1837,8 +1844,48 @@ static int lua_sr_siputils_has_totag(lua_State *L) /** * */ +static int lua_sr_siputils_is_uri_user_e164(lua_State *L) +{ + int ret; + sr_lua_env_t *env_L; + str param[1]; + + env_L = sr_lua_env_get(); + + if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SIPUTILS)) + { + LM_WARN("weird: siputils function executed but module not registered\n"); + return app_lua_return_error(L); + } + + if(env_L->msg==NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_error(L); + } + + if(lua_gettop(L)!=1) + { + LM_ERR("incorrect number of arguments\n"); + return app_lua_return_error(L); + } + + param[0].s = (char *) lua_tostring(L, -1); + param[0].len = strlen(param[0].s); + + ret = _lua_siputilsb.is_uri_user_e164(env_L->msg, ¶m[0]); + if (ret < 0) + return app_lua_return_false(L); + + return app_lua_return_true(L); +} + +/** + * + */ static const luaL_reg _sr_siputils_Map [] = { {"has_totag", lua_sr_siputils_has_totag}, + {"is_uri_user_e164", lua_sr_siputils_is_uri_user_e164}, {NULL, NULL} };
@@ -2063,6 +2110,62 @@ static const luaL_reg _sr_msilo_Map [] = { /** * */ +static int lua_sr_uac_replace_from(lua_State *L) +{ + int ret; + sr_lua_env_t *env_L; + str param[2]; + + env_L = sr_lua_env_get(); + + if (!(_sr_lua_exp_reg_mods & SR_LUA_EXP_MOD_UAC)) + { + LM_WARN("weird:uac function executed but module not registered\n"); + return app_lua_return_error(L); + } + + if (env_L->msg == NULL) + { + LM_WARN("invalid parameters from Lua env\n"); + return app_lua_return_error(L); + } + + if (lua_gettop(L) == 1) + { + param[0].s = ""; + param[0].len = 0; + param[1].s = (char *) lua_tostring(L, -1); + param[1].len = strlen(param[1].s); + + } + else if (lua_gettop(L) == 2) + { + param[0].s = (char *) lua_tostring(L, -2); + param[0].len = strlen(param[0].s); + param[1].s = (char *) lua_tostring(L, -1); + param[1].len = strlen(param[1].s); + } + else + { + LM_ERR("incorrect number of arguments\n"); + return app_lua_return_error(L); + } + + ret = _lua_uacb.replace_from(env_L->msg, ¶m[0], ¶m[1]); + return app_lua_return_int(L, ret); +} + +/** + * + */ +static const luaL_reg _sr_uac_Map [] = { + {"replace_from",lua_sr_uac_replace_from}, + {NULL, NULL} +}; + +/** + * + */ int lua_sr_exp_init_mod(void) { if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SL) @@ -2261,6 +2364,16 @@ int lua_sr_exp_init_mod(void) } LM_DBG("loaded msilo api\n"); } + if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_UAC) + { + /* bind the UAC API */ + if (load_uac_api(&_lua_uacb) < 0) + { + LM_ERR("cannot bind to UAC API\n"); + return -1; + } + LM_DBG("loaded uac api\n"); + } return 0; }
@@ -2331,6 +2444,9 @@ int lua_sr_exp_register_mod(char *mname) } else if(len==5 && strcmp(mname, "msilo")==0) { _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_MSILO; return 0; + } else if(len==3 && strcmp(mname, "uac")==0) { + _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_UAC; + return 0; }
return -1; @@ -2379,5 +2495,7 @@ void lua_sr_exp_openlibs(lua_State *L) luaL_openlib(L, "sr.alias_db", _sr_alias_db_Map, 0); if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_MSILO) luaL_openlib(L, "sr.msilo", _sr_msilo_Map, 0); + if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_UAC) + luaL_openlib(L, "sr.uac", _sr_uac_Map, 0); }
diff --git a/modules_k/siputils/checks.c b/modules_k/siputils/checks.c index 6ccac04..52db0ae 100644 --- a/modules_k/siputils/checks.c +++ b/modules_k/siputils/checks.c @@ -467,11 +467,10 @@ int is_e164(struct sip_msg* _m, char* _sp, char* _s2) /* * Check if user part of URI in pseudo variable is an e164 number */ -int is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2) +int w_is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2) { pv_spec_t *sp; pv_value_t pv_val; - struct sip_uri puri;
sp = (pv_spec_t *)_sp;
@@ -481,11 +480,7 @@ int is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2) LM_DBG("missing uri\n"); return -1; } - if (parse_uri(pv_val.rs.s, pv_val.rs.len, &puri) < 0) { - LM_ERR("parsing URI failed\n"); - return -1; - } - return e164_check(&(puri.user)); + return is_uri_user_e164(_m, &pv_val.rs); } else { LM_ERR("pseudo variable value is not string\n"); return -1; @@ -496,6 +491,19 @@ int is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2) } }
+ +int is_uri_user_e164(struct sip_msg *msg, str *uri) +{ + struct sip_uri puri; + + if (parse_uri(uri->s, uri->len, &puri) < 0) { + LM_ERR("parsing URI failed\n"); + return -1; + } + + return e164_check(&(puri.user)); +} + /* * Set userpart of URI */ diff --git a/modules_k/siputils/checks.h b/modules_k/siputils/checks.h index 706e54b..07a71a2 100644 --- a/modules_k/siputils/checks.h +++ b/modules_k/siputils/checks.h @@ -84,7 +84,8 @@ int tel2sip(struct sip_msg* _msg, char* _uri, char* _hostpart, char* _res); /* * Check if user part of URI in pseudo variable is an e164 number */ -int is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2); +int w_is_uri_user_e164(struct sip_msg* _m, char* _sp, char* _s2); +int is_uri_user_e164(struct sip_msg* msg, str *uri);
/* * Check if pseudo variable argument value is an e164 number diff --git a/modules_k/siputils/siputils.c b/modules_k/siputils/siputils.c index 9970f45..b5c9806 100644 --- a/modules_k/siputils/siputils.c +++ b/modules_k/siputils/siputils.c @@ -132,7 +132,7 @@ static cmd_export_t cmds[]={ REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE|ONREPLY_ROUTE}, {"is_e164", (cmd_function)is_e164, 1, fixup_pvar_null, fixup_free_pvar_null, REQUEST_ROUTE|FAILURE_ROUTE|LOCAL_ROUTE}, - {"is_uri_user_e164", (cmd_function)is_uri_user_e164, 1, fixup_pvar_null, + {"is_uri_user_e164", (cmd_function)w_is_uri_user_e164, 1, fixup_pvar_null, fixup_free_pvar_null, REQUEST_ROUTE|FAILURE_ROUTE|LOCAL_ROUTE}, {"encode_contact", (cmd_function)encode_contact, 2, 0, 0, REQUEST_ROUTE|ONREPLY_ROUTE}, @@ -263,6 +263,8 @@ int bind_siputils(siputils_api_t* api) }
get_rpid_avp( &api->rpid_avp, &api->rpid_avp_type ); + api->has_totag = has_totag; + api->is_uri_user_e164 = is_uri_user_e164;
return 0; } diff --git a/modules_k/siputils/siputils.h b/modules_k/siputils/siputils.h index b640a25..a4fc655 100644 --- a/modules_k/siputils/siputils.h +++ b/modules_k/siputils/siputils.h @@ -25,12 +25,14 @@ #define _SIPUTILS_H_
typedef int (*siputils_has_totag_t)(struct sip_msg*, char*, char*); +typedef int (*siputils_is_uri_user_e164_t)(struct sip_msg*, str*);
/*! Siputils module API */ typedef struct siputils_api { int_str rpid_avp; /*!< Name of AVP containing Remote-Party-ID */ int rpid_avp_type; /*!< type of the RPID AVP */ siputils_has_totag_t has_totag; + siputils_is_uri_user_e164_t is_uri_user_e164; } siputils_api_t;
typedef int (*bind_siputils_t)(siputils_api_t* api); diff --git a/modules_k/uac/api.h b/modules_k/uac/api.h new file mode 100644 index 0000000..64c4b37 --- /dev/null +++ b/modules_k/uac/api.h @@ -0,0 +1,25 @@ +#ifndef UAC_API_H_ +#define UAC_API_H_ +#include "../../sr_module.h" + + +typedef int (*uac_replace_from_t)(struct sip_msg *, str *, str *); + +typedef struct uac_binds { + uac_replace_from_t replace_from; +} uac_api_t; + +typedef int (*bind_uac_f)(uac_api_t*); + +int bind_uac(uac_api_t*); + +inline static int load_uac_api(uac_api_t *uacb){ + bind_uac_f bind_uac_exports; + if(!(bind_uac_exports=(bind_uac_f)find_export("bind_uac",1,0))){ + LM_ERR("Failed to import bind_iuax\n"); + return -1; + } + return bind_uac_exports(uacb); +} + +#endif /* UAC_API_H_ */ diff --git a/modules_k/uac/uac.c b/modules_k/uac/uac.c index 95abd10..5f6112a 100644 --- a/modules_k/uac/uac.c +++ b/modules_k/uac/uac.c @@ -57,6 +57,7 @@ #include "auth.h" #include "uac_send.h" #include "uac_reg.h" +#include "api.h"
MODULE_VERSION @@ -115,7 +116,8 @@ static cmd_export_t cmds[]={ fixup_free_pvar_pvar, ANY_ROUTE }, {"uac_reg_request_to", (cmd_function)w_uac_reg_request_to, 2, fixup_pvar_uint, fixup_free_pvar_uint, REQUEST_ROUTE | FAILURE_ROUTE | BRANCH_ROUTE }, - + {"bind_uac", (cmd_function)bind_uac, 1, 0, 0, + 0}, {0,0,0,0,0,0} };
@@ -496,3 +498,15 @@ static int w_uac_reg_request_to(struct sip_msg* msg, char* src, char* mode_s) return uac_reg_request_to(msg, &val.rs, mode); }
+ +int bind_uac(struct uac_binds *uacb) +{ + if (uacb == NULL) + { + LM_WARN("bind_uac: Cannot load uac API into a NULL pointer\n"); + return -1; + } + + uacb->replace_from = replace_from; + return 0; +}