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

📄 sip_parse_generic.c

📁 VoIP use SIP protocol interface
💻 C
📖 第 1 页 / 共 2 页
字号:
				hdr->sip_hdr_current = t;			}			/*			 * if SEMI exists in the value, set params list			 * two situations, there is or not SLASH before SEMI			 */			ret = sip_parse_params(hdr, &value->sip_param_list);			if (ret == EPROTO) {				value->sip_value_state = SIP_VALUE_BAD;			} else if (ret != 0) {				sip_free_phdr(parsed_header);				return (ret);			}			goto get_next_val;		} else {			value->str_val_ptr = value->sip_value_start;			value->str_val_len = hdr->sip_hdr_current -			    value->sip_value_start;			goto end;		}get_next_val:		if (sip_find_token(hdr, SIP_COMMA) != 0)			break;		value->sip_value_end = hdr->sip_hdr_current - 1;		last_value = value;		(void) sip_skip_white_space(hdr);	}end:	*phdr = parsed_header;	return (0);}/* * header_name: int * headers: Expires, Min-Expires *//* ARGSUSED */intsip_parse_hdr_parser2(_sip_header_t *hdr, sip_parsed_header_t **phdr,    int val_type){	sip_parsed_header_t	*parsed_header;	int			ret = 0;	sip_hdr_value_t		*value = NULL;	if (hdr == NULL || phdr == NULL)		return (EINVAL);	/* check if already parsed */	if (hdr->sip_hdr_parsed != NULL) {		*phdr = hdr->sip_hdr_parsed;		return (0);	}	*phdr = NULL;	assert(hdr->sip_hdr_start == hdr->sip_hdr_current);	if (sip_parse_goto_values(hdr) != 0)		return (EPROTO);	parsed_header = calloc(1, sizeof (sip_parsed_header_t));	if (parsed_header == NULL)		return (ENOMEM);	parsed_header->sip_header = hdr;	value = calloc(1, sizeof (sip_hdr_value_t));	if (value == NULL) {		sip_free_phdr(parsed_header);		return (ENOMEM);	}	parsed_header->value = (sip_value_t *)value;	value->sip_value_start = hdr->sip_hdr_current;	value->sip_value_header = parsed_header;	ret = sip_atoi(hdr, &value->int_val);	if (ret != 0) {		value->int_val = 0;		value->sip_value_state = SIP_VALUE_BAD;	}	value->sip_value_end = hdr->sip_hdr_current - 1;	*phdr = parsed_header;	return (0);}/* * parser3 parses hdr format * header_name: <val1>[, <val2>] * Alert-Info, Call-Info, Error-Info, reply-to */intsip_parse_hdr_parser3(_sip_header_t *hdr, sip_parsed_header_t **phdr, int type,    boolean_t parse_uri){	sip_parsed_header_t	*parsed_header;	sip_hdr_value_t		*value = NULL;	sip_hdr_value_t		*last_value = NULL;	if (hdr == NULL || phdr == NULL)		return (EINVAL);	/*	 * check if previously parsed	 */	if (hdr->sip_hdr_parsed != NULL) {		*phdr = hdr->sip_hdr_parsed;		return (0);	}	*phdr = NULL;	assert(hdr->sip_hdr_start == hdr->sip_hdr_current);	if (sip_parse_goto_values(hdr) != 0)		return (EPROTO);	parsed_header = calloc(1, sizeof (sip_parsed_header_t));	if (parsed_header == NULL)		return (ENOMEM);	parsed_header->sip_header = hdr;	while (hdr->sip_hdr_current < hdr->sip_hdr_end) {		int		r;		value = calloc(1, sizeof (sip_hdr_value_t));		if (value == NULL) {			sip_free_phdr(parsed_header);			return (ENOMEM);		}		if (last_value != NULL)			last_value->sip_next_value = value;		else			parsed_header->value = (sip_value_t *)value;		value->sip_value_start = hdr->sip_hdr_current;		value->sip_value_header = parsed_header;		if (type == SIP_STRS_VAL) {			if (sip_find_token(hdr, SIP_LAQUOT) == 0) {				char	*cur;				/* record the position after LAQUOT */				cur = hdr->sip_hdr_current;				/* get display name and store in str1 */				hdr->sip_hdr_current = value->sip_value_start;				if (*(hdr->sip_hdr_current) != SIP_LAQUOT) {					/* record start pos of display name */					char	*tmp = hdr->sip_hdr_current;					if (*hdr->sip_hdr_current ==					    SIP_QUOTE) {						hdr->sip_hdr_current++;						tmp++;						if (sip_find_token(hdr,						    SIP_QUOTE) != 0) {							value->sip_value_state =							    SIP_VALUE_BAD;							goto get_next_val;						}						hdr->sip_hdr_current -= 2;					} else {						hdr->sip_hdr_current = cur - 2;						(void)						    sip_reverse_skip_white_space						    (hdr);					}					value->strs1_val_ptr = tmp;					value->strs1_val_len =					    hdr->sip_hdr_current - tmp + 1;				} else {					value->strs1_val_ptr = NULL;					value->strs1_val_len = 0;				}				/* set current to the char after LAQUOT */				hdr->sip_hdr_current = cur;				value->strs2_val_ptr = hdr->sip_hdr_current;				if (sip_find_token(hdr, SIP_RAQUOT)) {					/* no RAQUOT */					value->strs1_val_ptr = NULL;					value->strs1_val_len = 0;					value->strs2_val_ptr = NULL;					value->strs2_val_len = 0;					value->sip_value_state = SIP_VALUE_BAD;					goto get_next_val;				}				value->strs2_val_len = hdr->sip_hdr_current -				    value->strs2_val_ptr - 1;			} else {				/*				 * have to be surrounded by AQUOT				 * invalid value				 */				value->strs1_val_ptr = NULL;				value->strs1_val_len = 0;				value->strs2_val_ptr = NULL;				value->strs2_val_len = 0;				value->sip_value_state = SIP_VALUE_BAD;				goto get_next_val;			}			if (parse_uri) {				sip_parse_uri_str(&value->strs_s2,				    parsed_header, value);			}		}		if (type == SIP_STR_VAL) {			/* alert-info, error-info, call-info */			if (sip_find_token(hdr, SIP_LAQUOT) == 0) {				value->str_val_ptr = hdr->sip_hdr_current;				if (sip_find_token(hdr, SIP_RAQUOT) == 0) {					value->str_val_len =					    hdr->sip_hdr_current -						value->str_val_ptr - 1;				} else {					value->str_val_ptr = NULL;					value->str_val_len = 0;					value->sip_value_state = SIP_VALUE_BAD;					goto get_next_val;				}				hdr->sip_hdr_current--;			} else {				value->str_val_ptr = NULL;				value->str_val_len = 0;				value->sip_value_state = SIP_VALUE_BAD;				goto get_next_val;			}			if (parse_uri) {				sip_parse_uri_str(&value->str_val,				    parsed_header, value);			}		}		r = sip_find_separator(hdr, SIP_COMMA, SIP_SEMI, (char)NULL);		if (r != 0)			goto end;		if (*hdr->sip_hdr_current == SIP_SEMI) {			(void) sip_parse_params(hdr,			    &(value->sip_param_list));			goto get_next_val;		}		if (*hdr->sip_hdr_current == SIP_COMMA) {			hdr->sip_hdr_current--;			goto get_next_val;		}get_next_val:		if (sip_find_token(hdr, SIP_COMMA) != 0)			break;		value->sip_value_end = hdr->sip_hdr_current - 1;		last_value = value;		(void) sip_skip_white_space(hdr);	}end:	*phdr = parsed_header;	return (0);}/* * parser4 parses hdr format, the whole field is one single str * header: Subject, MIME-Version, Organization, Server, User-Agent */intsip_parse_hdr_parser4(_sip_header_t *hdr, sip_parsed_header_t **phdr){	sip_parsed_header_t	*parsed_header;	sip_hdr_value_t		*value = NULL;	if (hdr == NULL || phdr == NULL)		return (EINVAL);	/*	 * check if previously parsed	 */	if (hdr->sip_hdr_parsed != NULL) {		*phdr = hdr->sip_hdr_parsed;		return (0);	}	*phdr = NULL;	assert(hdr->sip_hdr_start == hdr->sip_hdr_current);	if (sip_parse_goto_values(hdr) != 0)		return (EPROTO);	parsed_header = calloc(1, sizeof (sip_parsed_header_t));	if (parsed_header == NULL)		return (ENOMEM);	parsed_header->sip_header = hdr;	value = calloc(1, sizeof (sip_hdr_value_t));	if (value == NULL) {		sip_free_phdr(parsed_header);		return (ENOMEM);	}	parsed_header->value = (sip_value_t *)value;	value->sip_value_start = hdr->sip_hdr_current;	value->sip_value_header = parsed_header;	value->str_val_ptr = hdr->sip_hdr_current;	/* get rid of CRLF at end */	value->str_val_len = hdr->sip_hdr_end - value->str_val_ptr - 2;	value->sip_value_end = hdr->sip_hdr_end;	*phdr = parsed_header;	return (0);}intsip_parse_hdr_parser5(_sip_header_t *hdr, sip_parsed_header_t **phdr,    boolean_t parse_uri){	sip_parsed_header_t	*parsed_header;	sip_hdr_value_t		*value = NULL;	sip_param_t		*tmp_param;	boolean_t		first_param = B_TRUE;	if (hdr == NULL || phdr == NULL)		return (EINVAL);	/*	 * check if previously parsed	 */	if (hdr->sip_hdr_parsed != NULL) {		*phdr = hdr->sip_hdr_parsed;		return (0);	}	*phdr = NULL;	assert(hdr->sip_hdr_start == hdr->sip_hdr_current);	if (sip_parse_goto_values(hdr) != 0)		return (EPROTO);	parsed_header = calloc(1, sizeof (sip_parsed_header_t));	if (parsed_header == NULL)		return (ENOMEM);	parsed_header->sip_header = hdr;	value = calloc(1, sizeof (sip_hdr_value_t));	if (value == NULL) {		sip_free_phdr(parsed_header);		return (ENOMEM);	}	parsed_header->value = (sip_value_t *)value;	value->sip_value_start = hdr->sip_hdr_current;	value->auth_scheme_ptr = value->sip_value_start;	value->sip_value_header = parsed_header;	/* get auth_scheme */	if (sip_find_white_space(hdr)) {		value->sip_value_state = SIP_VALUE_BAD;		return (EINVAL);	}	value->auth_scheme_len = hdr->sip_hdr_current - value->auth_scheme_ptr;	tmp_param = value->auth_param;	/* parse auth_param */	for (;;) {		char		*tmp_cur;		boolean_t	quoted_name = B_FALSE;		char		quoted_char = (char)0;		sip_param_t	*new_param;		boolean_t	pval_is_uri = B_FALSE;		if (sip_skip_white_space(hdr) != 0) {			value->sip_value_state = SIP_VALUE_BAD;			return (EPROTO);		}		tmp_cur = hdr->sip_hdr_current;		new_param = calloc(1, sizeof (sip_param_t));		if (new_param == NULL)			return (ENOMEM);		if (first_param == B_FALSE)			tmp_param->param_next = new_param;		else			value->auth_param = new_param;		tmp_param = new_param;		tmp_param->param_name.sip_str_ptr = tmp_cur;		if (sip_find_separator(hdr, SIP_EQUAL, SIP_COMMA, (char)NULL) !=		    0) {			tmp_param->param_name.sip_str_len =			    hdr->sip_hdr_current - tmp_cur;			tmp_param->param_value.sip_str_ptr = NULL;			tmp_param->param_value.sip_str_len = 0;			goto end;		}		/*		 * End of param name		 */		tmp_param->param_name.sip_str_len = hdr->sip_hdr_current -		    tmp_cur;		if (sip_skip_white_space(hdr) != 0 ||		    *hdr->sip_hdr_current == SIP_COMMA) {			tmp_param->param_value.sip_str_ptr = NULL;			tmp_param->param_value.sip_str_len = 0;			continue;		}		/*		 * We are at EQUAL		 */		hdr->sip_hdr_current++;		if (sip_skip_white_space(hdr) != 0) {			value->sip_value_state = SIP_VALUE_BAD;			free(tmp_param);			return (EPROTO);		}		if (*hdr->sip_hdr_current == SIP_QUOTE ||		    *hdr->sip_hdr_current == SIP_LAQUOT) {			if (*hdr->sip_hdr_current == SIP_QUOTE)				quoted_char = SIP_QUOTE;			else {				quoted_char = SIP_RAQUOT;				pval_is_uri = B_TRUE;			}			hdr->sip_hdr_current++;			quoted_name = B_TRUE;		}		/*		 * start of param value		 */		tmp_cur = hdr->sip_hdr_current;		tmp_param->param_value.sip_str_ptr = tmp_cur;		if (quoted_name) {			if (sip_find_token(hdr, quoted_char) != 0) {				value->sip_value_state = SIP_VALUE_BAD;				free(tmp_param);				return (EPROTO);			}			tmp_param->param_value.sip_str_len =			    hdr->sip_hdr_current - tmp_cur - 1;		}		if (sip_find_token(hdr, SIP_COMMA) != 0)			goto end;		else {			if (!quoted_name) {				char *t = hdr->sip_hdr_current;				hdr->sip_hdr_current--;				(void) sip_reverse_skip_white_space(hdr);				tmp_param->param_value.sip_str_len =				    hdr->sip_hdr_current - tmp_cur;				hdr->sip_hdr_current = t;			}		}		if (first_param == B_TRUE)			first_param = B_FALSE;		if ((pval_is_uri == B_TRUE) && (parse_uri == B_TRUE)) {			/* Parse uri */			sip_parse_uri_str(&tmp_param->param_value,			    parsed_header, value);		}	}end:	*phdr = parsed_header;	return (0);}

⌨️ 快捷键说明

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