[sr-dev] git:master: pv: $snd(id) broken in $sndto(id) and $sndfrom(id)

Daniel-Constantin Mierla miconda at gmail.com
Mon Dec 6 00:07:55 CET 2010


Module: sip-router
Branch: master
Commit: f6e2325aa6770840c25dbb64afd405f73077fc79
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=f6e2325aa6770840c25dbb64afd405f73077fc79

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Mon Dec  6 00:05:46 2010 +0100

pv: $snd(id) broken in $sndto(id) and $sndfrom(id)

- $snd(id) is aliased to $sndto(id)
- $sndto(id) points to next hop address
- $sndfrom(id) points to local socket to be used for sending

---

 modules_k/pv/pv.c        |    8 ++++++--
 modules_k/pv/pv_branch.c |   40 +++++++++++++++++++++++++++++++++++++++-
 modules_k/pv/pv_branch.h |    4 +++-
 3 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/modules_k/pv/pv.c b/modules_k/pv/pv.c
index efeb7ee..3e21fc9 100644
--- a/modules_k/pv/pv.c
+++ b/modules_k/pv/pv.c
@@ -70,8 +70,12 @@ static pv_export_t mod_pvs[] = {
 	{ {"sel", sizeof("sel")-1}, /* select */
 		PVT_OTHER, pv_get_select, 0,
 		pv_parse_select_name, 0, 0, 0 },
-	{{"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_snd, 0,
-		pv_parse_snd_name, 0, 0, 0},
+	{ {"snd", (sizeof("snd")-1)}, PVT_OTHER, pv_get_sndto, 0,
+		pv_parse_snd_name, 0, 0, 0 },
+	{ {"sndto", (sizeof("sndto")-1)}, PVT_OTHER, pv_get_sndto, 0,
+		pv_parse_snd_name, 0, 0, 0 },
+	{ {"sndfrom", (sizeof("sndfrom")-1)}, PVT_OTHER, pv_get_sndfrom, 0,
+		pv_parse_snd_name, 0, 0, 0 },
 #ifdef WITH_XAVP
 	{ {"xavp", sizeof("xavp")-1}, /* xavp */
 		PVT_OTHER, pv_get_xavp, pv_set_xavp,
diff --git a/modules_k/pv/pv_branch.c b/modules_k/pv/pv_branch.c
index 0831bd5..a9dd1bc 100644
--- a/modules_k/pv/pv_branch.c
+++ b/modules_k/pv/pv_branch.c
@@ -328,7 +328,7 @@ error:
 	return -1;
 }
 
-int pv_get_snd(struct sip_msg *msg, pv_param_t *param,
+int pv_get_sndfrom(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res)
 {
 	struct onsend_info* snd_inf;
@@ -365,6 +365,44 @@ int pv_get_snd(struct sip_msg *msg, pv_param_t *param,
 	return 0;
 }
 
+int pv_get_sndto(struct sip_msg *msg, pv_param_t *param,
+		pv_value_t *res)
+{
+	struct onsend_info* snd_inf;
+	str s;
+
+	snd_inf=get_onsend_info();
+	if (! likely(snd_inf && snd_inf->send_sock))
+		return pv_get_null(msg, param, res);
+
+	switch(param->pvn.u.isname.name.n)
+	{
+		case 1: /* af */
+			return pv_get_uintval(msg, param, res,
+					(int)snd_inf->send_sock->address.af);
+		case 2: /* port */
+			return pv_get_uintval(msg, param, res,
+					(int)su_getport(snd_inf->to));
+		case 3: /* proto */
+			return pv_get_uintval(msg, param, res,
+					(int)snd_inf->send_sock->proto);
+		case 4: /* buf */
+			s.s   = snd_inf->buf;
+			s.len = snd_inf->len;
+			return pv_get_strval(msg, param, res, &s);
+		case 5: /* len */
+			return pv_get_uintval(msg, param, res,
+					(int)snd_inf->len);
+		default:
+			/* 0 - ip */
+			s.s   = su2a(snd_inf->to, sizeof(*snd_inf->to));
+			s.len = strlen(s.s);
+			return pv_get_strval(msg, param, res, &s);
+	}
+
+	return 0;
+}
+
 int pv_parse_snd_name(pv_spec_p sp, str *in)
 {
 	if(sp==NULL || in==NULL || in->len<=0)
diff --git a/modules_k/pv/pv_branch.h b/modules_k/pv/pv_branch.h
index d8e3fbc..b10d877 100644
--- a/modules_k/pv/pv_branch.h
+++ b/modules_k/pv/pv_branch.h
@@ -31,7 +31,9 @@ int pv_set_branchx(struct sip_msg* msg, pv_param_t *param,
 		int op, pv_value_t *val);
 int pv_parse_branchx_name(pv_spec_p sp, str *in);
 
-int pv_get_snd(struct sip_msg *msg, pv_param_t *param,
+int pv_get_sndto(struct sip_msg *msg, pv_param_t *param,
+		pv_value_t *res);
+int pv_get_sndfrom(struct sip_msg *msg, pv_param_t *param,
 		pv_value_t *res);
 int pv_parse_snd_name(pv_spec_p sp, str *in);
 




More information about the sr-dev mailing list