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

📄 sip_msg.c

📁 VoIP use SIP protocol interface
💻 C
📖 第 1 页 / 共 5 页
字号:
{	_sip_header_t	*new_header;	int 		header_size;	_sip_msg_t 	*_sip_msg;	int		csize = sizeof (char);	if (sip_msg == NULL || str1 == NULL || str2 == NULL ||	    (str1 != NULL && str1[0] == '\0') ||	    (str2 != NULL && str2[0] == '\0')) {		return (EINVAL);	}	_sip_msg = (_sip_msg_t *)sip_msg;	(void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);	if (!sip_ok_to_modify_message(_sip_msg)) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (ENOTSUP);	}	if (plist == NULL) {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    strlen(str1) + csize + strlen(str2) + strlen(SIP_CRLF);	} else {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    strlen(str1) + csize + strlen(str2) + csize + strlen(plist)			+ strlen(SIP_CRLF);	}	if (qstr1)		header_size += 2 * sizeof (char);	new_header = sip_new_header(header_size);	if (new_header == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (ENOMEM);	}	if (plist == NULL) {		if (qstr1) {			(void) snprintf(new_header->sip_hdr_start,			    header_size + 1, "%s %c \"%s\"%c%s%s",			    hdr_name, SIP_HCOLON, str1, sep, str2, SIP_CRLF);		} else {			(void) snprintf(new_header->sip_hdr_start,			    header_size + 1, "%s %c %s%c%s%s",			    hdr_name, SIP_HCOLON, str1, sep, str2, SIP_CRLF);		}	} else {		if (qstr1) {			(void) snprintf(new_header->sip_hdr_start,			    header_size + 1,			    "%s %c \"%s\"%c%s%c%s%s", hdr_name, SIP_HCOLON,			    str1, sep, str2, SIP_SEMI, plist, SIP_CRLF);		} else {			(void) snprintf(new_header->sip_hdr_start,			    header_size + 1, "%s %c %s%c%s%c%s%s",			    hdr_name, SIP_HCOLON, str1, sep, str2, SIP_SEMI,			    plist, SIP_CRLF);		}	}	_sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);	(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);	return (0);}/* Generic function to add a header with a string to message */static intsip_add_str_to_msg(sip_msg_t sip_msg, char *hdr_name, char *str, char *plist,    char param_sep){	_sip_header_t	*new_header;	int 		header_size;	_sip_msg_t 	*_sip_msg;	int		csize = sizeof (char);	if (sip_msg == NULL || str == NULL || (str != NULL && str[0] == '\0'))		return (EINVAL);	_sip_msg = (_sip_msg_t *)sip_msg;	(void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);	if (!sip_ok_to_modify_message(_sip_msg)) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (ENOTSUP);	}	if (plist == NULL) {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    + strlen(str) + strlen(SIP_CRLF);	} else {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    + strlen(str) + csize + strlen(plist) + strlen(SIP_CRLF);	}	new_header = sip_new_header(header_size);	if (new_header == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (ENOMEM);	}	if (plist == NULL) {		(void) snprintf(new_header->sip_hdr_start, header_size + 1,		    "%s %c %s%s", hdr_name, SIP_HCOLON, str, SIP_CRLF);	} else {		(void) snprintf(new_header->sip_hdr_start, header_size + 1,		    "%s %c %s%c%s%s", hdr_name, SIP_HCOLON, str, param_sep,		    plist, SIP_CRLF);	}	_sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);	(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);	return (0);}/* Return the int as a string */static char *sip_int_to_str(int i){	int	count;	int	t;	int	x;	char	*str;	if (i < 0)		return (NULL);	/* the following two loops convert int i to str */	count = 1;	t = i;	while ((t = t / 10) != 0) {		count++;	}	str = calloc(1, sizeof (char) * count + 1);	if (str == NULL)		return (NULL);	t = i;	for (x = 0; x < count; x++) {		int a;		a = t % 10;		str[count - 1 - x] = a + '0';		t = t / 10;	}	str[count] = '\0';	return (str);}/* Add an header with an int to sip_msg */static intsip_add_int_to_msg(sip_msg_t sip_msg, char *hdr_name, int i, char *plist){	_sip_header_t	*new_header;	int 		header_size;	_sip_msg_t 	*_sip_msg;	char		*digit_str;	int		csize = sizeof (char);	if (sip_msg == NULL || (hdr_name == NULL))		return (EINVAL);	_sip_msg = (_sip_msg_t *)sip_msg;	(void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);	if (!sip_ok_to_modify_message(_sip_msg)) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (ENOTSUP);	}	/* the following two loops convert int i to str */	digit_str = sip_int_to_str(i);	if (digit_str == NULL)		return (EINVAL);	if (plist == NULL) {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    strlen(digit_str) + strlen(SIP_CRLF);	} else {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    strlen(digit_str) + csize + strlen(plist) +		    strlen(SIP_CRLF);	}	new_header = sip_new_header(header_size);	if (new_header == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		free(digit_str);		return (ENOMEM);	}	if (plist == NULL) {		(void) snprintf(new_header->sip_hdr_start, header_size + 1,		    "%s %c %s%s", hdr_name, SIP_HCOLON, digit_str, SIP_CRLF);	} else {		(void) snprintf(new_header->sip_hdr_start, header_size + 1,		    "%s %c %s%c%s%s", hdr_name, SIP_HCOLON, digit_str,		    SIP_SEMI, plist, SIP_CRLF);	}	free(digit_str);	_sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);	(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);	return (0);}/* Add a header with an int and string to sip_msg */static intsip_add_intstr_to_msg(sip_msg_t sip_msg, char *hdr_name, int i, char *s,    char *plist){	_sip_header_t	*new_header;	int 		header_size;	_sip_msg_t 	*_sip_msg;	char		*digit_str;	int		csize = sizeof (char);	if (sip_msg == NULL || (hdr_name == NULL))		return (EINVAL);	_sip_msg = (_sip_msg_t *)sip_msg;	(void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex);	if (!sip_ok_to_modify_message(_sip_msg)) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (ENOTSUP);	}	/* the following two loops convert int i to str */	digit_str = sip_int_to_str(i);	if (digit_str == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		return (EINVAL);	}	if (plist == NULL) {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    strlen(digit_str) + csize + strlen(s) + strlen(SIP_CRLF);	} else {		header_size = strlen(hdr_name) + SIP_SPACE + csize + SIP_SPACE +		    strlen(digit_str) + csize + strlen(s) + csize +			strlen(plist) + strlen(SIP_CRLF);	}	new_header = sip_new_header(header_size);	if (new_header == NULL) {		(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);		free(digit_str);		return (ENOMEM);	}	if (plist == NULL) {		(void) snprintf(new_header->sip_hdr_start, header_size + 1,		    "%s %c %s %s%s", hdr_name, SIP_HCOLON, digit_str, s,		    SIP_CRLF);	} else {		(void) snprintf(new_header->sip_hdr_start, header_size + 1,		    "%s %c %s %s%c%s%s", hdr_name, SIP_HCOLON, digit_str,		    s, SIP_SEMI, plist, SIP_CRLF);	}	free(digit_str);	_sip_add_header(_sip_msg, new_header, B_TRUE, B_FALSE, NULL);	(void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex);	return (0);}/* * Accept = "Accept" ":" (media-range [ accept-params ]) * media-range = ( "X/X" | (type "/" "*") | (type "/" subtype))*(";" parameter) * accept-params = ";" "q" "=" qvalue *(accept-extension) * accept-extension = ";" token [ "=" (token | quoted-str) * * function take two char ptrs - type and subtype - if any of them is NULL * the corresponding value will be set to "*" in header */intsip_add_accept(sip_msg_t sip_msg, char *type, char *subtype, char *m_par,    char *a_par){	int		ret;	char		*plist;	int		size;	boolean_t	alloc = B_FALSE;	if (type == NULL && subtype == NULL) {		ret = sip_add_empty_hdr(sip_msg, SIP_ACCEPT);		return (ret);	}	if ((m_par != NULL) && (a_par != NULL)) {		size = strlen(m_par) + strlen(a_par) + 2 * sizeof (char);		plist = calloc(1, size * sizeof (char));		(void) strncpy(plist, m_par, strlen(m_par));		(void) strncat(plist, ";", 1);		(void) strncat(plist, a_par, strlen(a_par));		alloc = B_TRUE;	} else if (m_par != NULL) {		plist = m_par;	} else		plist = a_par;	if ((type != NULL) && (subtype != NULL)) {		ret = sip_add_2strs_to_msg(sip_msg, SIP_ACCEPT, type, B_FALSE,		    subtype, plist, SIP_SLASH);	} else if (type != NULL) {		ret = sip_add_2strs_to_msg(sip_msg, SIP_ACCEPT, type, B_FALSE,		    "*", plist, SIP_SLASH);	} else {		ret = EINVAL;	}	if (alloc == B_TRUE)		free(plist);	return (ret);}/* * Accept-Encoding = "Accept-Encoding" ":" 1#(codings [ ";" "q" "=" qval]) * codings = ( content-coding | "*" ) * content-coding   =  token * * function take one char ptr, if NULL value will be set to "*" */intsip_add_accept_enc(sip_msg_t sip_msg, char *code, char *plist){	int ret;	if (code == NULL) {		ret = sip_add_str_to_msg(sip_msg, SIP_ACCEPT_ENCODE, "*", plist,		    SIP_SEMI);	} else {		ret = sip_add_str_to_msg(sip_msg, SIP_ACCEPT_ENCODE, code,		    plist, SIP_SEMI);	}	return (ret);}/* * Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q""=" val]) * language-range = ( ( 1*8ALPHA *("-" 1*8ALPHA))|"*") * */intsip_add_accept_lang(sip_msg_t sip_msg, char *lang, char *plist){	int	ret;	if (lang == NULL) {		ret = sip_add_empty_hdr(sip_msg, SIP_ACCEPT_LANG);		return (ret);	}	ret = sip_add_str_to_msg(sip_msg, SIP_ACCEPT_LANG, lang, plist,	    SIP_SEMI);	return (ret);}/* * Alert-Info = "Alert-Info" ":" "<" URI ">" * */intsip_add_alert_info(sip_msg_t sip_msg, char *alert, char *plist){	int		ret;	char		*tmp;	boolean_t	alloc;	if (alert == NULL)		return (EINVAL);	tmp = sip_add_aquot_to_str(alert, &alloc);	if (tmp == NULL)		return (ENOMEM);	ret = sip_add_str_to_msg(sip_msg, SIP_ALERT_INFO, tmp, plist, SIP_SEMI);	if (alloc)		free(tmp);	return (ret);}/* * Allow = "Allow" ":" method-name1[, method-name2..] * method-name = "INVITE" | "ACK" | "OPTIONS" | "CANCEL" | "BYE" * */intsip_add_allow(sip_msg_t sip_msg, sip_method_t method){	int	ret;	if (method == 0 || method >= MAX_SIP_METHODS)		return (EINVAL);	ret = sip_add_str_to_msg(sip_msg, SIP_ALLOW, sip_methods[method].name,	    NULL, (char)NULL);	return (ret);}/* * Call-Info   =  "Call-Info" HCOLON info *(COMMA info) * info        =  LAQUOT absoluteURI RAQUOT *( SEMI info-param) * info-param  =  ( "purpose" EQUAL ( "icon" / "info" *		/ "card" / token ) ) / generic-param * */intsip_add_call_info(sip_msg_t sip_msg, char *uri, char *plist){	char		*tmp;	boolean_t	alloc;	int		r;	if (uri == NULL)		return (EINVAL);	tmp = sip_add_aquot_to_str(uri, &alloc);	if (tmp == NULL)		return (ENOMEM);	r = sip_add_str_to_msg(sip_msg, SIP_CALL_INFO, tmp, plist, SIP_SEMI);	if (alloc)		free(tmp);	return (r);}/* * Content-Disposition   =  "Content-Disposition" HCOLON *				disp-type *( SEMI disp-param ) * disp-type             =  "render" / "session" / "icon" / "alert" *				/ disp-extension-token * disp-param            =  handling-param / generic-param * handling-param        =  "handling" EQUAL *				( "optional" / "required" *				/ other-handling ) * other-handling        =  token * disp-extension-token  =  token * */intsip_add_content_disp(sip_msg_t sip_msg, char *dis_type, char *plist){	int	ret;	if (dis_type == NULL)		return (EINVAL);	ret = sip_add_str_to_msg(sip_msg, SIP_CONTENT_DIS, dis_type, plist,	    SIP_SEMI);	return (ret);}/* * Content-Encoding  =  ( "Content-Encoding" / "e" ) HCOLON *			content-coding *(COMMA content-coding) * content-coding   =  token * */intsip_add_content_enc(sip_msg_t sip_msg, char *code){	int	ret;	if (code == NULL)		return (EINVAL);	ret = sip_add_str_to_msg(sip_msg, SIP_CONTENT_ENCODE, code, NULL,	    (char)NULL);	return (ret);}/* * Content-Language  =  "Content-Language" HCOLON *			language-tag *(COMMA language-tag) * language-tag      =  primary-tag *( "-" subtag ) * primary-tag       =  1*8ALPHA * subtag            =  1*8ALPHA * */intsip_add_content_lang(sip_msg_t sip_msg, char *lang){	int	ret;	if (lang == NULL)		return (EINVAL);	ret = sip_add_str_to_msg(sip_msg, SIP_CONTENT_LANG, lang, NULL,	    (char)NULL);	return (ret);}/* * Date          =  "Date" HCOLON SIP-date * SIP-date      =  rfc1123-date * rfc1123-date  =  wkday "," SP date1 SP time SP "GMT" * date1         =  2DIGIT SP month SP 4DIGIT * 			; day month year (e.g., 02 Jun 1982) * time          =  2DIGIT ":" 2DIGIT ":" 2DIGIT *			; 00:00:00 - 23:59:59 * wkday         =  "Mon" / "Tue" / "Wed" *			/ "Thu" / "Fri" / "Sat" / "Sun" * month         =  "Jan" / "Feb" / "Mar" / "Apr" *			/ "May" / "Jun" / "Jul" / "Aug" *			/ "Sep" / "Oct" / "Nov" / "Dec" * */intsip_add_date(sip_msg_t sip_msg, char *date){	int	ret;	if (date == NULL)		return (EINVAL);	ret = sip_add_str_to_msg(sip_msg, SIP_DATE, date, NULL, (char)NULL);

⌨️ 快捷键说明

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