diff options
Diffstat (limited to 'usr/src/lib/libsip/common')
-rw-r--r-- | usr/src/lib/libsip/common/mapfile-vers | 4 | ||||
-rw-r--r-- | usr/src/lib/libsip/common/sip.h | 5 | ||||
-rw-r--r-- | usr/src/lib/libsip/common/sip_dialog_ui.c | 56 | ||||
-rw-r--r-- | usr/src/lib/libsip/common/sip_headers.c | 2 | ||||
-rw-r--r-- | usr/src/lib/libsip/common/sip_parse_generic.c | 30 | ||||
-rw-r--r-- | usr/src/lib/libsip/common/sip_parse_generic.h | 3 | ||||
-rw-r--r-- | usr/src/lib/libsip/common/sip_parse_hdrs.c | 57 |
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; + } } } |