Module: sip-router Branch: master Commit: 4b220639cb255a20bac762fd60e36a4336339a45 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4b220639...
Author: Juha Heinanen jh@tutpro.com Committer: Juha Heinanen jh@tutpro.com Date: Tue Sep 20 09:46:53 2011 +0300
modules_k/nathelper: fix_nated_sdp("1") fix
- Call fix_nated_sdp("1") now adds a=direction:active line after every m line in sdp. Earlier it just added one a=direction:active line at the end of body.
---
modules_k/nathelper/nathelper.c | 44 ++++++++++++++++++++++++++++---------- 1 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/modules_k/nathelper/nathelper.c b/modules_k/nathelper/nathelper.c index a7186d7..f734a8d 100644 --- a/modules_k/nathelper/nathelper.c +++ b/modules_k/nathelper/nathelper.c @@ -1352,8 +1352,8 @@ fix_nated_sdp_f(struct sip_msg* msg, char* str1, char* str2) { str body; str ip; - int level; - char *buf; + int level, rest_len; + char *buf, *m_start, *m_end, *rest_s; struct lump* anchor;
level = (int)(long)str1; @@ -1366,28 +1366,48 @@ fix_nated_sdp_f(struct sip_msg* msg, char* str1, char* str2) }
if (level & (ADD_ADIRECTION | ADD_ANORTPPROXY)) { + msg->msg_flags |= FL_FORCE_ACTIVE; - anchor = anchor_lump(msg, body.s + body.len - msg->buf, 0, 0); - if (anchor == NULL) { - LM_ERR("anchor_lump failed\n"); - return -1; - } + if (level & ADD_ADIRECTION) { + m_start = ser_memmem(body.s, "\r\nm=", body.len, 4); + while (m_start != NULL) { + m_start = m_start + 2; + rest_len = body.len - (m_start - body.s); + m_end = ser_memmem(m_start, "\r\n", rest_len, 2); + if (m_end == NULL) { + LM_ERR("m line is not crlf terminated\n"); + return -1; + } + anchor = anchor_lump(msg, m_end - msg->buf, 0, 0); + if (anchor == NULL) { + LM_ERR("anchor_lump failed\n"); + return -1; + } buf = pkg_malloc((ADIRECTION_LEN + CRLF_LEN) * sizeof(char)); if (buf == NULL) { - LM_ERR("out of pkg memory\n"); - return -1; + LM_ERR("out of pkg memory\n"); + return -1; } memcpy(buf, CRLF, CRLF_LEN); memcpy(buf + CRLF_LEN, ADIRECTION, ADIRECTION_LEN); if (insert_new_lump_after(anchor, buf, ADIRECTION_LEN + CRLF_LEN, 0) == NULL) { - LM_ERR("insert_new_lump_after failed\n"); - pkg_free(buf); - return -1; + LM_ERR("insert_new_lump_after failed\n"); + pkg_free(buf); + return -1; } + rest_s = m_end + 2; + rest_len = body.len - (rest_s - body.s); + m_start = ser_memmem(rest_s, "\r\nm=", rest_len, 4); + } }
if ((level & ADD_ANORTPPROXY) && nortpproxy_str.len) { + anchor = anchor_lump(msg, body.s + body.len - msg->buf, 0, 0); + if (anchor == NULL) { + LM_ERR("anchor_lump failed\n"); + return -1; + } buf = pkg_malloc((nortpproxy_str.len + CRLF_LEN) * sizeof(char)); if (buf == NULL) { LM_ERR("out of pkg memory\n");