📄 sip_msg.c
字号:
{ _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 + -