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 <stdio.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <stdlib.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <strings.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <errno.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <pthread.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <sip.h>
2c2c41837e330b002c4220a39638150db504fe0evi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include "sip_msg.h"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Generic function to get int or string value from a header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_val_from_hdr(sip_hdr_value_t *val, int val_type, boolean_t stype,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val == NULL || val->sip_value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val->sip_value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi switch (val_type) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (SIP_INT_VAL):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->int_val));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (SIP_STR_VAL):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->str_val));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (SIP_STRS_VAL):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (stype == B_TRUE) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val->strs_val.s1.sip_str_ptr != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->strs_val.s1));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val->strs_val.s2.sip_str_ptr != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->strs_val.s2));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (SIP_INTSTR_VAL):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (stype == B_TRUE) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val->intstr_str.sip_str_ptr != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->intstr_str));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->intstr_int));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (SIP_AUTH_VAL):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->auth_val));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && *error == 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Generic function to get value from a header given the value type and
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * the string info (for multi-string values).
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_val_from_msg(sip_msg_t msg, char *hdr_name, int val_type,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t stype, boolean_t empty_val, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const _sip_header_t *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(msg, hdr_name, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && empty_val == B_FALSE)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_val_from_hdr(value, val_type, stype, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get the URI from the value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_cftruri_from_val(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *cftrvalue;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi cftrvalue = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If the value is BAD, update error to reflect it.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && value->value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&cftrvalue->cftr_uri);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get display name from the value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_cftrname_from_val(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *cftrvalue;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi cftrvalue = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If the value is BAD, update error to reflect it.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && value->value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (cftrvalue->cftr_name);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Contact header can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * so we require a value to be passed in to get a value.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_contact_uri_str(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftruri_from_val(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Contact header can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * so we require a value to be passed in to get a value.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_contact_display_name(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftrname_from_val(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Route header can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * so we require a value to be passed in to get a value.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_route_uri_str(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftruri_from_val(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Route header can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * so we require a value to be passed in to get a value.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_route_display_name(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftrname_from_val(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get URI from the SIP message
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_cftruri_from_msg(sip_msg_t sip_msg, int *error, char *hdrname)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_hdr_value_t *value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const struct sip_header *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(sip_msg, hdrname, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If the value is BAD, update error to reflect it.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&value->cftr_uri);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get display name from the SIP message
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_cftrname_from_msg(sip_msg_t sip_msg, int *error, char *hdrname)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_hdr_value_t *value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const struct sip_header *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(sip_msg, hdrname, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If the value is BAD, update error to reflect it.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (value->cftr_name);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get FROM URI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_from_uri_str(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftruri_from_msg(sip_msg, error, SIP_FROM));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get FROM display name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_from_display_name(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftrname_from_msg(sip_msg, error, SIP_FROM));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the FROM tag
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_from_tag(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_hdr_value_t *value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const struct sip_header *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(sip_msg, SIP_FROM, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If the value is BAD, update error to reflect it.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_param_value((sip_header_value_t)value, "tag", error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get TO URI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_to_uri_str(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftruri_from_msg(sip_msg, error, SIP_TO));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get TO display name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_to_display_name(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_cftrname_from_msg(sip_msg, error, SIP_TO));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get TO tag
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_to_tag(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_hdr_value_t *value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const struct sip_header *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(sip_msg, SIP_TO, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If the value is BAD, update error to reflect it.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_param_value((sip_header_value_t)value, "tag", error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the Call-Id
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_callid(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CALL_ID, SIP_STR_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_TRUE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define SIP_CSEQ_NUM 1
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define SIP_CSEQ_METHOD 2
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get number/method from the CSEQ header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_cseq_val(sip_msg_t msg, int type, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const _sip_header_t *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(msg, SIP_CSEQ, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi val = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi switch (type) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case SIP_CSEQ_NUM:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->cseq_num));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case SIP_CSEQ_METHOD:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->cseq_method));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get CSEQ number
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_callseq_num(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_cseq_val(sip_msg, SIP_CSEQ_NUM, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get CSEQ method
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_method_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_callseq_method(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_method_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_method_t *)sip_get_cseq_val(sip_msg, SIP_CSEQ_METHOD, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Via header can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * so we require a value to be passed in.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_via_sent_by_host(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *via_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_value = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&via_value->via_sent_by_host);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Via header can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * so we require a value to be passed in.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_via_sent_by_port(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *via_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_value = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (via_value->via_sent_by_port);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the protocol version from the VIA value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_via_sent_protocol_version(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *via_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_value = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&via_value->via_protocol_vers);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the protocol name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_via_sent_protocol_name(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *via_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_value = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&via_value->via_protocol_name);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the transport from the VIA value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_via_sent_transport(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *via_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_value = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&via_value->via_protocol_transport);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get the branch id from the topmost VIA header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vichar *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_branchid(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_parsed_header_t *parsed_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *via_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_str_t *param_value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *bid;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_search_for_header(_sip_msg, SIP_VIA, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_parse_via_header(header, &parsed_header) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (parsed_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_value = (sip_hdr_value_t *)parsed_header->value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_value == NULL || via_value->sip_value_state == SIP_VALUE_BAD) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param_value = sip_get_param_value((sip_header_value_t)via_value,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "branch", error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (param_value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi bid = (char *)malloc(param_value->sip_str_len + 1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (bid == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = ENOMEM;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) strncpy(bid, param_value->sip_str_ptr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param_value->sip_str_len);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi bid[param_value->sip_str_len] = '\0';
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (bid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * adds branchid to the topmost VIA header, if a branchid already exists,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * returns error.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_branchid_to_via(sip_msg_t sip_msg, char *branchid)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int err = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int plen;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header_t via_hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * If there is already a branchid param, error?
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_get_branchid(sip_msg, NULL) != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_hdr == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plen = strlen(branchid) + strlen("branch=") + 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param = malloc(plen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (param == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(param, plen, "branch=%s", branchid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) sip_add_param(via_hdr, param, &err);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(param);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (err);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * returns the number of VIA headers in the SIP message
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_num_via(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_header_t hdr;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int via_cnt = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (via_cnt);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (hdr != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi via_cnt++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (via_cnt);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return Max-Forward value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_maxforward(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_val_from_msg(sip_msg, SIP_MAX_FORWARDS, SIP_INT_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (r == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (*r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get the content type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_content_type(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STRS_VAL, B_TRUE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get the content sub-type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_content_sub_type(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STRS_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the content-length value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_content_length(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_LENGTH,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_INT_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (r == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (*r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get allow-events
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_allow_events(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_TRUE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get event
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_event(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_EVENT, SIP_STR_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get subscription state
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_substate(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBSCRIPTION_STATE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STR_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get accept type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_accept_type(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get accept subtype
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_accept_sub_type(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * accept-encode can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_accept_enc(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * accept-language can have more than one value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_accept_lang(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get URI from the alert-info header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_alert_info_uri(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get method from allow header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_method_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_allow_method(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_val_from_hdr(val, SIP_INT_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : (sip_method_t)*r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get URI from call-info header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_call_info_uri(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get content-disposition value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_content_disp(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_DIS,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STR_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get content-encoding value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_content_enc(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get content-language value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_content_lang(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * sip_get_date_time, day, wkday, month, year
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define D_TIME 0x01
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define D_DAY 0x02
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define D_MONTH 0x03
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define D_YEAR 0x04
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define D_WKDAY 0x05
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define D_TIMEZONE 0x06
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get date information
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_val(sip_msg_t msg, int type, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const _sip_header_t *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(msg, SIP_DATE, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi val = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi switch (type) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (D_TIME):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->date_t));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (D_DAY):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->date_d));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (D_MONTH):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->date_m));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (D_YEAR):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->date_y));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (D_WKDAY):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->date_wd));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (D_TIMEZONE):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->date_tz));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get time value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_time(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_date_val(sip_msg, D_TIME, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get day
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_day(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r = NULL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_date_val(sip_msg, D_DAY, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *(int *)r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get month
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_month(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_date_val(sip_msg, D_MONTH, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get year
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_year(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_date_val(sip_msg, D_YEAR, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get day of the week
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_wkday(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_date_val(sip_msg, D_WKDAY, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get the timezone
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_date_timezone(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_date_val(sip_msg, D_TIMEZONE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get error-info URI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_error_info_uri(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get priv-value from privacy
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_priv_value(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * return expires value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_expires(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_val_from_msg(sip_msg, SIP_EXPIRE, SIP_INT_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (r == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (*r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get reply-to value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_in_reply_to(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get min-expires value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_min_expires(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_val_from_msg(sip_msg, SIP_MIN_EXPIRE, SIP_INT_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (r == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (*r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get mime-version
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_mime_version(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_MIME_VERSION,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STR_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get organization value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_org(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_ORGANIZATION,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STR_VAL, B_FALSE, B_TRUE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get priority value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_priority(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_PRIORITY,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STR_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get display name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_pidentity_display_name(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get URI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_pidenty_uri_str(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get display name from passerted-identity header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_passertedid_display_name(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_pidentity_display_name(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get URI from passerted-identity header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_passertedid_uri_str(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_pidenty_uri_str(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get display name from ppreferred-identity header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_ppreferredid_display_name(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_pidentity_display_name(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get URI from ppreferred-identity header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_ppreferredid_uri_str(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_get_pidenty_uri_str(value, error));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define SIP_RACK_RESP_NUM 1
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define SIP_RACK_CSEQ_NUM 2
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define SIP_RACK_METHOD 3
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Get rack information
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_rack_val(sip_msg_t msg, int type, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const _sip_header_t *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (msg == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(msg, SIP_RACK, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi val = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi switch (type) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case SIP_RACK_RESP_NUM:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->rack_resp));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case SIP_RACK_CSEQ_NUM:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->rack_cseq));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case SIP_RACK_METHOD:
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->rack_method));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get response number for rack
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_rack_resp_num(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_rack_val(sip_msg, SIP_RACK_RESP_NUM, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get sequence number for rack
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_rack_cseq_num(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_rack_val(sip_msg, SIP_RACK_CSEQ_NUM, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get method for rack
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_method_t
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_rack_method(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_method_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_method_t *)sip_get_rack_val(sip_msg, SIP_RACK_METHOD, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get response number from rseq
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_rseq_resp_num(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (int *)sip_get_val_from_msg(sip_msg, SIP_RSEQ, SIP_INT_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r == NULL ? -1 : *r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get reply-to display name
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_replyto_display_name(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_REPLYTO,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STRS_VAL, B_TRUE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get reply-to URI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_replyto_uri_str(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_REPLYTO,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_STRS_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get require value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_require(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get retry-after time
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_retry_after_time(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = (int *)sip_get_val_from_msg(sip_msg, SIP_RETRY_AFTER,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_INTSTR_VAL, B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (t == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (*t);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get retry-after comments
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_retry_after_cmts(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_RETRY_AFTER,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_INTSTR_VAL, B_TRUE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get subject
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_subject(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBJECT, SIP_STR_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_TRUE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get supported
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_supported(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get timestamp delay
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_tstamp_delay(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = sip_get_val_from_msg(sip_msg, SIP_TIMESTAMP, SIP_STRS_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (t);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get timestamp
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_tstamp_value(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = sip_get_val_from_msg(sip_msg, SIP_TIMESTAMP, SIP_STRS_VAL, B_TRUE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (t);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get unsupported value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_unsupported(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get server value from message
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_server(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SERVER, SIP_STR_VAL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get user-agent value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_user_agent(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_msg(sip_msg, SIP_USER_AGENT, SIP_STR_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define W_CODE 0x05
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define W_AGENT 0x06
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#define W_TEXT 0x07
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get warning info
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic void *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_warninfo(sip_header_value_t value, int info, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (val->sip_value_state == SIP_VALUE_BAD) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi switch (info) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (W_CODE):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->warn_code));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (W_AGENT):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->warn_agt));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi case (W_TEXT):
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&(val->warn_text));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get warning code
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_warning_code(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int *c;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi c = (int *)sip_get_warninfo(value, W_CODE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (c == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (-1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (*c);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get warning agent
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_warning_agent(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_warninfo(value, W_AGENT, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get warning text
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_warning_text(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = (sip_str_t *)sip_get_warninfo(value, W_TEXT, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get authorization scheme
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_author_scheme(sip_msg_t sip_msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_msg(sip_msg, SIP_AUTHOR, SIP_AUTH_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get authentication parameter
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic const sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_auth_param(sip_msg_t msg, char *hdr_name, char *pname, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const _sip_header_t *header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_param_t *param;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (msg == NULL || pname == NULL || hdr_name == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header = sip_get_header(msg, hdr_name, NULL, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi value = (sip_hdr_value_t *)sip_get_header_value(header, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EPROTO;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi param = sip_get_param_from_list(value->auth_param, pname);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (param != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (&param->param_value);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get authentication parameter
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_author_param(sip_msg_t sip_msg, char *name, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_auth_param(sip_msg, SIP_AUTHOR, name, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get authentication info
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_authen_info(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get proxy-authentication scheme
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_proxy_authen_scheme(sip_msg_t msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_msg(msg, SIP_PROXY_AUTHEN, SIP_AUTH_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get proxy authentication parameter
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_proxy_authen_param(sip_msg_t sip_msg, char *name, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_auth_param(sip_msg, SIP_PROXY_AUTHEN, name, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get proxy-authorization scheme
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_proxy_author_scheme(sip_msg_t msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_msg(msg, SIP_PROXY_AUTHOR, SIP_AUTH_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get proxy-authorization parameter
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_proxy_author_param(sip_msg_t sip_msg, char *name, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_auth_param(sip_msg, SIP_PROXY_AUTHOR, name, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get proxy-require
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_proxy_require(sip_header_value_t value, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_hdr_value_t *val = (sip_hdr_value_t *)value;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (error != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *error = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get www-authentication scheme
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_www_authen_scheme(sip_msg_t msg, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_val_from_msg(msg, SIP_WWW_AUTHEN, SIP_AUTH_VAL, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * get www-authentication parameter
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viconst sip_str_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_get_www_authen_param(sip_msg_t sip_msg, char *name, int *error)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi const sip_str_t *r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_get_auth_param(sip_msg, SIP_WWW_AUTHEN, name, error);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}