📄 sip_msg.c
字号:
return (ret);}/* * Error-Info = "Error-Info" HCOLON error-uri *(COMMA error-uri) * error-uri = LAQUOT absoluteURI RAQUOT *( SEMI generic-param ) * */intsip_add_error_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 (EINVAL); r = sip_add_str_to_msg(sip_msg, SIP_ERROR_INFO, tmp, plist, SIP_SEMI); if (alloc) free(tmp); return (r);}/* * Expires = "Expires" HCOLON delta-seconds * delta-seconds = 1*DIGIT * */intsip_add_expires(sip_msg_t sip_msg, int secs){ int ret; if (sip_msg == NULL || (int)secs < 0) return (EINVAL); ret = sip_add_int_to_msg(sip_msg, SIP_EXPIRE, secs, NULL); return (ret);}/* * In-Reply-To = "In-Reply-To" HCOLON callid *(COMMA callid) * callid = word [ "@" word ] * */intsip_add_in_reply_to(sip_msg_t sip_msg, char *reply_id){ int r; if (reply_id == NULL) return (EINVAL); r = sip_add_str_to_msg(sip_msg, SIP_IN_REPLY_TO, reply_id, NULL, (char)NULL); return (r);}/* * RSeq = "RSeq" HCOLON response-num * */intsip_add_rseq(sip_msg_t sip_msg, int resp_num){ int ret; if (sip_msg == NULL || resp_num <= 0) return (EINVAL); ret = sip_add_int_to_msg(sip_msg, SIP_RSEQ, resp_num, NULL); return (ret);}/* * Min-Expires = "Min-Expires" HCOLON delta-seconds * */intsip_add_min_expires(sip_msg_t sip_msg, int secs){ int ret; if (sip_msg == NULL || (int)secs < 0) return (EINVAL); ret = sip_add_int_to_msg(sip_msg, SIP_MIN_EXPIRE, secs, NULL); return (ret);}/* * MIME-Version = "MIME-Version" HCOLON 1*DIGIT "." 1*DIGIT * */intsip_add_mime_version(sip_msg_t sip_msg, char *version){ int ret; if (version == NULL) return (EINVAL); ret = sip_add_str_to_msg(sip_msg, SIP_MIME_VERSION, version, NULL, (char)NULL); return (ret);}/* * Organization = "Organization" HCOLON [TEXT-UTF8-TRIM] * */intsip_add_org(sip_msg_t sip_msg, char *org){ int ret; if (org == NULL) { ret = sip_add_empty_hdr(sip_msg, SIP_ORGANIZATION); } else { ret = sip_add_str_to_msg(sip_msg, SIP_ORGANIZATION, org, NULL, (char)NULL); } return (ret);}/* * Priority = "Priority" HCOLON priority-value * priority-value = "emergency" / "urgent" / "normal" * / "non-urgent" / other-priority * other-priority = token * */intsip_add_priority(sip_msg_t sip_msg, char *prio){ int ret; if (prio == NULL) return (EINVAL); ret = sip_add_str_to_msg(sip_msg, SIP_PRIORITY, prio, NULL, (char)NULL); return (ret);}/* * Reply-To = "Reply-To" HCOLON rplyto-spec * rplyto-spec = ( name-addr / addr-spec ) * *( SEMI rplyto-param ) * rplyto-param = generic-param * */intsip_add_reply_to(sip_msg_t sip_msg, char *uname, char *addr, char *plist, boolean_t add_aquot){ return (sip_add_name_aspec(sip_msg, uname, addr, NULL, add_aquot, SIP_REPLYTO, plist));}/* * Privacy-hdr = "Privacy" HCOLON priv-value *(";" priv-value) * priv-value = "header" / "session" / "user" / "none" / "critical" * / token */intsip_add_privacy(sip_msg_t sip_msg, char *priv_val){ int ret; if (priv_val == NULL) return (EINVAL); ret = sip_add_str_to_msg(sip_msg, SIP_PRIVACY, priv_val, NULL, (char)NULL); return (ret);}/* * Require = "Require" HCOLON option-tag *(COMMA option-tag) * option-tag = token * */intsip_add_require(sip_msg_t sip_msg, char *req){ int ret; if (req == NULL) return (EINVAL); ret = sip_add_str_to_msg(sip_msg, SIP_REQUIRE, req, NULL, (char)NULL); return (ret);}/* * Retry-After = "Retry-After" HCOLON delta-seconds * [ comment ] *( SEMI retry-param ) * retry-param = ("duration" EQUAL delta-seconds) * / generic-param */intsip_add_retry_after(sip_msg_t sip_msg, int secs, char *cmt, char *plist){ int r; if (secs <= 0) return (EINVAL); if (cmt == NULL) { r = sip_add_int_to_msg(sip_msg, SIP_RETRY_AFTER, secs, plist); return (r); } r = sip_add_intstr_to_msg(sip_msg, SIP_RETRY_AFTER, secs, cmt, plist); return (r);}/* * Server = "Server" HCOLON server-val *(LWS server-val) * server-val = product / comment * product = token [SLASH product-version] * product-version = token * */intsip_add_server(sip_msg_t sip_msg, char *svr){ int ret; if (svr == NULL) return (EINVAL); ret = sip_add_str_to_msg(sip_msg, SIP_SERVER, svr, NULL, (char)NULL); return (ret);}/* * Subject = ( "Subject" / "s" ) HCOLON [TEXT-UTF8-TRIM] * */intsip_add_subject(sip_msg_t sip_msg, char *subject){ int ret; if (subject == NULL) { ret = sip_add_empty_hdr(sip_msg, SIP_SUBJECT); } else { ret = sip_add_str_to_msg(sip_msg, SIP_SUBJECT, subject, NULL, (char)NULL); } return (ret);}/* * Supported = ( "Supported" / "k" ) HCOLON * [option-tag *(COMMA option-tag)] * */intsip_add_supported(sip_msg_t sip_msg, char *support){ int ret; if (support == NULL) { ret = sip_add_empty_hdr(sip_msg, SIP_SUPPORT); } else { ret = sip_add_str_to_msg(sip_msg, SIP_SUPPORT, support, NULL, (char)NULL); } return (ret);}/* * Timestamp = "Timestamp" HCOLON 1*(DIGIT) * [ "." *(DIGIT) ] [ LWS delay ] * delay = *(DIGIT) [ "." *(DIGIT) ] * */intsip_add_tstamp(sip_msg_t sip_msg, char *time, char *delay){ int ret; if (delay == NULL) { ret = sip_add_str_to_msg(sip_msg, SIP_TIMESTAMP, time, NULL, (char)NULL); } else { ret = sip_add_2strs_to_msg(sip_msg, SIP_TIMESTAMP, time, B_FALSE, delay, NULL, ' '); } return (ret);}/* * Unsupported = "Unsupported" HCOLON option-tag *(COMMA option-tag) * */intsip_add_unsupported(sip_msg_t sip_msg, char *unsupport){ int ret; if (unsupport == NULL) return (EINVAL); ret = sip_add_str_to_msg(sip_msg, SIP_UNSUPPORT, unsupport, NULL, (char)NULL); return (ret);}/* * User-Agent = "User-Agent" HCOLON server-val *(LWS server-val) * */intsip_add_user_agent(sip_msg_t sip_msg, char *usr){ int r; if (usr == NULL) return (EINVAL); r = sip_add_str_to_msg(sip_msg, SIP_USER_AGENT, usr, NULL, (char)NULL); return (r);}/* * Warning = "Warning" HCOLON warning-value *(COMMA warning-value) * warning-value = warn-code SP warn-agent SP warn-text * warn-code = 3DIGIT * warn-agent = hostport / pseudonym * ; the name or pseudonym of the server adding * ; the Warning header, for use in debugging * warn-text = quoted-string * pseudonym = token * */intsip_add_warning(sip_msg_t sip_msg, int code, char *addr, char *msg){ _sip_header_t *new_header; int header_size; _sip_msg_t *_sip_msg; char *hdr_name = SIP_WARNING; if (sip_msg == NULL || addr == NULL || msg == NULL || addr[0] == '\0' || msg == '\0' || code < 100 || code > 999) { 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); } header_size = strlen(hdr_name) + SIP_SPACE + sizeof (char) + SIP_SPACE + sip_num_of_bytes(code) + SIP_SPACE + strlen(addr) + SIP_SPACE + sizeof (char) + strlen(msg) + sizeof (char) + 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); } (void) snprintf(new_header->sip_hdr_start, header_size + 1, "%s %c %d %s \"%s\"%s", hdr_name, SIP_HCOLON, code, addr, msg, 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);}/* * RAck = "RAck" HCOLON response-num LWS CSeq-num LWS Method * response-num = 1*DIGIT * CSeq-num = 1*DIGIT * */intsip_add_rack(sip_msg_t sip_msg, int resp_num, int cseq, sip_method_t method){ _sip_header_t *new_header; int header_size; _sip_msg_t *_sip_msg; char *hdr_name = SIP_RACK; if (sip_msg == NULL || resp_num <= 0 || cseq < 0 || method <= 0 || method >= MAX_SIP_METHODS) { 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); } header_size = strlen(hdr_name) + SIP_SPACE + sizeof (char) + SIP_SPACE + sip_num_of_bytes(resp_num) + SIP_SPACE + sip_num_of_bytes(cseq) + SIP_SPACE + strlen(sip_methods[method].name) + 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); } (void) snprintf(new_header->sip_hdr_start, header_size + 1, "%s %c %d %d %s%s", hdr_name, SIP_HCOLON, resp_num, cseq, sip_methods[method].name, 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);}/* * Allow-Events = ( "Allow-Events" / "u" ) HCOLON event-type * *(COMMA event-type) */intsip_add_allow_events(sip_msg_t sip_msg, char *t_event){ return (sip_add_str_to_msg(sip_msg, SIP_ALLOW_EVENTS, t_event, NULL, (char)NULL));}/* * Event = ( "Event" / "o" ) HCOLON event-type * *( SEMI event-param ) * event-type = event-package *( "." event-template ) * event-package = token-nodot * event-template = token-nodot * token-nodot = 1*( alphanum / "-" / "!" / "%" / "*" * / "_" / "+" / "`" / "'" / "~" ) * event-param = generic-param / ( "id" EQUAL token ) */intsip_add_event(sip_msg_t sip_msg, char *t_event, char *plist){ return (sip_add_str_to_msg(sip_msg, SIP_EVENT, t_event, plist, SIP_SEMI));}/* * Subscription-State = "Subscription-State" HCOLON substate-value * *( SEMI subexp-params ) * substate-value = "active" / "pending" / "terminated" * / extension-substate * extension-substate = token * subexp-params = ("reason" EQUAL event-reason-value) * / ("expires" EQUAL delta-seconds)* * / ("retry-after" EQUAL delta-seconds) * / generic-param * event-reason-value = "deactivated" * / "probation" * / "rejected" * / "timeout" * / "giveup" * / "noresource" * / event-reason-extension * event-reason-extension = token */intsip_add_substate(sip_msg_t sip_msg, char *sub, char *plist){ return (sip_add_str_to_msg(sip_msg, SIP_SUBSCRIPTION_STATE, sub, plist, SIP_SEMI));}/* * Authorization = "Authorization" HCOLON credentials * credentials = ("Digest" LWS digest-response) * / other-response * digest-response = dig-resp *(COMMA dig-resp) * dig-resp = username / realm / nonce / digest-uri * / dresponse / algorithm / cnonce * / opaque / message-qop * / nonce-count / auth-param * username = "username" EQUAL username-value * username-value = quoted-string * digest-uri = "uri" EQUAL LDQUOT digest-uri-value RDQUOT * digest-uri-value = rquest-uri ; Equal to request-uri as specified * by HTTP/1.1 * message-qop = "qop" EQUAL qop-value * cnonce = "cnonce" EQUAL cnonce-value * cnonce-value = nonce-value * nonce-count = "nc" EQUAL nc-value * nc-value = 8LHEX * dresponse = "response" EQUAL request-digest * request-digest = LDQUOT 32LHEX RDQUOT * auth-param = auth-param-name EQUAL * ( token / quoted-string ) * auth-param-name = token * other-response = auth-scheme LWS auth-param * *(COMMA auth-param) * auth-scheme = token *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -