|
@@ -1,16 +1,15 @@
|
|
|
-/* $Id$
|
|
|
- *
|
|
|
+/*
|
|
|
* Copyright (C) 2004-2008 Dan Pascu
|
|
|
* Copyright (C) 2009 Juha Heinanen (multipart hack)
|
|
|
*
|
|
|
- * This file is part of Kamailio, a free SIP server.
|
|
|
+ * This file is part of SIP-Router, a free SIP server.
|
|
|
*
|
|
|
- * Kamailio is free software; you can redistribute it and/or modify
|
|
|
+ * SIP-router is free software; you can redistribute it and/or modify
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
* (at your option) any later version
|
|
|
*
|
|
|
- * Kamailio is distributed in the hope that it will be useful,
|
|
|
+ * SIP-router is distributed in the hope that it will be useful,
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
* GNU General Public License for more details.
|
|
@@ -18,7 +17,6 @@
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
- *
|
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
@@ -79,7 +77,7 @@ MODULE_VERSION
|
|
|
#endif
|
|
|
|
|
|
// As Solaris does not have the MSG_NOSIGNAL flag for send(2) syscall,
|
|
|
-//it is defined as 0
|
|
|
+// it is defined as 0
|
|
|
#ifndef MSG_NOSIGNAL
|
|
|
# define MSG_NOSIGNAL 0
|
|
|
#endif
|
|
@@ -501,21 +499,21 @@ get_cseq_number(struct sip_msg *msg, str *cseq)
|
|
|
static str
|
|
|
get_from_uri(struct sip_msg *msg)
|
|
|
{
|
|
|
- static str notfound = str_init("unknown");
|
|
|
+ static str unknown = str_init("unknown");
|
|
|
str uri;
|
|
|
char *ptr;
|
|
|
|
|
|
if (parse_from_header(msg) < 0) {
|
|
|
LM_ERR("cannot parse the From header\n");
|
|
|
- return notfound;
|
|
|
+ return unknown;
|
|
|
}
|
|
|
|
|
|
uri = get_from(msg)->uri;
|
|
|
|
|
|
if (uri.len == 0)
|
|
|
- return notfound;
|
|
|
+ return unknown;
|
|
|
|
|
|
- if (strncmp(uri.s, "sip:", 4)==0) {
|
|
|
+ if (strncasecmp(uri.s, "sip:", 4)==0) {
|
|
|
uri.s += 4;
|
|
|
uri.len -= 4;
|
|
|
}
|
|
@@ -531,21 +529,21 @@ get_from_uri(struct sip_msg *msg)
|
|
|
static str
|
|
|
get_to_uri(struct sip_msg *msg)
|
|
|
{
|
|
|
- static str notfound = str_init("unknown");
|
|
|
+ static str unknown = str_init("unknown");
|
|
|
str uri;
|
|
|
char *ptr;
|
|
|
|
|
|
if (!msg->to) {
|
|
|
LM_ERR("missing To header\n");
|
|
|
- return notfound;
|
|
|
+ return unknown;
|
|
|
}
|
|
|
|
|
|
uri = get_to(msg)->uri;
|
|
|
|
|
|
if (uri.len == 0)
|
|
|
- return notfound;
|
|
|
+ return unknown;
|
|
|
|
|
|
- if (strncmp(uri.s, "sip:", 4)==0) {
|
|
|
+ if (strncasecmp(uri.s, "sip:", 4)==0) {
|
|
|
uri.s += 4;
|
|
|
uri.len -= 4;
|
|
|
}
|
|
@@ -561,18 +559,18 @@ get_to_uri(struct sip_msg *msg)
|
|
|
static str
|
|
|
get_from_tag(struct sip_msg *msg)
|
|
|
{
|
|
|
- static str notfound = str_init("");
|
|
|
+ static str undefined = str_init("");
|
|
|
str tag;
|
|
|
|
|
|
if (parse_from_header(msg) < 0) {
|
|
|
LM_ERR("cannot parse the From header\n");
|
|
|
- return notfound;
|
|
|
+ return undefined;
|
|
|
}
|
|
|
|
|
|
tag = get_from(msg)->tag_value;
|
|
|
|
|
|
if (tag.len == 0)
|
|
|
- return notfound;
|
|
|
+ return undefined;
|
|
|
|
|
|
return tag;
|
|
|
}
|
|
@@ -581,23 +579,23 @@ get_from_tag(struct sip_msg *msg)
|
|
|
static str
|
|
|
get_to_tag(struct sip_msg *msg)
|
|
|
{
|
|
|
- static str notfound = str_init("");
|
|
|
+ static str undefined = str_init("");
|
|
|
str tag;
|
|
|
|
|
|
- if (!msg->to) {
|
|
|
- LM_ERR("missing To header\n");
|
|
|
- return notfound;
|
|
|
+ if (msg->first_line.type==SIP_REPLY && msg->REPLY_STATUS<200) {
|
|
|
+ // Ignore the To tag for provisional replies
|
|
|
+ return undefined;
|
|
|
}
|
|
|
|
|
|
- if (msg->first_line.type==SIP_REPLY && msg->REPLY_STATUS<200) {
|
|
|
- // Ignore the To tag for provisional replies
|
|
|
- return notfound;
|
|
|
+ if (!msg->to) {
|
|
|
+ LM_ERR("missing To header\n");
|
|
|
+ return undefined;
|
|
|
}
|
|
|
|
|
|
tag = get_to(msg)->tag_value;
|
|
|
|
|
|
if (tag.len == 0)
|
|
|
- return notfound;
|
|
|
+ return undefined;
|
|
|
|
|
|
return tag;
|
|
|
}
|
|
@@ -606,7 +604,7 @@ get_to_tag(struct sip_msg *msg)
|
|
|
static str
|
|
|
get_user_agent(struct sip_msg* msg)
|
|
|
{
|
|
|
- static str notfound = str_init("unknown agent");
|
|
|
+ static str unknown = str_init("unknown agent");
|
|
|
str block, server;
|
|
|
char *ptr;
|
|
|
|
|
@@ -616,21 +614,21 @@ get_user_agent(struct sip_msg* msg)
|
|
|
}
|
|
|
|
|
|
// If we can't find user-agent, look after the `Server' header
|
|
|
- // This is a temporary hack. Normally it should be extracted by openser.
|
|
|
+ // This is a temporary hack. Normally it should be extracted by sip-router.
|
|
|
|
|
|
block.s = msg->buf;
|
|
|
block.len = msg->len;
|
|
|
|
|
|
ptr = find_line_starting_with(&block, "Server:", True);
|
|
|
if (!ptr)
|
|
|
- return notfound;
|
|
|
+ return unknown;
|
|
|
|
|
|
server.s = ptr + 7;
|
|
|
server.len = findendline(server.s, block.s+block.len-server.s) - server.s;
|
|
|
|
|
|
trim(&server);
|
|
|
if (server.len == 0)
|
|
|
- return notfound;
|
|
|
+ return unknown;
|
|
|
|
|
|
return server;
|
|
|
}
|
|
@@ -657,12 +655,12 @@ get_signaling_ip(struct sip_msg* msg)
|
|
|
static str
|
|
|
get_media_relay(struct sip_msg* msg)
|
|
|
{
|
|
|
- static str notfound = str_init("");
|
|
|
+ static str undefined = str_init("");
|
|
|
int_str value;
|
|
|
|
|
|
if (!search_first_avp(media_relay_avp.type | AVP_VAL_STR,
|
|
|
media_relay_avp.name, &value, NULL) || value.s.s==NULL || value.s.len==0) {
|
|
|
- return notfound;
|
|
|
+ return undefined;
|
|
|
}
|
|
|
|
|
|
return value.s;
|
|
@@ -672,6 +670,7 @@ get_media_relay(struct sip_msg* msg)
|
|
|
// Functions to manipulate the SDP message body
|
|
|
//
|
|
|
|
|
|
+
|
|
|
static int
|
|
|
find_content_type_application_sdp(struct sip_msg *msg, str *sdp)
|
|
|
{
|
|
@@ -848,8 +847,8 @@ get_direction_attribute(str *block, str *default_direction)
|
|
|
line.len = findendline(line.s, zone.s + zone.len - line.s) - line.s;
|
|
|
|
|
|
if (line.len==8) {
|
|
|
- if (strncmp(line.s, "sendrecv", 8)==0 || strncmp(line.s, "sendonly", 8)==0 ||
|
|
|
- strncmp(line.s, "recvonly", 8)==0 || strncmp(line.s, "inactive", 8)==0) {
|
|
|
+ if (strncasecmp(line.s, "sendrecv", 8)==0 || strncasecmp(line.s, "sendonly", 8)==0 ||
|
|
|
+ strncasecmp(line.s, "recvonly", 8)==0 || strncasecmp(line.s, "inactive", 8)==0) {
|
|
|
return line;
|
|
|
}
|
|
|
}
|
|
@@ -865,14 +864,14 @@ get_direction_attribute(str *block, str *default_direction)
|
|
|
static str
|
|
|
get_rtcp_port_attribute(str *block)
|
|
|
{
|
|
|
- str zone, rtcp_port, notfound = {NULL, 0};
|
|
|
+ str zone, rtcp_port, undefined = {NULL, 0};
|
|
|
char *ptr;
|
|
|
int count;
|
|
|
|
|
|
ptr = find_line_starting_with(block, "a=rtcp:", False);
|
|
|
|
|
|
if (!ptr)
|
|
|
- return notfound;
|
|
|
+ return undefined;
|
|
|
|
|
|
zone.s = ptr + 7;
|
|
|
zone.len = findendline(zone.s, block->s + block->len - zone.s) - zone.s;
|
|
@@ -881,7 +880,7 @@ get_rtcp_port_attribute(str *block)
|
|
|
|
|
|
if (count != 1) {
|
|
|
LM_ERR("invalid `a=rtcp' line in SDP body\n");
|
|
|
- return notfound;
|
|
|
+ return undefined;
|
|
|
}
|
|
|
|
|
|
return rtcp_port;
|
|
@@ -1611,8 +1610,7 @@ use_media_proxy(struct sip_msg *msg, char *dialog_id, ice_candidate_data *ice_da
|
|
|
media_relay.len, media_relay.s, media_str);
|
|
|
|
|
|
if (len >= sizeof(request)) {
|
|
|
- LM_ERR("mediaproxy request is longer than %lu bytes\n",
|
|
|
- (unsigned long)sizeof(request));
|
|
|
+ LM_ERR("mediaproxy request is longer than %lu bytes\n", (unsigned long)sizeof(request));
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -1791,8 +1789,7 @@ end_media_session(str callid, str from_tag, str to_tag)
|
|
|
to_tag.len, to_tag.s);
|
|
|
|
|
|
if (len >= sizeof(request)) {
|
|
|
- LM_ERR("mediaproxy request is longer than %lu bytes\n",
|
|
|
- (unsigned long)sizeof(request));
|
|
|
+ LM_ERR("mediaproxy request is longer than %lu bytes\n", (unsigned long)sizeof(request));
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -1953,7 +1950,7 @@ mod_init(void)
|
|
|
{
|
|
|
pv_spec_t avp_spec;
|
|
|
int *param;
|
|
|
- modparam_t type;
|
|
|
+ modparam_t type;
|
|
|
|
|
|
// initialize the signaling_ip_avp structure
|
|
|
if (signaling_ip_avp.spec.s==NULL || *(signaling_ip_avp.spec.s)==0) {
|
|
@@ -2018,10 +2015,10 @@ mod_init(void)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- if (type != INT_PARAM) {
|
|
|
- LM_CRIT("dlg_flag parameter found but with wrong type: %d\n", type);
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ if (type != INT_PARAM) {
|
|
|
+ LM_CRIT("dlg_flag parameter found but with wrong type: %d\n", type);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
|
|
|
dialog_flag = *param;
|
|
|
|