Module: sip-router Branch: carstenbock/ims Commit: f440ef1a0debf9637d942922478aed478ac71d26 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f440ef1a...
Author: Carsten Bock carsten@bock.info Committer: Carsten Bock carsten@bock.info Date: Wed Mar 9 15:13:51 2011 +0100
- New function: is_registered("domain", "uri")
---
modules_k/registrar/doc/registrar_admin.xml | 41 ++++++++++++++++++++++++++- modules_k/registrar/lookup.c | 37 +++++++++++++++++++++++- modules_k/registrar/lookup.h | 5 +++ modules_k/registrar/reg_mod.c | 11 +++++-- modules_k/registrar/reg_mod.h | 11 +++++++ 5 files changed, 99 insertions(+), 6 deletions(-)
diff --git a/modules_k/registrar/doc/registrar_admin.xml b/modules_k/registrar/doc/registrar_admin.xml index ec553ed..091e36a 100644 --- a/modules_k/registrar/doc/registrar_admin.xml +++ b/modules_k/registrar/doc/registrar_admin.xml @@ -812,7 +812,7 @@ switch ($retcode) { <para> The function returns true if the AOR in the Request-URI is registered, false otherwise. The function does not modify the - message being process, it neither rewrites the Request-URI if a + message being processed, it neither rewrites the Request-URI if a contact is found not append branches. </para> <para>Meaning of the parameters is as follows:</para> @@ -842,6 +842,45 @@ if (registered("location")) {
<section> <title> + <function moreinfo="none">registered(domain, uri)</function> + </title> + <para> + The function returns true if the provided URI is + registered, false otherwise. + The function does not modify the + message being processed, it neither rewrites the Request-URI if a + contact is found not append branches. + </para> + <para>Meaning of the parameters is as follows:</para> + <itemizedlist> + <listitem> + <para> + <emphasis>domain</emphasis> - Name of table that should be + used for the lookup. + </para> + <para> + <emphasis>uri</emphasis> - URI used for lookup + </para> + </listitem> + </itemizedlist> + <para> + This function can be used from REQUEST_ROUTE, FAILURE_ROUTE. + </para> + <example> + <title><function>registered</function> usage</title> + <programlisting format="linespecific"> +... +if (!registered("location", "$fu")) { + sl_send_reply("407", "You must register first"); + ... +}; +... +</programlisting> + </example> + </section> + + <section> + <title> <function moreinfo="none">add_sock_hdr(hdr_name)</function> </title> <para> diff --git a/modules_k/registrar/lookup.c b/modules_k/registrar/lookup.c index cfab8d6..4f18944 100644 --- a/modules_k/registrar/lookup.c +++ b/modules_k/registrar/lookup.c @@ -47,6 +47,8 @@ #include "lookup.h" #include "config.h"
+#include "../../mod_fix.h" + #define allowed_method(_msg, _c) \ ( !method_filtering || ((_msg)->REQ_METHOD)&((_c)->methods) )
@@ -181,7 +183,7 @@ done: * it is similar to lookup but registered neither rewrites * the Request-URI nor appends branches */ -int registered(struct sip_msg* _m, char* _t, char* _s) +int r_registered(struct sip_msg* _m, char* _t, str * _uri) { str uri, aor; urecord_t* r; @@ -189,7 +191,8 @@ int registered(struct sip_msg* _m, char* _t, char* _s) int res; int_str match_callid=(int_str)0;
- if (_m->new_uri.s) uri = _m->new_uri; + if (_uri) uri = *_uri; + else if (_m->new_uri.s) uri = _m->new_uri; else uri = _m->first_line.u.request.uri; if (extract_aor(&uri, &aor) < 0) { @@ -235,3 +238,33 @@ int registered(struct sip_msg* _m, char* _t, char* _s) LM_DBG("'%.*s' not found in usrloc\n", aor.len, ZSW(aor.s)); return -1; } + +/*! \brief the is_registered() function + * Return true if the AOR in the Request-URI is registered, + * it is similar to lookup but registered neither rewrites + * the Request-URI nor appends branches + */ +int registered(struct sip_msg* _m, char* _t, char* _s) +{ + return r_registered(_m, _t, 0); +} + +/*! \brief the is_registered() function + * Return true if the AOR in the second Parameter ist registered. + */ +int registered2(struct sip_msg* _m, char* _t, char* _uri) +{ + str uri; + if(fixup_get_svalue(_m, (gparam_p)_uri, &uri)!=0) + { + LM_ERR("unable to get URI\n"); + return -1; + } + if(uri.s==NULL || uri.len == 0) + { + LM_ERR("invalid URI parameter\n"); + return -1; + } + return r_registered(_m, _t, &uri); +} + diff --git a/modules_k/registrar/lookup.h b/modules_k/registrar/lookup.h index 2cafbbf..2afdfa7 100644 --- a/modules_k/registrar/lookup.h +++ b/modules_k/registrar/lookup.h @@ -49,5 +49,10 @@ int lookup(struct sip_msg* _m, udomain_t* _d); */ int registered(struct sip_msg* _m, char* _t, char* _s);
+/*! \brief the is_registered() function + * Return true if the AOR in the second Parameter ist registered. + */ +int registered2(struct sip_msg* _m, char* _t, char* _uri); +
#endif /* LOOKUP_H */ diff --git a/modules_k/registrar/reg_mod.c b/modules_k/registrar/reg_mod.c index db8e43f..f84a8f7 100644 --- a/modules_k/registrar/reg_mod.c +++ b/modules_k/registrar/reg_mod.c @@ -93,11 +93,13 @@ static int w_lookup(struct sip_msg* _m, char* _d, char* _p2); /*! \brief Fixup functions */ static int domain_fixup(void** param, int param_no); static int save_fixup(void** param, int param_no); -static int unreg_fixup(void** param, int param_no); +static int reg_fixup(void** param, int param_no); static int fetchc_fixup(void** param, int param_no); /*! \brief Functions */ static int add_sock_hdr(struct sip_msg* msg, char *str, char *foo);
+static int reg_avp_param(modparam_t type, void* val); + int tcp_persistent_flag = -1; /*!< if the TCP connection should be kept open */ int method_filtering = 0; /*!< if the looked up contacts should be filtered based on supported methods */ int path_enabled = 0; /*!< if the Path HF should be handled */ @@ -162,9 +164,11 @@ static cmd_export_t cmds[] = { REQUEST_ROUTE | FAILURE_ROUTE }, {"registered", (cmd_function)registered, 1, domain_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE }, + {"registered", (cmd_function)registered2, 2, reg_fixup, 0, + REQUEST_ROUTE | FAILURE_ROUTE }, {"add_sock_hdr", (cmd_function)add_sock_hdr, 1,fixup_str_null, 0, REQUEST_ROUTE }, - {"unregister", (cmd_function)unregister, 2, unreg_fixup, 0, + {"unregister", (cmd_function)unregister, 2, reg_fixup, 0, REQUEST_ROUTE| FAILURE_ROUTE }, {"reg_fetch_contacts", (cmd_function)pv_fetch_contacts, 3, fetchc_fixup, 0, @@ -203,6 +207,7 @@ static param_export_t params[] = { {"use_path", INT_PARAM, &path_enabled }, {"path_mode", INT_PARAM, &path_mode }, {"path_use_received", INT_PARAM, &path_use_params }, + {"reg_avp", STR_PARAM|USE_FUNC_PARAM, (void*)reg_avp_param}, {0, 0, 0} };
@@ -427,7 +432,7 @@ static int domain_fixup(void** param, int param_no) * Convert char* parameter to udomain_t* pointer * Convert char* parameter to pv_elem_t* pointer */ -static int unreg_fixup(void** param, int param_no) +static int reg_fixup(void** param, int param_no) { if (param_no == 1) { return domain_fixup(param, 1); diff --git a/modules_k/registrar/reg_mod.h b/modules_k/registrar/reg_mod.h index 7355f8b..2ac81c4 100644 --- a/modules_k/registrar/reg_mod.h +++ b/modules_k/registrar/reg_mod.h @@ -98,4 +98,15 @@ extern stat_var *rejected_registrations; extern stat_var *default_expire_stat; extern stat_var *max_expires_stat;
+int_str billing_cust_limit_2_avp_name; +unsigned short billing_cust_limit_2_avp_type; + +/*! \brief Structure to handle the AVPs to be stored to a contact */ +struct reg_avp { + int_str avp_name; + unsigned short type; + struct reg_avp* next; +}; +struct reg_avp * reg_avp_list; + #endif /* REG_MOD_H */