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

📄 sip_headers.c

📁 VoIP use SIP protocol interface
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif	header = sip_search_for_header(_sip_msg, header_name, NULL);	if (header == NULL)		return;	while (header != NULL) {		if (_sip_msg->sip_msg_headers_start == header) {			_sip_msg->sip_msg_headers_start = header->sip_hdr_next;		} else {			header->sip_hdr_prev->sip_hdr_next =			    header->sip_hdr_next;		}		if (_sip_msg->sip_msg_headers_end == header) {			_sip_msg->sip_msg_headers_end = header->sip_hdr_prev;		} else {			header->sip_hdr_next->sip_hdr_prev =			    header->sip_hdr_prev;		}		sip_free_header(header);		if (header_name != NULL)			return;		else			header = sip_search_for_header(_sip_msg, NULL, NULL);	}}/* * Add a header to sip_msg. If header_name is provided then the new header * is added before that header, if first is set, or after. If append is * set, then the header is added to the end of the header list. */void_sip_add_header(_sip_msg_t *sip_msg, _sip_header_t *new_header,    boolean_t append, boolean_t first, char *header_name){	_sip_header_t	*header = NULL;	if (sip_msg == NULL || new_header == NULL)		return;#ifdef	__solaris__	assert(mutex_held(&sip_msg->sip_msg_mutex));#endif	new_header->sip_hdr_sipmsg = sip_msg;	if (header_name != NULL) {		_sip_header_t	*header_tmp;		header = sip_search_for_header(sip_msg, header_name, NULL);		header_tmp = header;		if (!first) {			while (header != NULL) {				header_tmp = header;				header = sip_search_for_header(sip_msg,				    header_name, header);			}		}		header = header_tmp;		if (header == NULL)			append =  B_TRUE;	}	if (header != NULL) {		if (append) {			new_header->sip_hdr_prev = header;			if (sip_msg->sip_msg_headers_end == header) {				sip_msg->sip_msg_headers_end = new_header;				new_header->sip_hdr_next = NULL;			} else {				header->sip_hdr_next->sip_hdr_prev = new_header;				new_header->sip_hdr_next = header->sip_hdr_next;			}			header->sip_hdr_next = new_header;		} else {			new_header->sip_hdr_next = header;			if (sip_msg->sip_msg_headers_start == header) {				sip_msg->sip_msg_headers_start = new_header;				new_header->sip_hdr_prev = NULL;			} else {				header->sip_hdr_prev->sip_hdr_next = new_header;				new_header->sip_hdr_prev = header->sip_hdr_prev;			}			header->sip_hdr_prev = new_header;		}	} else {		if (append) {			if (sip_msg->sip_msg_headers_end != NULL) {				sip_msg->sip_msg_headers_end->sip_hdr_next =				    new_header;			} else {				sip_msg->sip_msg_headers_start = new_header;			}			new_header->sip_hdr_prev =			    sip_msg->sip_msg_headers_end;			new_header->sip_hdr_next = NULL;			sip_msg->sip_msg_headers_end = new_header;		} else {			if (sip_msg->sip_msg_headers_start != NULL) {				sip_msg->sip_msg_headers_start->sip_hdr_prev =				    new_header;			} else {				sip_msg->sip_msg_headers_end = new_header;			}			new_header->sip_hdr_next =			    sip_msg->sip_msg_headers_start;			new_header->sip_hdr_prev = NULL;			sip_msg->sip_msg_headers_start = new_header;		}	}	sip_msg->sip_msg_len += new_header->sip_hdr_end -	    new_header->sip_hdr_start;}/* * Scan through the function table and return the entry for the given header * type. */sip_header_function_t *_sip_get_header_functions(sip_header_function_t *sip_header_function_table,    _sip_header_t *sip_header, char *header_name){	int	len;	int	i = 0;	if (sip_header == NULL && header_name == NULL)		return (NULL);	/* If header_name is NULL we first have to locate the name */	if (header_name == NULL) {		if (sip_skip_white_space(sip_header) != 0) {			return (NULL);		}		header_name = sip_header->sip_hdr_current;		if (sip_find_separator(sip_header, SIP_HCOLON, (char)NULL,		    (char)NULL) != 0) {			return (NULL);		}		len = sip_header->sip_hdr_current - header_name;	} else {		len = strlen(header_name);	}	if (len > 0) {		while (sip_header_function_table[i].header_name != NULL ||		    sip_header_function_table[i].header_short_name != NULL) {			if (sip_header_function_table[i].header_name != NULL &&			    len ==			    strlen(sip_header_function_table[i].header_name)) {				if (strncasecmp(header_name,				    sip_header_function_table[i].				    header_name, len) == 0) {					break;				}			} else if (sip_header_function_table[i].			    header_short_name != NULL && len ==			    strlen(sip_header_function_table[i].			    header_short_name)) {				if (strncasecmp(header_name,				    sip_header_function_table[i].				    header_short_name, len) == 0) {					break;				}			}			i++;		}	}	if (sip_header != NULL)		sip_header->sip_hdr_current = sip_header->sip_hdr_start;	if (sip_header_function_table[i].header_name == NULL)		return (NULL);	return (&sip_header_function_table[i]);}/* Return the entry from the function table for the given header */sip_header_function_t *sip_get_header_functions(_sip_header_t *sip_header, char *header_name){	sip_header_function_t	*func;	sip_header_function_t	*header_f_table = NULL;	if (sip_header_function_table_external != NULL) {		header_f_table = _sip_get_header_functions(		    sip_header_function_table_external,		    sip_header, header_name);		if (header_f_table != NULL)			return (header_f_table);	}	func = _sip_get_header_functions(sip_header_function_table, sip_header,	    header_name);	return (func);}/* Search for the header name passed in. */_sip_header_t *sip_search_for_header(_sip_msg_t *sip_msg, char *header_name,    _sip_header_t *old_header){	int			len = 0;	int			full_len = 0;	int			compact_len = 0;	_sip_header_t		*header = NULL;	char			*compact_name = NULL;	char			*full_name = NULL;	sip_header_function_t	*header_f_table = NULL;	if (sip_msg == NULL)		return (NULL);#ifdef	__solaris__	assert(mutex_held(&sip_msg->sip_msg_mutex));#endif	if (header_name != NULL) {		header_f_table = sip_get_header_functions(NULL, header_name);		if (header_f_table != NULL) {			full_name = header_f_table->header_name;			compact_name = header_f_table->header_short_name;			if (full_name != NULL)				full_len = strlen(full_name);			if (compact_name != NULL)				compact_len = strlen(compact_name);		} else {			header_f_table = &sip_header_function_table[0];			full_name = header_name;			full_len  = strlen(full_name);		}	}	if (old_header != NULL)		header = old_header->sip_hdr_next;	else		header = sip_msg->sip_msg_headers_start;	while (header != NULL) {		if (header->sip_header_state == SIP_HEADER_DELETED) {			header = header->sip_hdr_next;			continue;		}		if (compact_len == 0 && full_len == 0)			break;		header->sip_hdr_current = header->sip_hdr_start;		if (sip_skip_white_space(header)) {			header = header->sip_hdr_next;			continue;		}		len = header->sip_hdr_end - header->sip_hdr_current;		if (full_name != NULL && (full_len <= len) &&		    strncasecmp(header->sip_hdr_current, full_name,		    full_len) == 0) {			header->sip_hdr_current += full_len;			if (sip_skip_white_space(header)) {				header = header->sip_hdr_next;				continue;			}			if (*header->sip_hdr_current == SIP_HCOLON) {				header_name = full_name;				break;			}		}		if (compact_name != NULL && (compact_len <= len) &&		    strncasecmp(header->sip_hdr_current, compact_name,		    compact_len) == 0) {			header->sip_hdr_current += compact_len;			if (sip_skip_white_space(header)) {				header = header->sip_hdr_next;				continue;			}			if (*header->sip_hdr_current == SIP_HCOLON) {				header_name = compact_name;				break;			}		}		header = header->sip_hdr_next;	}	if (header != NULL) {		header->sip_hdr_current = header->sip_hdr_start;		if (header_f_table == NULL) {			header_f_table =			    sip_get_header_functions(header, header_name);			if (header_f_table == NULL)				header_f_table = &sip_header_function_table[0];		}		header->sip_header_functions = header_f_table;	}	return (header);}/* Return the start line as a string. Caller frees string */char *_sip_startline_to_str(_sip_msg_t *sip_msg, int *error){	char		*slstr;	int		len;	if (error != NULL)		*error = 0;	if (sip_msg == NULL || sip_msg->sip_msg_start_line == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	(void) pthread_mutex_lock(&sip_msg->sip_msg_mutex);	len = sip_msg->sip_msg_start_line->sip_hdr_end -	    sip_msg->sip_msg_start_line->sip_hdr_start - 2;	if ((slstr = malloc(len + 1)) == NULL) {		(void) pthread_mutex_unlock(&sip_msg->sip_msg_mutex);		if (error != NULL)			*error = ENOMEM;		return (NULL);	}	(void) strncpy(slstr, sip_msg->sip_msg_start_line->sip_hdr_start, len);	(void) pthread_mutex_unlock(&sip_msg->sip_msg_mutex);	slstr[len] = '\0';	return (slstr);}/* Return the given header as a string. Caller frees string */char *sip_hdr_to_str(sip_header_t sip_header, int *error){	char		*hdrstr;	char		*tmpptr;	_sip_header_t	*_sip_header;	int		len;	if (error != NULL)		*error = 0;	if (sip_header == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_sip_header = (_sip_header_t *)sip_header;	if (_sip_header->sip_header_state == SIP_HEADER_DELETED) {		if (_sip_header->sip_hdr_sipmsg != NULL) {			(void) pthread_mutex_unlock(			    &_sip_header->sip_hdr_sipmsg->sip_msg_mutex);		}		if (error != NULL)			*error = EINVAL;		return (NULL);	}	if (_sip_header->sip_hdr_sipmsg != NULL) {		(void) pthread_mutex_lock(		    &_sip_header->sip_hdr_sipmsg->sip_msg_mutex);	}	len = _sip_header->sip_hdr_end - _sip_header->sip_hdr_start;	hdrstr = malloc(len);	if (hdrstr == NULL) {		if (_sip_header->sip_hdr_sipmsg != NULL) {			(void) pthread_mutex_unlock(			    &_sip_header->sip_hdr_sipmsg->sip_msg_mutex);		}		if (error != NULL)			*error = ENOMEM;		return (NULL);	}	if (_sip_header->sip_header_state == SIP_HEADER_DELETED_VAL) {		len = sip_copy_values(hdrstr, _sip_header);	} else {		(void) strncpy(hdrstr, _sip_header->sip_hdr_start, len);	}	if (_sip_header->sip_hdr_sipmsg != NULL) {		(void) pthread_mutex_unlock(		    &_sip_header->sip_hdr_sipmsg->sip_msg_mutex);	}	tmpptr = hdrstr + len;	while (*tmpptr-- != '\n') {		if (tmpptr == _sip_header->sip_hdr_start) {			free(hdrstr);			if (error != NULL)				*error = EINVAL;			return (NULL);		}	}	*tmpptr = '\0';	return (hdrstr);}/* Return the SIP message as a string. Caller frees the string */char *sip_msg_to_str(sip_msg_t sip_msg, int *error){	_sip_msg_t	*msg;	char		*msgstr;	if (sip_msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	msg = (_sip_msg_t *)sip_msg;	(void) pthread_mutex_lock(&msg->sip_msg_mutex);	msgstr = sip_msg_to_msgbuf(msg, error);	(void) pthread_mutex_unlock(&msg->sip_msg_mutex);	return (msgstr);}/* * Given a message generate a string that includes all the headers and the * content. */char *sip_msg_to_msgbuf(_sip_msg_t *msg, int *error){	_sip_header_t	*header;	int		len = 0;	char		*p;	char		*e;	sip_content_t	*sip_content;#ifdef	_DEBUG	int		tlen = 0;	int		clen = 0;#endif	if (error != NULL)		*error = 0;	if (msg == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}#ifdef	__solaris__	assert(mutex_held(&msg->sip_msg_mutex));#endif	p = (char *)malloc(msg->sip_msg_len + 1);	if (p == NULL) {		if (error != 0)			*error = ENOMEM;		return (NULL);	}	e = p;	/* Get the start line */	if (msg->sip_msg_start_line != NULL) {		len = msg->sip_msg_start_line->sip_hdr_end -		    msg->sip_msg_start_line->sip_hdr_start;		(void) strncpy(e, msg->sip_msg_start_line->sip_hdr_start, len);		e += len;#ifdef	_DEBUG		tlen += len;#endif	}	header = sip_search_for_header(msg, NULL, NULL);	while (header != NULL) {		if (header->sip_header_state != SIP_HEADER_DELETED) {			if (header->sip_header_state ==			    SIP_HEADER_DELETED_VAL) {				len = sip_copy_values(e, header);			} else {				len = header->sip_hdr_end -				    header->sip_hdr_start;				(void) strncpy(e, header->sip_hdr_start, len);			}#ifdef	_DEBUG			tlen += len;			assert(tlen <= msg->sip_msg_len);#endif		}		header = sip_search_for_header(msg, NULL, header);		e += len;	}	sip_content = msg->sip_msg_content;	while (sip_content != NULL) {		len = sip_content->sip_content_end -		    sip_content->sip_content_start;#ifdef	_DEBUG		clen += len;		assert(clen <= msg->sip_msg_content_len);		tlen += len;		assert(tlen <= msg->sip_msg_len);#endif		(void) strncpy(e, sip_content->sip_content_start, len);		e += len;		sip_content = sip_content->sip_content_next;	}	p[msg->sip_msg_len] = '\0';	return (p);}/* * given a param list find the named parameter. * Retruns a pointer to the value or NULL. */sip_param_t *sip_get_param_from_list(sip_param_t *param_list, char *param_name){	while (param_list != NULL) {		if (param_list->param_name.sip_str_len == strlen(param_name) &&		    strncasecmp(param_list->param_name.sip_str_ptr, param_name,		    strlen(param_name)) == 0) {			return (param_list);		}		param_list = param_list->param_next;	}	return (NULL);}

⌨️ 快捷键说明

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