12882Svi117747 /*
22882Svi117747 * CDDL HEADER START
32882Svi117747 *
42882Svi117747 * The contents of this file are subject to the terms of the
52882Svi117747 * Common Development and Distribution License (the "License").
62882Svi117747 * You may not use this file except in compliance with the License.
72882Svi117747 *
82882Svi117747 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92882Svi117747 * or http://www.opensolaris.org/os/licensing.
102882Svi117747 * See the License for the specific language governing permissions
112882Svi117747 * and limitations under the License.
122882Svi117747 *
132882Svi117747 * When distributing Covered Code, include this CDDL HEADER in each
142882Svi117747 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152882Svi117747 * If applicable, add the following below this CDDL HEADER, with the
162882Svi117747 * fields enclosed by brackets "[]" replaced with your own identifying
172882Svi117747 * information: Portions Copyright [yyyy] [name of copyright owner]
182882Svi117747 *
192882Svi117747 * CDDL HEADER END
202882Svi117747 */
212882Svi117747
222882Svi117747 /*
23*3439Svi117747 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
242882Svi117747 * Use is subject to license terms.
252882Svi117747 */
262882Svi117747
272882Svi117747 #pragma ident "%Z%%M% %I% %E% SMI"
282882Svi117747
29*3439Svi117747 #include <stdio.h>
30*3439Svi117747 #include <stdlib.h>
31*3439Svi117747 #include <strings.h>
32*3439Svi117747 #include <errno.h>
33*3439Svi117747 #include <pthread.h>
34*3439Svi117747 #include <sip.h>
35*3439Svi117747
362882Svi117747 #include "sip_msg.h"
372882Svi117747
382882Svi117747 /*
392882Svi117747 * Generic function to get int or string value from a header
402882Svi117747 */
412882Svi117747 static void *
sip_get_val_from_hdr(sip_hdr_value_t * val,int val_type,boolean_t stype,int * error)422882Svi117747 sip_get_val_from_hdr(sip_hdr_value_t *val, int val_type, boolean_t stype,
432882Svi117747 int *error)
442882Svi117747 {
452882Svi117747 if (error != NULL)
462882Svi117747 *error = 0;
472882Svi117747
482882Svi117747 if (val == NULL || val->sip_value_state == SIP_VALUE_DELETED) {
492882Svi117747 if (error != NULL)
502882Svi117747 *error = EINVAL;
512882Svi117747 return (NULL);
522882Svi117747 }
532882Svi117747
542882Svi117747 if (val->sip_value_state == SIP_VALUE_BAD)
552882Svi117747 *error = EPROTO;
562882Svi117747
572882Svi117747 switch (val_type) {
582882Svi117747 case (SIP_INT_VAL):
592882Svi117747 return (&(val->int_val));
602882Svi117747 case (SIP_STR_VAL):
612882Svi117747 return (&(val->str_val));
622882Svi117747 case (SIP_STRS_VAL):
632882Svi117747 if (stype == B_TRUE) {
642882Svi117747 if (val->strs_val.s1.sip_str_ptr != NULL)
652882Svi117747 return (&(val->strs_val.s1));
662882Svi117747 return (NULL);
672882Svi117747 }
682882Svi117747 if (val->strs_val.s2.sip_str_ptr != NULL)
692882Svi117747 return (&(val->strs_val.s2));
702882Svi117747 return (NULL);
712882Svi117747 case (SIP_INTSTR_VAL):
722882Svi117747 if (stype == B_TRUE) {
732882Svi117747 if (val->intstr_str.sip_str_ptr != NULL)
742882Svi117747 return (&(val->intstr_str));
752882Svi117747 else
762882Svi117747 return (NULL);
772882Svi117747 }
782882Svi117747 return (&(val->intstr_int));
792882Svi117747 case (SIP_AUTH_VAL):
802882Svi117747 return (&(val->auth_val));
812882Svi117747 }
822882Svi117747 if (error != NULL && *error == 0)
832882Svi117747 *error = EINVAL;
842882Svi117747 return (NULL);
852882Svi117747 }
862882Svi117747
872882Svi117747 /*
882882Svi117747 * Generic function to get value from a header given the value type and
892882Svi117747 * the string info (for multi-string values).
902882Svi117747 */
912882Svi117747 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)922882Svi117747 sip_get_val_from_msg(sip_msg_t msg, char *hdr_name, int val_type,
932882Svi117747 boolean_t stype, boolean_t empty_val, int *error)
942882Svi117747 {
952882Svi117747 const _sip_header_t *header;
962882Svi117747 sip_hdr_value_t *value;
972882Svi117747
982882Svi117747 if (error != NULL)
992882Svi117747 *error = 0;
1002882Svi117747 if (msg == NULL) {
1012882Svi117747 if (error != NULL)
1022882Svi117747 *error = EINVAL;
1032882Svi117747 return (NULL);
1042882Svi117747 }
1052882Svi117747
1062882Svi117747 header = sip_get_header(msg, hdr_name, NULL, error);
1072882Svi117747 if (header == NULL) {
1082882Svi117747 if (error != NULL)
1092882Svi117747 *error = EINVAL;
1102882Svi117747 return (NULL);
1112882Svi117747 }
1122882Svi117747
1132882Svi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
1142882Svi117747 if (value == NULL) {
1152882Svi117747 if (error != NULL && empty_val == B_FALSE)
1162882Svi117747 *error = EPROTO;
1172882Svi117747 return (NULL);
1182882Svi117747 }
1192882Svi117747 return (sip_get_val_from_hdr(value, val_type, stype, error));
1202882Svi117747 }
1212882Svi117747
1222882Svi117747 /*
1232882Svi117747 * Get the URI from the value
1242882Svi117747 */
1252882Svi117747 const sip_str_t *
sip_get_cftruri_from_val(sip_header_value_t value,int * error)1262882Svi117747 sip_get_cftruri_from_val(sip_header_value_t value, int *error)
1272882Svi117747 {
1282882Svi117747 sip_hdr_value_t *cftrvalue;
1292882Svi117747
1302882Svi117747 if (error != NULL)
1312882Svi117747 *error = 0;
1322882Svi117747
1332882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
1342882Svi117747 if (error != NULL)
1352882Svi117747 *error = EINVAL;
1362882Svi117747 return (NULL);
1372882Svi117747 }
1382882Svi117747 cftrvalue = (sip_hdr_value_t *)value;
1392882Svi117747 /*
1402882Svi117747 * If the value is BAD, update error to reflect it.
1412882Svi117747 */
1422882Svi117747 if (error != NULL && value->value_state == SIP_VALUE_BAD)
1432882Svi117747 *error = EPROTO;
1442882Svi117747 return (&cftrvalue->cftr_uri);
1452882Svi117747 }
1462882Svi117747
1472882Svi117747 /*
1482882Svi117747 * Get display name from the value
1492882Svi117747 */
1502882Svi117747 const sip_str_t *
sip_get_cftrname_from_val(sip_header_value_t value,int * error)1512882Svi117747 sip_get_cftrname_from_val(sip_header_value_t value, int *error)
1522882Svi117747 {
1532882Svi117747 sip_hdr_value_t *cftrvalue;
1542882Svi117747
1552882Svi117747 if (error != NULL)
1562882Svi117747 *error = 0;
1572882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
1582882Svi117747 if (error != NULL)
1592882Svi117747 *error = EINVAL;
1602882Svi117747 return (NULL);
1612882Svi117747 }
1622882Svi117747 cftrvalue = (sip_hdr_value_t *)value;
1632882Svi117747 /*
1642882Svi117747 * If the value is BAD, update error to reflect it.
1652882Svi117747 */
1662882Svi117747 if (error != NULL && value->value_state == SIP_VALUE_BAD)
1672882Svi117747 *error = EPROTO;
1682882Svi117747 return (cftrvalue->cftr_name);
1692882Svi117747 }
1702882Svi117747
1712882Svi117747 /*
1722882Svi117747 * Contact header can have more than one value
1732882Svi117747 * so we require a value to be passed in to get a value.
1742882Svi117747 */
1752882Svi117747 const sip_str_t *
sip_get_contact_uri_str(sip_header_value_t value,int * error)1762882Svi117747 sip_get_contact_uri_str(sip_header_value_t value, int *error)
1772882Svi117747 {
1782882Svi117747 return (sip_get_cftruri_from_val(value, error));
1792882Svi117747 }
1802882Svi117747
1812882Svi117747 /*
1822882Svi117747 * Contact header can have more than one value
1832882Svi117747 * so we require a value to be passed in to get a value.
1842882Svi117747 */
1852882Svi117747 const sip_str_t *
sip_get_contact_display_name(sip_header_value_t value,int * error)1862882Svi117747 sip_get_contact_display_name(sip_header_value_t value, int *error)
1872882Svi117747 {
1882882Svi117747 return (sip_get_cftrname_from_val(value, error));
1892882Svi117747 }
1902882Svi117747
1912882Svi117747 /*
1922882Svi117747 * Route header can have more than one value
1932882Svi117747 * so we require a value to be passed in to get a value.
1942882Svi117747 */
1952882Svi117747 const sip_str_t *
sip_get_route_uri_str(sip_header_value_t value,int * error)1962882Svi117747 sip_get_route_uri_str(sip_header_value_t value, int *error)
1972882Svi117747 {
1982882Svi117747 return (sip_get_cftruri_from_val(value, error));
1992882Svi117747 }
2002882Svi117747
2012882Svi117747 /*
2022882Svi117747 * Route header can have more than one value
2032882Svi117747 * so we require a value to be passed in to get a value.
2042882Svi117747 */
2052882Svi117747 const sip_str_t *
sip_get_route_display_name(sip_header_value_t value,int * error)2062882Svi117747 sip_get_route_display_name(sip_header_value_t value, int *error)
2072882Svi117747 {
2082882Svi117747 return (sip_get_cftrname_from_val(value, error));
2092882Svi117747 }
2102882Svi117747
2112882Svi117747 /*
2122882Svi117747 * Get URI from the SIP message
2132882Svi117747 */
2142882Svi117747 const sip_str_t *
sip_get_cftruri_from_msg(sip_msg_t sip_msg,int * error,char * hdrname)2152882Svi117747 sip_get_cftruri_from_msg(sip_msg_t sip_msg, int *error, char *hdrname)
2162882Svi117747 {
2172882Svi117747 const sip_hdr_value_t *value;
2182882Svi117747 const struct sip_header *header;
2192882Svi117747
2202882Svi117747 if (error != NULL)
2212882Svi117747 *error = 0;
2222882Svi117747 if (sip_msg == NULL) {
2232882Svi117747 if (error != NULL)
2242882Svi117747 *error = EINVAL;
2252882Svi117747 return (NULL);
2262882Svi117747 }
2272882Svi117747
2282882Svi117747 header = sip_get_header(sip_msg, hdrname, NULL, error);
2292882Svi117747 if (header == NULL) {
2302882Svi117747 if (error != NULL)
2312882Svi117747 *error = EINVAL;
2322882Svi117747 return (NULL);
2332882Svi117747 }
2342882Svi117747
2352882Svi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
2362882Svi117747 if (value == NULL) {
2372882Svi117747 if (error != NULL)
2382882Svi117747 *error = EPROTO;
2392882Svi117747 return (NULL);
2402882Svi117747 }
2412882Svi117747 /*
2422882Svi117747 * If the value is BAD, update error to reflect it.
2432882Svi117747 */
2442882Svi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
2452882Svi117747 *error = EPROTO;
2462882Svi117747 return (&value->cftr_uri);
2472882Svi117747 }
2482882Svi117747
2492882Svi117747 /*
2502882Svi117747 * Get display name from the SIP message
2512882Svi117747 */
2522882Svi117747 const sip_str_t *
sip_get_cftrname_from_msg(sip_msg_t sip_msg,int * error,char * hdrname)2532882Svi117747 sip_get_cftrname_from_msg(sip_msg_t sip_msg, int *error, char *hdrname)
2542882Svi117747 {
2552882Svi117747 const sip_hdr_value_t *value;
2562882Svi117747 const struct sip_header *header;
2572882Svi117747
2582882Svi117747 if (error != NULL)
2592882Svi117747 *error = 0;
2602882Svi117747 if (sip_msg == NULL) {
2612882Svi117747 if (error != NULL)
2622882Svi117747 *error = EINVAL;
2632882Svi117747 return (NULL);
2642882Svi117747 }
2652882Svi117747 header = sip_get_header(sip_msg, hdrname, NULL, error);
2662882Svi117747 if (header == NULL) {
2672882Svi117747 if (error != NULL)
2682882Svi117747 *error = EINVAL;
2692882Svi117747 return (NULL);
2702882Svi117747 }
2712882Svi117747
2722882Svi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
2732882Svi117747 if (value == NULL) {
2742882Svi117747 if (error != NULL)
2752882Svi117747 *error = EPROTO;
2762882Svi117747 return (NULL);
2772882Svi117747 }
2782882Svi117747 /*
2792882Svi117747 * If the value is BAD, update error to reflect it.
2802882Svi117747 */
2812882Svi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
2822882Svi117747 *error = EPROTO;
2832882Svi117747 return (value->cftr_name);
2842882Svi117747 }
2852882Svi117747
2862882Svi117747 /*
2872882Svi117747 * Get FROM URI
2882882Svi117747 */
2892882Svi117747 const sip_str_t *
sip_get_from_uri_str(sip_msg_t sip_msg,int * error)2902882Svi117747 sip_get_from_uri_str(sip_msg_t sip_msg, int *error)
2912882Svi117747 {
2922882Svi117747 return (sip_get_cftruri_from_msg(sip_msg, error, SIP_FROM));
2932882Svi117747 }
2942882Svi117747
2952882Svi117747 /*
2962882Svi117747 * Get FROM display name
2972882Svi117747 */
2982882Svi117747 const sip_str_t *
sip_get_from_display_name(sip_msg_t sip_msg,int * error)2992882Svi117747 sip_get_from_display_name(sip_msg_t sip_msg, int *error)
3002882Svi117747 {
3012882Svi117747 return (sip_get_cftrname_from_msg(sip_msg, error, SIP_FROM));
3022882Svi117747 }
3032882Svi117747
3042882Svi117747 /*
3052882Svi117747 * Return the FROM tag
3062882Svi117747 */
3072882Svi117747 const sip_str_t *
sip_get_from_tag(sip_msg_t sip_msg,int * error)3082882Svi117747 sip_get_from_tag(sip_msg_t sip_msg, int *error)
3092882Svi117747 {
3102882Svi117747 const sip_hdr_value_t *value;
3112882Svi117747 const struct sip_header *header;
3122882Svi117747
3132882Svi117747 if (error != NULL)
3142882Svi117747 *error = 0;
3152882Svi117747 if (sip_msg == NULL) {
3162882Svi117747 if (error != NULL)
3172882Svi117747 *error = EINVAL;
3182882Svi117747 return (NULL);
3192882Svi117747 }
3202882Svi117747 header = sip_get_header(sip_msg, SIP_FROM, NULL, error);
3212882Svi117747 if (header == NULL) {
3222882Svi117747 if (error != NULL)
3232882Svi117747 *error = EINVAL;
3242882Svi117747 return (NULL);
3252882Svi117747 }
3262882Svi117747
3272882Svi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
3282882Svi117747 if (value == NULL) {
3292882Svi117747 if (error != NULL)
3302882Svi117747 *error = EPROTO;
3312882Svi117747 return (NULL);
3322882Svi117747 }
3332882Svi117747 /*
3342882Svi117747 * If the value is BAD, update error to reflect it.
3352882Svi117747 */
3362882Svi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
3372882Svi117747 *error = EPROTO;
3382882Svi117747 return (sip_get_param_value((sip_header_value_t)value, "tag", error));
3392882Svi117747 }
3402882Svi117747
3412882Svi117747 /*
3422882Svi117747 * Get TO URI
3432882Svi117747 */
3442882Svi117747 const sip_str_t *
sip_get_to_uri_str(sip_msg_t sip_msg,int * error)3452882Svi117747 sip_get_to_uri_str(sip_msg_t sip_msg, int *error)
3462882Svi117747 {
3472882Svi117747 return (sip_get_cftruri_from_msg(sip_msg, error, SIP_TO));
3482882Svi117747 }
3492882Svi117747
3502882Svi117747 /*
3512882Svi117747 * Get TO display name
3522882Svi117747 */
3532882Svi117747 const sip_str_t *
sip_get_to_display_name(sip_msg_t sip_msg,int * error)3542882Svi117747 sip_get_to_display_name(sip_msg_t sip_msg, int *error)
3552882Svi117747 {
3562882Svi117747 return (sip_get_cftrname_from_msg(sip_msg, error, SIP_TO));
3572882Svi117747 }
3582882Svi117747
3592882Svi117747 /*
3602882Svi117747 * Get TO tag
3612882Svi117747 */
3622882Svi117747 const sip_str_t *
sip_get_to_tag(sip_msg_t sip_msg,int * error)3632882Svi117747 sip_get_to_tag(sip_msg_t sip_msg, int *error)
3642882Svi117747 {
3652882Svi117747 const sip_hdr_value_t *value;
3662882Svi117747 const struct sip_header *header;
3672882Svi117747
3682882Svi117747 if (error != NULL)
3692882Svi117747 *error = 0;
3702882Svi117747 if (sip_msg == NULL) {
3712882Svi117747 if (error != NULL)
3722882Svi117747 *error = EINVAL;
3732882Svi117747 return (NULL);
3742882Svi117747 }
3752882Svi117747 header = sip_get_header(sip_msg, SIP_TO, NULL, error);
3762882Svi117747 if (header == NULL) {
3772882Svi117747 if (error != NULL)
3782882Svi117747 *error = EINVAL;
3792882Svi117747 return (NULL);
3802882Svi117747 }
3812882Svi117747
3822882Svi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
3832882Svi117747 if (value == NULL) {
3842882Svi117747 if (error != NULL)
3852882Svi117747 *error = EPROTO;
3862882Svi117747 return (NULL);
3872882Svi117747 }
3882882Svi117747 /*
3892882Svi117747 * If the value is BAD, update error to reflect it.
3902882Svi117747 */
3912882Svi117747 if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)
3922882Svi117747 *error = EPROTO;
3932882Svi117747 return (sip_get_param_value((sip_header_value_t)value, "tag", error));
3942882Svi117747 }
3952882Svi117747
3962882Svi117747 /*
3972882Svi117747 * Return the Call-Id
3982882Svi117747 */
3992882Svi117747 const sip_str_t *
sip_get_callid(sip_msg_t sip_msg,int * error)4002882Svi117747 sip_get_callid(sip_msg_t sip_msg, int *error)
4012882Svi117747 {
4022882Svi117747 sip_str_t *r;
4032882Svi117747
4042882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CALL_ID, SIP_STR_VAL,
4052882Svi117747 B_FALSE, B_TRUE, error);
4062882Svi117747 return (r);
4072882Svi117747 }
4082882Svi117747
4092882Svi117747 #define SIP_CSEQ_NUM 1
4102882Svi117747 #define SIP_CSEQ_METHOD 2
4112882Svi117747
4122882Svi117747 /*
4132882Svi117747 * Get number/method from the CSEQ header
4142882Svi117747 */
4152882Svi117747 static void *
sip_get_cseq_val(sip_msg_t msg,int type,int * error)4162882Svi117747 sip_get_cseq_val(sip_msg_t msg, int type, int *error)
4172882Svi117747 {
4182882Svi117747 const _sip_header_t *header;
4192882Svi117747 sip_hdr_value_t *val;
4202882Svi117747
4212882Svi117747 if (error != NULL)
4222882Svi117747 *error = 0;
4232882Svi117747
4242882Svi117747 if (msg == NULL) {
4252882Svi117747 if (error != NULL)
4262882Svi117747 *error = EINVAL;
4272882Svi117747 return (NULL);
4282882Svi117747 }
4292882Svi117747 header = sip_get_header(msg, SIP_CSEQ, NULL, error);
4302882Svi117747 if (header == NULL) {
4312882Svi117747 if (error != NULL)
4322882Svi117747 *error = EINVAL;
4332882Svi117747 return (NULL);
4342882Svi117747 }
4352882Svi117747 val = (sip_hdr_value_t *)sip_get_header_value(header, error);
4362882Svi117747 if (val == NULL) {
4372882Svi117747 if (error != NULL)
4382882Svi117747 *error = EPROTO;
4392882Svi117747 return (NULL);
4402882Svi117747 }
4412882Svi117747 if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
4422882Svi117747 *error = EPROTO;
4432882Svi117747
4442882Svi117747 switch (type) {
4452882Svi117747 case SIP_CSEQ_NUM:
4462882Svi117747 return (&(val->cseq_num));
4472882Svi117747 case SIP_CSEQ_METHOD:
4482882Svi117747 return (&(val->cseq_method));
4492882Svi117747 }
4502882Svi117747 if (error != NULL)
4512882Svi117747 *error = EINVAL;
4522882Svi117747 return (NULL);
4532882Svi117747 }
4542882Svi117747
4552882Svi117747 /*
4562882Svi117747 * Get CSEQ number
4572882Svi117747 */
4582882Svi117747 int
sip_get_callseq_num(sip_msg_t sip_msg,int * error)4592882Svi117747 sip_get_callseq_num(sip_msg_t sip_msg, int *error)
4602882Svi117747 {
4612882Svi117747 int *r;
4622882Svi117747
4632882Svi117747 r = (int *)sip_get_cseq_val(sip_msg, SIP_CSEQ_NUM, error);
4642882Svi117747 return (r == NULL ? -1 : *r);
4652882Svi117747 }
4662882Svi117747
4672882Svi117747 /*
4682882Svi117747 * Get CSEQ method
4692882Svi117747 */
4702882Svi117747 sip_method_t
sip_get_callseq_method(sip_msg_t sip_msg,int * error)4712882Svi117747 sip_get_callseq_method(sip_msg_t sip_msg, int *error)
4722882Svi117747 {
4732882Svi117747 sip_method_t *r;
4742882Svi117747
4752882Svi117747 r = (sip_method_t *)sip_get_cseq_val(sip_msg, SIP_CSEQ_METHOD, error);
4762882Svi117747 return (r == NULL ? -1 : *r);
4772882Svi117747 }
4782882Svi117747
4792882Svi117747 /*
4802882Svi117747 * Via header can have more than one value
4812882Svi117747 * so we require a value to be passed in.
4822882Svi117747 */
4832882Svi117747 const sip_str_t *
sip_get_via_sent_by_host(sip_header_value_t value,int * error)4842882Svi117747 sip_get_via_sent_by_host(sip_header_value_t value, int *error)
4852882Svi117747 {
4862882Svi117747 sip_hdr_value_t *via_value;
4872882Svi117747
4882882Svi117747 if (error != NULL)
4892882Svi117747 *error = 0;
4902882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
4912882Svi117747 if (error != NULL)
4922882Svi117747 *error = EINVAL;
4932882Svi117747 return (NULL);
4942882Svi117747 }
4952882Svi117747 via_value = (sip_hdr_value_t *)value;
4962882Svi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
4972882Svi117747 *error = EPROTO;
4982882Svi117747 return (&via_value->via_sent_by_host);
4992882Svi117747 }
5002882Svi117747
5012882Svi117747 /*
5022882Svi117747 * Via header can have more than one value
5032882Svi117747 * so we require a value to be passed in.
5042882Svi117747 */
5052882Svi117747 int
sip_get_via_sent_by_port(sip_header_value_t value,int * error)5062882Svi117747 sip_get_via_sent_by_port(sip_header_value_t value, int *error)
5072882Svi117747 {
5082882Svi117747 sip_hdr_value_t *via_value;
5092882Svi117747
5102882Svi117747 if (error != NULL)
5112882Svi117747 *error = 0;
5122882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
5132882Svi117747 if (error != NULL)
5142882Svi117747 *error = EINVAL;
5152882Svi117747 return (-1);
5162882Svi117747 }
5172882Svi117747 via_value = (sip_hdr_value_t *)value;
5182882Svi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
5192882Svi117747 *error = EPROTO;
5202882Svi117747 return (via_value->via_sent_by_port);
5212882Svi117747 }
5222882Svi117747
5232882Svi117747 /*
5242882Svi117747 * Return the protocol version from the VIA value
5252882Svi117747 */
5262882Svi117747 const sip_str_t *
sip_get_via_sent_protocol_version(sip_header_value_t value,int * error)5272882Svi117747 sip_get_via_sent_protocol_version(sip_header_value_t value, int *error)
5282882Svi117747 {
5292882Svi117747 sip_hdr_value_t *via_value;
5302882Svi117747
5312882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
5322882Svi117747 if (error != NULL)
5332882Svi117747 *error = EINVAL;
5342882Svi117747 return (NULL);
5352882Svi117747 }
5362882Svi117747 via_value = (sip_hdr_value_t *)value;
5372882Svi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
5382882Svi117747 *error = EPROTO;
5392882Svi117747 return (&via_value->via_protocol_vers);
5402882Svi117747 }
5412882Svi117747
5422882Svi117747 /*
5432882Svi117747 * Return the protocol name
5442882Svi117747 */
5452882Svi117747 const sip_str_t *
sip_get_via_sent_protocol_name(sip_header_value_t value,int * error)5462882Svi117747 sip_get_via_sent_protocol_name(sip_header_value_t value, int *error)
5472882Svi117747 {
5482882Svi117747 sip_hdr_value_t *via_value;
5492882Svi117747
5502882Svi117747 if (error != NULL)
5512882Svi117747 *error = 0;
5522882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
5532882Svi117747 if (error != NULL)
5542882Svi117747 *error = EINVAL;
5552882Svi117747 return (NULL);
5562882Svi117747 }
5572882Svi117747 via_value = (sip_hdr_value_t *)value;
5582882Svi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
5592882Svi117747 *error = EPROTO;
5602882Svi117747 return (&via_value->via_protocol_name);
5612882Svi117747 }
5622882Svi117747
5632882Svi117747 /*
5642882Svi117747 * Return the transport from the VIA value
5652882Svi117747 */
5662882Svi117747 const sip_str_t *
sip_get_via_sent_transport(sip_header_value_t value,int * error)5672882Svi117747 sip_get_via_sent_transport(sip_header_value_t value, int *error)
5682882Svi117747 {
5692882Svi117747 sip_hdr_value_t *via_value;
5702882Svi117747
5712882Svi117747 if (error != NULL)
5722882Svi117747 *error = 0;
5732882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
5742882Svi117747 if (error != NULL)
5752882Svi117747 *error = EINVAL;
5762882Svi117747 return (NULL);
5772882Svi117747 }
5782882Svi117747 via_value = (sip_hdr_value_t *)value;
5792882Svi117747 if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)
5802882Svi117747 *error = EPROTO;
5812882Svi117747 return (&via_value->via_protocol_transport);
5822882Svi117747 }
5832882Svi117747
5842882Svi117747 /*
5852882Svi117747 * get the branch id from the topmost VIA header
5862882Svi117747 */
5872882Svi117747 char *
sip_get_branchid(sip_msg_t sip_msg,int * error)5882882Svi117747 sip_get_branchid(sip_msg_t sip_msg, int *error)
5892882Svi117747 {
5902882Svi117747 _sip_header_t *header;
5912882Svi117747 sip_parsed_header_t *parsed_header;
5922882Svi117747 sip_hdr_value_t *via_value;
5932882Svi117747 const sip_str_t *param_value;
5942882Svi117747 char *bid;
5952882Svi117747 _sip_msg_t *_sip_msg;
5962882Svi117747
5972882Svi117747 if (error != NULL)
5982882Svi117747 *error = 0;
5992882Svi117747
6002882Svi117747 if (sip_msg == NULL) {
6012882Svi117747 if (error != NULL)
6022882Svi117747 *error = EINVAL;
6032882Svi117747 return (NULL);
6042882Svi117747 }
6052882Svi117747
6062882Svi117747 _sip_msg = (_sip_msg_t *)sip_msg;
6072882Svi117747
6082882Svi117747 (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
6092882Svi117747 header = sip_search_for_header(_sip_msg, SIP_VIA, NULL);
6102882Svi117747 if (header == NULL) {
6112882Svi117747 if (error != NULL)
6122882Svi117747 *error = EINVAL;
6132882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6142882Svi117747 return (NULL);
6152882Svi117747 }
6162882Svi117747 if (sip_parse_via_header(header, &parsed_header) != 0) {
6172882Svi117747 if (error != NULL)
6182882Svi117747 *error = EPROTO;
6192882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6202882Svi117747 return (NULL);
6212882Svi117747 }
6222882Svi117747 if (parsed_header == NULL) {
6232882Svi117747 if (error != NULL)
6242882Svi117747 *error = EPROTO;
6252882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6262882Svi117747 return (NULL);
6272882Svi117747 }
6282882Svi117747 via_value = (sip_hdr_value_t *)parsed_header->value;
6292882Svi117747 if (via_value == NULL || via_value->sip_value_state == SIP_VALUE_BAD) {
6302882Svi117747 if (error != NULL)
6312882Svi117747 *error = EPROTO;
6322882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6332882Svi117747 return (NULL);
6342882Svi117747 }
6352882Svi117747 param_value = sip_get_param_value((sip_header_value_t)via_value,
6362882Svi117747 "branch", error);
6372882Svi117747
6382882Svi117747 if (param_value == NULL) {
6392882Svi117747 if (error != NULL)
6402882Svi117747 *error = EINVAL;
6412882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6422882Svi117747 return (NULL);
6432882Svi117747 }
6442882Svi117747
6452882Svi117747 bid = (char *)malloc(param_value->sip_str_len + 1);
6462882Svi117747 if (bid == NULL) {
6472882Svi117747 if (error != NULL)
6482882Svi117747 *error = ENOMEM;
6492882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6502882Svi117747 return (NULL);
6512882Svi117747 }
6522882Svi117747 (void) strncpy(bid, param_value->sip_str_ptr,
6532882Svi117747 param_value->sip_str_len);
6542882Svi117747 bid[param_value->sip_str_len] = '\0';
6552882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6562882Svi117747 return (bid);
6572882Svi117747 }
6582882Svi117747
6592882Svi117747 /*
6602882Svi117747 * adds branchid to the topmost VIA header, if a branchid already exists,
6612882Svi117747 * returns error.
6622882Svi117747 */
6632882Svi117747 int
sip_add_branchid_to_via(sip_msg_t sip_msg,char * branchid)6642882Svi117747 sip_add_branchid_to_via(sip_msg_t sip_msg, char *branchid)
6652882Svi117747 {
6662882Svi117747 int err = 0;
6672882Svi117747 char *param;
6682882Svi117747 int plen;
6692882Svi117747 sip_header_t via_hdr;
6702882Svi117747 _sip_msg_t *_sip_msg;
6712882Svi117747
6722882Svi117747 if (sip_msg == NULL)
6732882Svi117747 return (EINVAL);
6742882Svi117747 /*
6752882Svi117747 * If there is already a branchid param, error?
6762882Svi117747 */
6772882Svi117747 if (sip_get_branchid(sip_msg, NULL) != NULL)
6782882Svi117747 return (EINVAL);
6792882Svi117747 _sip_msg = (_sip_msg_t *)sip_msg;
6802882Svi117747 (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
6812882Svi117747 via_hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA, NULL);
6822882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
6832882Svi117747 if (via_hdr == NULL)
6842882Svi117747 return (EINVAL);
6852882Svi117747 plen = strlen(branchid) + strlen("branch=") + 1;
6862882Svi117747 param = malloc(plen);
6872882Svi117747 if (param == NULL)
6882882Svi117747 return (ENOMEM);
6892882Svi117747 (void) snprintf(param, plen, "branch=%s", branchid);
6902882Svi117747
6912882Svi117747 (void) sip_add_param(via_hdr, param, &err);
6922882Svi117747 free(param);
6932882Svi117747
6942882Svi117747 return (err);
6952882Svi117747 }
6962882Svi117747
6972882Svi117747 /*
6982882Svi117747 * returns the number of VIA headers in the SIP message
6992882Svi117747 */
7002882Svi117747 int
sip_get_num_via(sip_msg_t sip_msg,int * error)7012882Svi117747 sip_get_num_via(sip_msg_t sip_msg, int *error)
7022882Svi117747 {
7032882Svi117747 _sip_msg_t *_sip_msg;
7042882Svi117747 sip_header_t hdr;
7052882Svi117747 int via_cnt = 0;
7062882Svi117747
7072882Svi117747 if (error != NULL)
7082882Svi117747 *error = 0;
7092882Svi117747 if (sip_msg == NULL) {
7102882Svi117747 if (error != NULL)
7112882Svi117747 *error = EINVAL;
7122882Svi117747 return (via_cnt);
7132882Svi117747 }
7142882Svi117747 _sip_msg = (_sip_msg_t *)sip_msg;
7152882Svi117747 (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);
7162882Svi117747 hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA, NULL);
7172882Svi117747 while (hdr != NULL) {
7182882Svi117747 via_cnt++;
7192882Svi117747 hdr = (sip_header_t)sip_search_for_header(_sip_msg, SIP_VIA,
7202882Svi117747 hdr);
7212882Svi117747 }
7222882Svi117747 (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);
7232882Svi117747 return (via_cnt);
7242882Svi117747 }
7252882Svi117747
7262882Svi117747 /*
7272882Svi117747 * Return Max-Forward value
7282882Svi117747 */
7292882Svi117747 int
sip_get_maxforward(sip_msg_t sip_msg,int * error)7302882Svi117747 sip_get_maxforward(sip_msg_t sip_msg, int *error)
7312882Svi117747 {
7322882Svi117747 int *r;
7332882Svi117747
7342882Svi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_MAX_FORWARDS, SIP_INT_VAL,
7352882Svi117747 B_FALSE, B_FALSE, error);
7362882Svi117747 if (r == NULL)
7372882Svi117747 return (-1);
7382882Svi117747 return (*r);
7392882Svi117747 }
7402882Svi117747
7412882Svi117747 /*
7422882Svi117747 * Get the content type
7432882Svi117747 */
7442882Svi117747 const sip_str_t *
sip_get_content_type(sip_msg_t sip_msg,int * error)7452882Svi117747 sip_get_content_type(sip_msg_t sip_msg, int *error)
7462882Svi117747 {
7472882Svi117747 sip_str_t *r;
7482882Svi117747
7492882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,
7502882Svi117747 SIP_STRS_VAL, B_TRUE, B_FALSE, error);
7512882Svi117747 return (r);
7522882Svi117747 }
7532882Svi117747
7542882Svi117747 /*
7552882Svi117747 * Get the content sub-type
7562882Svi117747 */
7572882Svi117747 const sip_str_t *
sip_get_content_sub_type(sip_msg_t sip_msg,int * error)7582882Svi117747 sip_get_content_sub_type(sip_msg_t sip_msg, int *error)
7592882Svi117747 {
7602882Svi117747 sip_str_t *r;
7612882Svi117747
7622882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,
7632882Svi117747 SIP_STRS_VAL, B_FALSE, B_FALSE, error);
7642882Svi117747 return (r);
7652882Svi117747 }
7662882Svi117747
7672882Svi117747 /*
7682882Svi117747 * Return the content-length value
7692882Svi117747 */
7702882Svi117747 int
sip_get_content_length(sip_msg_t sip_msg,int * error)7712882Svi117747 sip_get_content_length(sip_msg_t sip_msg, int *error)
7722882Svi117747 {
7732882Svi117747 int *r;
7742882Svi117747
7752882Svi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_LENGTH,
7762882Svi117747 SIP_INT_VAL, B_FALSE, B_FALSE, error);
7772882Svi117747 if (r == NULL)
7782882Svi117747 return (-1);
7792882Svi117747 return (*r);
7802882Svi117747 }
7812882Svi117747
7822882Svi117747 /*
7832882Svi117747 * get allow-events
7842882Svi117747 */
7852882Svi117747 const sip_str_t *
sip_get_allow_events(sip_header_value_t value,int * error)7862882Svi117747 sip_get_allow_events(sip_header_value_t value, int *error)
7872882Svi117747 {
7882882Svi117747 sip_str_t *r;
7892882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
7902882Svi117747
7912882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_TRUE, error);
7922882Svi117747 return (r);
7932882Svi117747 }
7942882Svi117747
7952882Svi117747 /*
7962882Svi117747 * get event
7972882Svi117747 */
7982882Svi117747 const sip_str_t *
sip_get_event(sip_msg_t sip_msg,int * error)7992882Svi117747 sip_get_event(sip_msg_t sip_msg, int *error)
8002882Svi117747 {
8012882Svi117747 sip_str_t *r;
8022882Svi117747
8032882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_EVENT, SIP_STR_VAL,
8042882Svi117747 B_FALSE, B_FALSE, error);
8052882Svi117747 return (r);
8062882Svi117747 }
8072882Svi117747
8082882Svi117747 /*
8092882Svi117747 * get subscription state
8102882Svi117747 */
8112882Svi117747 const sip_str_t *
sip_get_substate(sip_msg_t sip_msg,int * error)8122882Svi117747 sip_get_substate(sip_msg_t sip_msg, int *error)
8132882Svi117747 {
8142882Svi117747 sip_str_t *r;
8152882Svi117747
8162882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBSCRIPTION_STATE,
8172882Svi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
8182882Svi117747 return (r);
8192882Svi117747 }
8202882Svi117747
8212882Svi117747 /*
8222882Svi117747 * get accept type
8232882Svi117747 */
8242882Svi117747 const sip_str_t *
sip_get_accept_type(sip_header_value_t value,int * error)8252882Svi117747 sip_get_accept_type(sip_header_value_t value, int *error)
8262882Svi117747 {
8272882Svi117747 sip_str_t *r;
8282882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
8292882Svi117747
8302882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);
8312882Svi117747 return (r);
8322882Svi117747 }
8332882Svi117747
8342882Svi117747 /*
8352882Svi117747 * get accept subtype
8362882Svi117747 */
8372882Svi117747 const sip_str_t *
sip_get_accept_sub_type(sip_header_value_t value,int * error)8382882Svi117747 sip_get_accept_sub_type(sip_header_value_t value, int *error)
8392882Svi117747 {
8402882Svi117747 sip_str_t *r;
8412882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
8422882Svi117747
8432882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_FALSE,
8442882Svi117747 error);
8452882Svi117747 return (r);
8462882Svi117747 }
8472882Svi117747
8482882Svi117747 /*
8492882Svi117747 * accept-encode can have more than one value
8502882Svi117747 */
8512882Svi117747 const sip_str_t *
sip_get_accept_enc(sip_header_value_t value,int * error)8522882Svi117747 sip_get_accept_enc(sip_header_value_t value, int *error)
8532882Svi117747 {
8542882Svi117747 sip_str_t *r;
8552882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
8562882Svi117747
8572882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
8582882Svi117747 return (r);
8592882Svi117747 }
8602882Svi117747
8612882Svi117747 /*
8622882Svi117747 * accept-language can have more than one value
8632882Svi117747 */
8642882Svi117747 const sip_str_t *
sip_get_accept_lang(sip_header_value_t value,int * error)8652882Svi117747 sip_get_accept_lang(sip_header_value_t value, int *error)
8662882Svi117747 {
8672882Svi117747 sip_str_t *r;
8682882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
8692882Svi117747
8702882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
8712882Svi117747 return (r);
8722882Svi117747 }
8732882Svi117747
8742882Svi117747 /*
8752882Svi117747 * get URI from the alert-info header
8762882Svi117747 */
8772882Svi117747 const sip_str_t *
sip_get_alert_info_uri(sip_header_value_t value,int * error)8782882Svi117747 sip_get_alert_info_uri(sip_header_value_t value, int *error)
8792882Svi117747 {
8802882Svi117747 sip_str_t *r;
8812882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
8822882Svi117747
8832882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
8842882Svi117747 return (r);
8852882Svi117747 }
8862882Svi117747
8872882Svi117747 /*
8882882Svi117747 * get method from allow header
8892882Svi117747 */
8902882Svi117747 sip_method_t
sip_get_allow_method(sip_header_value_t value,int * error)8912882Svi117747 sip_get_allow_method(sip_header_value_t value, int *error)
8922882Svi117747 {
8932882Svi117747 int *r;
8942882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
8952882Svi117747
8962882Svi117747 r = (int *)sip_get_val_from_hdr(val, SIP_INT_VAL, B_FALSE, error);
8972882Svi117747 return (r == NULL ? -1 : (sip_method_t)*r);
8982882Svi117747 }
8992882Svi117747
9002882Svi117747 /*
9012882Svi117747 * get URI from call-info header
9022882Svi117747 */
9032882Svi117747 const sip_str_t *
sip_get_call_info_uri(sip_header_value_t value,int * error)9042882Svi117747 sip_get_call_info_uri(sip_header_value_t value, int *error)
9052882Svi117747 {
9062882Svi117747 sip_str_t *r;
9072882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
9082882Svi117747
9092882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
9102882Svi117747 return (r);
9112882Svi117747 }
9122882Svi117747
9132882Svi117747 /*
9142882Svi117747 * get content-disposition value
9152882Svi117747 */
9162882Svi117747 const sip_str_t *
sip_get_content_disp(sip_msg_t sip_msg,int * error)9172882Svi117747 sip_get_content_disp(sip_msg_t sip_msg, int *error)
9182882Svi117747 {
9192882Svi117747 sip_str_t *r;
9202882Svi117747
9212882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_DIS,
9222882Svi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
9232882Svi117747 return (r);
9242882Svi117747 }
9252882Svi117747
9262882Svi117747 /*
9272882Svi117747 * get content-encoding value
9282882Svi117747 */
9292882Svi117747 const sip_str_t *
sip_get_content_enc(sip_header_value_t value,int * error)9302882Svi117747 sip_get_content_enc(sip_header_value_t value, int *error)
9312882Svi117747 {
9322882Svi117747 sip_str_t *r;
9332882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
9342882Svi117747
9352882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
9362882Svi117747 return (r);
9372882Svi117747 }
9382882Svi117747
9392882Svi117747 /*
9402882Svi117747 * get content-language value
9412882Svi117747 */
9422882Svi117747 const sip_str_t *
sip_get_content_lang(sip_header_value_t value,int * error)9432882Svi117747 sip_get_content_lang(sip_header_value_t value, int *error)
9442882Svi117747 {
9452882Svi117747 sip_str_t *r;
9462882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
9472882Svi117747
9482882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
9492882Svi117747 return (r);
9502882Svi117747 }
9512882Svi117747
9522882Svi117747 /*
9532882Svi117747 * sip_get_date_time, day, wkday, month, year
9542882Svi117747 */
9552882Svi117747 #define D_TIME 0x01
9562882Svi117747 #define D_DAY 0x02
9572882Svi117747 #define D_MONTH 0x03
9582882Svi117747 #define D_YEAR 0x04
9592882Svi117747 #define D_WKDAY 0x05
9602882Svi117747 #define D_TIMEZONE 0x06
9612882Svi117747
9622882Svi117747 /*
9632882Svi117747 * get date information
9642882Svi117747 */
9652882Svi117747 static void *
sip_get_date_val(sip_msg_t msg,int type,int * error)9662882Svi117747 sip_get_date_val(sip_msg_t msg, int type, int *error)
9672882Svi117747 {
9682882Svi117747 const _sip_header_t *header;
9692882Svi117747 sip_hdr_value_t *val;
9702882Svi117747
9712882Svi117747 if (error != NULL)
9722882Svi117747 *error = 0;
9732882Svi117747 if (msg == NULL) {
9742882Svi117747 if (error != NULL)
9752882Svi117747 *error = EINVAL;
9762882Svi117747 return (NULL);
9772882Svi117747 }
9782882Svi117747 header = sip_get_header(msg, SIP_DATE, NULL, error);
9792882Svi117747 if (header == NULL) {
9802882Svi117747 if (error != NULL)
9812882Svi117747 *error = EINVAL;
9822882Svi117747 return (NULL);
9832882Svi117747 }
9842882Svi117747
9852882Svi117747 val = (sip_hdr_value_t *)sip_get_header_value(header, error);
9862882Svi117747 if (val == NULL) {
9872882Svi117747 if (error != NULL)
9882882Svi117747 *error = EPROTO;
9892882Svi117747 return (NULL);
9902882Svi117747 }
9912882Svi117747 if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
9922882Svi117747 *error = EPROTO;
9932882Svi117747 switch (type) {
9942882Svi117747 case (D_TIME):
9952882Svi117747 return (&(val->date_t));
9962882Svi117747 case (D_DAY):
9972882Svi117747 return (&(val->date_d));
9982882Svi117747 case (D_MONTH):
9992882Svi117747 return (&(val->date_m));
10002882Svi117747 case (D_YEAR):
10012882Svi117747 return (&(val->date_y));
10022882Svi117747 case (D_WKDAY):
10032882Svi117747 return (&(val->date_wd));
10042882Svi117747 case (D_TIMEZONE):
10052882Svi117747 return (&(val->date_tz));
10062882Svi117747 }
10072882Svi117747 if (error != NULL)
10082882Svi117747 *error = EINVAL;
10092882Svi117747 return (NULL);
10102882Svi117747 }
10112882Svi117747
10122882Svi117747 /*
10132882Svi117747 * get time value
10142882Svi117747 */
10152882Svi117747 const sip_str_t *
sip_get_date_time(sip_msg_t sip_msg,int * error)10162882Svi117747 sip_get_date_time(sip_msg_t sip_msg, int *error)
10172882Svi117747 {
10182882Svi117747 sip_str_t *r;
10192882Svi117747
10202882Svi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_TIME, error);
10212882Svi117747 return (r);
10222882Svi117747 }
10232882Svi117747
10242882Svi117747 /*
10252882Svi117747 * get day
10262882Svi117747 */
10272882Svi117747 int
sip_get_date_day(sip_msg_t sip_msg,int * error)10282882Svi117747 sip_get_date_day(sip_msg_t sip_msg, int *error)
10292882Svi117747 {
10302882Svi117747 int *r = NULL;
10312882Svi117747
10322882Svi117747 r = sip_get_date_val(sip_msg, D_DAY, error);
10332882Svi117747 return (r == NULL ? -1 : *(int *)r);
10342882Svi117747 }
10352882Svi117747
10362882Svi117747 /*
10372882Svi117747 * get month
10382882Svi117747 */
10392882Svi117747 const sip_str_t *
sip_get_date_month(sip_msg_t sip_msg,int * error)10402882Svi117747 sip_get_date_month(sip_msg_t sip_msg, int *error)
10412882Svi117747 {
10422882Svi117747 sip_str_t *r;
10432882Svi117747
10442882Svi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_MONTH, error);
10452882Svi117747 return (r);
10462882Svi117747 }
10472882Svi117747
10482882Svi117747 /*
10492882Svi117747 * get year
10502882Svi117747 */
10512882Svi117747 int
sip_get_date_year(sip_msg_t sip_msg,int * error)10522882Svi117747 sip_get_date_year(sip_msg_t sip_msg, int *error)
10532882Svi117747 {
10542882Svi117747 int *r;
10552882Svi117747
10562882Svi117747 r = (int *)sip_get_date_val(sip_msg, D_YEAR, error);
10572882Svi117747 return (r == NULL ? -1 : *r);
10582882Svi117747 }
10592882Svi117747
10602882Svi117747 /*
10612882Svi117747 * get day of the week
10622882Svi117747 */
10632882Svi117747 const sip_str_t *
sip_get_date_wkday(sip_msg_t sip_msg,int * error)10642882Svi117747 sip_get_date_wkday(sip_msg_t sip_msg, int *error)
10652882Svi117747 {
10662882Svi117747 sip_str_t *r;
10672882Svi117747
10682882Svi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_WKDAY, error);
10692882Svi117747 return (r);
10702882Svi117747 }
10712882Svi117747
10722882Svi117747 /*
10732882Svi117747 * get the timezone
10742882Svi117747 */
10752882Svi117747 const sip_str_t *
sip_get_date_timezone(sip_msg_t sip_msg,int * error)10762882Svi117747 sip_get_date_timezone(sip_msg_t sip_msg, int *error)
10772882Svi117747 {
10782882Svi117747 sip_str_t *r;
10792882Svi117747
10802882Svi117747 r = (sip_str_t *)sip_get_date_val(sip_msg, D_TIMEZONE, error);
10812882Svi117747 return (r);
10822882Svi117747 }
10832882Svi117747
10842882Svi117747 /*
10852882Svi117747 * get error-info URI
10862882Svi117747 */
10872882Svi117747 const sip_str_t *
sip_get_error_info_uri(sip_header_value_t value,int * error)10882882Svi117747 sip_get_error_info_uri(sip_header_value_t value, int *error)
10892882Svi117747 {
10902882Svi117747 sip_str_t *r;
10912882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
10922882Svi117747
10932882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
10942882Svi117747 return (r);
10952882Svi117747 }
10962882Svi117747
10972882Svi117747 /*
10982882Svi117747 * get priv-value from privacy
10992882Svi117747 */
11002882Svi117747 const sip_str_t *
sip_get_priv_value(sip_header_value_t value,int * error)11012882Svi117747 sip_get_priv_value(sip_header_value_t value, int *error)
11022882Svi117747 {
11032882Svi117747 sip_str_t *r;
11042882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
11052882Svi117747
11062882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
11072882Svi117747 return (r);
11082882Svi117747 }
11092882Svi117747
11102882Svi117747 /*
11112882Svi117747 * return expires value
11122882Svi117747 */
11132882Svi117747 int
sip_get_expires(sip_msg_t sip_msg,int * error)11142882Svi117747 sip_get_expires(sip_msg_t sip_msg, int *error)
11152882Svi117747 {
11162882Svi117747 int *r;
11172882Svi117747
11182882Svi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_EXPIRE, SIP_INT_VAL,
11192882Svi117747 B_FALSE, B_FALSE, error);
11202882Svi117747 if (r == NULL)
11212882Svi117747 return (-1);
11222882Svi117747 return (*r);
11232882Svi117747 }
11242882Svi117747
11252882Svi117747 /*
11262882Svi117747 * get reply-to value
11272882Svi117747 */
11282882Svi117747 const sip_str_t *
sip_get_in_reply_to(sip_header_value_t value,int * error)11292882Svi117747 sip_get_in_reply_to(sip_header_value_t value, int *error)
11302882Svi117747 {
11312882Svi117747 sip_str_t *r;
11322882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
11332882Svi117747
11342882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
11352882Svi117747 return (r);
11362882Svi117747 }
11372882Svi117747
11382882Svi117747 /*
11392882Svi117747 * get min-expires value
11402882Svi117747 */
11412882Svi117747 int
sip_get_min_expires(sip_msg_t sip_msg,int * error)11422882Svi117747 sip_get_min_expires(sip_msg_t sip_msg, int *error)
11432882Svi117747 {
11442882Svi117747 int *r;
11452882Svi117747
11462882Svi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_MIN_EXPIRE, SIP_INT_VAL,
11472882Svi117747 B_FALSE, B_FALSE, error);
11482882Svi117747 if (r == NULL)
11492882Svi117747 return (-1);
11502882Svi117747 return (*r);
11512882Svi117747 }
11522882Svi117747
11532882Svi117747 /*
11542882Svi117747 * get mime-version
11552882Svi117747 */
11562882Svi117747 const sip_str_t *
sip_get_mime_version(sip_msg_t sip_msg,int * error)11572882Svi117747 sip_get_mime_version(sip_msg_t sip_msg, int *error)
11582882Svi117747 {
11592882Svi117747 sip_str_t *r;
11602882Svi117747
11612882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_MIME_VERSION,
11622882Svi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
11632882Svi117747 return (r);
11642882Svi117747 }
11652882Svi117747
11662882Svi117747 /*
11672882Svi117747 * get organization value
11682882Svi117747 */
11692882Svi117747 const sip_str_t *
sip_get_org(sip_msg_t sip_msg,int * error)11702882Svi117747 sip_get_org(sip_msg_t sip_msg, int *error)
11712882Svi117747 {
11722882Svi117747 sip_str_t *r;
11732882Svi117747
11742882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_ORGANIZATION,
11752882Svi117747 SIP_STR_VAL, B_FALSE, B_TRUE, error);
11762882Svi117747 return (r);
11772882Svi117747 }
11782882Svi117747
11792882Svi117747 /*
11802882Svi117747 * get priority value
11812882Svi117747 */
11822882Svi117747 const sip_str_t *
sip_get_priority(sip_msg_t sip_msg,int * error)11832882Svi117747 sip_get_priority(sip_msg_t sip_msg, int *error)
11842882Svi117747 {
11852882Svi117747 sip_str_t *r;
11862882Svi117747
11872882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_PRIORITY,
11882882Svi117747 SIP_STR_VAL, B_FALSE, B_FALSE, error);
11892882Svi117747 return (r);
11902882Svi117747 }
11912882Svi117747
11922882Svi117747 /*
11932882Svi117747 * get display name
11942882Svi117747 */
11952882Svi117747 const sip_str_t *
sip_get_pidentity_display_name(sip_header_value_t value,int * error)11962882Svi117747 sip_get_pidentity_display_name(sip_header_value_t value, int *error)
11972882Svi117747 {
11982882Svi117747 sip_str_t *r;
11992882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
12002882Svi117747
12012882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);
12022882Svi117747
12032882Svi117747 return (r);
12042882Svi117747 }
12052882Svi117747
12062882Svi117747 /*
12072882Svi117747 * get URI
12082882Svi117747 */
12092882Svi117747 const sip_str_t *
sip_get_pidenty_uri_str(sip_header_value_t value,int * error)12102882Svi117747 sip_get_pidenty_uri_str(sip_header_value_t value, int *error)
12112882Svi117747 {
12122882Svi117747 sip_str_t *r;
12132882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
12142882Svi117747
12152882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_FALSE,
12162882Svi117747 error);
12172882Svi117747
12182882Svi117747 return (r);
12192882Svi117747 }
12202882Svi117747
12212882Svi117747 /*
12222882Svi117747 * get display name from passerted-identity header
12232882Svi117747 */
12242882Svi117747 const sip_str_t *
sip_get_passertedid_display_name(sip_header_value_t value,int * error)12252882Svi117747 sip_get_passertedid_display_name(sip_header_value_t value, int *error)
12262882Svi117747 {
12272882Svi117747 return (sip_get_pidentity_display_name(value, error));
12282882Svi117747 }
12292882Svi117747
12302882Svi117747 /*
12312882Svi117747 * get URI from passerted-identity header
12322882Svi117747 */
12332882Svi117747 const sip_str_t *
sip_get_passertedid_uri_str(sip_header_value_t value,int * error)12342882Svi117747 sip_get_passertedid_uri_str(sip_header_value_t value, int *error)
12352882Svi117747 {
12362882Svi117747 return (sip_get_pidenty_uri_str(value, error));
12372882Svi117747 }
12382882Svi117747
12392882Svi117747 /*
12402882Svi117747 * get display name from ppreferred-identity header
12412882Svi117747 */
12422882Svi117747 const sip_str_t *
sip_get_ppreferredid_display_name(sip_header_value_t value,int * error)12432882Svi117747 sip_get_ppreferredid_display_name(sip_header_value_t value, int *error)
12442882Svi117747 {
12452882Svi117747 return (sip_get_pidentity_display_name(value, error));
12462882Svi117747 }
12472882Svi117747
12482882Svi117747 /*
12492882Svi117747 * get URI from ppreferred-identity header
12502882Svi117747 */
12512882Svi117747 const sip_str_t *
sip_get_ppreferredid_uri_str(sip_header_value_t value,int * error)12522882Svi117747 sip_get_ppreferredid_uri_str(sip_header_value_t value, int *error)
12532882Svi117747 {
12542882Svi117747 return (sip_get_pidenty_uri_str(value, error));
12552882Svi117747 }
12562882Svi117747
12572882Svi117747 #define SIP_RACK_RESP_NUM 1
12582882Svi117747 #define SIP_RACK_CSEQ_NUM 2
12592882Svi117747 #define SIP_RACK_METHOD 3
12602882Svi117747
12612882Svi117747 /*
12622882Svi117747 * Get rack information
12632882Svi117747 */
12642882Svi117747 static void *
sip_get_rack_val(sip_msg_t msg,int type,int * error)12652882Svi117747 sip_get_rack_val(sip_msg_t msg, int type, int *error)
12662882Svi117747 {
12672882Svi117747 const _sip_header_t *header;
12682882Svi117747 sip_hdr_value_t *val;
12692882Svi117747
12702882Svi117747 if (error != NULL)
12712882Svi117747 *error = 0;
12722882Svi117747
12732882Svi117747 if (msg == NULL) {
12742882Svi117747 if (error != NULL)
12752882Svi117747 *error = EINVAL;
12762882Svi117747 return (NULL);
12772882Svi117747 }
12782882Svi117747 header = sip_get_header(msg, SIP_RACK, NULL, error);
12792882Svi117747 if (header == NULL) {
12802882Svi117747 if (error != NULL)
12812882Svi117747 *error = EINVAL;
12822882Svi117747 return (NULL);
12832882Svi117747 }
12842882Svi117747 val = (sip_hdr_value_t *)sip_get_header_value(header, error);
12852882Svi117747 if (val == NULL) {
12862882Svi117747 if (error != NULL)
12872882Svi117747 *error = EPROTO;
12882882Svi117747 return (NULL);
12892882Svi117747 }
12902882Svi117747 if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)
12912882Svi117747 *error = EPROTO;
12922882Svi117747
12932882Svi117747 switch (type) {
12942882Svi117747 case SIP_RACK_RESP_NUM:
12952882Svi117747 return (&(val->rack_resp));
12962882Svi117747 case SIP_RACK_CSEQ_NUM:
12972882Svi117747 return (&(val->rack_cseq));
12982882Svi117747 case SIP_RACK_METHOD:
12992882Svi117747 return (&(val->rack_method));
13002882Svi117747 }
13012882Svi117747 if (error != NULL)
13022882Svi117747 *error = EINVAL;
13032882Svi117747 return (NULL);
13042882Svi117747 }
13052882Svi117747
13062882Svi117747 /*
13072882Svi117747 * get response number for rack
13082882Svi117747 */
13092882Svi117747 int
sip_get_rack_resp_num(sip_msg_t sip_msg,int * error)13102882Svi117747 sip_get_rack_resp_num(sip_msg_t sip_msg, int *error)
13112882Svi117747 {
13122882Svi117747 int *r;
13132882Svi117747
13142882Svi117747 r = (int *)sip_get_rack_val(sip_msg, SIP_RACK_RESP_NUM, error);
13152882Svi117747
13162882Svi117747 return (r == NULL ? -1 : *r);
13172882Svi117747 }
13182882Svi117747
13192882Svi117747 /*
13202882Svi117747 * get sequence number for rack
13212882Svi117747 */
13222882Svi117747 int
sip_get_rack_cseq_num(sip_msg_t sip_msg,int * error)13232882Svi117747 sip_get_rack_cseq_num(sip_msg_t sip_msg, int *error)
13242882Svi117747 {
13252882Svi117747 int *r;
13262882Svi117747
13272882Svi117747 r = (int *)sip_get_rack_val(sip_msg, SIP_RACK_CSEQ_NUM, error);
13282882Svi117747
13292882Svi117747 return (r == NULL ? -1 : *r);
13302882Svi117747 }
13312882Svi117747
13322882Svi117747 /*
13332882Svi117747 * get method for rack
13342882Svi117747 */
13352882Svi117747 sip_method_t
sip_get_rack_method(sip_msg_t sip_msg,int * error)13362882Svi117747 sip_get_rack_method(sip_msg_t sip_msg, int *error)
13372882Svi117747 {
13382882Svi117747 sip_method_t *r;
13392882Svi117747
13402882Svi117747 r = (sip_method_t *)sip_get_rack_val(sip_msg, SIP_RACK_METHOD, error);
13412882Svi117747
13422882Svi117747 return (r == NULL ? -1 : *r);
13432882Svi117747 }
13442882Svi117747
13452882Svi117747 /*
13462882Svi117747 * get response number from rseq
13472882Svi117747 */
13482882Svi117747 int
sip_get_rseq_resp_num(sip_msg_t sip_msg,int * error)13492882Svi117747 sip_get_rseq_resp_num(sip_msg_t sip_msg, int *error)
13502882Svi117747 {
13512882Svi117747 int *r;
13522882Svi117747
13532882Svi117747 r = (int *)sip_get_val_from_msg(sip_msg, SIP_RSEQ, SIP_INT_VAL,
13542882Svi117747 B_FALSE, B_FALSE, error);
13552882Svi117747
13562882Svi117747 return (r == NULL ? -1 : *r);
13572882Svi117747 }
13582882Svi117747
13592882Svi117747 /*
13602882Svi117747 * get reply-to display name
13612882Svi117747 */
13622882Svi117747 const sip_str_t *
sip_get_replyto_display_name(sip_msg_t sip_msg,int * error)13632882Svi117747 sip_get_replyto_display_name(sip_msg_t sip_msg, int *error)
13642882Svi117747 {
13652882Svi117747 sip_str_t *r;
13662882Svi117747
13672882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_REPLYTO,
13682882Svi117747 SIP_STRS_VAL, B_TRUE, B_FALSE, error);
13692882Svi117747 return (r);
13702882Svi117747 }
13712882Svi117747
13722882Svi117747 /*
13732882Svi117747 * get reply-to URI
13742882Svi117747 */
13752882Svi117747 const sip_str_t *
sip_get_replyto_uri_str(sip_msg_t sip_msg,int * error)13762882Svi117747 sip_get_replyto_uri_str(sip_msg_t sip_msg, int *error)
13772882Svi117747 {
13782882Svi117747 sip_str_t *r;
13792882Svi117747
13802882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_REPLYTO,
13812882Svi117747 SIP_STRS_VAL, B_FALSE, B_FALSE, error);
13822882Svi117747
13832882Svi117747 return (r);
13842882Svi117747 }
13852882Svi117747
13862882Svi117747 /*
13872882Svi117747 * get require value
13882882Svi117747 */
13892882Svi117747 const sip_str_t *
sip_get_require(sip_header_value_t value,int * error)13902882Svi117747 sip_get_require(sip_header_value_t value, int *error)
13912882Svi117747 {
13922882Svi117747 sip_str_t *r;
13932882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
13942882Svi117747
13952882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
13962882Svi117747 return (r);
13972882Svi117747 }
13982882Svi117747
13992882Svi117747 /*
14002882Svi117747 * get retry-after time
14012882Svi117747 */
14022882Svi117747 int
sip_get_retry_after_time(sip_msg_t sip_msg,int * error)14032882Svi117747 sip_get_retry_after_time(sip_msg_t sip_msg, int *error)
14042882Svi117747 {
14052882Svi117747 int *t;
14062882Svi117747
14072882Svi117747 t = (int *)sip_get_val_from_msg(sip_msg, SIP_RETRY_AFTER,
14082882Svi117747 SIP_INTSTR_VAL, B_FALSE, B_FALSE, error);
14092882Svi117747 if (t == NULL)
14102882Svi117747 return (-1);
14112882Svi117747 return (*t);
14122882Svi117747 }
14132882Svi117747
14142882Svi117747 /*
14152882Svi117747 * get retry-after comments
14162882Svi117747 */
14172882Svi117747 const sip_str_t *
sip_get_retry_after_cmts(sip_msg_t sip_msg,int * error)14182882Svi117747 sip_get_retry_after_cmts(sip_msg_t sip_msg, int *error)
14192882Svi117747 {
14202882Svi117747 sip_str_t *r;
14212882Svi117747
14222882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_RETRY_AFTER,
14232882Svi117747 SIP_INTSTR_VAL, B_TRUE, B_FALSE, error);
14242882Svi117747 return (r);
14252882Svi117747 }
14262882Svi117747
14272882Svi117747 /*
14282882Svi117747 * get subject
14292882Svi117747 */
14302882Svi117747 const sip_str_t *
sip_get_subject(sip_msg_t sip_msg,int * error)14312882Svi117747 sip_get_subject(sip_msg_t sip_msg, int *error)
14322882Svi117747 {
14332882Svi117747 sip_str_t *r;
14342882Svi117747
14352882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBJECT, SIP_STR_VAL,
14362882Svi117747 B_FALSE, B_TRUE, error);
14372882Svi117747 return (r);
14382882Svi117747 }
14392882Svi117747
14402882Svi117747 /*
14412882Svi117747 * get supported
14422882Svi117747 */
14432882Svi117747 const sip_str_t *
sip_get_supported(sip_header_value_t value,int * error)14442882Svi117747 sip_get_supported(sip_header_value_t value, int *error)
14452882Svi117747 {
14462882Svi117747 sip_str_t *r;
14472882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
14482882Svi117747
14492882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
14502882Svi117747 return (r);
14512882Svi117747 }
14522882Svi117747
14532882Svi117747 /*
14542882Svi117747 * get timestamp delay
14552882Svi117747 */
14562882Svi117747 const sip_str_t *
sip_get_tstamp_delay(sip_msg_t sip_msg,int * error)14572882Svi117747 sip_get_tstamp_delay(sip_msg_t sip_msg, int *error)
14582882Svi117747 {
14592882Svi117747 sip_str_t *t;
14602882Svi117747
14612882Svi117747 t = sip_get_val_from_msg(sip_msg, SIP_TIMESTAMP, SIP_STRS_VAL, B_FALSE,
14622882Svi117747 B_FALSE, error);
14632882Svi117747 return (t);
14642882Svi117747 }
14652882Svi117747
14662882Svi117747 /*
14672882Svi117747 * get timestamp
14682882Svi117747 */
14692882Svi117747 const sip_str_t *
sip_get_tstamp_value(sip_msg_t sip_msg,int * error)14702882Svi117747 sip_get_tstamp_value(sip_msg_t sip_msg, int *error)
14712882Svi117747 {
14722882Svi117747 sip_str_t *t;
14732882Svi117747
14742882Svi117747 t = sip_get_val_from_msg(sip_msg, SIP_TIMESTAMP, SIP_STRS_VAL, B_TRUE,
14752882Svi117747 B_FALSE, error);
14762882Svi117747 return (t);
14772882Svi117747 }
14782882Svi117747
14792882Svi117747 /*
14802882Svi117747 * get unsupported value
14812882Svi117747 */
14822882Svi117747 const sip_str_t *
sip_get_unsupported(sip_header_value_t value,int * error)14832882Svi117747 sip_get_unsupported(sip_header_value_t value, int *error)
14842882Svi117747 {
14852882Svi117747 sip_str_t *r;
14862882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
14872882Svi117747
14882882Svi117747 r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
14892882Svi117747 return (r);
14902882Svi117747 }
14912882Svi117747
14922882Svi117747 /*
14932882Svi117747 * get server value from message
14942882Svi117747 */
14952882Svi117747 const sip_str_t *
sip_get_server(sip_msg_t sip_msg,int * error)14962882Svi117747 sip_get_server(sip_msg_t sip_msg, int *error)
14972882Svi117747 {
14982882Svi117747 sip_str_t *r;
14992882Svi117747
15002882Svi117747 r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SERVER, SIP_STR_VAL,
15012882Svi117747 B_FALSE, B_FALSE, error);
15022882Svi117747 return (r);
15032882Svi117747 }
15042882Svi117747
15052882Svi117747 /*
15062882Svi117747 * get user-agent value
15072882Svi117747 */
15082882Svi117747 const sip_str_t *
sip_get_user_agent(sip_msg_t sip_msg,int * error)15092882Svi117747 sip_get_user_agent(sip_msg_t sip_msg, int *error)
15102882Svi117747 {
15112882Svi117747 sip_str_t *r;
15122882Svi117747
15132882Svi117747 r = sip_get_val_from_msg(sip_msg, SIP_USER_AGENT, SIP_STR_VAL, B_FALSE,
15142882Svi117747 B_FALSE, error);
15152882Svi117747 return (r);
15162882Svi117747 }
15172882Svi117747
15182882Svi117747 #define W_CODE 0x05
15192882Svi117747 #define W_AGENT 0x06
15202882Svi117747 #define W_TEXT 0x07
15212882Svi117747
15222882Svi117747 /*
15232882Svi117747 * get warning info
15242882Svi117747 */
15252882Svi117747 static void *
sip_get_warninfo(sip_header_value_t value,int info,int * error)15262882Svi117747 sip_get_warninfo(sip_header_value_t value, int info, int *error)
15272882Svi117747 {
15282882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
15292882Svi117747
15302882Svi117747 if (error != NULL)
15312882Svi117747 *error = 0;
15322882Svi117747
15332882Svi117747 if (val == NULL) {
15342882Svi117747 if (error != NULL)
15352882Svi117747 *error = EINVAL;
15362882Svi117747 return (NULL);
15372882Svi117747 }
15382882Svi117747
15392882Svi117747 if (val->sip_value_state == SIP_VALUE_BAD) {
15402882Svi117747 *error = EPROTO;
15412882Svi117747 return (NULL);
15422882Svi117747 }
15432882Svi117747
15442882Svi117747 switch (info) {
15452882Svi117747 case (W_CODE):
15462882Svi117747 return (&(val->warn_code));
15472882Svi117747 case (W_AGENT):
15482882Svi117747 return (&(val->warn_agt));
15492882Svi117747 case (W_TEXT):
15502882Svi117747 return (&(val->warn_text));
15512882Svi117747 }
15522882Svi117747 if (error != NULL)
15532882Svi117747 *error = EINVAL;
15542882Svi117747 return (NULL);
15552882Svi117747 }
15562882Svi117747
15572882Svi117747 /*
15582882Svi117747 * get warning code
15592882Svi117747 */
15602882Svi117747 int
sip_get_warning_code(sip_header_value_t value,int * error)15612882Svi117747 sip_get_warning_code(sip_header_value_t value, int *error)
15622882Svi117747 {
15632882Svi117747 int *c;
15642882Svi117747
15652882Svi117747 if (error != NULL)
15662882Svi117747 *error = 0;
15672882Svi117747
15682882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
15692882Svi117747 if (error != NULL)
15702882Svi117747 *error = EINVAL;
15712882Svi117747 return (-1);
15722882Svi117747 }
15732882Svi117747 c = (int *)sip_get_warninfo(value, W_CODE, error);
15742882Svi117747 if (c == NULL)
15752882Svi117747 return (-1);
15762882Svi117747 return (*c);
15772882Svi117747 }
15782882Svi117747
15792882Svi117747 /*
15802882Svi117747 * get warning agent
15812882Svi117747 */
15822882Svi117747 const sip_str_t *
sip_get_warning_agent(sip_header_value_t value,int * error)15832882Svi117747 sip_get_warning_agent(sip_header_value_t value, int *error)
15842882Svi117747 {
15852882Svi117747 sip_str_t *r;
15862882Svi117747
15872882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
15882882Svi117747 if (error != NULL)
15892882Svi117747 *error = EINVAL;
15902882Svi117747 return (NULL);
15912882Svi117747 }
15922882Svi117747 r = (sip_str_t *)sip_get_warninfo(value, W_AGENT, error);
15932882Svi117747 return (r);
15942882Svi117747 }
15952882Svi117747
15962882Svi117747 /*
15972882Svi117747 * get warning text
15982882Svi117747 */
15992882Svi117747 const sip_str_t *
sip_get_warning_text(sip_header_value_t value,int * error)16002882Svi117747 sip_get_warning_text(sip_header_value_t value, int *error)
16012882Svi117747 {
16022882Svi117747 sip_str_t *r;
16032882Svi117747
16042882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
16052882Svi117747 if (error != NULL)
16062882Svi117747 *error = EINVAL;
16072882Svi117747 return (NULL);
16082882Svi117747 }
16092882Svi117747 r = (sip_str_t *)sip_get_warninfo(value, W_TEXT, error);
16102882Svi117747 return (r);
16112882Svi117747 }
16122882Svi117747
16132882Svi117747 /*
16142882Svi117747 * get authorization scheme
16152882Svi117747 */
16162882Svi117747 const sip_str_t *
sip_get_author_scheme(sip_msg_t sip_msg,int * error)16172882Svi117747 sip_get_author_scheme(sip_msg_t sip_msg, int *error)
16182882Svi117747 {
16192882Svi117747 sip_str_t *r;
16202882Svi117747
16212882Svi117747 r = sip_get_val_from_msg(sip_msg, SIP_AUTHOR, SIP_AUTH_VAL, B_FALSE,
16222882Svi117747 B_FALSE, error);
16232882Svi117747 return (r);
16242882Svi117747 }
16252882Svi117747
16262882Svi117747 /*
16272882Svi117747 * get authentication parameter
16282882Svi117747 */
16292882Svi117747 static const sip_str_t *
sip_get_auth_param(sip_msg_t msg,char * hdr_name,char * pname,int * error)16302882Svi117747 sip_get_auth_param(sip_msg_t msg, char *hdr_name, char *pname, int *error)
16312882Svi117747 {
16322882Svi117747 const _sip_header_t *header;
16332882Svi117747 sip_hdr_value_t *value;
16342882Svi117747 sip_param_t *param;
16352882Svi117747
16362882Svi117747 if (error != NULL)
16372882Svi117747 *error = 0;
16382882Svi117747
16392882Svi117747 if (msg == NULL || pname == NULL || hdr_name == NULL) {
16402882Svi117747 if (error != NULL)
16412882Svi117747 *error = EINVAL;
16422882Svi117747 return (NULL);
16432882Svi117747 }
16442882Svi117747
16452882Svi117747 header = sip_get_header(msg, hdr_name, NULL, error);
16462882Svi117747 if (header == NULL) {
16472882Svi117747 if (error != NULL)
16482882Svi117747 *error = EINVAL;
16492882Svi117747 return (NULL);
16502882Svi117747 }
16512882Svi117747
16522882Svi117747 value = (sip_hdr_value_t *)sip_get_header_value(header, error);
16532882Svi117747 if (value == NULL) {
16542882Svi117747 if (error != NULL)
16552882Svi117747 *error = EPROTO;
16562882Svi117747 return (NULL);
16572882Svi117747 }
16582882Svi117747
16592882Svi117747 param = sip_get_param_from_list(value->auth_param, pname);
16602882Svi117747 if (param != NULL)
16612882Svi117747 return (¶m->param_value);
16622882Svi117747 return (NULL);
16632882Svi117747 }
16642882Svi117747
16652882Svi117747 /*
16662882Svi117747 * get authentication parameter
16672882Svi117747 */
16682882Svi117747 const sip_str_t *
sip_get_author_param(sip_msg_t sip_msg,char * name,int * error)16692882Svi117747 sip_get_author_param(sip_msg_t sip_msg, char *name, int *error)
16702882Svi117747 {
16712882Svi117747 const sip_str_t *r;
16722882Svi117747
16732882Svi117747 r = sip_get_auth_param(sip_msg, SIP_AUTHOR, name, error);
16742882Svi117747 return (r);
16752882Svi117747 }
16762882Svi117747
16772882Svi117747 /*
16782882Svi117747 * get authentication info
16792882Svi117747 */
16802882Svi117747 const sip_str_t *
sip_get_authen_info(sip_header_value_t value,int * error)16812882Svi117747 sip_get_authen_info(sip_header_value_t value, int *error)
16822882Svi117747 {
16832882Svi117747 sip_str_t *r;
16842882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
16852882Svi117747
16862882Svi117747 if (error != NULL)
16872882Svi117747 *error = 0;
16882882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
16892882Svi117747 if (error != NULL)
16902882Svi117747 *error = EINVAL;
16912882Svi117747 return (NULL);
16922882Svi117747 }
16932882Svi117747 r = sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
16942882Svi117747 return (r);
16952882Svi117747 }
16962882Svi117747
16972882Svi117747 /*
16982882Svi117747 * get proxy-authentication scheme
16992882Svi117747 */
17002882Svi117747 const sip_str_t *
sip_get_proxy_authen_scheme(sip_msg_t msg,int * error)17012882Svi117747 sip_get_proxy_authen_scheme(sip_msg_t msg, int *error)
17022882Svi117747 {
17032882Svi117747 sip_str_t *r;
17042882Svi117747
17052882Svi117747 r = sip_get_val_from_msg(msg, SIP_PROXY_AUTHEN, SIP_AUTH_VAL, B_FALSE,
17062882Svi117747 B_FALSE, error);
17072882Svi117747 return (r);
17082882Svi117747 }
17092882Svi117747
17102882Svi117747 /*
17112882Svi117747 * get proxy authentication parameter
17122882Svi117747 */
17132882Svi117747 const sip_str_t *
sip_get_proxy_authen_param(sip_msg_t sip_msg,char * name,int * error)17142882Svi117747 sip_get_proxy_authen_param(sip_msg_t sip_msg, char *name, int *error)
17152882Svi117747 {
17162882Svi117747 const sip_str_t *r;
17172882Svi117747
17182882Svi117747 r = sip_get_auth_param(sip_msg, SIP_PROXY_AUTHEN, name, error);
17192882Svi117747 return (r);
17202882Svi117747 }
17212882Svi117747
17222882Svi117747 /*
17232882Svi117747 * get proxy-authorization scheme
17242882Svi117747 */
17252882Svi117747 const sip_str_t *
sip_get_proxy_author_scheme(sip_msg_t msg,int * error)17262882Svi117747 sip_get_proxy_author_scheme(sip_msg_t msg, int *error)
17272882Svi117747 {
17282882Svi117747 sip_str_t *r;
17292882Svi117747
17302882Svi117747 r = sip_get_val_from_msg(msg, SIP_PROXY_AUTHOR, SIP_AUTH_VAL, B_FALSE,
17312882Svi117747 B_FALSE, error);
17322882Svi117747 return (r);
17332882Svi117747 }
17342882Svi117747
17352882Svi117747 /*
17362882Svi117747 * get proxy-authorization parameter
17372882Svi117747 */
17382882Svi117747 const sip_str_t *
sip_get_proxy_author_param(sip_msg_t sip_msg,char * name,int * error)17392882Svi117747 sip_get_proxy_author_param(sip_msg_t sip_msg, char *name, int *error)
17402882Svi117747 {
17412882Svi117747 const sip_str_t *r;
17422882Svi117747
17432882Svi117747 r = sip_get_auth_param(sip_msg, SIP_PROXY_AUTHOR, name, error);
17442882Svi117747 return (r);
17452882Svi117747 }
17462882Svi117747
17472882Svi117747 /*
17482882Svi117747 * get proxy-require
17492882Svi117747 */
17502882Svi117747 const sip_str_t *
sip_get_proxy_require(sip_header_value_t value,int * error)17512882Svi117747 sip_get_proxy_require(sip_header_value_t value, int *error)
17522882Svi117747 {
17532882Svi117747 sip_str_t *r;
17542882Svi117747 sip_hdr_value_t *val = (sip_hdr_value_t *)value;
17552882Svi117747
17562882Svi117747 if (error != NULL)
17572882Svi117747 *error = 0;
17582882Svi117747 if (value == NULL || value->value_state == SIP_VALUE_DELETED) {
17592882Svi117747 if (error != NULL)
17602882Svi117747 *error = EINVAL;
17612882Svi117747 return (NULL);
17622882Svi117747 }
17632882Svi117747 r = sip_get_val_from_hdr(val, SIP_STR_VAL, B_FALSE, error);
17642882Svi117747 return (r);
17652882Svi117747 }
17662882Svi117747
17672882Svi117747 /*
17682882Svi117747 * get www-authentication scheme
17692882Svi117747 */
17702882Svi117747 const sip_str_t *
sip_get_www_authen_scheme(sip_msg_t msg,int * error)17712882Svi117747 sip_get_www_authen_scheme(sip_msg_t msg, int *error)
17722882Svi117747 {
17732882Svi117747 sip_str_t *r;
17742882Svi117747
17752882Svi117747 r = sip_get_val_from_msg(msg, SIP_WWW_AUTHEN, SIP_AUTH_VAL, B_FALSE,
17762882Svi117747 B_FALSE, error);
17772882Svi117747 return (r);
17782882Svi117747 }
17792882Svi117747
17802882Svi117747 /*
17812882Svi117747 * get www-authentication parameter
17822882Svi117747 */
17832882Svi117747 const sip_str_t *
sip_get_www_authen_param(sip_msg_t sip_msg,char * name,int * error)17842882Svi117747 sip_get_www_authen_param(sip_msg_t sip_msg, char *name, int *error)
17852882Svi117747 {
17862882Svi117747 const sip_str_t *r;
17872882Svi117747
17882882Svi117747 r = sip_get_auth_param(sip_msg, SIP_WWW_AUTHEN, name, error);
17892882Svi117747 return (r);
17902882Svi117747 }
1791