summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/libsip/common/mapfile-vers4
-rw-r--r--usr/src/lib/libsip/common/sip.h5
-rw-r--r--usr/src/lib/libsip/common/sip_dialog_ui.c56
-rw-r--r--usr/src/lib/libsip/common/sip_headers.c2
-rw-r--r--usr/src/lib/libsip/common/sip_parse_generic.c30
-rw-r--r--usr/src/lib/libsip/common/sip_parse_generic.h3
-rw-r--r--usr/src/lib/libsip/common/sip_parse_hdrs.c57
7 files changed, 128 insertions, 29 deletions
diff --git a/usr/src/lib/libsip/common/mapfile-vers b/usr/src/lib/libsip/common/mapfile-vers
index e32b223c1b..9bbd724b06 100644
--- a/usr/src/lib/libsip/common/mapfile-vers
+++ b/usr/src/lib/libsip/common/mapfile-vers
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -72,6 +72,7 @@ SUNW_1.1 {
sip_hold_trans;
sip_release_trans;
sip_create_dialog_req;
+ sip_create_dialog_req_nocontact;
sip_hold_dialog;
sip_release_dialog;
sip_delete_dialog;
@@ -83,6 +84,7 @@ SUNW_1.1 {
sip_get_dialog_local_uri;
sip_get_dialog_remote_uri;
sip_get_dialog_remote_target_uri;
+ sip_get_dialog_local_contact_uri;
sip_get_dialog_route_set;
sip_is_dialog_secure;
sip_get_dialog_local_cseq;
diff --git a/usr/src/lib/libsip/common/sip.h b/usr/src/lib/libsip/common/sip.h
index 79969944e5..c4cc189b9b 100644
--- a/usr/src/lib/libsip/common/sip.h
+++ b/usr/src/lib/libsip/common/sip.h
@@ -626,6 +626,9 @@ extern const sip_str_t *sip_get_content_sub_type(sip_msg_t, int *);
extern char *sip_get_content(sip_msg_t, int *);
extern sip_msg_t sip_create_dialog_req(sip_method_t, sip_dialog_t,
char *, char *, int, char *, uint32_t, int);
+extern sip_msg_t sip_create_dialog_req_nocontact(sip_method_t,
+ sip_dialog_t, char *, char *, int, char *,
+ uint32_t, int);
extern int sip_get_dialog_state(sip_dialog_t, int *);
extern int sip_get_dialog_method(sip_dialog_t, int *);
@@ -636,6 +639,8 @@ extern const struct sip_uri *sip_get_dialog_local_uri(sip_dialog_t, int *);
extern const struct sip_uri *sip_get_dialog_remote_uri(sip_dialog_t, int *);
extern const struct sip_uri *sip_get_dialog_remote_target_uri(sip_dialog_t,
int *);
+extern const struct sip_uri *sip_get_dialog_local_contact_uri(sip_dialog_t,
+ int *);
extern const sip_str_t *sip_get_dialog_route_set(sip_dialog_t, int *);
extern boolean_t sip_is_dialog_secure(sip_dialog_t, int *);
extern uint32_t sip_get_dialog_local_cseq(sip_dialog_t, int *);
diff --git a/usr/src/lib/libsip/common/sip_dialog_ui.c b/usr/src/lib/libsip/common/sip_dialog_ui.c
index bdbc588e8c..d15d79f56e 100644
--- a/usr/src/lib/libsip/common/sip_dialog_ui.c
+++ b/usr/src/lib/libsip/common/sip_dialog_ui.c
@@ -119,6 +119,29 @@ err_ret:
}
/*
+ * Create a request using the state maintained in the dialog. The request will
+ * not have Contact header.
+ */
+sip_msg_t
+sip_create_dialog_req_nocontact(sip_method_t method, sip_dialog_t dialog,
+ char *transport, char *sent_by, int sent_by_port, char *via_param,
+ uint32_t maxforward, int cseq)
+{
+ sip_msg_t sip_msg;
+
+ sip_msg = sip_create_dialog_req(method, dialog, transport, sent_by,
+ sent_by_port, via_param, maxforward, cseq);
+ if (sip_msg != NULL) {
+ if (sip_delete_header_by_name(sip_msg, SIP_CONTACT) != 0) {
+ sip_free_msg(sip_msg);
+ return (NULL);
+ }
+ }
+
+ return (sip_msg);
+}
+
+/*
* Get the Dialog method
*/
int
@@ -363,6 +386,39 @@ sip_get_dialog_remote_target_uri(sip_dialog_t dialog, int *error)
}
/*
+ * Return the dialog local contact uri.
+ */
+const struct sip_uri *
+sip_get_dialog_local_contact_uri(sip_dialog_t dialog, int *error)
+{
+ _sip_dialog_t *_dialog;
+ const struct sip_uri *lcuri = NULL;
+ const struct sip_value *val;
+
+ if (error != NULL)
+ *error = 0;
+ if (!sip_manage_dialog || dialog == NULL) {
+ if (error != NULL)
+ *error = EINVAL;
+ return (NULL);
+ }
+ _dialog = (_sip_dialog_t *)dialog;
+ (void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);
+ if (dialog->sip_dlg_local_contact != NULL) {
+ val = sip_get_header_value(_dialog->sip_dlg_local_contact,
+ error);
+ if (val == NULL) {
+ (void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);
+ return (NULL);
+ }
+ lcuri = val->sip_value_parse_uri;
+ }
+ (void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);
+
+ return ((sip_uri_t)lcuri);
+}
+
+/*
* Return the dialog route set
*/
const sip_str_t *
diff --git a/usr/src/lib/libsip/common/sip_headers.c b/usr/src/lib/libsip/common/sip_headers.c
index f6d90bf5b5..d299ab4e79 100644
--- a/usr/src/lib/libsip/common/sip_headers.c
+++ b/usr/src/lib/libsip/common/sip_headers.c
@@ -728,7 +728,7 @@ _sip_get_header_functions(sip_header_function_t *sip_header_function_table,
}
header_name = sip_header->sip_hdr_current;
if (sip_find_separator(sip_header, SIP_HCOLON, (char)NULL,
- (char)NULL) != 0) {
+ (char)NULL, B_FALSE) != 0) {
return (NULL);
}
len = sip_header->sip_hdr_current - header_name;
diff --git a/usr/src/lib/libsip/common/sip_parse_generic.c b/usr/src/lib/libsip/common/sip_parse_generic.c
index b8d0ba0200..98f459b1b0 100644
--- a/usr/src/lib/libsip/common/sip_parse_generic.c
+++ b/usr/src/lib/libsip/common/sip_parse_generic.c
@@ -108,10 +108,14 @@ sip_find_cr(_sip_header_t *sip_header)
*/
int
sip_find_separator(_sip_header_t *sip_header, char separator_1st,
- char separator_2nd, char separator_3rd)
+ char separator_2nd, char separator_3rd, boolean_t ignore_space)
{
assert(separator_1st != (char)NULL || separator_2nd != (char)NULL);
while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
+ if (ignore_space && (*sip_header->sip_hdr_current == SIP_SP)) {
+ sip_header->sip_hdr_current++;
+ continue;
+ }
if (isspace(*sip_header->sip_hdr_current) ||
(separator_1st != (char)NULL &&
(*sip_header->sip_hdr_current == separator_1st)) ||
@@ -267,7 +271,7 @@ sip_parse_params(_sip_header_t *sip_header, sip_param_t **parsed_list)
param->param_name.sip_str_ptr = tmp_ptr;
if (sip_find_separator(sip_header, SIP_EQUAL, SIP_SEMI,
- SIP_COMMA) != 0) {
+ SIP_COMMA, B_FALSE) != 0) {
param->param_name.sip_str_len =
sip_header->sip_hdr_current - tmp_ptr;
param->param_value.sip_str_ptr = NULL;
@@ -316,7 +320,7 @@ sip_parse_params(_sip_header_t *sip_header, sip_param_t **parsed_list)
if (quoted_name && sip_find_token(sip_header, SIP_QUOTE) != 0) {
return (EPROTO);
} else if (sip_find_separator(sip_header, SIP_SEMI, SIP_COMMA,
- (char)NULL) != 0) {
+ (char)NULL, B_FALSE) != 0) {
return (EPROTO);
}
param->param_value.sip_str_len = sip_header->sip_hdr_current -
@@ -527,7 +531,8 @@ sip_parse_hdr_parser1(_sip_header_t *hdr, sip_parsed_header_t **phdr, char sep)
value->sip_value_start = hdr->sip_hdr_current;
value->sip_value_header = parsed_header;
- if (sip_find_separator(hdr, sep, SIP_COMMA, SIP_SEMI) == 0) {
+ if (sip_find_separator(hdr, sep, SIP_COMMA, SIP_SEMI,
+ B_FALSE) == 0) {
char c = *hdr->sip_hdr_current;
if (isspace(c) && sep == (char)NULL) {
@@ -574,11 +579,11 @@ sip_parse_hdr_parser1(_sip_header_t *hdr, sip_parsed_header_t **phdr, char sep)
value->strs2_val_ptr =
(++hdr->sip_hdr_current);
if (sip_find_separator(hdr, SIP_SEMI, SIP_COMMA,
- (char)NULL) == 0) {
+ (char)NULL, B_FALSE) == 0) {
char t = *(hdr->sip_hdr_current);
value->strs2_val_len =
hdr->sip_hdr_current -
- value->strs2_val_ptr;
+ value->strs2_val_ptr;
/*
* if COMMA, no param list, get next val
* if SEMI, need to set params list
@@ -588,7 +593,7 @@ sip_parse_hdr_parser1(_sip_header_t *hdr, sip_parsed_header_t **phdr, char sep)
} else { /* the last part */
value->strs2_val_len =
hdr->sip_hdr_current -
- value->strs2_val_ptr;
+ value->strs2_val_ptr;
value->sip_value_end =
hdr->sip_hdr_current;
goto end;
@@ -822,7 +827,7 @@ sip_parse_hdr_parser3(_sip_header_t *hdr, sip_parsed_header_t **phdr, int type,
cur = value->sip_value_start;
hdr->sip_hdr_current = cur;
if (sip_find_separator(hdr, SIP_COMMA,
- (char)NULL, (char)NULL) != 0) {
+ (char)NULL, (char)NULL, B_FALSE) != 0) {
value->strs2_val_ptr = cur;
value->strs2_val_len =
hdr->sip_hdr_current -
@@ -862,7 +867,7 @@ sip_parse_hdr_parser3(_sip_header_t *hdr, sip_parsed_header_t **phdr, int type,
if (sip_find_token(hdr, SIP_RAQUOT) == 0) {
value->str_val_len =
hdr->sip_hdr_current -
- value->str_val_ptr - 1;
+ value->str_val_ptr - 1;
} else {
value->str_val_ptr = NULL;
value->str_val_len = 0;
@@ -880,7 +885,8 @@ sip_parse_hdr_parser3(_sip_header_t *hdr, sip_parsed_header_t **phdr, int type,
sip_parse_uri_str(&value->str_val, value);
}
- r = sip_find_separator(hdr, SIP_COMMA, SIP_SEMI, (char)NULL);
+ r = sip_find_separator(hdr, SIP_COMMA, SIP_SEMI, (char)NULL,
+ B_FALSE);
if (r != 0) {
value->sip_value_end = hdr->sip_hdr_current;
goto end;
@@ -1037,8 +1043,8 @@ sip_parse_hdr_parser5(_sip_header_t *hdr, sip_parsed_header_t **phdr,
tmp_param = new_param;
tmp_param->param_name.sip_str_ptr = tmp_cur;
- if (sip_find_separator(hdr, SIP_EQUAL, SIP_COMMA, (char)NULL) !=
- 0) {
+ if (sip_find_separator(hdr, SIP_EQUAL, SIP_COMMA, (char)NULL,
+ B_FALSE) != 0) {
tmp_param->param_name.sip_str_len =
hdr->sip_hdr_current - tmp_cur;
tmp_param->param_value.sip_str_ptr = NULL;
diff --git a/usr/src/lib/libsip/common/sip_parse_generic.h b/usr/src/lib/libsip/common/sip_parse_generic.h
index 5792bee2b0..3d1b749a3f 100644
--- a/usr/src/lib/libsip/common/sip_parse_generic.h
+++ b/usr/src/lib/libsip/common/sip_parse_generic.h
@@ -41,7 +41,8 @@ extern "C" {
extern int sip_atoi(_sip_header_t *, int *);
extern int sip_find_token(_sip_header_t *, char);
extern int sip_find_cr(_sip_header_t *);
-extern int sip_find_separator(_sip_header_t *, char, char, char);
+extern int sip_find_separator(_sip_header_t *, char, char, char,
+ boolean_t);
extern int sip_find_white_space(_sip_header_t *);
extern int sip_skip_white_space(_sip_header_t *);
extern int sip_reverse_skip_white_space(_sip_header_t *);
diff --git a/usr/src/lib/libsip/common/sip_parse_hdrs.c b/usr/src/lib/libsip/common/sip_parse_hdrs.c
index aab94d6a23..e7ee91acad 100644
--- a/usr/src/lib/libsip/common/sip_parse_hdrs.c
+++ b/usr/src/lib/libsip/common/sip_parse_hdrs.c
@@ -133,7 +133,7 @@ sip_parse_allow_header(_sip_header_t *hdr, sip_parsed_header_t **phdr)
value->sip_value_header = parsed_header;
if (sip_find_separator(hdr, SIP_COMMA, (char)NULL,
- (char)NULL) == 0) {
+ (char)NULL, B_FALSE) == 0) {
multi_value = B_TRUE;
}
@@ -506,7 +506,7 @@ sip_parse_retryaft_header(_sip_header_t *sip_header,
if (sip_find_token(sip_header, SIP_RPAR) == 0) {
value->intstr_str_len =
sip_header->sip_hdr_current -
- value->intstr_str_ptr - 1;
+ value->intstr_str_ptr - 1;
if (sip_find_token(sip_header, SIP_SEMI) == 0) {
sip_header->sip_hdr_current--;
(void) sip_parse_params(sip_header,
@@ -749,7 +749,7 @@ sip_parse_warn_header(_sip_header_t *sip_header, sip_parsed_header_t **header)
if (sip_find_token(sip_header, SIP_QUOTE) == 0) {
value->warn_text_len =
sip_header->sip_hdr_current -
- value->warn_text_ptr - 1;
+ value->warn_text_ptr - 1;
} else {
value->sip_value_state = SIP_VALUE_BAD;
goto get_next_val;
@@ -1260,7 +1260,7 @@ sip_parse_via_header(_sip_header_t *sip_header, sip_parsed_header_t **header)
goto get_next_via_value;
}
} else if (sip_find_separator(sip_header, SIP_SEMI, SIP_COMMA,
- SIP_HCOLON)) {
+ SIP_HCOLON, B_FALSE)) {
if (sip_goto_next_value(sip_header) != 0) {
sip_free_phdr(parsed_header);
return (EPROTO);
@@ -1469,7 +1469,7 @@ sip_parse_cftr_header(_sip_header_t *sip_header, sip_parsed_header_t **header)
value->sip_value_state = SIP_VALUE_BAD;
goto get_next_cftr_value;
} else if (sip_find_separator(sip_header, SIP_SEMI,
- SIP_LAQUOT, SIP_COMMA) != 0) {
+ SIP_LAQUOT, SIP_COMMA, B_TRUE) != 0) {
/*
* only a uri.
*/
@@ -1489,9 +1489,15 @@ sip_parse_cftr_header(_sip_header_t *sip_header, sip_parsed_header_t **header)
value->sip_value_state = SIP_VALUE_BAD;
goto get_next_cftr_value;
}
- continue;
+ goto get_next_cftr_value;
}
-
+ /*
+ * This is needed to get rid of leading white spaces of
+ * display name or uri
+ */
+ --sip_header->sip_hdr_current;
+ (void) sip_reverse_skip_white_space(sip_header);
+ ++sip_header->sip_hdr_current;
tmp_ptr_2 = sip_header->sip_hdr_current;
if (*sip_header->sip_hdr_current == SIP_SP) {
if (sip_skip_white_space(sip_header) != 0) {
@@ -1515,7 +1521,7 @@ sip_parse_cftr_header(_sip_header_t *sip_header, sip_parsed_header_t **header)
SIP_VALUE_BAD;
goto get_next_cftr_value;
}
- continue;
+ goto get_next_cftr_value;
}
}
@@ -1576,7 +1582,7 @@ sip_parse_cftr_header(_sip_header_t *sip_header, sip_parsed_header_t **header)
tmp_ptr = sip_header->sip_hdr_current;
if (sip_find_separator(sip_header, SIP_RAQUOT, (char)NULL,
- (char)NULL)) {
+ (char)NULL, B_FALSE)) {
if (sip_goto_next_value(sip_header) != 0) {
sip_free_cftr_header(parsed_header);
return (EPROTO);
@@ -1622,7 +1628,11 @@ get_next_cftr_value:
* Parse uri
*/
if (value->cftr_uri.sip_str_len > 0) {
- int error;
+ int error;
+ uint_t uri_errflags;
+ char *uri = "*";
+ _sip_msg_t *sip_msg;
+ sip_message_type_t *msg_type;
value->sip_value_parsed_uri = sip_parse_uri(
&value->cftr_uri, &error);
@@ -1630,10 +1640,29 @@ get_next_cftr_value:
sip_free_cftr_header(parsed_header);
return (ENOMEM);
}
- if (error != 0 ||
- ((_sip_uri_t *)value->sip_value_parsed_uri)->
- sip_uri_errflags != 0) {
- value->sip_value_state = SIP_VALUE_BAD;
+ uri_errflags = ((_sip_uri_t *)value->
+ sip_value_parsed_uri)->sip_uri_errflags;
+ if (error != 0 || uri_errflags != 0) {
+ if ((strcmp(SIP_CONTACT, sip_header->
+ sip_header_functions->header_name) == 0) &&
+ (strncmp(value->cftr_uri.sip_str_ptr, uri,
+ strlen(uri)) == 0) && (strlen(uri) ==
+ value->cftr_uri.sip_str_len)) {
+ sip_msg = sip_header->sip_hdr_sipmsg;
+ msg_type = sip_msg->sip_msg_req_res;
+ if (msg_type->is_request && msg_type->
+ sip_req_method == REGISTER) {
+ error = 0;
+ ((_sip_uri_t *)value->
+ sip_value_parsed_uri)->
+ sip_uri_errflags = 0;
+ } else {
+ value->sip_value_state =
+ SIP_VALUE_BAD;
+ }
+ } else {
+ value->sip_value_state = SIP_VALUE_BAD;
+ }
}
}