Module: sip-router
Branch: master
Commit: eaed27161e36b0bec9bef2660d2fae80092a2e42
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=eaed271…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Tue Sep 11 21:52:01 2012 +0200
corex: new parameter alias_subdomains
- adds domain and all its subdomains to myself condition, registering a
callback for check self event
---
modules/corex/corex_lib.c | 123 +++++++++++++++++++++++++++++++++++++++++++++
modules/corex/corex_lib.h | 4 ++
modules/corex/corex_mod.c | 22 ++++++++
3 files changed, 149 insertions(+), 0 deletions(-)
diff --git a/modules/corex/corex_lib.c b/modules/corex/corex_lib.c
index d8ad3c5..1f69847 100644
--- a/modules/corex/corex_lib.c
+++ b/modules/corex/corex_lib.c
@@ -26,6 +26,7 @@
#include "../../dprint.h"
#include "../../dset.h"
+#include "../../forward.h"
#include "corex_lib.h"
@@ -88,3 +89,125 @@ int corex_append_branch(sip_msg_t *msg, gparam_t *pu, gparam_t *pq)
return ret;
}
+
+typedef struct corex_alias {
+ str alias;
+ unsigned short port;
+ unsigned short proto;
+ int flags;
+ struct corex_alias* next;
+} corex_alias_t;
+
+static corex_alias_t *_corex_alias_list = NULL;
+
+int corex_add_alias_subdomains(char* aliasval)
+{
+ char *p = NULL;
+ corex_alias_t ta;
+ corex_alias_t *na;
+
+ memset(&ta, 0, sizeof(corex_alias_t));
+
+ p = strchr(aliasval, ':');
+ if(p==NULL) {
+ /* only hostname */
+ ta.alias.s = aliasval;
+ ta.alias.len = strlen(aliasval);
+ goto done;
+ }
+ if((p-aliasval)==3 || (p-aliasval)==4) {
+ /* check if it is protocol */
+ if((p-aliasval)==3 && strncasecmp(aliasval, "udp", 3)==0) {
+ ta.proto = PROTO_UDP;
+ } else if((p-aliasval)==3 && strncasecmp(aliasval, "tcp", 3)==0) {
+ ta.proto = PROTO_TCP;
+ } else if((p-aliasval)==3 && strncasecmp(aliasval, "tls", 3)==0) {
+ ta.proto = PROTO_TLS;
+ } else if((p-aliasval)==4 && strncasecmp(aliasval, "sctp", 4)==0) {
+ ta.proto = PROTO_SCTP;
+ } else {
+ /* use hostname */
+ ta.alias.s = aliasval;
+ ta.alias.len = p - aliasval;
+ }
+ }
+ if(ta.alias.len==0) {
+ p++;
+ if(p>=aliasval+strlen(aliasval))
+ goto error;
+ ta.alias.s = p;
+ p = strchr(ta.alias.s, ':');
+ if(p==NULL) {
+ ta.alias.len = strlen(ta.alias.s);
+ goto done;
+ }
+ }
+ /* port */
+ p++;
+ if(p>=aliasval+strlen(aliasval))
+ goto error;
+ ta.port = str2s(p, strlen(p), NULL);
+
+done:
+ if(ta.alias.len==0)
+ goto error;
+
+ na = (corex_alias_t*)pkg_malloc(sizeof(corex_alias_t));
+ if(na==NULL) {
+ LM_ERR("no memory for adding alias subdomains: %s\n", aliasval);
+ return -1;
+ }
+ memcpy(na, &ta, sizeof(corex_alias_t));
+ na->next = _corex_alias_list;
+ _corex_alias_list = na;
+
+ return 0;
+
+error:
+ LM_ERR("error adding alias subdomains: %s\n", aliasval);
+ return -1;
+}
+
+
+int corex_check_self(str* host, unsigned short port, unsigned short proto)
+{
+ corex_alias_t *ta;
+
+ for(ta=_corex_alias_list; ta; ta=ta->next) {
+ if(host->len<ta->alias.len)
+ continue;
+ if(ta->port!=0 && port!=0 && ta->port!=port)
+ continue;
+ if(ta->proto!=0 && proto!=0 && ta->proto!=proto)
+ continue;
+ if(host->len==ta->alias.len
+ && strncasecmp(host->s, ta->alias.s, host->len)==0) {
+ /* match domain */
+ LM_DBG("check self domain match: %d:%.*s:%d\n", (int)ta->port,
+ ta->alias.len, ta->alias.s, (int)ta->proto);
+ return 1;
+ }
+ if(strncasecmp(ta->alias.s, host->s + host->len - ta->alias.len,
+ ta->alias.len)==0) {
+ if(host->s[host->len - ta->alias.len - 1]=='.') {
+ /* match sub-domain */
+ LM_DBG("check self sub-domain match: %d:%.*s:%d\n", (int)ta->port,
+ ta->alias.len, ta->alias.s, (int)ta->proto);
+ return 1;
+ }
+ }
+ }
+
+ return 0; /* no match */
+}
+
+int corex_register_check_self(void)
+{
+ if(_corex_alias_list==NULL)
+ return 0;
+ if (register_check_self_func(corex_check_self) <0 ) {
+ LM_ERR("failed to register check self function\n");
+ return -1;
+ }
+ return 0;
+}
diff --git a/modules/corex/corex_lib.h b/modules/corex/corex_lib.h
index c997fce..49fa712 100644
--- a/modules/corex/corex_lib.h
+++ b/modules/corex/corex_lib.h
@@ -26,4 +26,8 @@
int corex_append_branch(sip_msg_t *msg, gparam_t *pu, gparam_t *pq);
+int corex_add_alias_subdomains(char* aliasval);
+
+int corex_register_check_self(void);
+
#endif
diff --git a/modules/corex/corex_mod.c b/modules/corex/corex_mod.c
index 4fda1a2..5b4690c 100644
--- a/modules/corex/corex_mod.c
+++ b/modules/corex/corex_mod.c
@@ -35,6 +35,8 @@ MODULE_VERSION
static int w_append_branch(sip_msg_t *msg, char *su, char *sq);
+int corex_alias_subdomains_param(modparam_t type, void *val);
+
static int mod_init(void);
static int child_init(int);
static void mod_destroy(void);
@@ -52,6 +54,8 @@ static cmd_export_t cmds[]={
};
static param_export_t params[]={
+ {"alias_subdomains", STR_PARAM|USE_FUNC_PARAM,
+ (void*)corex_alias_subdomains_param},
{0, 0, 0}
};
@@ -83,6 +87,12 @@ static int mod_init(void)
return -1;
}
+ if(corex_register_check_self()<0)
+ {
+ LM_ERR("failed to register check self callback\n");
+ return -1;
+ }
+
return 0;
}
@@ -113,3 +123,15 @@ static int w_append_branch(sip_msg_t *msg, char *su, char *sq)
return 1;
}
+
+int corex_alias_subdomains_param(modparam_t type, void *val)
+{
+ if(val==NULL)
+ goto error;
+
+ return corex_add_alias_subdomains((char*)val);
+error:
+ return -1;
+
+}
+