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 <ctype.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <errno.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <pthread.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <strings.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <stdlib.h>
2c2c41837e330b002c4220a39638150db504fe0evi#include <sip.h>
2c2c41837e330b002c4220a39638150db504fe0evi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include "sip_msg.h"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi#include "sip_miscdefs.h"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Returns number of digits in the given int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_num_of_digits(int num)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int num_of_bytes = 0;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi do {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi num_of_bytes += 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi num = num / 10;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } while (num > 0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (num_of_bytes);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Return the int as a string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic char *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_int_to_str(int i)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int t;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int x;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *str;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (i < 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * the following two loops convert int i to str
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi count = 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = i;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while ((t = t / 10) != 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi count++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi str = calloc(1, sizeof (char) * count + 1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (str == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = i;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi for (x = 0; x < count; x++) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int a;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi a = t % 10;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi str[count - 1 - x] = a + '0';
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = t / 10;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi str[count] = '\0';
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Add quotes to the give str and return the quoted string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic char *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_aquot_to_str(char *str, boolean_t *alloc)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *new_str;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp = str;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi while (isspace(*tmp))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp++;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *alloc = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (*tmp != SIP_LAQUOT) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi size = strlen(str) + 2 * sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_str = calloc(1, size + 1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_str == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_str[0] = SIP_LAQUOT;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_str[1] = '\0';
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) strncat(new_str, str, strlen(str));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) strncat(new_str, ">", 1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_str[size] = '\0';
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *alloc = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (new_str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Add an empty header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_empty_hdr(sip_msg_t sip_msg, char *hdr_name)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int csize = sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || hdr_name == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c", hdr_name, SIP_HCOLON);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, hdr_name);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Generic function to add a header with two strings to message
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_2strs_to_msg(sip_msg_t sip_msg, char *hdr_name, char *str1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t qstr1, char *str2, char *plist, char sep)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int csize = sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || str1 == NULL || str2 == NULL ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (str1 != NULL && str1[0] == '\0') ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (str2 != NULL && str2[0] == '\0')) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(str1) + csize + strlen(str2) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(str1) + csize + strlen(str2) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi csize + strlen(plist) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (qstr1)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size += 2 * sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (qstr1) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size + 1, "%s %c \"%s\"%c%s%s",
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr_name, SIP_HCOLON, str1, sep, str2, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size + 1, "%s %c %s%c%s%s",
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr_name, SIP_HCOLON, str1, sep, str2, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (qstr1) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c \"%s\"%c%s%c%s%s", hdr_name, SIP_HCOLON,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi str1, sep, str2, SIP_SEMI, plist, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size + 1, "%s %c %s%c%s%c%s%s",
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi hdr_name, SIP_HCOLON, str1, sep, str2, SIP_SEMI,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plist, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Generic function to add a header with a string to message
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_str_to_msg(sip_msg_t sip_msg, char *hdr_name, char *str, char *plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char param_sep)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int csize = sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || str == NULL || (str != NULL && str[0] == '\0'))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + + strlen(str) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + + strlen(str) + csize + strlen(plist) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s%s", hdr_name, SIP_HCOLON, str, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s%c%s%s", hdr_name, SIP_HCOLON, str, param_sep,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plist, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Add an header with an int to sip_msg
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_int_to_msg(sip_msg_t sip_msg, char *hdr_name, int i, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *digit_str;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int csize = sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (hdr_name == NULL))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * the following two loops convert int i to str
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi digit_str = sip_int_to_str(i);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (digit_str == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(digit_str) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(digit_str) + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(plist) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(digit_str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s%s", hdr_name, SIP_HCOLON, digit_str, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s%c%s%s", hdr_name, SIP_HCOLON, digit_str,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SEMI, plist, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(digit_str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Add a header with an int and string to sip_msg
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_intstr_to_msg(sip_msg_t sip_msg, char *hdr_name, int i, char *s,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *digit_str;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int csize = sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (hdr_name == NULL))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi /*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * the following two loops convert int i to str
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi digit_str = sip_int_to_str(i);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (digit_str == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(digit_str) + csize + strlen(s) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + csize +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(digit_str) + csize + strlen(s) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi csize + strlen(plist) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(digit_str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (plist == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s %s%s", hdr_name, SIP_HCOLON, digit_str, s,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s %s%c%s%s", hdr_name, SIP_HCOLON, digit_str,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi s, SIP_SEMI, plist, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(digit_str);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Generic function to add Contact, From, To, Route or Record-Route header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vistatic int
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_name_aspec(sip_msg_t sip_msg, char *display_name, char *uri,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tags, boolean_t add_aquot, char *header_name, char *params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *t = uri;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t qalloc = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t palloc = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || uri == NULL || header_name == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (display_name != NULL && !add_aquot)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (add_aquot) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t = sip_add_aquot_to_str(uri, &qalloc);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (t == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (tags != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int plen;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (params != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plen = strlen(SIP_TAG) + strlen(tags) + 1;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi params = malloc(plen);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (params == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(params, plen, "%s%s", SIP_TAG, tags);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi params[plen - 1] = '\0';
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi palloc = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (display_name == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_2strs_to_msg(sip_msg, header_name, " ", B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi t, params, SIP_SP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_2strs_to_msg(sip_msg, header_name, display_name,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_TRUE, t, params, SIP_SP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (qalloc)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(t);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (palloc)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(params);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Accept = "Accept" ":" (media-range [ accept-params ])
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * media-range = ( "X/X" | (type "/" "*") | (type "/" subtype))*(";" parameter)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * accept-params = ";" "q" "=" qvalue *(accept-extension)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * accept-extension = ";" token [ "=" (token | quoted-str)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * function take two char ptrs - type and subtype - if any of them is NULL
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * the corresponding value will be set to "*" in header
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_accept(sip_msg_t sip_msg, char *type, char *subtype, char *m_par,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *a_par)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *plist;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t alloc = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (type == NULL && subtype == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_empty_hdr(sip_msg, SIP_ACCEPT);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((m_par != NULL) && (a_par != NULL)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi size = strlen(m_par) + strlen(a_par) + 2 * sizeof (char);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plist = calloc(1, size * sizeof (char));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) strncpy(plist, m_par, strlen(m_par));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) strncat(plist, ";", 1);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) strncat(plist, a_par, strlen(a_par));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi alloc = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (m_par != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plist = m_par;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plist = a_par;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if ((type != NULL) && (subtype != NULL)) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_2strs_to_msg(sip_msg, SIP_ACCEPT, type, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi subtype, plist, SIP_SLASH);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else if (type != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_2strs_to_msg(sip_msg, SIP_ACCEPT, type, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "*", plist, SIP_SLASH);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = EINVAL;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (alloc == B_TRUE)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(plist);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Accept-Encoding = "Accept-Encoding" ":" 1#(codings [ ";" "q" "=" qval])
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * codings = ( content-coding | "*" )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * content-coding = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * function take one char ptr, if NULL value will be set to "*"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_accept_enc(sip_msg_t sip_msg, char *code, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (code == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_ACCEPT_ENCODE, "*", plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_ACCEPT_ENCODE, code,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi plist, SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q""=" val])
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * language-range = ( ( 1*8ALPHA *("-" 1*8ALPHA))|"*")
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_accept_lang(sip_msg_t sip_msg, char *lang, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (lang == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_empty_hdr(sip_msg, SIP_ACCEPT_LANG);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_ACCEPT_LANG, lang, plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Alert-Info = "Alert-Info" ":" "<" URI ">"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_alert_info(sip_msg_t sip_msg, char *alert, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t alloc;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (alert == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp = sip_add_aquot_to_str(alert, &alloc);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (tmp == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_ALERT_INFO, tmp, plist, SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (alloc)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(tmp);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Allow = "Allow" ":" method-name1[, method-name2..]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * method-name = "INVITE" | "ACK" | "OPTIONS" | "CANCEL" | "BYE"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_allow(sip_msg_t sip_msg, sip_method_t method)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (method == 0 || method >= MAX_SIP_METHODS)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_ALLOW, sip_methods[method].name,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi NULL, (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Call-Info = "Call-Info" HCOLON info *(COMMA info)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * info = LAQUOT absoluteURI RAQUOT *( SEMI info-param)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * info-param = ( "purpose" EQUAL ( "icon" / "info"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "card" / token ) ) / generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_call_info(sip_msg_t sip_msg, char *uri, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t alloc;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (uri == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp = sip_add_aquot_to_str(uri, &alloc);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (tmp == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_str_to_msg(sip_msg, SIP_CALL_INFO, tmp, plist, SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (alloc)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(tmp);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Content-Disposition = "Content-Disposition" HCOLON
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * disp-type *( SEMI disp-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * disp-type = "render" / "session" / "icon" / "alert"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / disp-extension-token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * disp-param = handling-param / generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * handling-param = "handling" EQUAL
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ( "optional" / "required"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / other-handling )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * other-handling = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * disp-extension-token = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_content_disp(sip_msg_t sip_msg, char *dis_type, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (dis_type == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_CONTENT_DIS, dis_type, plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Content-Encoding = ( "Content-Encoding" / "e" ) HCOLON
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * content-coding *(COMMA content-coding)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * content-coding = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_content_enc(sip_msg_t sip_msg, char *code)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (code == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_CONTENT_ENCODE, code, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Content-Language = "Content-Language" HCOLON
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * language-tag *(COMMA language-tag)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * language-tag = primary-tag *( "-" subtag )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * primary-tag = 1*8ALPHA
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * subtag = 1*8ALPHA
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_content_lang(sip_msg_t sip_msg, char *lang)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (lang == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_CONTENT_LANG, lang, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Date = "Date" HCOLON SIP-date
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * SIP-date = rfc1123-date
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * rfc1123-date = wkday "," SP date1 SP time SP "GMT"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * date1 = 2DIGIT SP month SP 4DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ; day month year (e.g., 02 Jun 1982)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ; 00:00:00 - 23:59:59
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * wkday = "Mon" / "Tue" / "Wed"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "Thu" / "Fri" / "Sat" / "Sun"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * month = "Jan" / "Feb" / "Mar" / "Apr"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "May" / "Jun" / "Jul" / "Aug"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "Sep" / "Oct" / "Nov" / "Dec"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_date(sip_msg_t sip_msg, char *date)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (date == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_DATE, date, NULL, (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Error-Info = "Error-Info" HCOLON error-uri *(COMMA error-uri)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * error-uri = LAQUOT absoluteURI RAQUOT *( SEMI generic-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_error_info(sip_msg_t sip_msg, char *uri, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *tmp;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t alloc;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (uri == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi tmp = sip_add_aquot_to_str(uri, &alloc);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (tmp == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_str_to_msg(sip_msg, SIP_ERROR_INFO, tmp, plist, SIP_SEMI);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (alloc)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(tmp);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Expires = "Expires" HCOLON delta-seconds
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * delta-seconds = 1*DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_expires(sip_msg_t sip_msg, int secs)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (int)secs < 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_int_to_msg(sip_msg, SIP_EXPIRE, secs, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * In-Reply-To = "In-Reply-To" HCOLON callid *(COMMA callid)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * callid = word [ "@" word ]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_in_reply_to(sip_msg_t sip_msg, char *reply_id)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (reply_id == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_str_to_msg(sip_msg, SIP_IN_REPLY_TO, reply_id, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * RSeq = "RSeq" HCOLON response-num
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_rseq(sip_msg_t sip_msg, int resp_num)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || resp_num <= 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_int_to_msg(sip_msg, SIP_RSEQ, resp_num, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Min-Expires = "Min-Expires" HCOLON delta-seconds
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_min_expires(sip_msg_t sip_msg, int secs)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (int)secs < 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_int_to_msg(sip_msg, SIP_MIN_EXPIRE, secs, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * MIME-Version = "MIME-Version" HCOLON 1*DIGIT "." 1*DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_mime_version(sip_msg_t sip_msg, char *version)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (version == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_MIME_VERSION, version, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Organization = "Organization" HCOLON [TEXT-UTF8-TRIM]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_org(sip_msg_t sip_msg, char *org)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (org == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_empty_hdr(sip_msg, SIP_ORGANIZATION);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_ORGANIZATION, org, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Priority = "Priority" HCOLON priority-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * priority-value = "emergency" / "urgent" / "normal"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "non-urgent" / other-priority
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * other-priority = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_priority(sip_msg_t sip_msg, char *prio)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (prio == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_PRIORITY, prio, NULL, (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Reply-To = "Reply-To" HCOLON rplyto-spec
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * rplyto-spec = ( name-addr / addr-spec )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *( SEMI rplyto-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * rplyto-param = generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_reply_to(sip_msg_t sip_msg, char *uname, char *addr, char *plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t add_aquot)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, uname, addr, NULL, add_aquot,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_REPLYTO, plist));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Privacy-hdr = "Privacy" HCOLON priv-value *(";" priv-value)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * priv-value = "header" / "session" / "user" / "none" / "critical"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_privacy(sip_msg_t sip_msg, char *priv_val)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (priv_val == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_PRIVACY, priv_val, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Require = "Require" HCOLON option-tag *(COMMA option-tag)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * option-tag = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_require(sip_msg_t sip_msg, char *req)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (req == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_REQUIRE, req, NULL, (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Retry-After = "Retry-After" HCOLON delta-seconds
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * [ comment ] *( SEMI retry-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * retry-param = ("duration" EQUAL delta-seconds)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_retry_after(sip_msg_t sip_msg, int secs, char *cmt, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (secs <= 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (cmt == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_int_to_msg(sip_msg, SIP_RETRY_AFTER, secs, plist);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_intstr_to_msg(sip_msg, SIP_RETRY_AFTER, secs, cmt, plist);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Server = "Server" HCOLON server-val *(LWS server-val)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * server-val = product / comment
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * product = token [SLASH product-version]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * product-version = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_server(sip_msg_t sip_msg, char *svr)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (svr == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_SERVER, svr, NULL, (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Subject = ( "Subject" / "s" ) HCOLON [TEXT-UTF8-TRIM]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_subject(sip_msg_t sip_msg, char *subject)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (subject == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_empty_hdr(sip_msg, SIP_SUBJECT);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_SUBJECT, subject, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Supported = ( "Supported" / "k" ) HCOLON
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * [option-tag *(COMMA option-tag)]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_supported(sip_msg_t sip_msg, char *support)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (support == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_empty_hdr(sip_msg, SIP_SUPPORT);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_SUPPORT, support, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Timestamp = "Timestamp" HCOLON 1*(DIGIT)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * [ "." *(DIGIT) ] [ LWS delay ]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * delay = *(DIGIT) [ "." *(DIGIT) ]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_tstamp(sip_msg_t sip_msg, char *time, char *delay)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (delay == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_TIMESTAMP, time, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi } else {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_2strs_to_msg(sip_msg, SIP_TIMESTAMP, time,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi B_FALSE, delay, NULL, ' ');
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Unsupported = "Unsupported" HCOLON option-tag *(COMMA option-tag)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_unsupported(sip_msg_t sip_msg, char *unsupport)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (unsupport == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_UNSUPPORT, unsupport, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * User-Agent = "User-Agent" HCOLON server-val *(LWS server-val)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_user_agent(sip_msg_t sip_msg, char *usr)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (usr == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_str_to_msg(sip_msg, SIP_USER_AGENT, usr, NULL, (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Warning = "Warning" HCOLON warning-value *(COMMA warning-value)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * warning-value = warn-code SP warn-agent SP warn-text
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * warn-code = 3DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * warn-agent = hostport / pseudonym
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ; the name or pseudonym of the server adding
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ; the Warning header, for use in debugging
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * warn-text = quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * pseudonym = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_warning(sip_msg_t sip_msg, int code, char *addr, char *msg)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *hdr_name = SIP_WARNING;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || addr == NULL || msg == NULL ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi addr[0] == '\0' || msg == '\0' || code < 100 || code > 999) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + sizeof (char) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + sip_num_of_digits(code) + SIP_SPACE_LEN +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(addr) + SIP_SPACE_LEN + sizeof (char) + strlen(msg) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sizeof (char) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %d %s \"%s\"%s", hdr_name, SIP_HCOLON, code, addr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi msg, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * RAck = "RAck" HCOLON response-num LWS CSeq-num LWS Method
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * response-num = 1*DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * CSeq-num = 1*DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_rack(sip_msg_t sip_msg, int resp_num, int cseq, sip_method_t method)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *hdr_name = SIP_RACK;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || resp_num <= 0 || cseq < 0 || method <= 0 ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi method >= MAX_SIP_METHODS) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(hdr_name) + SIP_SPACE_LEN + sizeof (char) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + sip_num_of_digits(resp_num) + SIP_SPACE_LEN +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_num_of_digits(cseq) + SIP_SPACE_LEN +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(sip_methods[method].name) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %d %d %s%s", hdr_name, SIP_HCOLON, resp_num, cseq,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_methods[method].name, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Allow-Events = ( "Allow-Events" / "u" ) HCOLON event-type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA event-type)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_allow_events(sip_msg_t sip_msg, char *t_event)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_ALLOW_EVENTS, t_event, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Event = ( "Event" / "o" ) HCOLON event-type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *( SEMI event-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * event-type = event-package *( "." event-template )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * event-package = token-nodot
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * event-template = token-nodot
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * token-nodot = 1*( alphanum / "-" / "!" / "%" / "*"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "_" / "+" / "`" / "'" / "~" )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * event-param = generic-param / ( "id" EQUAL token )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_event(sip_msg_t sip_msg, char *t_event, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_EVENT, t_event, plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SEMI));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Subscription-State = "Subscription-State" HCOLON substate-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *( SEMI subexp-params )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * substate-value = "active" / "pending" / "terminated"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / extension-substate
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * extension-substate = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * subexp-params = ("reason" EQUAL event-reason-value)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / ("expires" EQUAL delta-seconds)*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / ("retry-after" EQUAL delta-seconds)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * event-reason-value = "deactivated"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "probation"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "rejected"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "timeout"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "giveup"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "noresource"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / event-reason-extension
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * event-reason-extension = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_substate(sip_msg_t sip_msg, char *sub, char *plist)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_SUBSCRIPTION_STATE, sub, plist,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SEMI));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Authorization = "Authorization" HCOLON credentials
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * credentials = ("Digest" LWS digest-response)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / other-response
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * digest-response = dig-resp *(COMMA dig-resp)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * dig-resp = username / realm / nonce / digest-uri
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / dresponse / algorithm / cnonce
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / opaque / message-qop
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / nonce-count / auth-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * username = "username" EQUAL username-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * username-value = quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * digest-uri = "uri" EQUAL LDQUOT digest-uri-value RDQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * digest-uri-value = rquest-uri ; Equal to request-uri as specified
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * by HTTP/1.1
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * message-qop = "qop" EQUAL qop-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * cnonce = "cnonce" EQUAL cnonce-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * cnonce-value = nonce-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * nonce-count = "nc" EQUAL nc-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * nc-value = 8LHEX
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * dresponse = "response" EQUAL request-digest
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * request-digest = LDQUOT 32LHEX RDQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * auth-param = auth-param-name EQUAL
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ( token / quoted-string )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * auth-param-name = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * other-response = auth-scheme LWS auth-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA auth-param)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * auth-scheme = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_author(sip_msg_t sip_msg, char *scheme, char *param)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_AUTHOR, scheme, param, SIP_SP));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Authentication-Info = "Authentication-Info" HCOLON ainfo
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA ainfo)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ainfo = nextnonce / message-qop
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / response-auth / cnonce
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / nonce-count
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * nextnonce = "nextnonce" EQUAL nonce-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * response-auth = "rspauth" EQUAL response-digest
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * response-digest = LDQUOT *LHEX RDQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_authen_info(sip_msg_t sip_msg, char *ainfo)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_AUTHEN_INFO, ainfo, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Proxy-Authenticate = "Proxy-Authenticate" HCOLON challenge
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * challenge = ("Digest" LWS digest-cln *(COMMA digest-cln))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / other-challenge
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * other-challenge = auth-scheme LWS auth-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA auth-param)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * digest-cln = realm / domain / nonce
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / opaque / stale / algorithm
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / qop-options / auth-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * realm = "realm" EQUAL realm-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * realm-value = quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * domain = "domain" EQUAL LDQUOT URI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *( 1*SP URI ) RDQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * URI = absoluteURI / abs-path
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * nonce = "nonce" EQUAL nonce-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * nonce-value = quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * opaque = "opaque" EQUAL quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * stale = "stale" EQUAL ( "true" / "false" )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * algorithm = "algorithm" EQUAL ( "MD5" / "MD5-sess"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / token )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * qop-options = "qop" EQUAL LDQUOT qop-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *("," qop-value) RDQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * qop-value = "auth" / "auth-int" / token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_proxy_authen(sip_msg_t sip_msg, char *pascheme, char *paparam)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_PROXY_AUTHEN, pascheme, paparam,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SP));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Proxy-Authorization = "Proxy-Authorization" HCOLON credentials
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_proxy_author(sip_msg_t sip_msg, char *paschem, char *paparam)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_PROXY_AUTHOR, paschem, paparam,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SP));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Proxy-Require = "Proxy-Require" HCOLON option-tag
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA option-tag)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * option-tag = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_proxy_require(sip_msg_t sip_msg, char *opt)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_PROXY_REQ, opt, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * WWW-Authenticate = "WWW-Authenticate" HCOLON challenge
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * extension-header = header-name HCOLON header-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * header-name = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * header-value = *(TEXT-UTF8char / UTF8-CONT / LWS)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * message-body = *OCTET
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_www_authen(sip_msg_t sip_msg, char *wascheme, char *waparam)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_str_to_msg(sip_msg, SIP_WWW_AUTHEN, wascheme, waparam,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SP));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Call-ID = ( "Call-ID" / "i" ) HCOLON callid
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_callid(sip_msg_t sip_msg, char *callid)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int ret;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t allocd = B_FALSE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (callid != NULL && callid[0] == '\0'))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (callid == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi callid = (char *)sip_guid();
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (callid == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi allocd = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi ret = sip_add_str_to_msg(sip_msg, SIP_CALL_ID, callid, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (char)NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (allocd)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi free(callid);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ret);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * CSeq = "CSeq" HCOLON 1*DIGIT LWS Method
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_cseq(sip_msg_t sip_msg, sip_method_t method, uint32_t cseq)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int r;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (int)cseq < 0 || method == 0 ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi method >= MAX_SIP_METHODS) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi r = sip_add_intstr_to_msg(sip_msg, SIP_CSEQ, cseq,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_methods[method].name, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (r);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Via = ( "Via" / "v" ) HCOLON via-parm *(COMMA via-parm)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-parm = sent-protocol LWS sent-by *( SEMI via-params )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-params = via-ttl / via-maddr
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / via-received / via-branch
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / via-extension
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-ttl = "ttl" EQUAL ttl
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-maddr = "maddr" EQUAL host
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-received = "received" EQUAL (IPv4address / IPv6address)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-branch = "branch" EQUAL token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * via-extension = generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * sent-protocol = protocol-name SLASH protocol-version
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * SLASH transport
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * protocol-name = "SIP" / token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * protocol-version = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * transport = "UDP" / "TCP" / "TLS" / "SCTP"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / other-transport
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * sent-by = host [ COLON port ]
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ttl = 1*3DIGIT ; 0 to 255
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi_sip_header_t *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_create_via_hdr(char *sent_protocol_transport, char *sent_by_host,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int sent_by_port, char *via_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(SIP_VIA) + SIP_SPACE_LEN + sizeof (char) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_SPACE_LEN + strlen(SIP_VERSION) + sizeof (char) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(sent_protocol_transport) + SIP_SPACE_LEN +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(sent_by_host) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sent_by_port > 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size += SIP_SPACE_LEN + sizeof (char) + SIP_SPACE_LEN +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sip_num_of_digits(sent_by_port);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_params != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size += SIP_SPACE_LEN + sizeof (char) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(via_params);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header->sip_hdr_start == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi count = snprintf(new_header->sip_hdr_current, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %s/%s %s",
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_VIA, SIP_HCOLON, SIP_VERSION, sent_protocol_transport,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sent_by_host);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header->sip_hdr_current += count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size -= count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sent_by_port > 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi count = snprintf(new_header->sip_hdr_current, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi " %c %d", SIP_HCOLON, sent_by_port);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header->sip_hdr_current += count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size -= count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (via_params != NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi count = snprintf(new_header->sip_hdr_current, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi " %c%s", SIP_SEMI, via_params);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header->sip_hdr_current += count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size -= count;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_current, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s", SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (new_header);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * There can be multiple via headers we always append the header.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * We expect the via params to be a semi-colon separated list of parameters.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * We will add a semi-clone, before adding the list to the header.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_via(sip_msg_t sip_msg, char *sent_protocol_transport,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *sent_by_host, int sent_by_port, char *via_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg_t *_sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || sent_protocol_transport == NULL ||
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sent_by_host == NULL || sent_by_port < 0) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg = (_sip_msg_t *)sip_msg;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_create_via_hdr(sent_protocol_transport, sent_by_host,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sent_by_port, via_params);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Max-Forwards = "Max-Forwards" HCOLON 1*DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_maxforward(sip_msg_t sip_msg, uint_t maxforward)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || (int)maxforward < 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_int_to_msg(sip_msg, SIP_MAX_FORWARDS, maxforward,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi NULL));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Content-Type = ( "Content-Type" / "c" ) HCOLON media-type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * media-type = m-type SLASH m-subtype *(SEMI m-parameter)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * m-type = discrete-type / composite-type
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * discrete-type = "text" / "image" / "audio" / "video"
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / "application" / extension-token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * composite-type = "message" / "multipart" / extension-token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * extension-token = ietf-token / x-token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ietf-token = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * x-token = "x-" token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * m-subtype = extension-token / iana-token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * iana-token = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * m-parameter = m-attribute EQUAL m-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * m-attribute = token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * m-value = token / quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_content_type(sip_msg_t sip_msg, char *type, char *subtype)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (sip_msg == NULL || type == NULL || subtype == NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_2strs_to_msg(sip_msg, SIP_CONTENT_TYPE, type, B_FALSE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi subtype, NULL, SIP_SLASH));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Content-Length = ( "Content-Length" / "l" ) HCOLON 1*DIGIT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_content_length(_sip_msg_t *_sip_msg, int length)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_header_t *new_header;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi int header_size;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg == NULL || length < 0)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (EINVAL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_cannot_be_modified) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOTSUP);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi header_size = strlen(SIP_CONTENT_LENGTH) + SIP_SPACE_LEN +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi sizeof (char) + SIP_SPACE_LEN + sip_num_of_digits(length) +
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi strlen(SIP_CRLF) + strlen(SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi new_header = sip_new_header(header_size);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (new_header == NULL) {
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (ENOMEM);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi }
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) snprintf(new_header->sip_hdr_start, header_size + 1,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi "%s %c %u%s%s", SIP_CONTENT_LENGTH, SIP_HCOLON, length,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_CRLF, SIP_CRLF);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi if (_sip_msg->sip_msg_buf != NULL)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi _sip_msg->sip_msg_modified = B_TRUE;
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (0);
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Contact = ("Contact" / "m" ) HCOLON
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * ( STAR / (contact-param *(COMMA contact-param)))
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * contact-param = (name-addr / addr-spec) *(SEMI contact-params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * name-addr = [ display-name ] LAQUOT addr-spec RAQUOT
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * addr-spec = SIP-URI / SIPS-URI / absoluteURI
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * display-name = *(token LWS)/ quoted-string
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * contact-params = c-p-q / c-p-expires
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / contact-extension
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_contact(sip_msg_t sip_msg, char *display_name, char *contact_uri,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t add_aquot, char *contact_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, contact_uri, NULL,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi add_aquot, SIP_CONTACT, contact_params));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * From = ( "From" / "f" ) HCOLON from-spec
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * from-spec = ( name-addr / addr-spec )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *( SEMI from-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * from-param = tag-param / generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * tag-param = "tag" EQUAL token
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi *
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Since there can be more than one tags, fromtags is a semi colon separated
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * list of tags.
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_from(sip_msg_t sip_msg, char *display_name, char *from_uri,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *fromtags, boolean_t add_aquot, char *from_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, from_uri, fromtags,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi add_aquot, SIP_FROM, from_params));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * To = ( "To" / "t" ) HCOLON ( name-addr
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * / addr-spec ) *( SEMI to-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * to-param = tag-param / generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_to(sip_msg_t sip_msg, char *display_name, char *to_uri,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *totags, boolean_t add_aquot, char *to_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, to_uri, totags,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi add_aquot, SIP_TO, to_params));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Route = "Route" HCOLON route-param *(COMMA route-param)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * route-param = name-addr *( SEMI rr-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_route(sip_msg_t sip_msg, char *display_name, char *uri,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *route_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, uri, NULL, B_TRUE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_ROUTE, route_params));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * Record-Route = "Record-Route" HCOLON rec-route *(COMMA rec-route)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * rec-route = name-addr *( SEMI rr-param )
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * rr-param = generic-param
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_record_route(sip_msg_t sip_msg, char *display_name, char *uri,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi char *route_params)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, uri, NULL, B_TRUE,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_RECORD_ROUTE, route_params));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * PAssertedID = "P-Asserted-Identity" HCOLON PAssertedID-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA PAssertedID-value)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * PAssertedID-value = name-addr / addr-spec
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_passertedid(sip_msg_t sip_msg, char *display_name, char *addr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t add_aquot)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, addr, NULL, add_aquot,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_PASSERTEDID, NULL));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi/*
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * PPreferredID = "P-Preferred-Identity" HCOLON PPreferredID-value
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * *(COMMA PPreferredID-value)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi * PPreferredID-value = name-addr / addr-spec
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi */
40cb5e5daa7b80bb70fcf8dadfb20f9281566331viint
40cb5e5daa7b80bb70fcf8dadfb20f9281566331visip_add_ppreferredid(sip_msg_t sip_msg, char *display_name, char *addr,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi boolean_t add_aquot)
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi{
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi return (sip_add_name_aspec(sip_msg, display_name, addr, NULL, add_aquot,
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi SIP_PPREFERREDID, NULL));
40cb5e5daa7b80bb70fcf8dadfb20f9281566331vi}