40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * CDDL HEADER START
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * The contents of this file are subject to the terms of the
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Common Development and Distribution License (the "License").
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * You may not use this file except in compliance with the License.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * or http://www.opensolaris.org/os/licensing.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * See the License for the specific language governing permissions
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * and limitations under the License.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * When distributing Covered Code, include this CDDL HEADER in each
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If applicable, add the following below this CDDL HEADER, with the
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * fields enclosed by brackets "[]" replaced with your own identifying
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * information: Portions Copyright [yyyy] [name of copyright owner]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * CDDL HEADER END
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
2c2c41837e330b002c4220a39638150db504fe0evi * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Use is subject to license terms.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#pragma ident "%Z%%M% %I% %E% SMI"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
2c2c41837e330b002c4220a39638150db504fe0evi#include <stdlib.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <assert.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <errno.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <strings.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <ctype.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <sip.h>
2c2c41837e330b002c4220a39638150db504fe0evi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include "sip_miscdefs.h"
2c2c41837e330b002c4220a39638150db504fe0evi#include "sip_msg.h"
2c2c41837e330b002c4220a39638150db504fe0evi#include "sip_parse_uri.h"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * atoi function from a header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_atoi(_sip_header_t *sip_header, int *num)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t num_found = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *num = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (isspace(*sip_header->sip_hdr_current)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (num_found)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi break;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (isdigit(*sip_header->sip_hdr_current)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *num = (*num * 10) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (*sip_header->sip_hdr_current - '0');
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi num_found = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi break;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!num_found)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Find the 'token'
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_find_token(_sip_header_t *sip_header, char token)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (token != SIP_COMMA &&
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *sip_header->sip_hdr_current == SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current++ == token) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * sip_hdr_current points to the char
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * after the token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Find a carriage-return
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_find_cr(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current = sip_header->sip_hdr_end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (*sip_header->sip_hdr_current-- != '\n') {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_current == sip_header->sip_hdr_start)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Find one of the separator provided, i.e. separator_1st or separator_2nd or
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * separator_3rd.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_find_separator(_sip_header_t *sip_header, char separator_1st,
df4705eab9c873eae60bada4f2138e6f22a76e11gm char separator_2nd, char separator_3rd, boolean_t ignore_space)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi assert(separator_1st != (char)NULL || separator_2nd != (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
df4705eab9c873eae60bada4f2138e6f22a76e11gm if (ignore_space && (*sip_header->sip_hdr_current == SIP_SP)) {
df4705eab9c873eae60bada4f2138e6f22a76e11gm sip_header->sip_hdr_current++;
df4705eab9c873eae60bada4f2138e6f22a76e11gm continue;
df4705eab9c873eae60bada4f2138e6f22a76e11gm }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (isspace(*sip_header->sip_hdr_current) ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (separator_1st != (char)NULL &&
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (*sip_header->sip_hdr_current == separator_1st)) ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (separator_2nd != (char)NULL &&
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (*sip_header->sip_hdr_current == separator_2nd)) ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (separator_3rd != (char)NULL &&
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (*sip_header->sip_hdr_current == separator_3rd))) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If we have escape character, go to the next char
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current == '\\')
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return when we hit a white space
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_find_white_space(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (isspace(*sip_header->sip_hdr_current))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Skip to the next non-whitespace
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_skip_white_space(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!isspace(*sip_header->sip_hdr_current))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Skip to the non-white space in the reverse direction
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_reverse_skip_white_space(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current >= sip_header->sip_hdr_start) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!isspace(*sip_header->sip_hdr_current))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get to the first non space after ':'
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_goto_values(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(sip_header, SIP_HCOLON) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Skip the current value.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_goto_next_value(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t quoted = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (sip_header->sip_hdr_current < sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current == SIP_QUOTE) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (quoted)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi quoted = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi quoted = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (!quoted &&
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *sip_header->sip_hdr_current == SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * value ends before the COMMA
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (quoted)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Parse the header into parameter list. Parameters start with a ';'
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_params(_sip_header_t *sip_header, sip_param_t **parsed_list)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_param_t *param = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_param_t *new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_list == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *parsed_list = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi for (;;) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t quoted_name = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * First check if there are any params
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current != SIP_SEMI)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_param = calloc(1, sizeof (sip_param_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_param == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (param != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_next = new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *parsed_list = new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param = new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Let's get to the start of the param name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * start of param name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_ptr = sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_name.sip_str_ptr = tmp_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_separator(sip_header, SIP_EQUAL, SIP_SEMI,
df4705eab9c873eae60bada4f2138e6f22a76e11gm SIP_COMMA, B_FALSE) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_name.sip_str_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current - tmp_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * End of param name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_name.sip_str_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current - tmp_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0 ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *sip_header->sip_hdr_current == SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current == SIP_SEMI) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi continue;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi assert(*sip_header->sip_hdr_current == SIP_EQUAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * We are at EQUAL, lets go beyond that
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current == SIP_QUOTE) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi quoted_name = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * start of param value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_ptr = sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_ptr = sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (quoted_name && sip_find_token(sip_header, SIP_QUOTE) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (sip_find_separator(sip_header, SIP_SEMI, SIP_COMMA,
df4705eab9c873eae60bada4f2138e6f22a76e11gm (char)NULL, B_FALSE) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_len = sip_header->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (quoted_name)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param->param_value.sip_str_len--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * a header that only has "header_name : " is an empty header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ":" must exist
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * sip_hdr_current resets to sip_hdr_start before exit
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viboolean_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_is_empty_hdr(_sip_header_t *sip_header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(sip_header, SIP_HCOLON) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current = sip_header->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (B_FALSE);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current = sip_header->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (B_FALSE);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current = sip_header->sip_hdr_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (B_TRUE);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Parsing an empty header, i.e. only has a ":"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_hdr_empty(_sip_header_t *hdr, sip_parsed_header_t **phdr)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (hdr == NULL || phdr == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if already parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (hdr->sip_hdr_parsed != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = hdr->sip_hdr_parsed;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header = calloc(1, sizeof (sip_parsed_header_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_header = hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * validate uri str and parse uri using uri_parse()
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_uri_str(sip_str_t *sip_str, sip_hdr_value_t *value)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int error;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Parse uri
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_str->sip_str_len > 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_parsed_uri = sip_parse_uri(sip_str, &error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value->sip_value_parsed_uri == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != 0 ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_parsed_uri->sip_uri_errflags != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Some basic common checks before parsing the headers
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_prim_parsers(_sip_header_t *sip_header, sip_parsed_header_t **header)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header == NULL || header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if already parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_parsed != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *header = sip_header->sip_hdr_parsed;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *header = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi assert(sip_header->sip_hdr_start == sip_header->sip_hdr_current);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_parse_goto_values(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Parse SIP/2.0 string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_protocol_version(_sip_header_t *sip_header,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_proto_version_t *sip_proto_version)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (strncasecmp(sip_header->sip_hdr_current, SIP, strlen(SIP)) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_proto_version->name.sip_str_ptr =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_proto_version->name.sip_str_len = strlen(SIP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(sip_header, SIP_SLASH) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_proto_version->version.sip_str_ptr =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (isdigit(*sip_header->sip_hdr_current)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_current >=
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*sip_header->sip_hdr_current != SIP_PERIOD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!isdigit(*sip_header->sip_hdr_current))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (isdigit(*sip_header->sip_hdr_current)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_current >=
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_proto_version->version.sip_str_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_proto_version->version.sip_str_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * parser1 parses hdr format
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * header_name: val1[; par1=pval1;par2=pval2 ..][, val2[;parlist..] ]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * val can be str1/str2 or str
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * headers: Accept, Accept-Encode, Accept-lang, Allow, Content-disp,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Content-Encode, Content-Lang, In-reply-to,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Priority, Require, Supported, Unsupported
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Allow-Events, Event, Subscription-State
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_hdr_parser1(_sip_header_t *hdr, sip_parsed_header_t **phdr, char sep)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *last_value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((ret = sip_prim_parsers(hdr, phdr)) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if previously parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*phdr != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header = calloc(1, sizeof (sip_parsed_header_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_parsed_header_version = SIP_PARSED_HEADER_VERSION_1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_header = hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (hdr->sip_hdr_current < hdr->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = calloc(1, sizeof (sip_hdr_value_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_free_phdr(parsed_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (last_value != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi last_value->sip_next_value = value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->value = (sip_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_header = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
df4705eab9c873eae60bada4f2138e6f22a76e11gm if (sip_find_separator(hdr, sep, SIP_COMMA, SIP_SEMI,
df4705eab9c873eae60bada4f2138e6f22a76e11gm B_FALSE) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char c = *hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (isspace(c) && sep == (char)NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * nothing at the end except space
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(hdr) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * white space skipped
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi c = *(hdr->sip_hdr_current);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * only one string until COMMA, use sip_str_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (c == SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *t = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_reverse_skip_white_space(hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start + 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * two strings, use sip_2strs_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((sep != (char)NULL) && (c == sep)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_ptr = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (++hdr->sip_hdr_current);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_separator(hdr, SIP_SEMI, SIP_COMMA,
df4705eab9c873eae60bada4f2138e6f22a76e11gm (char)NULL, B_FALSE) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char t = *(hdr->sip_hdr_current);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current -
df4705eab9c873eae60bada4f2138e6f22a76e11gm value->strs2_val_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * if COMMA, no param list, get next val
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * if SEMI, need to set params list
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (t == SIP_COMMA)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else { /* the last part */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current -
df4705eab9c873eae60bada4f2138e6f22a76e11gm value->strs2_val_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (sep != (char)NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * c == SEMI, value contains single string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * only one string until SEMI, use sip_str_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (c == SIP_SEMI) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *t = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get rid of SP at end of value field
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_reverse_skip_white_space(hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr + 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * if SEMI exists in the value, set params list
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * two situations, there is or not SLASH before SEMI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_parse_params(hdr, &value->sip_param_list);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (ret == EPROTO) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (ret != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_free_phdr(parsed_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viget_next_val:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_COMMA) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi break;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi last_value = value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_skip_white_space(hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viend:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * header_name: int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * headers: Expires, Min-Expires
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/* ARGSUSED */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_hdr_parser2(_sip_header_t *hdr, sip_parsed_header_t **phdr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int val_type)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((ret = sip_prim_parsers(hdr, phdr)) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if previously parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*phdr != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header = calloc(1, sizeof (sip_parsed_header_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_parsed_header_version = SIP_PARSED_HEADER_VERSION_1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_header = hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = calloc(1, sizeof (sip_hdr_value_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_free_phdr(parsed_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->value = (sip_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_header = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_atoi(hdr, &value->int_val);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (ret != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->int_val = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * parser3 parses hdr format
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * header_name: <val1>[, <val2>]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Alert-Info, Call-Info, Error-Info, reply-to
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_hdr_parser3(_sip_header_t *hdr, sip_parsed_header_t **phdr, int type,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t parse_uri)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *last_value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((ret = sip_prim_parsers(hdr, phdr)) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if previously parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*phdr != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header = calloc(1, sizeof (sip_parsed_header_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_parsed_header_version = SIP_PARSED_HEADER_VERSION_1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_header = hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (hdr->sip_hdr_current < hdr->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = calloc(1, sizeof (sip_hdr_value_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_free_phdr(parsed_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (last_value != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi last_value->sip_next_value = value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->value = (sip_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_header = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (type == SIP_STRS_VAL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_LAQUOT) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * record the position after LAQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi cur = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get display name and store in str1
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*(hdr->sip_hdr_current) != SIP_LAQUOT) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * record start pos of display name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*hdr->sip_hdr_current ==
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_QUOTE) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_QUOTE) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current -= 2;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = cur - 2;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_reverse_skip_white_space
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_ptr = tmp;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current - tmp + 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * set current to the char after LAQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_RAQUOT)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * no RAQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * No display name - Only URI.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs1_val_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi cur = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_separator(hdr, SIP_COMMA,
df4705eab9c873eae60bada4f2138e6f22a76e11gm (char)NULL, (char)NULL, B_FALSE) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr = cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (*hdr->sip_hdr_current == SIP_SP) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr = cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi cur = hdr->sip_hdr_current - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(hdr) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len = cur -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (*hdr->sip_hdr_current ==
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len = cur -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr = cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->strs2_val_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parse_uri)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parse_uri_str(&value->strs_s2, value);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (type == SIP_STR_VAL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * alert-info, error-info, call-info
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_LAQUOT) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_RAQUOT) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current -
df4705eab9c873eae60bada4f2138e6f22a76e11gm value->str_val_ptr - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parse_uri)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parse_uri_str(&value->str_val, value);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
df4705eab9c873eae60bada4f2138e6f22a76e11gm r = sip_find_separator(hdr, SIP_COMMA, SIP_SEMI, (char)NULL,
df4705eab9c873eae60bada4f2138e6f22a76e11gm B_FALSE);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (r != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*hdr->sip_hdr_current == SIP_SEMI) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_parse_params(hdr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi &(value->sip_param_list));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*hdr->sip_hdr_current == SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto get_next_val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viget_next_val:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_COMMA) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi break;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi last_value = value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_skip_white_space(hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viend:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * parser4 parses hdr format, the whole field is one single str
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * header: Subject, MIME-Version, Organization, Server, User-Agent
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_hdr_parser4(_sip_header_t *hdr, sip_parsed_header_t **phdr)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((ret = sip_prim_parsers(hdr, phdr)) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if previously parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*phdr != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header = calloc(1, sizeof (sip_parsed_header_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_parsed_header_version = SIP_PARSED_HEADER_VERSION_1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_header = hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = calloc(1, sizeof (sip_hdr_value_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_free_phdr(parsed_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->value = (sip_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_header = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_ptr = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get rid of CRLF at end
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->str_val_len = hdr->sip_hdr_end - value->str_val_ptr - 2;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_hdr_parser5(_sip_header_t *hdr, sip_parsed_header_t **phdr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t parse_uri)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_param_t *tmp_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t first_param = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((ret = sip_prim_parsers(hdr, phdr)) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check if previously parsed
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*phdr != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header = calloc(1, sizeof (sip_parsed_header_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_parsed_header_version = SIP_PARSED_HEADER_VERSION_1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->sip_header = hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = calloc(1, sizeof (sip_hdr_value_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_free_phdr(parsed_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi parsed_header->value = (sip_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_start = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->auth_scheme_ptr = value->sip_value_start;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_header = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get auth_scheme
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_white_space(hdr)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->auth_scheme_len = hdr->sip_hdr_current - value->auth_scheme_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param = value->auth_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * parse auth_param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi for (;;) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp_cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t quoted_name = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char quoted_char = (char)0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_param_t *new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t pval_is_uri = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(hdr) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_cur = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_param = calloc(1, sizeof (sip_param_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_param == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (first_param == B_FALSE)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_next = new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->auth_param = new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param = new_param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_name.sip_str_ptr = tmp_cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
df4705eab9c873eae60bada4f2138e6f22a76e11gm if (sip_find_separator(hdr, SIP_EQUAL, SIP_COMMA, (char)NULL,
df4705eab9c873eae60bada4f2138e6f22a76e11gm B_FALSE) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_name.sip_str_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current - tmp_cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * End of param name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_name.sip_str_len = hdr->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(hdr) != 0 ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *hdr->sip_hdr_current == SIP_COMMA) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi continue;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * We are at EQUAL
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(hdr) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(tmp_param);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*hdr->sip_hdr_current == SIP_QUOTE ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *hdr->sip_hdr_current == SIP_LAQUOT) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*hdr->sip_hdr_current == SIP_QUOTE)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi quoted_char = SIP_QUOTE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi quoted_char = SIP_RAQUOT;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi pval_is_uri = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi quoted_name = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * start of param value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_cur = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_ptr = tmp_cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (quoted_name) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, quoted_char) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_state = SIP_VALUE_BAD;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(tmp_param);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current - tmp_cur - 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_token(hdr, SIP_COMMA) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value->sip_value_end = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto end;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!quoted_name) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *t = hdr->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current--;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_reverse_skip_white_space(hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp_param->param_value.sip_str_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current - tmp_cur;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_current = t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (first_param == B_TRUE)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi first_param = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Parse uri
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (pval_is_uri && parse_uri)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parse_uri_str(&tmp_param->param_value, value);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viend:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *phdr = parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr->sip_hdr_parsed = *phdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the URI in the request startline
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi_sip_get_request_uri(_sip_header_t *sip_header, sip_message_type_t *msg_info)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int size = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *start_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi start_ptr = sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (!isspace(*sip_header->sip_hdr_current)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_current >= sip_header->sip_hdr_end)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi size = sip_header->sip_hdr_current - start_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi msg_info->U.sip_request.sip_request_uri.sip_str_ptr = start_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi msg_info->U.sip_request.sip_request_uri.sip_str_len = size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (size > 0) { /* Parse uri */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int error;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi msg_info->U.sip_request.sip_parse_uri = sip_parse_uri(
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi &msg_info->U.sip_request.sip_request_uri, &error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (msg_info->U.sip_request.sip_parse_uri == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Parse the start line into request/response
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_parse_first_line(_sip_header_t *sip_header, sip_message_type_t **msg_info)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_message_type_t *sip_msg_info;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t sip_is_request = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header == NULL || msg_info == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * There is nothing, return
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_current + strlen(SIP_VERSION) >=
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#ifdef __solaris__
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi assert(mutex_held(&sip_header->sip_hdr_sipmsg->sip_msg_mutex));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#endif
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info = malloc(sizeof (sip_message_type_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg_info == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * let's see if it's a request or a response
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_get_protocol_version(sip_header,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi &sip_msg_info->sip_proto_version);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (ret == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_is_request = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (ret == 2) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!sip_is_request) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * check for status code.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_header->sip_hdr_current + SIP_SIZE_OF_STATUS_CODE >=
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_end) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_atoi(sip_header,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi &sip_msg_info->U.sip_response.sip_response_code)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg_info->U.sip_response.sip_response_code < 100 ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->U.sip_response.sip_response_code > 700) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get reason phrase.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_skip_white_space(sip_header) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_resp_phrase_len = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_resp_phrase_ptr = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_resp_phrase_ptr =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_find_cr(sip_header) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_resp_phrase_len =
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current -
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_resp_phrase_ptr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->is_request = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int i;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * It's a request.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->is_request = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi for (i = 1; i < MAX_SIP_METHODS; i++) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (strncmp(sip_methods[i].name,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_methods[i].len) == 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_req_method = i;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header->sip_hdr_current +=
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_methods[i].len;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (!isspace(*sip_header->sip_hdr_current++) ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi !isalpha(*sip_header->sip_hdr_current)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((ret = _sip_get_request_uri(sip_header,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info)) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get SIP version
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_get_protocol_version(sip_header,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi &sip_msg_info->sip_proto_version);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (ret != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi goto done;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(sip_msg_info);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EPROTO);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vidone:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_msg_info->sip_next = *msg_info;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *msg_info = sip_msg_info;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}