Module: sip-router
Branch: master
Commit: 308f2920df586065e0bf8ef02d7c77b1c94a4836
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=308f292…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Mon Sep 30 15:49:10 2013 +0200
registrar: option to take the socket from an xavp
- child named "socket" of xavp named by xavp_cfg parameter
---
modules/registrar/save.c | 55 +++++++++++++++++++++++++++++----------------
1 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/modules/registrar/save.c b/modules/registrar/save.c
index fc4a60a..de6610e 100644
--- a/modules/registrar/save.c
+++ b/modules/registrar/save.c
@@ -134,37 +134,50 @@ static inline int star(sip_msg_t *_m, udomain_t* _d, str* _a, str
*_h)
/*! \brief
*/
-static struct socket_info *get_sock_hdr(struct sip_msg *msg)
+static struct socket_info *get_sock_val(struct sip_msg *msg)
{
struct socket_info *sock;
struct hdr_field *hf;
+ str xsockname = str_init("socket");
+ sr_xavp_t *vavp = NULL;
str socks;
str hosts;
int port;
int proto;
char c;
- if (parse_headers( msg, HDR_EOH_F, 0) == -1) {
- LM_ERR("failed to parse message\n");
- return 0;
- }
+ if(sock_hdr_name.len>0) {
+ if (parse_headers( msg, HDR_EOH_F, 0) == -1) {
+ LM_ERR("failed to parse message\n");
+ return 0;
+ }
- for (hf=msg->headers; hf; hf=hf->next) {
- if (cmp_hdrname_str(&hf->name, &sock_hdr_name)==0)
- break;
- }
+ for (hf=msg->headers; hf; hf=hf->next) {
+ if (cmp_hdrname_str(&hf->name, &sock_hdr_name)==0)
+ break;
+ }
- /* hdr found? */
- if (hf==0)
- return 0;
+ /* hdr found? */
+ if (hf==0)
+ return 0;
- trim_len( socks.len, socks.s, hf->body );
- if (socks.len==0)
- return 0;
+ trim_len( socks.len, socks.s, hf->body );
+ if (socks.len==0)
+ return 0;
- /*FIXME: This is a hack */
- c = socks.s[socks.len];
- socks.s[socks.len] = '\0';
+ /*FIXME: This is a hack */
+ c = socks.s[socks.len];
+ socks.s[socks.len] = '\0';
+ } else {
+ /* xavp */
+ if(reg_xavp_cfg.s!=NULL)
+ {
+ vavp = xavp_get_child_with_sval(®_xavp_cfg, &xsockname);
+ if(vavp==NULL || vavp->val.v.s.len<=0)
+ return 0;
+ }
+ socks = vavp->val.v.s;
+ }
if (parse_phostport( socks.s, &hosts.s, &hosts.len,
&port, &proto)!=0) {
socks.s[socks.len] = c;
@@ -172,7 +185,9 @@ static struct socket_info *get_sock_hdr(struct sip_msg *msg)
socks.len, socks.s);
return 0;
}
- socks.s[socks.len] = c;
+ if(sock_hdr_name.len>0) {
+ socks.s[socks.len] = c;
+ }
sock = grep_sock_info(&hosts,(unsigned short)port,(unsigned short)proto);
if (sock==0) {
LM_ERR("non-local socket <%.*s>\n", socks.len, socks.s);
@@ -256,7 +271,7 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t*
_c, unsig
/* set received socket */
if (_m->flags&sock_flag) {
- ci.sock = get_sock_hdr(_m);
+ ci.sock = get_sock_val(_m);
if (ci.sock==0)
ci.sock = _m->rcv.bind_address;
} else {