⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sip_ui.c

📁 VoIP use SIP protocol interface
💻 C
📖 第 1 页 / 共 4 页
字号:
	/*	 * If the value is BAD, update error to reflect it.	 */	if (error != NULL && value->value_state == SIP_VALUE_BAD)		*error = EPROTO;	return (&cftrvalue->cftr_uri);}/* Get display name from the value */const sip_str_t *sip_get_cftrname_from_val(sip_header_value_t value, int *error){	sip_hdr_value_t *cftrvalue;	if (error != NULL)		*error = 0;	if (value == NULL || value->value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	cftrvalue = (sip_hdr_value_t *)value;	/*	 * If the value is BAD, update error to reflect it.	 */	if (error != NULL && value->value_state == SIP_VALUE_BAD)		*error = EPROTO;	return (cftrvalue->cftr_name);}/* * Contact header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_contact_uri_str(sip_header_value_t value, int *error){	return (sip_get_cftruri_from_val(value, error));}/* * Contact header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_contact_display_name(sip_header_value_t value, int *error){	return (sip_get_cftrname_from_val(value, error));}/* * Route header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_route_uri_str(sip_header_value_t value, int *error){	return (sip_get_cftruri_from_val(value, error));}/* * Route header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_route_display_name(sip_header_value_t value, int *error){	return (sip_get_cftrname_from_val(value, error));}/* Get URI from the SIP message */const sip_str_t *sip_get_cftruri_from_msg(sip_msg_t sip_msg, int *error, char *hdrname){	const sip_hdr_value_t	*value;	const struct sip_header	*header;	if (error != NULL)		*error = 0;	if (sip_msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	header = sip_get_header(sip_msg, hdrname, NULL, error);	if (header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	value = (sip_hdr_value_t *)sip_get_header_value(header, error);	if (value == NULL) {		if (error != NULL)			*error = EPROTO;		return (NULL);	}	/*	 * If the value is BAD, update error to reflect it.	 */	if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)		*error = EPROTO;	return (&value->cftr_uri);}/* Get display name from the SIP message */const sip_str_t *sip_get_cftrname_from_msg(sip_msg_t sip_msg, int *error, char *hdrname){	const sip_hdr_value_t		*value;	const struct  sip_header	*header;	if (error != NULL)		*error = 0;	if (sip_msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	header = sip_get_header(sip_msg, hdrname, NULL, error);	if (header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	value = (sip_hdr_value_t *)sip_get_header_value(header, error);	if (value == NULL) {		if (error != NULL)			*error = EPROTO;		return (NULL);	}	/*	 * If the value is BAD, update error to reflect it.	 */	if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)		*error = EPROTO;	return (value->cftr_name);}/* Get FROM URI */const sip_str_t *sip_get_from_uri_str(sip_msg_t sip_msg, int *error){	return (sip_get_cftruri_from_msg(sip_msg, error, SIP_FROM));}/* Get FROM display name */const sip_str_t *sip_get_from_display_name(sip_msg_t sip_msg, int *error){	return (sip_get_cftrname_from_msg(sip_msg, error, SIP_FROM));}/* Return the FROM tag */const sip_str_t *sip_get_from_tag(sip_msg_t sip_msg, int *error){	const sip_hdr_value_t	*value;	const struct sip_header	*header;	if (error != NULL)		*error = 0;	if (sip_msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	header = sip_get_header(sip_msg, SIP_FROM, NULL, error);	if (header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	value = (sip_hdr_value_t *)sip_get_header_value(header, error);	if (value == NULL) {		if (error != NULL)			*error = EPROTO;		return (NULL);	}	/*	 * If the value is BAD, update error to reflect it.	 */	if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)		*error = EPROTO;	return (sip_get_param_value((sip_header_value_t)value, "tag", error));}/* Get TO URI */const sip_str_t *sip_get_to_uri_str(sip_msg_t sip_msg, int *error){	return (sip_get_cftruri_from_msg(sip_msg, error, SIP_TO));}/* Get TO display name */const sip_str_t *sip_get_to_display_name(sip_msg_t sip_msg, int *error){	return (sip_get_cftrname_from_msg(sip_msg, error, SIP_TO));}/* Get TO tag */const sip_str_t *sip_get_to_tag(sip_msg_t sip_msg, int *error){	const sip_hdr_value_t	*value;	const struct sip_header	*header;	if (error != NULL)		*error = 0;	if (sip_msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	header = sip_get_header(sip_msg, SIP_TO, NULL, error);	if (header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	value = (sip_hdr_value_t *)sip_get_header_value(header, error);	if (value == NULL) {		if (error != NULL)			*error = EPROTO;		return (NULL);	}	/*	 * If the value is BAD, update error to reflect it.	 */	if (error != NULL && value->sip_value_state == SIP_VALUE_BAD)		*error = EPROTO;	return (sip_get_param_value((sip_header_value_t)value, "tag", error));}/* Generic function to get int or string value from a header */static void *sip_get_val_from_hdr(sip_hdr_value_t *val, int val_type, boolean_t stype,    int *error){	if (error != NULL)		*error = 0;	if (val == NULL || val->sip_value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	if (val->sip_value_state == SIP_VALUE_BAD)		*error = EPROTO;	switch (val_type) {		case (SIP_INT_VAL):			return (&(val->int_val));		case (SIP_STR_VAL):			return (&(val->str_val));		case (SIP_STRS_VAL):			if (stype == B_TRUE)				return (&(val->strs_val.s1));			return (&(val->strs_val.s2));		case (SIP_INTSTR_VAL):			if (stype == B_TRUE)				return (&(val->intstr_str));			return (&(val->intstr_int));		case (SIP_AUTH_VAL):			return (&(val->auth_val));	}	if (error != NULL && *error == 0)		*error = EINVAL;	return (NULL);}/* * Generic function to get value from a header given the value type and * the string info (for multi-string values). */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){	const _sip_header_t	*header;	sip_hdr_value_t		*value;	if (error != NULL)		*error = 0;	if (msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	header = sip_get_header(msg, hdr_name, NULL, error);	if (header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	value = (sip_hdr_value_t *)sip_get_header_value(header, error);	if (value == NULL) {		if (error != NULL && empty_val == B_FALSE)			*error = EPROTO;		return (NULL);	}	return (sip_get_val_from_hdr(value, val_type, stype, error));}/* Return the Call-Id */const sip_str_t *sip_get_callid(sip_msg_t sip_msg, int *error){	sip_str_t	*r;	r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CALL_ID, SIP_STR_VAL,	    B_FALSE, B_TRUE, error);	return (r);}#define	SIP_CSEQ_NUM	1#define	SIP_CSEQ_METHOD	2/* Get number/method from the CSEQ header */void *sip_get_cseq_val(sip_msg_t msg, int type, int *error){	const _sip_header_t	*header;	sip_hdr_value_t		*val;	if (error != NULL)		*error = 0;	if (msg == NULL)  {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	header = sip_get_header(msg, SIP_CSEQ, NULL, error);	if (header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	val = (sip_hdr_value_t *)sip_get_header_value(header, error);	if (val == NULL) {		if (error != NULL)			*error = EPROTO;		return (NULL);	}	if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD)		*error = EPROTO;	switch (type) {		case SIP_CSEQ_NUM:			return (&(val->cseq_num));		case SIP_CSEQ_METHOD:			return (&(val->cseq_method));	}	if (error != NULL)		*error = EINVAL;	return (NULL);}/* Get CSEQ number */intsip_get_callseq_num(sip_msg_t sip_msg, int *error){	int	*r;	r = (int *)sip_get_cseq_val(sip_msg, SIP_CSEQ_NUM, error);	return (r == NULL ? -1 : *r);}/* Get CSEQ method */sip_method_tsip_get_callseq_method(sip_msg_t sip_msg, int *error){	sip_method_t	*r;	r = (sip_method_t *)sip_get_cseq_val(sip_msg, SIP_CSEQ_METHOD, error);	return (r == NULL ? -1 : *r);}/* * Via header can have more than one value * so we require a value to be passed in. */const sip_str_t *sip_get_via_sent_by_host(sip_header_value_t value, int *error){	sip_hdr_value_t	*via_value;	if (error != NULL)		*error = 0;	if (value == NULL || value->value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	via_value = (sip_hdr_value_t *)value;	if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)		*error = EPROTO;	return (&via_value->via_sent_by_host);}/* * Via header can have more than one value * so we require a value to be passed in. */intsip_get_via_sent_by_port(sip_header_value_t value, int *error){	sip_hdr_value_t	*via_value;	if (error != NULL)		*error = 0;	if (value == NULL || value->value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (-1);	}	via_value = (sip_hdr_value_t *)value;	if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)		*error = EPROTO;	return (via_value->via_sent_by_port);}/* Return the protocol version from the VIA value */const sip_str_t *sip_get_via_sent_protocol_version(sip_header_value_t value, int *error){	sip_hdr_value_t *via_value;	if (value == NULL || value->value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	via_value = (sip_hdr_value_t *)value;	if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)		*error = EPROTO;	return (&via_value->via_protocol_vers);}/* Return the protocol name */const sip_str_t *sip_get_via_sent_protocol_name(sip_header_value_t value, int *error){	sip_hdr_value_t	*via_value;	if (error != NULL)		*error = 0;	if (value == NULL || value->value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	via_value = (sip_hdr_value_t *)value;	if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)		*error = EPROTO;	return (&via_value->via_protocol_name);}/* Return the transport from the VIA value */const sip_str_t *sip_get_via_sent_transport(sip_header_value_t value, int *error){	sip_hdr_value_t	*via_value;	if (error != NULL)		*error = 0;	if (value == NULL || value->value_state == SIP_VALUE_DELETED) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	via_value = (sip_hdr_value_t *)value;	if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL)		*error = EPROTO;	return (&via_value->via_protocol_transport);}/* Return Max-Forward value */intsip_get_maxforward(sip_msg_t sip_msg, int *error){	int	*r;	r = (int *)sip_get_val_from_msg(sip_msg, SIP_MAX_FORWARDS, SIP_INT_VAL,	    B_FALSE, B_FALSE, error);	if (r == NULL)		return (-1);	return (*r);}/* Get the content type */const sip_str_t *sip_get_content_type(sip_msg_t sip_msg, int *error){	sip_str_t	*r;	r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,	    SIP_STRS_VAL, B_TRUE, B_FALSE, error);	return (r);}/* Get the content sub-type */const sip_str_t *sip_get_content_sub_type(sip_msg_t sip_msg, int *error){	sip_str_t	*r;	r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE,	    SIP_STRS_VAL, B_FALSE, B_FALSE, error);	return (r);}/* Get content as a string. Caller frees the string */char *sip_get_content(sip_msg_t sip_msg, int *error){	_sip_msg_t	*_sip_msg;	sip_content_t	*sip_content;	char		*content;	int		len;	char		*p;	if (error != NULL)		*error = 0;	if (sip_msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_sip_msg = (_sip_msg_t *)sip_msg;	(void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);	if (_sip_msg->sip_msg_content == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		if (error != NULL)			*error = EINVAL;		return (NULL);	}	content = malloc(_sip_msg->sip_msg_content_len + 1);	if (content == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		if (error != NULL)			*error = ENOMEM;		return (NULL);	}	p = content;	sip_content = _sip_msg->sip_msg_content;	while (sip_content != NULL) {		len =  sip_content->sip_content_end -		    sip_content->sip_content_start;		(void) strncpy(p, sip_content->sip_content_start, len);		p += len;		sip_content = sip_content->sip_content_next;	}	content[_sip_msg->sip_msg_content_len] = '\0';	(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);	return (content);}/* Return the content-length value */intsip_get_content_length(sip_msg_t sip_msg, int *error){	int	*r;	r = (int *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_LENGTH,	    SIP_INT_VAL, B_FALSE, B_FALSE, error);	if (r == NULL)		return (-1);	return (*r);}/* get allow-events */const sip_str_t *sip_get_allow_events(sip_header_value_t value, int *error){	sip_str_t	*r;	sip_hdr_value_t	*val = (sip_hdr_value_t *)value;	r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_TRUE, error);	return (r);}/* get event */const sip_str_t *sip_get_event(sip_msg_t sip_msg, int *error){	sip_str_t	*r;	r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_EVENT, SIP_STR_VAL,	    B_FALSE, B_FALSE, error);	return (r);}/* get subscription state */const sip_str_t *sip_get_substate(sip_msg_t sip_msg, int *error){	sip_str_t	*r;	r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBSCRIPTION_STATE,	    SIP_STR_VAL, B_FALSE, B_FALSE, error);	return (r);}/* get accept type */const sip_str_t *sip_get_accept_type(sip_header_value_t value, int *error){	sip_str_t	*r;	sip_hdr_value_t	*val = (sip_hdr_value_t *)value;	r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error);	return (r);}/* get accept subtype */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -