140cb5e5dSvi117747 /*
240cb5e5dSvi117747 * CDDL HEADER START
340cb5e5dSvi117747 *
440cb5e5dSvi117747 * The contents of this file are subject to the terms of the
540cb5e5dSvi117747 * Common Development and Distribution License (the "License").
640cb5e5dSvi117747 * You may not use this file except in compliance with the License.
740cb5e5dSvi117747 *
840cb5e5dSvi117747 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
940cb5e5dSvi117747 * or http://www.opensolaris.org/os/licensing.
1040cb5e5dSvi117747 * See the License for the specific language governing permissions
1140cb5e5dSvi117747 * and limitations under the License.
1240cb5e5dSvi117747 *
1340cb5e5dSvi117747 * When distributing Covered Code, include this CDDL HEADER in each
1440cb5e5dSvi117747 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1540cb5e5dSvi117747 * If applicable, add the following below this CDDL HEADER, with the
1640cb5e5dSvi117747 * fields enclosed by brackets "[]" replaced with your own identifying
1740cb5e5dSvi117747 * information: Portions Copyright [yyyy] [name of copyright owner]
1840cb5e5dSvi117747 *
1940cb5e5dSvi117747 * CDDL HEADER END
2040cb5e5dSvi117747 */
2140cb5e5dSvi117747
2240cb5e5dSvi117747 /*
23*2c2c4183Svi117747 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
2440cb5e5dSvi117747 * Use is subject to license terms.
2540cb5e5dSvi117747 */
2640cb5e5dSvi117747
2740cb5e5dSvi117747 #pragma ident "%Z%%M% %I% %E% SMI"
2840cb5e5dSvi117747
29*2c2c4183Svi117747 #include <stdio.h>
30*2c2c4183Svi117747 #include <stdlib.h>
31*2c2c4183Svi117747 #include <strings.h>
32*2c2c4183Svi117747 #include <errno.h>
33*2c2c4183Svi117747 #include <pthread.h>
34*2c2c4183Svi117747 #include <sip.h>
35*2c2c4183Svi117747
3640cb5e5dSvi117747 #include "sip_msg.h"
3740cb5e5dSvi117747
3840cb5e5dSvi117747 /*
3940cb5e5dSvi117747 * Generic function to get int or string value from a header
4040cb5e5dSvi117747 */
4140cb5e5dSvi117747 static void *
sip_get_val_from_hdr(sip_hdr_value_t * val,int val_type,boolean_t stype,int * error)4240cb5e5dSvi117747 sip_get_val_from_hdr(sip_hdr_value_t *val, int val_type, boolean_t stype,
4340cb5e5dSvi117747 int *error)
4440cb5e5dSvi117747 {
4540cb5e5dSvi117747 if (error != NULL)
4640cb5e5dSvi117747 *error = 0;
4740cb5e5dSvi117747
4840cb5e5dSvi117747 if (val == NULL || val->sip_value_state == SIP_VALUE_DELETED) {
4940cb5e5dSvi117747 if (error != NULL)
5040cb5e5dSvi117747 *error = EINVAL;
5140cb5e5dSvi117747 return (NULL);
5240cb5e5dSvi117747 }
5340cb5e5dSvi117747
5440cb5e5dSvi117747 if (val->sip_value_state == SIP_VALUE_BAD)
5540cb5e5dSvi117747 *error = EPROTO;
5640cb5e5dSvi117747
5740cb5e5dSvi117747 switch (val_type) {
5840cb5e5dSvi117747 case (SIP_INT_VAL):
5940cb5e5dSvi117747 return (&(val->int_val));
6040cb5e5dSvi117747 case (SIP_STR_VAL):
6140cb5e5dSvi117747 return (&(val->str_val));
6240cb5e5dSvi117747 case (SIP_STRS_VAL):
6340cb5e5dSvi117747 if (stype == B_TRUE) {
6440cb5e5dSvi117747 if (val->strs_val.s1.sip_str_ptr != NULL)
6540cb5e5dSvi117747 return (&(val->strs_val.s1));
6640cb5e5dSvi117747 return (NULL);
6740cb5e5dSvi117747 }
6840cb5e5dSvi117747 if (val->strs_val.s2.sip_str_ptr != NULL)
6940cb5e5dSvi117747 return (&(val->strs_val.s2));
7040cb5e5dSvi117747 return (NULL);
7140cb5e5dSvi117747 case (SIP_INTSTR_VAL):
7240cb5e5dSvi117747 if (stype == B_TRUE) {
7340cb5e5dSvi117747 if (val->intstr_str.sip_str_ptr != NULL)
7440cb5e5dSvi117747 return (&(val->intstr_str));
7540cb5e5dSvi117747 else
7640cb5e5dSvi117747 return (NULL);
7740cb5e5dSvi117747 }
7840cb5e5dSvi117747 return (&(val->intstr_int));
7940cb5e5dSvi117747 case (SIP_AUTH_VAL):
8040cb5e5dSvi117747 return (&(val->auth_val));
8140cb5e5dSvi117747 }
8240cb5e5dSvi117747 if (error != NULL && *error == 0)
8340cb5e5dSvi117747 *error = EINVAL;
8440cb5e5dSvi117747 return (NULL);
8540cb5e5dSvi117747 }
8640cb5e5dSvi117747
8740cb5e5dSvi117747 /*
8840cb5e5dSvi117747 * Generic function to get value from a header given the value type and
8940cb5e5dSvi117747 * the string info (for multi-string values).
9040cb5e5dSvi117747 */
9140cb5e5dSvi117747 static void *
sip_get_val_from_msg(sip_msg_t msg,char * hdr_name,int val_type,boolean_t stype,boolean_t empty_val,int * error)9240cb5e5dSvi117747 sip_get_val_from_msg(sip_msg_t msg, char *hdr_name, int val_type,
9340cb5e5dSvi117747 boolean_t stype, boolean_t empty_val, int *error)
9440cb5e5dSvi117747 {
9540cb5e5dSvi117747 const _sip_header_t *header;
9640cb5e5dSvi117747 sip_hdr_value_t *value;
9740cb5e5dSvi117747
9840cb5e5dSvi117747 if (error != NULL)
9940cb5e5dSvi117747 *error = 0;
10040cb5e5dSvi117747 if (msg == NULL) {
10140cb5e5dSvi117747 if (error != NULL)
10240cb5e5dSvi117747 *error = EINVAL;
10340cb5e5dSvi117747 return (NULL);
10440cb5e5dSvi117747 }
10540cb5e5dSvi117747
10640cb5e5dSvi117747 header = sip_get_header(msg, hdr_name, NULL, error);
10740cb5e5dSvi117747 if (header == NULL) {
10840cb5e5dSvi117747 if (error != NULL)
10940cb5e5dSvi117747 *error = EINVAL;
11040cb5e5dSvi117747 return (NULL);
11140cb5e5dSvi117747 }
11240cb5e5dSvi117747
11340cb5e5dSvi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
11440cb5e5dSvi117747 if (value == NULL) {
11540cb5e5dSvi117747 if (error != NULL && empty_val == B_FALSE)
11640cb5e5dSvi117747 *error = EPROTO;
11740cb5e5dSvi117747 return (NULL);
11840cb5e5dSvi117747 }
11940cb5e5dSvi117747 return (sip_get_val_from_hdr(value, val_type, stype, error));
12040cb5e5dSvi117747 }
12140cb5e5dSvi117747
12240cb5e5dSvi117747 /*
12340cb5e5dSvi117747 * Get the URI from the value
12440cb5e5dSvi117747 */
12540cb5e5dSvi117747 const sip_str_t *
sip_get_cftruri_from_val(sip_header_value_t value,int * error)12640cb5e5dSvi117747 sip_get_cftruri_from_val(sip_header_value_t value, int *error)
12740cb5e5dSvi117747 {
12840cb5e5dSvi117747 sip_hdr_value_t *cftrvalue;
12940cb5e5dSvi117747
13040cb5e5dSvi117747 if (error != NULL)
13140cb5e5dSvi117747 *error = 0;
13240cb5e5dSvi117747
13340cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
13440cb5e5dSvi117747 if (error != NULL)
13540cb5e5dSvi117747 *error = EINVAL;
13640cb5e5dSvi117747 return (NULL);
13740cb5e5dSvi117747 }
13840cb5e5dSvi117747 cftrvalue = (sip_hdr_value_t *)value;
13940cb5e5dSvi117747 /*
14040cb5e5dSvi117747 * If the value is BAD, update error to reflect it.
14140cb5e5dSvi117747 */
14240cb5e5dSvi117747 if (error != NULL && value->value_state == SIP_VALUE_BAD)
14340cb5e5dSvi117747 *error = EPROTO;
14440cb5e5dSvi117747 return (&cftrvalue->cftr_uri);
14540cb5e5dSvi117747 }
14640cb5e5dSvi117747
14740cb5e5dSvi117747 /*
14840cb5e5dSvi117747 * Get display name from the value
14940cb5e5dSvi117747 */
15040cb5e5dSvi117747 const sip_str_t *
sip_get_cftrname_from_val(sip_header_value_t value,int * error)15140cb5e5dSvi117747 sip_get_cftrname_from_val(sip_header_value_t value, int *error)
15240cb5e5dSvi117747 {
15340cb5e5dSvi117747 sip_hdr_value_t *cftrvalue;
15440cb5e5dSvi117747
15540cb5e5dSvi117747 if (error != NULL)
15640cb5e5dSvi117747 *error = 0;
15740cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
15840cb5e5dSvi117747 if (error != NULL)
15940cb5e5dSvi117747 *error = EINVAL;
16040cb5e5dSvi117747 return (NULL);
16140cb5e5dSvi117747 }
16240cb5e5dSvi117747 cftrvalue = (sip_hdr_value_t *)value;
16340cb5e5dSvi117747 /*
16440cb5e5dSvi117747 * If the value is BAD, update error to reflect it.
16540cb5e5dSvi117747 */
16640cb5e5dSvi117747 if (error != NULL && value->value_state == SIP_VALUE_BAD)
16740cb5e5dSvi117747 *error = EPROTO;
16840cb5e5dSvi117747 return (cftrvalue->cftr_name);
16940cb5e5dSvi117747 }
17040cb5e5dSvi117747
17140cb5e5dSvi117747 /*
17240cb5e5dSvi117747 * Contact header can have more than one value
17340cb5e5dSvi117747 * so we require a value to be passed in to get a value.
17440cb5e5dSvi117747 */
17540cb5e5dSvi117747 const sip_str_t *
sip_get_contact_uri_str(sip_header_value_t value,int * error)17640cb5e5dSvi117747 sip_get_contact_uri_str(sip_header_value_t value, int *error)
17740cb5e5dSvi117747 {
17840cb5e5dSvi117747 return (sip_get_cftruri_from_val(value, error));
17940cb5e5dSvi117747 }
18040cb5e5dSvi117747
18140cb5e5dSvi117747 /*
18240cb5e5dSvi117747 * Contact header can have more than one value
18340cb5e5dSvi117747 * so we require a value to be passed in to get a value.
18440cb5e5dSvi117747 */
18540cb5e5dSvi117747 const sip_str_t *
sip_get_contact_display_name(sip_header_value_t value,int * error)18640cb5e5dSvi117747 sip_get_contact_display_name(sip_header_value_t value, int *error)
18740cb5e5dSvi117747 {
18840cb5e5dSvi117747 return (sip_get_cftrname_from_val(value, error));
18940cb5e5dSvi117747 }
19040cb5e5dSvi117747
19140cb5e5dSvi117747 /*
19240cb5e5dSvi117747 * Route header can have more than one value
19340cb5e5dSvi117747 * so we require a value to be passed in to get a value.
19440cb5e5dSvi117747 */
19540cb5e5dSvi117747 const sip_str_t *
sip_get_route_uri_str(sip_header_value_t value,int * error)19640cb5e5dSvi117747 sip_get_route_uri_str(sip_header_value_t value, int *error)
19740cb5e5dSvi117747 {
19840cb5e5dSvi117747 return (sip_get_cftruri_from_val(value, error));
19940cb5e5dSvi117747 }
20040cb5e5dSvi117747
20140cb5e5dSvi117747 /*
20240cb5e5dSvi117747 * Route header can have more than one value
20340cb5e5dSvi117747 * so we require a value to be passed in to get a value.
20440cb5e5dSvi117747 */
20540cb5e5dSvi117747 const sip_str_t *
sip_get_route_display_name(sip_header_value_t value,int * error)20640cb5e5dSvi117747 sip_get_route_display_name(sip_header_value_t value, int *error)
20740cb5e5dSvi117747 {
20840cb5e5dSvi117747 return (sip_get_cftrname_from_val(value, error));
20940cb5e5dSvi117747 }
21040cb5e5dSvi117747
21140cb5e5dSvi117747 /*
21240cb5e5dSvi117747 * Get URI from the SIP message
21340cb5e5dSvi117747 */
21440cb5e5dSvi117747 const sip_str_t *
sip_get_cftruri_from_msg(sip_msg_t sip_msg,int * error,char * hdrname)21540cb5e5dSvi117747 sip_get_cftruri_from_msg(sip_msg_t sip_msg, int *error, char *hdrname)
21640cb5e5dSvi117747 {
21740cb5e5dSvi117747 const sip_hdr_value_t *value;
21840cb5e5dSvi117747 const struct sip_header *header;
21940cb5e5dSvi117747
22040cb5e5dSvi117747 if (error != NULL)
22140cb5e5dSvi117747 *error = 0;
22240cb5e5dSvi117747 if (sip_msg == NULL) {
22340cb5e5dSvi117747 if (error != NULL)
22440cb5e5dSvi117747 *error = EINVAL;
22540cb5e5dSvi117747 return (NULL);
22640cb5e5dSvi117747 }
22740cb5e5dSvi117747
22840cb5e5dSvi117747 header = sip_get_header(sip_msg, hdrname, NULL, error);
22940cb5e5dSvi117747 if (header == NULL) {
23040cb5e5dSvi117747 if (error != NULL)
23140cb5e5dSvi117747 *error = EINVAL;
23240cb5e5dSvi117747 return (NULL);
23340cb5e5dSvi117747 }
23440cb5e5dSvi117747
23540cb5e5dSvi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
23640cb5e5dSvi117747 if (value == NULL) {
23740cb5e5dSvi117747 if (error != NULL)
23840cb5e5dSvi117747 *error = EPROTO;
23940cb5e5dSvi117747 return (NULL);
24040cb5e5dSvi117747 }
24140cb5e5dSvi117747 /*
24240cb5e5dSvi117747 * If the value is BAD, update error to reflect it.
24340cb5e5dSvi117747 */
24440cb5e5dSvi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
24540cb5e5dSvi117747 *error = EPROTO;
24640cb5e5dSvi117747 return (&value->cftr_uri);
24740cb5e5dSvi117747 }
24840cb5e5dSvi117747
24940cb5e5dSvi117747 /*
25040cb5e5dSvi117747 * Get display name from the SIP message
25140cb5e5dSvi117747 */
25240cb5e5dSvi117747 const sip_str_t *
sip_get_cftrname_from_msg(sip_msg_t sip_msg,int * error,char * hdrname)25340cb5e5dSvi117747 sip_get_cftrname_from_msg(sip_msg_t sip_msg, int *error, char *hdrname)
25440cb5e5dSvi117747 {
25540cb5e5dSvi117747 const sip_hdr_value_t *value;
25640cb5e5dSvi117747 const struct sip_header *header;
25740cb5e5dSvi117747
25840cb5e5dSvi117747 if (error != NULL)
25940cb5e5dSvi117747 *error = 0;
26040cb5e5dSvi117747 if (sip_msg == NULL) {
26140cb5e5dSvi117747 if (error != NULL)
26240cb5e5dSvi117747 *error = EINVAL;
26340cb5e5dSvi117747 return (NULL);
26440cb5e5dSvi117747 }
26540cb5e5dSvi117747 header = sip_get_header(sip_msg, hdrname, NULL, error);
26640cb5e5dSvi117747 if (header == NULL) {
26740cb5e5dSvi117747 if (error != NULL)
26840cb5e5dSvi117747 *error = EINVAL;
26940cb5e5dSvi117747 return (NULL);
27040cb5e5dSvi117747 }
27140cb5e5dSvi117747
27240cb5e5dSvi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
27340cb5e5dSvi117747 if (value == NULL) {
27440cb5e5dSvi117747 if (error != NULL)
27540cb5e5dSvi117747 *error = EPROTO;
27640cb5e5dSvi117747 return (NULL);
27740cb5e5dSvi117747 }
27840cb5e5dSvi117747 /*
27940cb5e5dSvi117747 * If the value is BAD, update error to reflect it.
28040cb5e5dSvi117747 */
28140cb5e5dSvi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
28240cb5e5dSvi117747 *error = EPROTO;
28340cb5e5dSvi117747 return (value->cftr_name);
28440cb5e5dSvi117747 }
28540cb5e5dSvi117747
28640cb5e5dSvi117747 /*
28740cb5e5dSvi117747 * Get FROM URI
28840cb5e5dSvi117747 */
28940cb5e5dSvi117747 const sip_str_t *
sip_get_from_uri_str(sip_msg_t sip_msg,int * error)29040cb5e5dSvi117747 sip_get_from_uri_str(sip_msg_t sip_msg, int *error)
29140cb5e5dSvi117747 {
29240cb5e5dSvi117747 return (sip_get_cftruri_from_msg(sip_msg, error, SIP_FROM));
29340cb5e5dSvi117747 }
29440cb5e5dSvi117747
29540cb5e5dSvi117747 /*
29640cb5e5dSvi117747 * Get FROM display name
29740cb5e5dSvi117747 */
29840cb5e5dSvi117747 const sip_str_t *
sip_get_from_display_name(sip_msg_t sip_msg,int * error)29940cb5e5dSvi117747 sip_get_from_display_name(sip_msg_t sip_msg, int *error)
30040cb5e5dSvi117747 {
30140cb5e5dSvi117747 return (sip_get_cftrname_from_msg(sip_msg, error, SIP_FROM));
30240cb5e5dSvi117747 }
30340cb5e5dSvi117747
30440cb5e5dSvi117747 /*
30540cb5e5dSvi117747 * Return the FROM tag
30640cb5e5dSvi117747 */
30740cb5e5dSvi117747 const sip_str_t *
sip_get_from_tag(sip_msg_t sip_msg,int * error)30840cb5e5dSvi117747 sip_get_from_tag(sip_msg_t sip_msg, int *error)
30940cb5e5dSvi117747 {
31040cb5e5dSvi117747 const sip_hdr_value_t *value;
31140cb5e5dSvi117747 const struct sip_header *header;
31240cb5e5dSvi117747
31340cb5e5dSvi117747 if (error != NULL)
31440cb5e5dSvi117747 *error = 0;
31540cb5e5dSvi117747 if (sip_msg == NULL) {
31640cb5e5dSvi117747 if (error != NULL)
31740cb5e5dSvi117747 *error = EINVAL;
31840cb5e5dSvi117747 return (NULL);
31940cb5e5dSvi117747 }
32040cb5e5dSvi117747 header = sip_get_header(sip_msg, SIP_FROM, NULL, error);
32140cb5e5dSvi117747 if (header == NULL) {
32240cb5e5dSvi117747 if (error != NULL)
32340cb5e5dSvi117747 *error = EINVAL;
32440cb5e5dSvi117747 return (NULL);
32540cb5e5dSvi117747 }
32640cb5e5dSvi117747
32740cb5e5dSvi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
32840cb5e5dSvi117747 if (value == NULL) {
32940cb5e5dSvi117747 if (error != NULL)
33040cb5e5dSvi117747 *error = EPROTO;
33140cb5e5dSvi117747 return (NULL);
33240cb5e5dSvi117747 }
33340cb5e5dSvi117747 /*
33440cb5e5dSvi117747 * If the value is BAD, update error to reflect it.
33540cb5e5dSvi117747 */
33640cb5e5dSvi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
33740cb5e5dSvi117747 *error = EPROTO;
33840cb5e5dSvi117747 return (sip_get_param_value((sip_header_value_t)value, "tag", error));
33940cb5e5dSvi117747 }
34040cb5e5dSvi117747
34140cb5e5dSvi117747 /*
34240cb5e5dSvi117747 * Get TO URI
34340cb5e5dSvi117747 */
34440cb5e5dSvi117747 const sip_str_t *
sip_get_to_uri_str(sip_msg_t sip_msg,int * error)34540cb5e5dSvi117747 sip_get_to_uri_str(sip_msg_t sip_msg, int *error)
34640cb5e5dSvi117747 {
34740cb5e5dSvi117747 return (sip_get_cftruri_from_msg(sip_msg, error, SIP_TO));
34840cb5e5dSvi117747 }
34940cb5e5dSvi117747
35040cb5e5dSvi117747 /*
35140cb5e5dSvi117747 * Get TO display name
35240cb5e5dSvi117747 */
35340cb5e5dSvi117747 const sip_str_t *
sip_get_to_display_name(sip_msg_t sip_msg,int * error)35440cb5e5dSvi117747 sip_get_to_display_name(sip_msg_t sip_msg, int *error)
35540cb5e5dSvi117747 {
35640cb5e5dSvi117747 return (sip_get_cftrname_from_msg(sip_msg, error, SIP_TO));
35740cb5e5dSvi117747 }
35840cb5e5dSvi117747
35940cb5e5dSvi117747 /*
36040cb5e5dSvi117747 * Get TO tag
36140cb5e5dSvi117747 */
36240cb5e5dSvi117747 const sip_str_t *
sip_get_to_tag(sip_msg_t sip_msg,int * error)36340cb5e5dSvi117747 sip_get_to_tag(sip_msg_t sip_msg, int *error)
36440cb5e5dSvi117747 {
36540cb5e5dSvi117747 const sip_hdr_value_t *value;
36640cb5e5dSvi117747 const struct sip_header *header;
36740cb5e5dSvi117747
36840cb5e5dSvi117747 if (error != NULL)
36940cb5e5dSvi117747 *error = 0;
37040cb5e5dSvi117747 if (sip_msg == NULL) {
37140cb5e5dSvi117747 if (error != NULL)
37240cb5e5dSvi117747 *error = EINVAL;
37340cb5e5dSvi117747 return (NULL);
37440cb5e5dSvi117747 }
37540cb5e5dSvi117747 header = sip_get_header(sip_msg, SIP_TO, NULL, error);
37640cb5e5dSvi117747 if (header == NULL) {
37740cb5e5dSvi117747 if (error != NULL)
37840cb5e5dSvi117747 *error = EINVAL;
37940cb5e5dSvi117747 return (NULL);
38040cb5e5dSvi117747 }
38140cb5e5dSvi117747
38240cb5e5dSvi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
38340cb5e5dSvi117747 if (value == NULL) {
38440cb5e5dSvi117747 if (error != NULL)
38540cb5e5dSvi117747 *error = EPROTO;
38640cb5e5dSvi117747 return (NULL);
38740cb5e5dSvi117747 }
38840cb5e5dSvi117747 /*
38940cb5e5dSvi117747 * If the value is BAD, update error to reflect it.
39040cb5e5dSvi117747 */
39140cb5e5dSvi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
39240cb5e5dSvi117747 *error = EPROTO;
39340cb5e5dSvi117747 return (sip_get_param_value((sip_header_value_t)value, "tag", error));
39440cb5e5dSvi117747 }
39540cb5e5dSvi117747
39640cb5e5dSvi117747 /*
39740cb5e5dSvi117747 * Return the Call-Id
39840cb5e5dSvi117747 */
39940cb5e5dSvi117747 const sip_str_t *
sip_get_callid(sip_msg_t sip_msg,int * error)40040cb5e5dSvi117747 sip_get_callid(sip_msg_t sip_msg, int *error)
40140cb5e5dSvi117747 {
40240cb5e5dSvi117747 sip_str_t *r;
40340cb5e5dSvi117747
40440cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CALL_ID, SIP_STR_VAL,
40540cb5e5dSvi117747 B_FALSE, B_TRUE, error);
40640cb5e5dSvi117747 return (r);
40740cb5e5dSvi117747 }
40840cb5e5dSvi117747
40940cb5e5dSvi117747 #define SIP_CSEQ_NUM 1
41040cb5e5dSvi117747 #define SIP_CSEQ_METHOD 2
41140cb5e5dSvi117747
41240cb5e5dSvi117747 /*
41340cb5e5dSvi117747 * Get number/method from the CSEQ header
41440cb5e5dSvi117747 */
41540cb5e5dSvi117747 static void *
sip_get_cseq_val(sip_msg_t msg,int type,int * error)41640cb5e5dSvi117747 sip_get_cseq_val(sip_msg_t msg, int type, int *error)
41740cb5e5dSvi117747 {
41840cb5e5dSvi117747 const _sip_header_t *header;
41940cb5e5dSvi117747 sip_hdr_value_t *val;
42040cb5e5dSvi117747
42140cb5e5dSvi117747 if (error != NULL)
42240cb5e5dSvi117747 *error = 0;
42340cb5e5dSvi117747
42440cb5e5dSvi117747 if (msg == NULL) {
42540cb5e5dSvi117747 if (error != NULL)
42640cb5e5dSvi117747 *error = EINVAL;
42740cb5e5dSvi117747 return (NULL);
42840cb5e5dSvi117747 }
42940cb5e5dSvi117747 header = sip_get_header(msg, SIP_CSEQ, NULL, error);
43040cb5e5dSvi117747 if (header == NULL) {
43140cb5e5dSvi117747 if (error != NULL)
43240cb5e5dSvi117747 *error = EINVAL;
43340cb5e5dSvi117747 return (NULL);
43440cb5e5dSvi117747 }
43540cb5e5dSvi117747 val = (sip_hdr_value_t *)sip_get_header_value(header, error);
43640cb5e5dSvi117747 if (val == NULL) {
43740cb5e5dSvi117747 if (error != NULL)
43840cb5e5dSvi117747 *error = EPROTO;
43940cb5e5dSvi117747 return (NULL);
44040cb5e5dSvi117747 }
44140cb5e5dSvi117747 if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
44240cb5e5dSvi117747 *error = EPROTO;
44340cb5e5dSvi117747
44440cb5e5dSvi117747 switch (type) {
44540cb5e5dSvi117747 case SIP_CSEQ_NUM:
44640cb5e5dSvi117747 return (&(val->cseq_num));
44740cb5e5dSvi117747 case SIP_CSEQ_METHOD:
44840cb5e5dSvi117747 return (&(val->cseq_method));
44940cb5e5dSvi117747 }
45040cb5e5dSvi117747 if (error != NULL)
45140cb5e5dSvi117747 *error = EINVAL;
45240cb5e5dSvi117747 return (NULL);
45340cb5e5dSvi117747 }
45440cb5e5dSvi117747
45540cb5e5dSvi117747 /*
45640cb5e5dSvi117747 * Get CSEQ number
45740cb5e5dSvi117747 */
45840cb5e5dSvi117747 int
sip_get_callseq_num(sip_msg_t sip_msg,int * error)45940cb5e5dSvi117747 sip_get_callseq_num(sip_msg_t sip_msg, int *error)
46040cb5e5dSvi117747 {
46140cb5e5dSvi117747 int *r;
46240cb5e5dSvi117747
46340cb5e5dSvi117747 r = (int *)sip_get_cseq_val(sip_msg, SIP_CSEQ_NUM, error);
46440cb5e5dSvi117747 return (r == NULL ? -1 : *r);
46540cb5e5dSvi117747 }
46640cb5e5dSvi117747
46740cb5e5dSvi117747 /*
46840cb5e5dSvi117747 * Get CSEQ method
46940cb5e5dSvi117747 */
47040cb5e5dSvi117747 sip_method_t
sip_get_callseq_method(sip_msg_t sip_msg,int * error)47140cb5e5dSvi117747 sip_get_callseq_method(sip_msg_t sip_msg, int *error)
47240cb5e5dSvi117747 {
47340cb5e5dSvi117747 sip_method_t *r;
47440cb5e5dSvi117747
47540cb5e5dSvi117747 r = (sip_method_t *)sip_get_cseq_val(sip_msg, SIP_CSEQ_METHOD, error);
47640cb5e5dSvi117747 return (r == NULL ? -1 : *r);
47740cb5e5dSvi117747 }
47840cb5e5dSvi117747
47940cb5e5dSvi117747 /*
48040cb5e5dSvi117747 * Via header can have more than one value
48140cb5e5dSvi117747 * so we require a value to be passed in.
48240cb5e5dSvi117747 */
48340cb5e5dSvi117747 const sip_str_t *
sip_get_via_sent_by_host(sip_header_value_t value,int * error)48440cb5e5dSvi117747 sip_get_via_sent_by_host(sip_header_value_t value, int *error)
48540cb5e5dSvi117747 {
48640cb5e5dSvi117747 sip_hdr_value_t *via_value;
48740cb5e5dSvi117747
48840cb5e5dSvi117747 if (error != NULL)
48940cb5e5dSvi117747 *error = 0;
49040cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
49140cb5e5dSvi117747 if (error != NULL)
49240cb5e5dSvi117747 *error = EINVAL;
49340cb5e5dSvi117747 return (NULL);
49440cb5e5dSvi117747 }
49540cb5e5dSvi117747 via_value = (sip_hdr_value_t *)value;
49640cb5e5dSvi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
49740cb5e5dSvi117747 *error = EPROTO;
49840cb5e5dSvi117747 return (&via_value->via_sent_by_host);
49940cb5e5dSvi117747 }
50040cb5e5dSvi117747
50140cb5e5dSvi117747 /*
50240cb5e5dSvi117747 * Via header can have more than one value
50340cb5e5dSvi117747 * so we require a value to be passed in.
50440cb5e5dSvi117747 */
50540cb5e5dSvi117747 int
sip_get_via_sent_by_port(sip_header_value_t value,int * error)50640cb5e5dSvi117747 sip_get_via_sent_by_port(sip_header_value_t value, int *error)
50740cb5e5dSvi117747 {
50840cb5e5dSvi117747 sip_hdr_value_t *via_value;
50940cb5e5dSvi117747
51040cb5e5dSvi117747 if (error != NULL)
51140cb5e5dSvi117747 *error = 0;
51240cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
51340cb5e5dSvi117747 if (error != NULL)
51440cb5e5dSvi117747 *error = EINVAL;
51540cb5e5dSvi117747 return (-1);
51640cb5e5dSvi117747 }
51740cb5e5dSvi117747 via_value = (sip_hdr_value_t *)value;
51840cb5e5dSvi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
51940cb5e5dSvi117747 *error = EPROTO;
52040cb5e5dSvi117747 return (via_value->via_sent_by_port);
52140cb5e5dSvi117747 }
52240cb5e5dSvi117747
52340cb5e5dSvi117747 /*
52440cb5e5dSvi117747 * Return the protocol version from the VIA value
52540cb5e5dSvi117747 */
52640cb5e5dSvi117747 const sip_str_t *
sip_get_via_sent_protocol_version(sip_header_value_t value,int * error)52740cb5e5dSvi117747 sip_get_via_sent_protocol_version(sip_header_value_t value, int *error)
52840cb5e5dSvi117747 {
52940cb5e5dSvi117747 sip_hdr_value_t *via_value;
53040cb5e5dSvi117747
53140cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
53240cb5e5dSvi117747 if (error != NULL)
53340cb5e5dSvi117747 *error = EINVAL;
53440cb5e5dSvi117747 return (NULL);
53540cb5e5dSvi117747 }
53640cb5e5dSvi117747 via_value = (sip_hdr_value_t *)value;
53740cb5e5dSvi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
53840cb5e5dSvi117747 *error = EPROTO;
53940cb5e5dSvi117747 return (&via_value->via_protocol_vers);
54040cb5e5dSvi117747 }
54140cb5e5dSvi117747
54240cb5e5dSvi117747 /*
54340cb5e5dSvi117747 * Return the protocol name
54440cb5e5dSvi117747 */
54540cb5e5dSvi117747 const sip_str_t *
sip_get_via_sent_protocol_name(sip_header_value_t value,int * error)54640cb5e5dSvi117747 sip_get_via_sent_protocol_name(sip_header_value_t value, int *error)
54740cb5e5dSvi117747 {
54840cb5e5dSvi117747 sip_hdr_value_t *via_value;
54940cb5e5dSvi117747
55040cb5e5dSvi117747 if (error != NULL)
55140cb5e5dSvi117747 *error = 0;
55240cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
55340cb5e5dSvi117747 if (error != NULL)
55440cb5e5dSvi117747 *error = EINVAL;
55540cb5e5dSvi117747 return (NULL);
55640cb5e5dSvi117747 }
55740cb5e5dSvi117747 via_value = (sip_hdr_value_t *)value;
55840cb5e5dSvi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
55940cb5e5dSvi117747 *error = EPROTO;
56040cb5e5dSvi117747 return (&via_value->via_protocol_name);
56140cb5e5dSvi117747 }
56240cb5e5dSvi117747
56340cb5e5dSvi117747 /*
56440cb5e5dSvi117747 * Return the transport from the VIA value
56540cb5e5dSvi117747 */
56640cb5e5dSvi117747 const sip_str_t *
sip_get_via_sent_transport(sip_header_value_t value,int * error)56740cb5e5dSvi117747 sip_get_via_sent_transport(sip_header_value_t value, int *error)
56840cb5e5dSvi117747 {
56940cb5e5dSvi117747 sip_hdr_value_t *via_value;
57040cb5e5dSvi117747
57140cb5e5dSvi117747 if (error != NULL)
57240cb5e5dSvi117747 *error = 0;
57340cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
57440cb5e5dSvi117747 if (error != NULL)
57540cb5e5dSvi117747 *error = EINVAL;
57640cb5e5dSvi117747 return (NULL);
57740cb5e5dSvi117747 }
57840cb5e5dSvi117747 via_value = (sip_hdr_value_t *)value;
57940cb5e5dSvi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
58040cb5e5dSvi117747 *error = EPROTO;
58140cb5e5dSvi117747 return (&via_value->via_protocol_transport);
58240cb5e5dSvi117747 }
58340cb5e5dSvi117747
58440cb5e5dSvi117747 /*
58540cb5e5dSvi117747 * get the branch id from the topmost VIA header
58640cb5e5dSvi117747 */
58740cb5e5dSvi117747 char *
sip_get_branchid(sip_msg_t sip_msg,int * error)58840cb5e5dSvi117747 sip_get_branchid(sip_msg_t sip_msg, int *error)
58940cb5e5dSvi117747 {
59040cb5e5dSvi117747 _sip_header_t *header;
59140cb5e5dSvi117747 sip_parsed_header_t *parsed_header;
59240cb5e5dSvi117747 sip_hdr_value_t *via_value;
59340cb5e5dSvi117747 const sip_str_t *param_value;
59440cb5e5dSvi117747 char *bid;
59540cb5e5dSvi117747 _sip_msg_t *_sip_msg;
59640cb5e5dSvi117747
59740cb5e5dSvi117747 if (error != NULL)
59840cb5e5dSvi117747 *error = 0;
59940cb5e5dSvi117747
60040cb5e5dSvi117747 if (sip_msg == NULL) {
60140cb5e5dSvi117747 if (error != NULL)
60240cb5e5dSvi117747 *error = EINVAL;
60340cb5e5dSvi117747 return (NULL);
60440cb5e5dSvi117747 }
60540cb5e5dSvi117747
60640cb5e5dSvi117747 _sip_msg = (_sip_msg_t *)sip_msg;
60740cb5e5dSvi117747
60840cb5e5dSvi117747 (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
60940cb5e5dSvi117747 header = sip_search_for_header(_sip_msg, SIP_VIA, NULL);
61040cb5e5dSvi117747 if (header == NULL) {
61140cb5e5dSvi117747 if (error != NULL)
61240cb5e5dSvi117747 *error = EINVAL;
61340cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
61440cb5e5dSvi117747 return (NULL);
61540cb5e5dSvi117747 }
61640cb5e5dSvi117747 if (sip_parse_via_header(header, &parsed_header) != 0) {
61740cb5e5dSvi117747 if (error != NULL)
61840cb5e5dSvi117747 *error = EPROTO;
61940cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
62040cb5e5dSvi117747 return (NULL);
62140cb5e5dSvi117747 }
62240cb5e5dSvi117747 if (parsed_header == NULL) {
62340cb5e5dSvi117747 if (error != NULL)
62440cb5e5dSvi117747 *error = EPROTO;
62540cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
62640cb5e5dSvi117747 return (NULL);
62740cb5e5dSvi117747 }
62840cb5e5dSvi117747 via_value = (sip_hdr_value_t *)parsed_header->value;
62940cb5e5dSvi117747 if (via_value == NULL || via_value->sip_value_state == SIP_VALUE_BAD) {
63040cb5e5dSvi117747 if (error != NULL)
63140cb5e5dSvi117747 *error = EPROTO;
63240cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
63340cb5e5dSvi117747 return (NULL);
63440cb5e5dSvi117747 }
63540cb5e5dSvi117747 param_value = sip_get_param_value((sip_header_value_t)via_value,
63640cb5e5dSvi117747 "branch", error);
63740cb5e5dSvi117747
63840cb5e5dSvi117747 if (param_value == NULL) {
63940cb5e5dSvi117747 if (error != NULL)
64040cb5e5dSvi117747 *error = EINVAL;
64140cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
64240cb5e5dSvi117747 return (NULL);
64340cb5e5dSvi117747 }
64440cb5e5dSvi117747
64540cb5e5dSvi117747 bid = (char *)malloc(param_value->sip_str_len + 1);
64640cb5e5dSvi117747 if (bid == NULL) {
64740cb5e5dSvi117747 if (error != NULL)
64840cb5e5dSvi117747 *error = ENOMEM;
64940cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
65040cb5e5dSvi117747 return (NULL);
65140cb5e5dSvi117747 }
65240cb5e5dSvi117747 (void) strncpy(bid, param_value->sip_str_ptr,
65340cb5e5dSvi117747 param_value->sip_str_len);
65440cb5e5dSvi117747 bid[param_value->sip_str_len] = '\0';
65540cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
65640cb5e5dSvi117747 return (bid);
65740cb5e5dSvi117747 }
65840cb5e5dSvi117747
65940cb5e5dSvi117747 /*
66040cb5e5dSvi117747 * adds branchid to the topmost VIA header, if a branchid already exists,
66140cb5e5dSvi117747 * returns error.
66240cb5e5dSvi117747 */
66340cb5e5dSvi117747 int
sip_add_branchid_to_via(sip_msg_t sip_msg,char * branchid)66440cb5e5dSvi117747 sip_add_branchid_to_via(sip_msg_t sip_msg, char *branchid)
66540cb5e5dSvi117747 {
66640cb5e5dSvi117747 int err = 0;
66740cb5e5dSvi117747 char *param;
66840cb5e5dSvi117747 int plen;
66940cb5e5dSvi117747 sip_header_t via_hdr;
67040cb5e5dSvi117747 _sip_msg_t *_sip_msg;
67140cb5e5dSvi117747
67240cb5e5dSvi117747 if (sip_msg == NULL)
67340cb5e5dSvi117747 return (EINVAL);
67440cb5e5dSvi117747 /*
67540cb5e5dSvi117747 * If there is already a branchid param, error?
67640cb5e5dSvi117747 */
67740cb5e5dSvi117747 if (sip_get_branchid(sip_msg, NULL) != NULL)
67840cb5e5dSvi117747 return (EINVAL);
67940cb5e5dSvi117747 _sip_msg = (_sip_msg_t *)sip_msg;
68040cb5e5dSvi117747 (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
68140cb5e5dSvi117747 via_hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA, NULL);
68240cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
68340cb5e5dSvi117747 if (via_hdr == NULL)
68440cb5e5dSvi117747 return (EINVAL);
68540cb5e5dSvi117747 plen = strlen(branchid) + strlen("branch=") + 1;
68640cb5e5dSvi117747 param = malloc(plen);
68740cb5e5dSvi117747 if (param == NULL)
68840cb5e5dSvi117747 return (ENOMEM);
68940cb5e5dSvi117747 (void) snprintf(param, plen, "branch=%s", branchid);
69040cb5e5dSvi117747
69140cb5e5dSvi117747 (void) sip_add_param(via_hdr, param, &err);
69240cb5e5dSvi117747 free(param);
69340cb5e5dSvi117747
69440cb5e5dSvi117747 return (err);
69540cb5e5dSvi117747 }
69640cb5e5dSvi117747
69740cb5e5dSvi117747 /*
69840cb5e5dSvi117747 * returns the number of VIA headers in the SIP message
69940cb5e5dSvi117747 */
70040cb5e5dSvi117747 int
sip_get_num_via(sip_msg_t sip_msg,int * error)70140cb5e5dSvi117747 sip_get_num_via(sip_msg_t sip_msg, int *error)
70240cb5e5dSvi117747 {
70340cb5e5dSvi117747 _sip_msg_t *_sip_msg;
70440cb5e5dSvi117747 sip_header_t hdr;
70540cb5e5dSvi117747 int via_cnt = 0;
70640cb5e5dSvi117747
70740cb5e5dSvi117747 if (error != NULL)
70840cb5e5dSvi117747 *error = 0;
70940cb5e5dSvi117747 if (sip_msg == NULL) {
71040cb5e5dSvi117747 if (error != NULL)
71140cb5e5dSvi117747 *error = EINVAL;
71240cb5e5dSvi117747 return (via_cnt);
71340cb5e5dSvi117747 }
71440cb5e5dSvi117747 _sip_msg = (_sip_msg_t *)sip_msg;
71540cb5e5dSvi117747 (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
71640cb5e5dSvi117747 hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA, NULL);
71740cb5e5dSvi117747 while (hdr != NULL) {
71840cb5e5dSvi117747 via_cnt++;
71940cb5e5dSvi117747 hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA,
72040cb5e5dSvi117747 hdr);
72140cb5e5dSvi117747 }
72240cb5e5dSvi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
72340cb5e5dSvi117747 return (via_cnt);
72440cb5e5dSvi117747 }
72540cb5e5dSvi117747
72640cb5e5dSvi117747 /*
72740cb5e5dSvi117747 * Return Max-Forward value
72840cb5e5dSvi117747 */
72940cb5e5dSvi117747 int
sip_get_maxforward(sip_msg_t sip_msg,int * error)73040cb5e5dSvi117747 sip_get_maxforward(sip_msg_t sip_msg, int *error)
73140cb5e5dSvi117747 {
73240cb5e5dSvi117747 int *r;
73340cb5e5dSvi117747
73440cb5e5dSvi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_MAX_FORWARDS, SIP_INT_VAL,
73540cb5e5dSvi117747 B_FALSE, B_FALSE, error);
73640cb5e5dSvi117747 if (r == NULL)
73740cb5e5dSvi117747 return (-1);
73840cb5e5dSvi117747 return (*r);
73940cb5e5dSvi117747 }
74040cb5e5dSvi117747
74140cb5e5dSvi117747 /*
74240cb5e5dSvi117747 * Get the content type
74340cb5e5dSvi117747 */
74440cb5e5dSvi117747 const sip_str_t *
sip_get_content_type(sip_msg_t sip_msg,int * error)74540cb5e5dSvi117747 sip_get_content_type(sip_msg_t sip_msg, int *error)
74640cb5e5dSvi117747 {
74740cb5e5dSvi117747 sip_str_t *r;
74840cb5e5dSvi117747
74940cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,
75040cb5e5dSvi117747 SIP_STRS_VAL, B_TRUE, B_FALSE, error);
75140cb5e5dSvi117747 return (r);
75240cb5e5dSvi117747 }
75340cb5e5dSvi117747
75440cb5e5dSvi117747 /*
75540cb5e5dSvi117747 * Get the content sub-type
75640cb5e5dSvi117747 */
75740cb5e5dSvi117747 const sip_str_t *
sip_get_content_sub_type(sip_msg_t sip_msg,int * error)75840cb5e5dSvi117747 sip_get_content_sub_type(sip_msg_t sip_msg, int *error)
75940cb5e5dSvi117747 {
76040cb5e5dSvi117747 sip_str_t *r;
76140cb5e5dSvi117747
76240cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,
76340cb5e5dSvi117747 SIP_STRS_VAL, B_FALSE, B_FALSE, error);
76440cb5e5dSvi117747 return (r);
76540cb5e5dSvi117747 }
76640cb5e5dSvi117747
76740cb5e5dSvi117747 /*
76840cb5e5dSvi117747 * Return the content-length value
76940cb5e5dSvi117747 */
77040cb5e5dSvi117747 int
sip_get_content_length(sip_msg_t sip_msg,int * error)77140cb5e5dSvi117747 sip_get_content_length(sip_msg_t sip_msg, int *error)
77240cb5e5dSvi117747 {
77340cb5e5dSvi117747 int *r;
77440cb5e5dSvi117747
77540cb5e5dSvi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_LENGTH,
77640cb5e5dSvi117747 SIP_INT_VAL, B_FALSE, B_FALSE, error);
77740cb5e5dSvi117747 if (r == NULL)
77840cb5e5dSvi117747 return (-1);
77940cb5e5dSvi117747 return (*r);
78040cb5e5dSvi117747 }
78140cb5e5dSvi117747
78240cb5e5dSvi117747 /*
78340cb5e5dSvi117747 * get allow-events
78440cb5e5dSvi117747 */
78540cb5e5dSvi117747 const sip_str_t *
sip_get_allow_events(sip_header_value_t value,int * error)78640cb5e5dSvi117747 sip_get_allow_events(sip_header_value_t value, int *error)
78740cb5e5dSvi117747 {
78840cb5e5dSvi117747 sip_str_t *r;
78940cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
79040cb5e5dSvi117747
79140cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_TRUE, error);
79240cb5e5dSvi117747 return (r);
79340cb5e5dSvi117747 }
79440cb5e5dSvi117747
79540cb5e5dSvi117747 /*
79640cb5e5dSvi117747 * get event
79740cb5e5dSvi117747 */
79840cb5e5dSvi117747 const sip_str_t *
sip_get_event(sip_msg_t sip_msg,int * error)79940cb5e5dSvi117747 sip_get_event(sip_msg_t sip_msg, int *error)
80040cb5e5dSvi117747 {
80140cb5e5dSvi117747 sip_str_t *r;
80240cb5e5dSvi117747
80340cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_EVENT, SIP_STR_VAL,
80440cb5e5dSvi117747 B_FALSE, B_FALSE, error);
80540cb5e5dSvi117747 return (r);
80640cb5e5dSvi117747 }
80740cb5e5dSvi117747
80840cb5e5dSvi117747 /*
80940cb5e5dSvi117747 * get subscription state
81040cb5e5dSvi117747 */
81140cb5e5dSvi117747 const sip_str_t *
sip_get_substate(sip_msg_t sip_msg,int * error)81240cb5e5dSvi117747 sip_get_substate(sip_msg_t sip_msg, int *error)
81340cb5e5dSvi117747 {
81440cb5e5dSvi117747 sip_str_t *r;
81540cb5e5dSvi117747
81640cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBSCRIPTION_STATE,
81740cb5e5dSvi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
81840cb5e5dSvi117747 return (r);
81940cb5e5dSvi117747 }
82040cb5e5dSvi117747
82140cb5e5dSvi117747 /*
82240cb5e5dSvi117747 * get accept type
82340cb5e5dSvi117747 */
82440cb5e5dSvi117747 const sip_str_t *
sip_get_accept_type(sip_header_value_t value,int * error)82540cb5e5dSvi117747 sip_get_accept_type(sip_header_value_t value, int *error)
82640cb5e5dSvi117747 {
82740cb5e5dSvi117747 sip_str_t *r;
82840cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
82940cb5e5dSvi117747
83040cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);
83140cb5e5dSvi117747 return (r);
83240cb5e5dSvi117747 }
83340cb5e5dSvi117747
83440cb5e5dSvi117747 /*
83540cb5e5dSvi117747 * get accept subtype
83640cb5e5dSvi117747 */
83740cb5e5dSvi117747 const sip_str_t *
sip_get_accept_sub_type(sip_header_value_t value,int * error)83840cb5e5dSvi117747 sip_get_accept_sub_type(sip_header_value_t value, int *error)
83940cb5e5dSvi117747 {
84040cb5e5dSvi117747 sip_str_t *r;
84140cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
84240cb5e5dSvi117747
84340cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_FALSE,
84440cb5e5dSvi117747 error);
84540cb5e5dSvi117747 return (r);
84640cb5e5dSvi117747 }
84740cb5e5dSvi117747
84840cb5e5dSvi117747 /*
84940cb5e5dSvi117747 * accept-encode can have more than one value
85040cb5e5dSvi117747 */
85140cb5e5dSvi117747 const sip_str_t *
sip_get_accept_enc(sip_header_value_t value,int * error)85240cb5e5dSvi117747 sip_get_accept_enc(sip_header_value_t value, int *error)
85340cb5e5dSvi117747 {
85440cb5e5dSvi117747 sip_str_t *r;
85540cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
85640cb5e5dSvi117747
85740cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
85840cb5e5dSvi117747 return (r);
85940cb5e5dSvi117747 }
86040cb5e5dSvi117747
86140cb5e5dSvi117747 /*
86240cb5e5dSvi117747 * accept-language can have more than one value
86340cb5e5dSvi117747 */
86440cb5e5dSvi117747 const sip_str_t *
sip_get_accept_lang(sip_header_value_t value,int * error)86540cb5e5dSvi117747 sip_get_accept_lang(sip_header_value_t value, int *error)
86640cb5e5dSvi117747 {
86740cb5e5dSvi117747 sip_str_t *r;
86840cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
86940cb5e5dSvi117747
87040cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
87140cb5e5dSvi117747 return (r);
87240cb5e5dSvi117747 }
87340cb5e5dSvi117747
87440cb5e5dSvi117747 /*
87540cb5e5dSvi117747 * get URI from the alert-info header
87640cb5e5dSvi117747 */
87740cb5e5dSvi117747 const sip_str_t *
sip_get_alert_info_uri(sip_header_value_t value,int * error)87840cb5e5dSvi117747 sip_get_alert_info_uri(sip_header_value_t value, int *error)
87940cb5e5dSvi117747 {
88040cb5e5dSvi117747 sip_str_t *r;
88140cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
88240cb5e5dSvi117747
88340cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
88440cb5e5dSvi117747 return (r);
88540cb5e5dSvi117747 }
88640cb5e5dSvi117747
88740cb5e5dSvi117747 /*
88840cb5e5dSvi117747 * get method from allow header
88940cb5e5dSvi117747 */
89040cb5e5dSvi117747 sip_method_t
sip_get_allow_method(sip_header_value_t value,int * error)89140cb5e5dSvi117747 sip_get_allow_method(sip_header_value_t value, int *error)
89240cb5e5dSvi117747 {
89340cb5e5dSvi117747 int *r;
89440cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
89540cb5e5dSvi117747
89640cb5e5dSvi117747 r = (int *)sip_get_val_from_hdr(val, SIP_INT_VAL, B_FALSE, error);
89740cb5e5dSvi117747 return (r == NULL ? -1 : (sip_method_t)*r);
89840cb5e5dSvi117747 }
89940cb5e5dSvi117747
90040cb5e5dSvi117747 /*
90140cb5e5dSvi117747 * get URI from call-info header
90240cb5e5dSvi117747 */
90340cb5e5dSvi117747 const sip_str_t *
sip_get_call_info_uri(sip_header_value_t value,int * error)90440cb5e5dSvi117747 sip_get_call_info_uri(sip_header_value_t value, int *error)
90540cb5e5dSvi117747 {
90640cb5e5dSvi117747 sip_str_t *r;
90740cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
90840cb5e5dSvi117747
90940cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
91040cb5e5dSvi117747 return (r);
91140cb5e5dSvi117747 }
91240cb5e5dSvi117747
91340cb5e5dSvi117747 /*
91440cb5e5dSvi117747 * get content-disposition value
91540cb5e5dSvi117747 */
91640cb5e5dSvi117747 const sip_str_t *
sip_get_content_disp(sip_msg_t sip_msg,int * error)91740cb5e5dSvi117747 sip_get_content_disp(sip_msg_t sip_msg, int *error)
91840cb5e5dSvi117747 {
91940cb5e5dSvi117747 sip_str_t *r;
92040cb5e5dSvi117747
92140cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_DIS,
92240cb5e5dSvi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
92340cb5e5dSvi117747 return (r);
92440cb5e5dSvi117747 }
92540cb5e5dSvi117747
92640cb5e5dSvi117747 /*
92740cb5e5dSvi117747 * get content-encoding value
92840cb5e5dSvi117747 */
92940cb5e5dSvi117747 const sip_str_t *
sip_get_content_enc(sip_header_value_t value,int * error)93040cb5e5dSvi117747 sip_get_content_enc(sip_header_value_t value, int *error)
93140cb5e5dSvi117747 {
93240cb5e5dSvi117747 sip_str_t *r;
93340cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
93440cb5e5dSvi117747
93540cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
93640cb5e5dSvi117747 return (r);
93740cb5e5dSvi117747 }
93840cb5e5dSvi117747
93940cb5e5dSvi117747 /*
94040cb5e5dSvi117747 * get content-language value
94140cb5e5dSvi117747 */
94240cb5e5dSvi117747 const sip_str_t *
sip_get_content_lang(sip_header_value_t value,int * error)94340cb5e5dSvi117747 sip_get_content_lang(sip_header_value_t value, int *error)
94440cb5e5dSvi117747 {
94540cb5e5dSvi117747 sip_str_t *r;
94640cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
94740cb5e5dSvi117747
94840cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
94940cb5e5dSvi117747 return (r);
95040cb5e5dSvi117747 }
95140cb5e5dSvi117747
95240cb5e5dSvi117747 /*
95340cb5e5dSvi117747 * sip_get_date_time, day, wkday, month, year
95440cb5e5dSvi117747 */
95540cb5e5dSvi117747 #define D_TIME 0x01
95640cb5e5dSvi117747 #define D_DAY 0x02
95740cb5e5dSvi117747 #define D_MONTH 0x03
95840cb5e5dSvi117747 #define D_YEAR 0x04
95940cb5e5dSvi117747 #define D_WKDAY 0x05
96040cb5e5dSvi117747 #define D_TIMEZONE 0x06
96140cb5e5dSvi117747
96240cb5e5dSvi117747 /*
96340cb5e5dSvi117747 * get date information
96440cb5e5dSvi117747 */
96540cb5e5dSvi117747 static void *
sip_get_date_val(sip_msg_t msg,int type,int * error)96640cb5e5dSvi117747 sip_get_date_val(sip_msg_t msg, int type, int *error)
96740cb5e5dSvi117747 {
96840cb5e5dSvi117747 const _sip_header_t *header;
96940cb5e5dSvi117747 sip_hdr_value_t *val;
97040cb5e5dSvi117747
97140cb5e5dSvi117747 if (error != NULL)
97240cb5e5dSvi117747 *error = 0;
97340cb5e5dSvi117747 if (msg == NULL) {
97440cb5e5dSvi117747 if (error != NULL)
97540cb5e5dSvi117747 *error = EINVAL;
97640cb5e5dSvi117747 return (NULL);
97740cb5e5dSvi117747 }
97840cb5e5dSvi117747 header = sip_get_header(msg, SIP_DATE, NULL, error);
97940cb5e5dSvi117747 if (header == NULL) {
98040cb5e5dSvi117747 if (error != NULL)
98140cb5e5dSvi117747 *error = EINVAL;
98240cb5e5dSvi117747 return (NULL);
98340cb5e5dSvi117747 }
98440cb5e5dSvi117747
98540cb5e5dSvi117747 val = (sip_hdr_value_t *)sip_get_header_value(header, error);
98640cb5e5dSvi117747 if (val == NULL) {
98740cb5e5dSvi117747 if (error != NULL)
98840cb5e5dSvi117747 *error = EPROTO;
98940cb5e5dSvi117747 return (NULL);
99040cb5e5dSvi117747 }
99140cb5e5dSvi117747 if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
99240cb5e5dSvi117747 *error = EPROTO;
99340cb5e5dSvi117747 switch (type) {
99440cb5e5dSvi117747 case (D_TIME):
99540cb5e5dSvi117747 return (&(val->date_t));
99640cb5e5dSvi117747 case (D_DAY):
99740cb5e5dSvi117747 return (&(val->date_d));
99840cb5e5dSvi117747 case (D_MONTH):
99940cb5e5dSvi117747 return (&(val->date_m));
100040cb5e5dSvi117747 case (D_YEAR):
100140cb5e5dSvi117747 return (&(val->date_y));
100240cb5e5dSvi117747 case (D_WKDAY):
100340cb5e5dSvi117747 return (&(val->date_wd));
100440cb5e5dSvi117747 case (D_TIMEZONE):
100540cb5e5dSvi117747 return (&(val->date_tz));
100640cb5e5dSvi117747 }
100740cb5e5dSvi117747 if (error != NULL)
100840cb5e5dSvi117747 *error = EINVAL;
100940cb5e5dSvi117747 return (NULL);
101040cb5e5dSvi117747 }
101140cb5e5dSvi117747
101240cb5e5dSvi117747 /*
101340cb5e5dSvi117747 * get time value
101440cb5e5dSvi117747 */
101540cb5e5dSvi117747 const sip_str_t *
sip_get_date_time(sip_msg_t sip_msg,int * error)101640cb5e5dSvi117747 sip_get_date_time(sip_msg_t sip_msg, int *error)
101740cb5e5dSvi117747 {
101840cb5e5dSvi117747 sip_str_t *r;
101940cb5e5dSvi117747
102040cb5e5dSvi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_TIME, error);
102140cb5e5dSvi117747 return (r);
102240cb5e5dSvi117747 }
102340cb5e5dSvi117747
102440cb5e5dSvi117747 /*
102540cb5e5dSvi117747 * get day
102640cb5e5dSvi117747 */
102740cb5e5dSvi117747 int
sip_get_date_day(sip_msg_t sip_msg,int * error)102840cb5e5dSvi117747 sip_get_date_day(sip_msg_t sip_msg, int *error)
102940cb5e5dSvi117747 {
103040cb5e5dSvi117747 int *r = NULL;
103140cb5e5dSvi117747
103240cb5e5dSvi117747 r = sip_get_date_val(sip_msg, D_DAY, error);
103340cb5e5dSvi117747 return (r == NULL ? -1 : *(int *)r);
103440cb5e5dSvi117747 }
103540cb5e5dSvi117747
103640cb5e5dSvi117747 /*
103740cb5e5dSvi117747 * get month
103840cb5e5dSvi117747 */
103940cb5e5dSvi117747 const sip_str_t *
sip_get_date_month(sip_msg_t sip_msg,int * error)104040cb5e5dSvi117747 sip_get_date_month(sip_msg_t sip_msg, int *error)
104140cb5e5dSvi117747 {
104240cb5e5dSvi117747 sip_str_t *r;
104340cb5e5dSvi117747
104440cb5e5dSvi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_MONTH, error);
104540cb5e5dSvi117747 return (r);
104640cb5e5dSvi117747 }
104740cb5e5dSvi117747
104840cb5e5dSvi117747 /*
104940cb5e5dSvi117747 * get year
105040cb5e5dSvi117747 */
105140cb5e5dSvi117747 int
sip_get_date_year(sip_msg_t sip_msg,int * error)105240cb5e5dSvi117747 sip_get_date_year(sip_msg_t sip_msg, int *error)
105340cb5e5dSvi117747 {
105440cb5e5dSvi117747 int *r;
105540cb5e5dSvi117747
105640cb5e5dSvi117747 r = (int *)sip_get_date_val(sip_msg, D_YEAR, error);
105740cb5e5dSvi117747 return (r == NULL ? -1 : *r);
105840cb5e5dSvi117747 }
105940cb5e5dSvi117747
106040cb5e5dSvi117747 /*
106140cb5e5dSvi117747 * get day of the week
106240cb5e5dSvi117747 */
106340cb5e5dSvi117747 const sip_str_t *
sip_get_date_wkday(sip_msg_t sip_msg,int * error)106440cb5e5dSvi117747 sip_get_date_wkday(sip_msg_t sip_msg, int *error)
106540cb5e5dSvi117747 {
106640cb5e5dSvi117747 sip_str_t *r;
106740cb5e5dSvi117747
106840cb5e5dSvi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_WKDAY, error);
106940cb5e5dSvi117747 return (r);
107040cb5e5dSvi117747 }
107140cb5e5dSvi117747
107240cb5e5dSvi117747 /*
107340cb5e5dSvi117747 * get the timezone
107440cb5e5dSvi117747 */
107540cb5e5dSvi117747 const sip_str_t *
sip_get_date_timezone(sip_msg_t sip_msg,int * error)107640cb5e5dSvi117747 sip_get_date_timezone(sip_msg_t sip_msg, int *error)
107740cb5e5dSvi117747 {
107840cb5e5dSvi117747 sip_str_t *r;
107940cb5e5dSvi117747
108040cb5e5dSvi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_TIMEZONE, error);
108140cb5e5dSvi117747 return (r);
108240cb5e5dSvi117747 }
108340cb5e5dSvi117747
108440cb5e5dSvi117747 /*
108540cb5e5dSvi117747 * get error-info URI
108640cb5e5dSvi117747 */
108740cb5e5dSvi117747 const sip_str_t *
sip_get_error_info_uri(sip_header_value_t value,int * error)108840cb5e5dSvi117747 sip_get_error_info_uri(sip_header_value_t value, int *error)
108940cb5e5dSvi117747 {
109040cb5e5dSvi117747 sip_str_t *r;
109140cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
109240cb5e5dSvi117747
109340cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
109440cb5e5dSvi117747 return (r);
109540cb5e5dSvi117747 }
109640cb5e5dSvi117747
109740cb5e5dSvi117747 /*
109840cb5e5dSvi117747 * get priv-value from privacy
109940cb5e5dSvi117747 */
110040cb5e5dSvi117747 const sip_str_t *
sip_get_priv_value(sip_header_value_t value,int * error)110140cb5e5dSvi117747 sip_get_priv_value(sip_header_value_t value, int *error)
110240cb5e5dSvi117747 {
110340cb5e5dSvi117747 sip_str_t *r;
110440cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
110540cb5e5dSvi117747
110640cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
110740cb5e5dSvi117747 return (r);
110840cb5e5dSvi117747 }
110940cb5e5dSvi117747
111040cb5e5dSvi117747 /*
111140cb5e5dSvi117747 * return expires value
111240cb5e5dSvi117747 */
111340cb5e5dSvi117747 int
sip_get_expires(sip_msg_t sip_msg,int * error)111440cb5e5dSvi117747 sip_get_expires(sip_msg_t sip_msg, int *error)
111540cb5e5dSvi117747 {
111640cb5e5dSvi117747 int *r;
111740cb5e5dSvi117747
111840cb5e5dSvi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_EXPIRE, SIP_INT_VAL,
111940cb5e5dSvi117747 B_FALSE, B_FALSE, error);
112040cb5e5dSvi117747 if (r == NULL)
112140cb5e5dSvi117747 return (-1);
112240cb5e5dSvi117747 return (*r);
112340cb5e5dSvi117747 }
112440cb5e5dSvi117747
112540cb5e5dSvi117747 /*
112640cb5e5dSvi117747 * get reply-to value
112740cb5e5dSvi117747 */
112840cb5e5dSvi117747 const sip_str_t *
sip_get_in_reply_to(sip_header_value_t value,int * error)112940cb5e5dSvi117747 sip_get_in_reply_to(sip_header_value_t value, int *error)
113040cb5e5dSvi117747 {
113140cb5e5dSvi117747 sip_str_t *r;
113240cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
113340cb5e5dSvi117747
113440cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
113540cb5e5dSvi117747 return (r);
113640cb5e5dSvi117747 }
113740cb5e5dSvi117747
113840cb5e5dSvi117747 /*
113940cb5e5dSvi117747 * get min-expires value
114040cb5e5dSvi117747 */
114140cb5e5dSvi117747 int
sip_get_min_expires(sip_msg_t sip_msg,int * error)114240cb5e5dSvi117747 sip_get_min_expires(sip_msg_t sip_msg, int *error)
114340cb5e5dSvi117747 {
114440cb5e5dSvi117747 int *r;
114540cb5e5dSvi117747
114640cb5e5dSvi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_MIN_EXPIRE, SIP_INT_VAL,
114740cb5e5dSvi117747 B_FALSE, B_FALSE, error);
114840cb5e5dSvi117747 if (r == NULL)
114940cb5e5dSvi117747 return (-1);
115040cb5e5dSvi117747 return (*r);
115140cb5e5dSvi117747 }
115240cb5e5dSvi117747
115340cb5e5dSvi117747 /*
115440cb5e5dSvi117747 * get mime-version
115540cb5e5dSvi117747 */
115640cb5e5dSvi117747 const sip_str_t *
sip_get_mime_version(sip_msg_t sip_msg,int * error)115740cb5e5dSvi117747 sip_get_mime_version(sip_msg_t sip_msg, int *error)
115840cb5e5dSvi117747 {
115940cb5e5dSvi117747 sip_str_t *r;
116040cb5e5dSvi117747
116140cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_MIME_VERSION,
116240cb5e5dSvi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
116340cb5e5dSvi117747 return (r);
116440cb5e5dSvi117747 }
116540cb5e5dSvi117747
116640cb5e5dSvi117747 /*
116740cb5e5dSvi117747 * get organization value
116840cb5e5dSvi117747 */
116940cb5e5dSvi117747 const sip_str_t *
sip_get_org(sip_msg_t sip_msg,int * error)117040cb5e5dSvi117747 sip_get_org(sip_msg_t sip_msg, int *error)
117140cb5e5dSvi117747 {
117240cb5e5dSvi117747 sip_str_t *r;
117340cb5e5dSvi117747
117440cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_ORGANIZATION,
117540cb5e5dSvi117747 SIP_STR_VAL, B_FALSE, B_TRUE, error);
117640cb5e5dSvi117747 return (r);
117740cb5e5dSvi117747 }
117840cb5e5dSvi117747
117940cb5e5dSvi117747 /*
118040cb5e5dSvi117747 * get priority value
118140cb5e5dSvi117747 */
118240cb5e5dSvi117747 const sip_str_t *
sip_get_priority(sip_msg_t sip_msg,int * error)118340cb5e5dSvi117747 sip_get_priority(sip_msg_t sip_msg, int *error)
118440cb5e5dSvi117747 {
118540cb5e5dSvi117747 sip_str_t *r;
118640cb5e5dSvi117747
118740cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_PRIORITY,
118840cb5e5dSvi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
118940cb5e5dSvi117747 return (r);
119040cb5e5dSvi117747 }
119140cb5e5dSvi117747
119240cb5e5dSvi117747 /*
119340cb5e5dSvi117747 * get display name
119440cb5e5dSvi117747 */
119540cb5e5dSvi117747 const sip_str_t *
sip_get_pidentity_display_name(sip_header_value_t value,int * error)119640cb5e5dSvi117747 sip_get_pidentity_display_name(sip_header_value_t value, int *error)
119740cb5e5dSvi117747 {
119840cb5e5dSvi117747 sip_str_t *r;
119940cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
120040cb5e5dSvi117747
120140cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);
120240cb5e5dSvi117747
120340cb5e5dSvi117747 return (r);
120440cb5e5dSvi117747 }
120540cb5e5dSvi117747
120640cb5e5dSvi117747 /*
120740cb5e5dSvi117747 * get URI
120840cb5e5dSvi117747 */
120940cb5e5dSvi117747 const sip_str_t *
sip_get_pidenty_uri_str(sip_header_value_t value,int * error)121040cb5e5dSvi117747 sip_get_pidenty_uri_str(sip_header_value_t value, int *error)
121140cb5e5dSvi117747 {
121240cb5e5dSvi117747 sip_str_t *r;
121340cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
121440cb5e5dSvi117747
121540cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_FALSE,
121640cb5e5dSvi117747 error);
121740cb5e5dSvi117747
121840cb5e5dSvi117747 return (r);
121940cb5e5dSvi117747 }
122040cb5e5dSvi117747
122140cb5e5dSvi117747 /*
122240cb5e5dSvi117747 * get display name from passerted-identity header
122340cb5e5dSvi117747 */
122440cb5e5dSvi117747 const sip_str_t *
sip_get_passertedid_display_name(sip_header_value_t value,int * error)122540cb5e5dSvi117747 sip_get_passertedid_display_name(sip_header_value_t value, int *error)
122640cb5e5dSvi117747 {
122740cb5e5dSvi117747 return (sip_get_pidentity_display_name(value, error));
122840cb5e5dSvi117747 }
122940cb5e5dSvi117747
123040cb5e5dSvi117747 /*
123140cb5e5dSvi117747 * get URI from passerted-identity header
123240cb5e5dSvi117747 */
123340cb5e5dSvi117747 const sip_str_t *
sip_get_passertedid_uri_str(sip_header_value_t value,int * error)123440cb5e5dSvi117747 sip_get_passertedid_uri_str(sip_header_value_t value, int *error)
123540cb5e5dSvi117747 {
123640cb5e5dSvi117747 return (sip_get_pidenty_uri_str(value, error));
123740cb5e5dSvi117747 }
123840cb5e5dSvi117747
123940cb5e5dSvi117747 /*
124040cb5e5dSvi117747 * get display name from ppreferred-identity header
124140cb5e5dSvi117747 */
124240cb5e5dSvi117747 const sip_str_t *
sip_get_ppreferredid_display_name(sip_header_value_t value,int * error)124340cb5e5dSvi117747 sip_get_ppreferredid_display_name(sip_header_value_t value, int *error)
124440cb5e5dSvi117747 {
124540cb5e5dSvi117747 return (sip_get_pidentity_display_name(value, error));
124640cb5e5dSvi117747 }
124740cb5e5dSvi117747
124840cb5e5dSvi117747 /*
124940cb5e5dSvi117747 * get URI from ppreferred-identity header
125040cb5e5dSvi117747 */
125140cb5e5dSvi117747 const sip_str_t *
sip_get_ppreferredid_uri_str(sip_header_value_t value,int * error)125240cb5e5dSvi117747 sip_get_ppreferredid_uri_str(sip_header_value_t value, int *error)
125340cb5e5dSvi117747 {
125440cb5e5dSvi117747 return (sip_get_pidenty_uri_str(value, error));
125540cb5e5dSvi117747 }
125640cb5e5dSvi117747
125740cb5e5dSvi117747 #define SIP_RACK_RESP_NUM 1
125840cb5e5dSvi117747 #define SIP_RACK_CSEQ_NUM 2
125940cb5e5dSvi117747 #define SIP_RACK_METHOD 3
126040cb5e5dSvi117747
126140cb5e5dSvi117747 /*
126240cb5e5dSvi117747 * Get rack information
126340cb5e5dSvi117747 */
126440cb5e5dSvi117747 static void *
sip_get_rack_val(sip_msg_t msg,int type,int * error)126540cb5e5dSvi117747 sip_get_rack_val(sip_msg_t msg, int type, int *error)
126640cb5e5dSvi117747 {
126740cb5e5dSvi117747 const _sip_header_t *header;
126840cb5e5dSvi117747 sip_hdr_value_t *val;
126940cb5e5dSvi117747
127040cb5e5dSvi117747 if (error != NULL)
127140cb5e5dSvi117747 *error = 0;
127240cb5e5dSvi117747
127340cb5e5dSvi117747 if (msg == NULL) {
127440cb5e5dSvi117747 if (error != NULL)
127540cb5e5dSvi117747 *error = EINVAL;
127640cb5e5dSvi117747 return (NULL);
127740cb5e5dSvi117747 }
127840cb5e5dSvi117747 header = sip_get_header(msg, SIP_RACK, NULL, error);
127940cb5e5dSvi117747 if (header == NULL) {
128040cb5e5dSvi117747 if (error != NULL)
128140cb5e5dSvi117747 *error = EINVAL;
128240cb5e5dSvi117747 return (NULL);
128340cb5e5dSvi117747 }
128440cb5e5dSvi117747 val = (sip_hdr_value_t *)sip_get_header_value(header, error);
128540cb5e5dSvi117747 if (val == NULL) {
128640cb5e5dSvi117747 if (error != NULL)
128740cb5e5dSvi117747 *error = EPROTO;
128840cb5e5dSvi117747 return (NULL);
128940cb5e5dSvi117747 }
129040cb5e5dSvi117747 if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
129140cb5e5dSvi117747 *error = EPROTO;
129240cb5e5dSvi117747
129340cb5e5dSvi117747 switch (type) {
129440cb5e5dSvi117747 case SIP_RACK_RESP_NUM:
129540cb5e5dSvi117747 return (&(val->rack_resp));
129640cb5e5dSvi117747 case SIP_RACK_CSEQ_NUM:
129740cb5e5dSvi117747 return (&(val->rack_cseq));
129840cb5e5dSvi117747 case SIP_RACK_METHOD:
129940cb5e5dSvi117747 return (&(val->rack_method));
130040cb5e5dSvi117747 }
130140cb5e5dSvi117747 if (error != NULL)
130240cb5e5dSvi117747 *error = EINVAL;
130340cb5e5dSvi117747 return (NULL);
130440cb5e5dSvi117747 }
130540cb5e5dSvi117747
130640cb5e5dSvi117747 /*
130740cb5e5dSvi117747 * get response number for rack
130840cb5e5dSvi117747 */
130940cb5e5dSvi117747 int
sip_get_rack_resp_num(sip_msg_t sip_msg,int * error)131040cb5e5dSvi117747 sip_get_rack_resp_num(sip_msg_t sip_msg, int *error)
131140cb5e5dSvi117747 {
131240cb5e5dSvi117747 int *r;
131340cb5e5dSvi117747
131440cb5e5dSvi117747 r = (int *)sip_get_rack_val(sip_msg, SIP_RACK_RESP_NUM, error);
131540cb5e5dSvi117747
131640cb5e5dSvi117747 return (r == NULL ? -1 : *r);
131740cb5e5dSvi117747 }
131840cb5e5dSvi117747
131940cb5e5dSvi117747 /*
132040cb5e5dSvi117747 * get sequence number for rack
132140cb5e5dSvi117747 */
132240cb5e5dSvi117747 int
sip_get_rack_cseq_num(sip_msg_t sip_msg,int * error)132340cb5e5dSvi117747 sip_get_rack_cseq_num(sip_msg_t sip_msg, int *error)
132440cb5e5dSvi117747 {
132540cb5e5dSvi117747 int *r;
132640cb5e5dSvi117747
132740cb5e5dSvi117747 r = (int *)sip_get_rack_val(sip_msg, SIP_RACK_CSEQ_NUM, error);
132840cb5e5dSvi117747
132940cb5e5dSvi117747 return (r == NULL ? -1 : *r);
133040cb5e5dSvi117747 }
133140cb5e5dSvi117747
133240cb5e5dSvi117747 /*
133340cb5e5dSvi117747 * get method for rack
133440cb5e5dSvi117747 */
133540cb5e5dSvi117747 sip_method_t
sip_get_rack_method(sip_msg_t sip_msg,int * error)133640cb5e5dSvi117747 sip_get_rack_method(sip_msg_t sip_msg, int *error)
133740cb5e5dSvi117747 {
133840cb5e5dSvi117747 sip_method_t *r;
133940cb5e5dSvi117747
134040cb5e5dSvi117747 r = (sip_method_t *)sip_get_rack_val(sip_msg, SIP_RACK_METHOD, error);
134140cb5e5dSvi117747
134240cb5e5dSvi117747 return (r == NULL ? -1 : *r);
134340cb5e5dSvi117747 }
134440cb5e5dSvi117747
134540cb5e5dSvi117747 /*
134640cb5e5dSvi117747 * get response number from rseq
134740cb5e5dSvi117747 */
134840cb5e5dSvi117747 int
sip_get_rseq_resp_num(sip_msg_t sip_msg,int * error)134940cb5e5dSvi117747 sip_get_rseq_resp_num(sip_msg_t sip_msg, int *error)
135040cb5e5dSvi117747 {
135140cb5e5dSvi117747 int *r;
135240cb5e5dSvi117747
135340cb5e5dSvi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_RSEQ, SIP_INT_VAL,
135440cb5e5dSvi117747 B_FALSE, B_FALSE, error);
135540cb5e5dSvi117747
135640cb5e5dSvi117747 return (r == NULL ? -1 : *r);
135740cb5e5dSvi117747 }
135840cb5e5dSvi117747
135940cb5e5dSvi117747 /*
136040cb5e5dSvi117747 * get reply-to display name
136140cb5e5dSvi117747 */
136240cb5e5dSvi117747 const sip_str_t *
sip_get_replyto_display_name(sip_msg_t sip_msg,int * error)136340cb5e5dSvi117747 sip_get_replyto_display_name(sip_msg_t sip_msg, int *error)
136440cb5e5dSvi117747 {
136540cb5e5dSvi117747 sip_str_t *r;
136640cb5e5dSvi117747
136740cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_REPLYTO,
136840cb5e5dSvi117747 SIP_STRS_VAL, B_TRUE, B_FALSE, error);
136940cb5e5dSvi117747 return (r);
137040cb5e5dSvi117747 }
137140cb5e5dSvi117747
137240cb5e5dSvi117747 /*
137340cb5e5dSvi117747 * get reply-to URI
137440cb5e5dSvi117747 */
137540cb5e5dSvi117747 const sip_str_t *
sip_get_replyto_uri_str(sip_msg_t sip_msg,int * error)137640cb5e5dSvi117747 sip_get_replyto_uri_str(sip_msg_t sip_msg, int *error)
137740cb5e5dSvi117747 {
137840cb5e5dSvi117747 sip_str_t *r;
137940cb5e5dSvi117747
138040cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_REPLYTO,
138140cb5e5dSvi117747 SIP_STRS_VAL, B_FALSE, B_FALSE, error);
138240cb5e5dSvi117747
138340cb5e5dSvi117747 return (r);
138440cb5e5dSvi117747 }
138540cb5e5dSvi117747
138640cb5e5dSvi117747 /*
138740cb5e5dSvi117747 * get require value
138840cb5e5dSvi117747 */
138940cb5e5dSvi117747 const sip_str_t *
sip_get_require(sip_header_value_t value,int * error)139040cb5e5dSvi117747 sip_get_require(sip_header_value_t value, int *error)
139140cb5e5dSvi117747 {
139240cb5e5dSvi117747 sip_str_t *r;
139340cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
139440cb5e5dSvi117747
139540cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
139640cb5e5dSvi117747 return (r);
139740cb5e5dSvi117747 }
139840cb5e5dSvi117747
139940cb5e5dSvi117747 /*
140040cb5e5dSvi117747 * get retry-after time
140140cb5e5dSvi117747 */
140240cb5e5dSvi117747 int
sip_get_retry_after_time(sip_msg_t sip_msg,int * error)140340cb5e5dSvi117747 sip_get_retry_after_time(sip_msg_t sip_msg, int *error)
140440cb5e5dSvi117747 {
140540cb5e5dSvi117747 int *t;
140640cb5e5dSvi117747
140740cb5e5dSvi117747 t = (int *)sip_get_val_from_msg(sip_msg, SIP_RETRY_AFTER,
140840cb5e5dSvi117747 SIP_INTSTR_VAL, B_FALSE, B_FALSE, error);
140940cb5e5dSvi117747 if (t == NULL)
141040cb5e5dSvi117747 return (-1);
141140cb5e5dSvi117747 return (*t);
141240cb5e5dSvi117747 }
141340cb5e5dSvi117747
141440cb5e5dSvi117747 /*
141540cb5e5dSvi117747 * get retry-after comments
141640cb5e5dSvi117747 */
141740cb5e5dSvi117747 const sip_str_t *
sip_get_retry_after_cmts(sip_msg_t sip_msg,int * error)141840cb5e5dSvi117747 sip_get_retry_after_cmts(sip_msg_t sip_msg, int *error)
141940cb5e5dSvi117747 {
142040cb5e5dSvi117747 sip_str_t *r;
142140cb5e5dSvi117747
142240cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_RETRY_AFTER,
142340cb5e5dSvi117747 SIP_INTSTR_VAL, B_TRUE, B_FALSE, error);
142440cb5e5dSvi117747 return (r);
142540cb5e5dSvi117747 }
142640cb5e5dSvi117747
142740cb5e5dSvi117747 /*
142840cb5e5dSvi117747 * get subject
142940cb5e5dSvi117747 */
143040cb5e5dSvi117747 const sip_str_t *
sip_get_subject(sip_msg_t sip_msg,int * error)143140cb5e5dSvi117747 sip_get_subject(sip_msg_t sip_msg, int *error)
143240cb5e5dSvi117747 {
143340cb5e5dSvi117747 sip_str_t *r;
143440cb5e5dSvi117747
143540cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBJECT, SIP_STR_VAL,
143640cb5e5dSvi117747 B_FALSE, B_TRUE, error);
143740cb5e5dSvi117747 return (r);
143840cb5e5dSvi117747 }
143940cb5e5dSvi117747
144040cb5e5dSvi117747 /*
144140cb5e5dSvi117747 * get supported
144240cb5e5dSvi117747 */
144340cb5e5dSvi117747 const sip_str_t *
sip_get_supported(sip_header_value_t value,int * error)144440cb5e5dSvi117747 sip_get_supported(sip_header_value_t value, int *error)
144540cb5e5dSvi117747 {
144640cb5e5dSvi117747 sip_str_t *r;
144740cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
144840cb5e5dSvi117747
144940cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
145040cb5e5dSvi117747 return (r);
145140cb5e5dSvi117747 }
145240cb5e5dSvi117747
145340cb5e5dSvi117747 /*
145440cb5e5dSvi117747 * get timestamp delay
145540cb5e5dSvi117747 */
145640cb5e5dSvi117747 const sip_str_t *
sip_get_tstamp_delay(sip_msg_t sip_msg,int * error)145740cb5e5dSvi117747 sip_get_tstamp_delay(sip_msg_t sip_msg, int *error)
145840cb5e5dSvi117747 {
145940cb5e5dSvi117747 sip_str_t *t;
146040cb5e5dSvi117747
146140cb5e5dSvi117747 t = sip_get_val_from_msg(sip_msg, SIP_TIMESTAMP, SIP_STRS_VAL, B_FALSE,
146240cb5e5dSvi117747 B_FALSE, error);
146340cb5e5dSvi117747 return (t);
146440cb5e5dSvi117747 }
146540cb5e5dSvi117747
146640cb5e5dSvi117747 /*
146740cb5e5dSvi117747 * get timestamp
146840cb5e5dSvi117747 */
146940cb5e5dSvi117747 const sip_str_t *
sip_get_tstamp_value(sip_msg_t sip_msg,int * error)147040cb5e5dSvi117747 sip_get_tstamp_value(sip_msg_t sip_msg, int *error)
147140cb5e5dSvi117747 {
147240cb5e5dSvi117747 sip_str_t *t;
147340cb5e5dSvi117747
147440cb5e5dSvi117747 t = sip_get_val_from_msg(sip_msg, SIP_TIMESTAMP, SIP_STRS_VAL, B_TRUE,
147540cb5e5dSvi117747 B_FALSE, error);
147640cb5e5dSvi117747 return (t);
147740cb5e5dSvi117747 }
147840cb5e5dSvi117747
147940cb5e5dSvi117747 /*
148040cb5e5dSvi117747 * get unsupported value
148140cb5e5dSvi117747 */
148240cb5e5dSvi117747 const sip_str_t *
sip_get_unsupported(sip_header_value_t value,int * error)148340cb5e5dSvi117747 sip_get_unsupported(sip_header_value_t value, int *error)
148440cb5e5dSvi117747 {
148540cb5e5dSvi117747 sip_str_t *r;
148640cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
148740cb5e5dSvi117747
148840cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
148940cb5e5dSvi117747 return (r);
149040cb5e5dSvi117747 }
149140cb5e5dSvi117747
149240cb5e5dSvi117747 /*
149340cb5e5dSvi117747 * get server value from message
149440cb5e5dSvi117747 */
149540cb5e5dSvi117747 const sip_str_t *
sip_get_server(sip_msg_t sip_msg,int * error)149640cb5e5dSvi117747 sip_get_server(sip_msg_t sip_msg, int *error)
149740cb5e5dSvi117747 {
149840cb5e5dSvi117747 sip_str_t *r;
149940cb5e5dSvi117747
150040cb5e5dSvi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SERVER, SIP_STR_VAL,
150140cb5e5dSvi117747 B_FALSE, B_FALSE, error);
150240cb5e5dSvi117747 return (r);
150340cb5e5dSvi117747 }
150440cb5e5dSvi117747
150540cb5e5dSvi117747 /*
150640cb5e5dSvi117747 * get user-agent value
150740cb5e5dSvi117747 */
150840cb5e5dSvi117747 const sip_str_t *
sip_get_user_agent(sip_msg_t sip_msg,int * error)150940cb5e5dSvi117747 sip_get_user_agent(sip_msg_t sip_msg, int *error)
151040cb5e5dSvi117747 {
151140cb5e5dSvi117747 sip_str_t *r;
151240cb5e5dSvi117747
151340cb5e5dSvi117747 r = sip_get_val_from_msg(sip_msg, SIP_USER_AGENT, SIP_STR_VAL, B_FALSE,
151440cb5e5dSvi117747 B_FALSE, error);
151540cb5e5dSvi117747 return (r);
151640cb5e5dSvi117747 }
151740cb5e5dSvi117747
151840cb5e5dSvi117747 #define W_CODE 0x05
151940cb5e5dSvi117747 #define W_AGENT 0x06
152040cb5e5dSvi117747 #define W_TEXT 0x07
152140cb5e5dSvi117747
152240cb5e5dSvi117747 /*
152340cb5e5dSvi117747 * get warning info
152440cb5e5dSvi117747 */
152540cb5e5dSvi117747 static void *
sip_get_warninfo(sip_header_value_t value,int info,int * error)152640cb5e5dSvi117747 sip_get_warninfo(sip_header_value_t value, int info, int *error)
152740cb5e5dSvi117747 {
152840cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
152940cb5e5dSvi117747
153040cb5e5dSvi117747 if (error != NULL)
153140cb5e5dSvi117747 *error = 0;
153240cb5e5dSvi117747
153340cb5e5dSvi117747 if (val == NULL) {
153440cb5e5dSvi117747 if (error != NULL)
153540cb5e5dSvi117747 *error = EINVAL;
153640cb5e5dSvi117747 return (NULL);
153740cb5e5dSvi117747 }
153840cb5e5dSvi117747
153940cb5e5dSvi117747 if (val->sip_value_state == SIP_VALUE_BAD) {
154040cb5e5dSvi117747 *error = EPROTO;
154140cb5e5dSvi117747 return (NULL);
154240cb5e5dSvi117747 }
154340cb5e5dSvi117747
154440cb5e5dSvi117747 switch (info) {
154540cb5e5dSvi117747 case (W_CODE):
154640cb5e5dSvi117747 return (&(val->warn_code));
154740cb5e5dSvi117747 case (W_AGENT):
154840cb5e5dSvi117747 return (&(val->warn_agt));
154940cb5e5dSvi117747 case (W_TEXT):
155040cb5e5dSvi117747 return (&(val->warn_text));
155140cb5e5dSvi117747 }
155240cb5e5dSvi117747 if (error != NULL)
155340cb5e5dSvi117747 *error = EINVAL;
155440cb5e5dSvi117747 return (NULL);
155540cb5e5dSvi117747 }
155640cb5e5dSvi117747
155740cb5e5dSvi117747 /*
155840cb5e5dSvi117747 * get warning code
155940cb5e5dSvi117747 */
156040cb5e5dSvi117747 int
sip_get_warning_code(sip_header_value_t value,int * error)156140cb5e5dSvi117747 sip_get_warning_code(sip_header_value_t value, int *error)
156240cb5e5dSvi117747 {
156340cb5e5dSvi117747 int *c;
156440cb5e5dSvi117747
156540cb5e5dSvi117747 if (error != NULL)
156640cb5e5dSvi117747 *error = 0;
156740cb5e5dSvi117747
156840cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
156940cb5e5dSvi117747 if (error != NULL)
157040cb5e5dSvi117747 *error = EINVAL;
157140cb5e5dSvi117747 return (-1);
157240cb5e5dSvi117747 }
157340cb5e5dSvi117747 c = (int *)sip_get_warninfo(value, W_CODE, error);
157440cb5e5dSvi117747 if (c == NULL)
157540cb5e5dSvi117747 return (-1);
157640cb5e5dSvi117747 return (*c);
157740cb5e5dSvi117747 }
157840cb5e5dSvi117747
157940cb5e5dSvi117747 /*
158040cb5e5dSvi117747 * get warning agent
158140cb5e5dSvi117747 */
158240cb5e5dSvi117747 const sip_str_t *
sip_get_warning_agent(sip_header_value_t value,int * error)158340cb5e5dSvi117747 sip_get_warning_agent(sip_header_value_t value, int *error)
158440cb5e5dSvi117747 {
158540cb5e5dSvi117747 sip_str_t *r;
158640cb5e5dSvi117747
158740cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
158840cb5e5dSvi117747 if (error != NULL)
158940cb5e5dSvi117747 *error = EINVAL;
159040cb5e5dSvi117747 return (NULL);
159140cb5e5dSvi117747 }
159240cb5e5dSvi117747 r = (sip_str_t *)sip_get_warninfo(value, W_AGENT, error);
159340cb5e5dSvi117747 return (r);
159440cb5e5dSvi117747 }
159540cb5e5dSvi117747
159640cb5e5dSvi117747 /*
159740cb5e5dSvi117747 * get warning text
159840cb5e5dSvi117747 */
159940cb5e5dSvi117747 const sip_str_t *
sip_get_warning_text(sip_header_value_t value,int * error)160040cb5e5dSvi117747 sip_get_warning_text(sip_header_value_t value, int *error)
160140cb5e5dSvi117747 {
160240cb5e5dSvi117747 sip_str_t *r;
160340cb5e5dSvi117747
160440cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
160540cb5e5dSvi117747 if (error != NULL)
160640cb5e5dSvi117747 *error = EINVAL;
160740cb5e5dSvi117747 return (NULL);
160840cb5e5dSvi117747 }
160940cb5e5dSvi117747 r = (sip_str_t *)sip_get_warninfo(value, W_TEXT, error);
161040cb5e5dSvi117747 return (r);
161140cb5e5dSvi117747 }
161240cb5e5dSvi117747
161340cb5e5dSvi117747 /*
161440cb5e5dSvi117747 * get authorization scheme
161540cb5e5dSvi117747 */
161640cb5e5dSvi117747 const sip_str_t *
sip_get_author_scheme(sip_msg_t sip_msg,int * error)161740cb5e5dSvi117747 sip_get_author_scheme(sip_msg_t sip_msg, int *error)
161840cb5e5dSvi117747 {
161940cb5e5dSvi117747 sip_str_t *r;
162040cb5e5dSvi117747
162140cb5e5dSvi117747 r = sip_get_val_from_msg(sip_msg, SIP_AUTHOR, SIP_AUTH_VAL, B_FALSE,
162240cb5e5dSvi117747 B_FALSE, error);
162340cb5e5dSvi117747 return (r);
162440cb5e5dSvi117747 }
162540cb5e5dSvi117747
162640cb5e5dSvi117747 /*
162740cb5e5dSvi117747 * get authentication parameter
162840cb5e5dSvi117747 */
162940cb5e5dSvi117747 static const sip_str_t *
sip_get_auth_param(sip_msg_t msg,char * hdr_name,char * pname,int * error)163040cb5e5dSvi117747 sip_get_auth_param(sip_msg_t msg, char *hdr_name, char *pname, int *error)
163140cb5e5dSvi117747 {
163240cb5e5dSvi117747 const _sip_header_t *header;
163340cb5e5dSvi117747 sip_hdr_value_t *value;
163440cb5e5dSvi117747 sip_param_t *param;
163540cb5e5dSvi117747
163640cb5e5dSvi117747 if (error != NULL)
163740cb5e5dSvi117747 *error = 0;
163840cb5e5dSvi117747
163940cb5e5dSvi117747 if (msg == NULL || pname == NULL || hdr_name == NULL) {
164040cb5e5dSvi117747 if (error != NULL)
164140cb5e5dSvi117747 *error = EINVAL;
164240cb5e5dSvi117747 return (NULL);
164340cb5e5dSvi117747 }
164440cb5e5dSvi117747
164540cb5e5dSvi117747 header = sip_get_header(msg, hdr_name, NULL, error);
164640cb5e5dSvi117747 if (header == NULL) {
164740cb5e5dSvi117747 if (error != NULL)
164840cb5e5dSvi117747 *error = EINVAL;
164940cb5e5dSvi117747 return (NULL);
165040cb5e5dSvi117747 }
165140cb5e5dSvi117747
165240cb5e5dSvi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
165340cb5e5dSvi117747 if (value == NULL) {
165440cb5e5dSvi117747 if (error != NULL)
165540cb5e5dSvi117747 *error = EPROTO;
165640cb5e5dSvi117747 return (NULL);
165740cb5e5dSvi117747 }
165840cb5e5dSvi117747
165940cb5e5dSvi117747 param = sip_get_param_from_list(value->auth_param, pname);
166040cb5e5dSvi117747 if (param != NULL)
166140cb5e5dSvi117747 return (¶m->param_value);
166240cb5e5dSvi117747 return (NULL);
166340cb5e5dSvi117747 }
166440cb5e5dSvi117747
166540cb5e5dSvi117747 /*
166640cb5e5dSvi117747 * get authentication parameter
166740cb5e5dSvi117747 */
166840cb5e5dSvi117747 const sip_str_t *
sip_get_author_param(sip_msg_t sip_msg,char * name,int * error)166940cb5e5dSvi117747 sip_get_author_param(sip_msg_t sip_msg, char *name, int *error)
167040cb5e5dSvi117747 {
167140cb5e5dSvi117747 const sip_str_t *r;
167240cb5e5dSvi117747
167340cb5e5dSvi117747 r = sip_get_auth_param(sip_msg, SIP_AUTHOR, name, error);
167440cb5e5dSvi117747 return (r);
167540cb5e5dSvi117747 }
167640cb5e5dSvi117747
167740cb5e5dSvi117747 /*
167840cb5e5dSvi117747 * get authentication info
167940cb5e5dSvi117747 */
168040cb5e5dSvi117747 const sip_str_t *
sip_get_authen_info(sip_header_value_t value,int * error)168140cb5e5dSvi117747 sip_get_authen_info(sip_header_value_t value, int *error)
168240cb5e5dSvi117747 {
168340cb5e5dSvi117747 sip_str_t *r;
168440cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
168540cb5e5dSvi117747
168640cb5e5dSvi117747 if (error != NULL)
168740cb5e5dSvi117747 *error = 0;
168840cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
168940cb5e5dSvi117747 if (error != NULL)
169040cb5e5dSvi117747 *error = EINVAL;
169140cb5e5dSvi117747 return (NULL);
169240cb5e5dSvi117747 }
169340cb5e5dSvi117747 r = sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
169440cb5e5dSvi117747 return (r);
169540cb5e5dSvi117747 }
169640cb5e5dSvi117747
169740cb5e5dSvi117747 /*
169840cb5e5dSvi117747 * get proxy-authentication scheme
169940cb5e5dSvi117747 */
170040cb5e5dSvi117747 const sip_str_t *
sip_get_proxy_authen_scheme(sip_msg_t msg,int * error)170140cb5e5dSvi117747 sip_get_proxy_authen_scheme(sip_msg_t msg, int *error)
170240cb5e5dSvi117747 {
170340cb5e5dSvi117747 sip_str_t *r;
170440cb5e5dSvi117747
170540cb5e5dSvi117747 r = sip_get_val_from_msg(msg, SIP_PROXY_AUTHEN, SIP_AUTH_VAL, B_FALSE,
170640cb5e5dSvi117747 B_FALSE, error);
170740cb5e5dSvi117747 return (r);
170840cb5e5dSvi117747 }
170940cb5e5dSvi117747
171040cb5e5dSvi117747 /*
171140cb5e5dSvi117747 * get proxy authentication parameter
171240cb5e5dSvi117747 */
171340cb5e5dSvi117747 const sip_str_t *
sip_get_proxy_authen_param(sip_msg_t sip_msg,char * name,int * error)171440cb5e5dSvi117747 sip_get_proxy_authen_param(sip_msg_t sip_msg, char *name, int *error)
171540cb5e5dSvi117747 {
171640cb5e5dSvi117747 const sip_str_t *r;
171740cb5e5dSvi117747
171840cb5e5dSvi117747 r = sip_get_auth_param(sip_msg, SIP_PROXY_AUTHEN, name, error);
171940cb5e5dSvi117747 return (r);
172040cb5e5dSvi117747 }
172140cb5e5dSvi117747
172240cb5e5dSvi117747 /*
172340cb5e5dSvi117747 * get proxy-authorization scheme
172440cb5e5dSvi117747 */
172540cb5e5dSvi117747 const sip_str_t *
sip_get_proxy_author_scheme(sip_msg_t msg,int * error)172640cb5e5dSvi117747 sip_get_proxy_author_scheme(sip_msg_t msg, int *error)
172740cb5e5dSvi117747 {
172840cb5e5dSvi117747 sip_str_t *r;
172940cb5e5dSvi117747
173040cb5e5dSvi117747 r = sip_get_val_from_msg(msg, SIP_PROXY_AUTHOR, SIP_AUTH_VAL, B_FALSE,
173140cb5e5dSvi117747 B_FALSE, error);
173240cb5e5dSvi117747 return (r);
173340cb5e5dSvi117747 }
173440cb5e5dSvi117747
173540cb5e5dSvi117747 /*
173640cb5e5dSvi117747 * get proxy-authorization parameter
173740cb5e5dSvi117747 */
173840cb5e5dSvi117747 const sip_str_t *
sip_get_proxy_author_param(sip_msg_t sip_msg,char * name,int * error)173940cb5e5dSvi117747 sip_get_proxy_author_param(sip_msg_t sip_msg, char *name, int *error)
174040cb5e5dSvi117747 {
174140cb5e5dSvi117747 const sip_str_t *r;
174240cb5e5dSvi117747
174340cb5e5dSvi117747 r = sip_get_auth_param(sip_msg, SIP_PROXY_AUTHOR, name, error);
174440cb5e5dSvi117747 return (r);
174540cb5e5dSvi117747 }
174640cb5e5dSvi117747
174740cb5e5dSvi117747 /*
174840cb5e5dSvi117747 * get proxy-require
174940cb5e5dSvi117747 */
175040cb5e5dSvi117747 const sip_str_t *
sip_get_proxy_require(sip_header_value_t value,int * error)175140cb5e5dSvi117747 sip_get_proxy_require(sip_header_value_t value, int *error)
175240cb5e5dSvi117747 {
175340cb5e5dSvi117747 sip_str_t *r;
175440cb5e5dSvi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
175540cb5e5dSvi117747
175640cb5e5dSvi117747 if (error != NULL)
175740cb5e5dSvi117747 *error = 0;
175840cb5e5dSvi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
175940cb5e5dSvi117747 if (error != NULL)
176040cb5e5dSvi117747 *error = EINVAL;
176140cb5e5dSvi117747 return (NULL);
176240cb5e5dSvi117747 }
176340cb5e5dSvi117747 r = sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
176440cb5e5dSvi117747 return (r);
176540cb5e5dSvi117747 }
176640cb5e5dSvi117747
176740cb5e5dSvi117747 /*
176840cb5e5dSvi117747 * get www-authentication scheme
176940cb5e5dSvi117747 */
177040cb5e5dSvi117747 const sip_str_t *
sip_get_www_authen_scheme(sip_msg_t msg,int * error)177140cb5e5dSvi117747 sip_get_www_authen_scheme(sip_msg_t msg, int *error)
177240cb5e5dSvi117747 {
177340cb5e5dSvi117747 sip_str_t *r;
177440cb5e5dSvi117747
177540cb5e5dSvi117747 r = sip_get_val_from_msg(msg, SIP_WWW_AUTHEN, SIP_AUTH_VAL, B_FALSE,
177640cb5e5dSvi117747 B_FALSE, error);
177740cb5e5dSvi117747 return (r);
177840cb5e5dSvi117747 }
177940cb5e5dSvi117747
178040cb5e5dSvi117747 /*
178140cb5e5dSvi117747 * get www-authentication parameter
178240cb5e5dSvi117747 */
178340cb5e5dSvi117747 const sip_str_t *
sip_get_www_authen_param(sip_msg_t sip_msg,char * name,int * error)178440cb5e5dSvi117747 sip_get_www_authen_param(sip_msg_t sip_msg, char *name, int *error)
178540cb5e5dSvi117747 {
178640cb5e5dSvi117747 const sip_str_t *r;
178740cb5e5dSvi117747
178840cb5e5dSvi117747 r = sip_get_auth_param(sip_msg, SIP_WWW_AUTHEN, name, error);
178940cb5e5dSvi117747 return (r);
179040cb5e5dSvi117747 }
1791