📄 sip_ui.c
字号:
/* * If the value is BAD, update error to reflect it. */ if (error != NULL && value->value_state == SIP_VALUE_BAD) *error = EPROTO; return (&cftrvalue->cftr_uri);}/* Get display name from the value */const sip_str_t *sip_get_cftrname_from_val(sip_header_value_t value, int *error){ sip_hdr_value_t *cftrvalue; if (error != NULL) *error = 0; if (value == NULL || value->value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (NULL); } cftrvalue = (sip_hdr_value_t *)value; /* * If the value is BAD, update error to reflect it. */ if (error != NULL && value->value_state == SIP_VALUE_BAD) *error = EPROTO; return (cftrvalue->cftr_name);}/* * Contact header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_contact_uri_str(sip_header_value_t value, int *error){ return (sip_get_cftruri_from_val(value, error));}/* * Contact header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_contact_display_name(sip_header_value_t value, int *error){ return (sip_get_cftrname_from_val(value, error));}/* * Route header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_route_uri_str(sip_header_value_t value, int *error){ return (sip_get_cftruri_from_val(value, error));}/* * Route header can have more than one value * so we require a value to be passed in to get a value. */const sip_str_t *sip_get_route_display_name(sip_header_value_t value, int *error){ return (sip_get_cftrname_from_val(value, error));}/* Get URI from the SIP message */const sip_str_t *sip_get_cftruri_from_msg(sip_msg_t sip_msg, int *error, char *hdrname){ const sip_hdr_value_t *value; const struct sip_header *header; if (error != NULL) *error = 0; if (sip_msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } header = sip_get_header(sip_msg, hdrname, NULL, error); if (header == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } value = (sip_hdr_value_t *)sip_get_header_value(header, error); if (value == NULL) { if (error != NULL) *error = EPROTO; return (NULL); } /* * If the value is BAD, update error to reflect it. */ if (error != NULL && value->sip_value_state == SIP_VALUE_BAD) *error = EPROTO; return (&value->cftr_uri);}/* Get display name from the SIP message */const sip_str_t *sip_get_cftrname_from_msg(sip_msg_t sip_msg, int *error, char *hdrname){ const sip_hdr_value_t *value; const struct sip_header *header; if (error != NULL) *error = 0; if (sip_msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } header = sip_get_header(sip_msg, hdrname, NULL, error); if (header == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } value = (sip_hdr_value_t *)sip_get_header_value(header, error); if (value == NULL) { if (error != NULL) *error = EPROTO; return (NULL); } /* * If the value is BAD, update error to reflect it. */ if (error != NULL && value->sip_value_state == SIP_VALUE_BAD) *error = EPROTO; return (value->cftr_name);}/* Get FROM URI */const sip_str_t *sip_get_from_uri_str(sip_msg_t sip_msg, int *error){ return (sip_get_cftruri_from_msg(sip_msg, error, SIP_FROM));}/* Get FROM display name */const sip_str_t *sip_get_from_display_name(sip_msg_t sip_msg, int *error){ return (sip_get_cftrname_from_msg(sip_msg, error, SIP_FROM));}/* Return the FROM tag */const sip_str_t *sip_get_from_tag(sip_msg_t sip_msg, int *error){ const sip_hdr_value_t *value; const struct sip_header *header; if (error != NULL) *error = 0; if (sip_msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } header = sip_get_header(sip_msg, SIP_FROM, NULL, error); if (header == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } value = (sip_hdr_value_t *)sip_get_header_value(header, error); if (value == NULL) { if (error != NULL) *error = EPROTO; return (NULL); } /* * If the value is BAD, update error to reflect it. */ if (error != NULL && value->sip_value_state == SIP_VALUE_BAD) *error = EPROTO; return (sip_get_param_value((sip_header_value_t)value, "tag", error));}/* Get TO URI */const sip_str_t *sip_get_to_uri_str(sip_msg_t sip_msg, int *error){ return (sip_get_cftruri_from_msg(sip_msg, error, SIP_TO));}/* Get TO display name */const sip_str_t *sip_get_to_display_name(sip_msg_t sip_msg, int *error){ return (sip_get_cftrname_from_msg(sip_msg, error, SIP_TO));}/* Get TO tag */const sip_str_t *sip_get_to_tag(sip_msg_t sip_msg, int *error){ const sip_hdr_value_t *value; const struct sip_header *header; if (error != NULL) *error = 0; if (sip_msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } header = sip_get_header(sip_msg, SIP_TO, NULL, error); if (header == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } value = (sip_hdr_value_t *)sip_get_header_value(header, error); if (value == NULL) { if (error != NULL) *error = EPROTO; return (NULL); } /* * If the value is BAD, update error to reflect it. */ if (error != NULL && value->sip_value_state == SIP_VALUE_BAD) *error = EPROTO; return (sip_get_param_value((sip_header_value_t)value, "tag", error));}/* Generic function to get int or string value from a header */static void *sip_get_val_from_hdr(sip_hdr_value_t *val, int val_type, boolean_t stype, int *error){ if (error != NULL) *error = 0; if (val == NULL || val->sip_value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (NULL); } if (val->sip_value_state == SIP_VALUE_BAD) *error = EPROTO; switch (val_type) { case (SIP_INT_VAL): return (&(val->int_val)); case (SIP_STR_VAL): return (&(val->str_val)); case (SIP_STRS_VAL): if (stype == B_TRUE) return (&(val->strs_val.s1)); return (&(val->strs_val.s2)); case (SIP_INTSTR_VAL): if (stype == B_TRUE) return (&(val->intstr_str)); return (&(val->intstr_int)); case (SIP_AUTH_VAL): return (&(val->auth_val)); } if (error != NULL && *error == 0) *error = EINVAL; return (NULL);}/* * Generic function to get value from a header given the value type and * the string info (for multi-string values). */static void *sip_get_val_from_msg(sip_msg_t msg, char *hdr_name, int val_type, boolean_t stype, boolean_t empty_val, int *error){ const _sip_header_t *header; sip_hdr_value_t *value; if (error != NULL) *error = 0; if (msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } header = sip_get_header(msg, hdr_name, NULL, error); if (header == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } value = (sip_hdr_value_t *)sip_get_header_value(header, error); if (value == NULL) { if (error != NULL && empty_val == B_FALSE) *error = EPROTO; return (NULL); } return (sip_get_val_from_hdr(value, val_type, stype, error));}/* Return the Call-Id */const sip_str_t *sip_get_callid(sip_msg_t sip_msg, int *error){ sip_str_t *r; r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CALL_ID, SIP_STR_VAL, B_FALSE, B_TRUE, error); return (r);}#define SIP_CSEQ_NUM 1#define SIP_CSEQ_METHOD 2/* Get number/method from the CSEQ header */void *sip_get_cseq_val(sip_msg_t msg, int type, int *error){ const _sip_header_t *header; sip_hdr_value_t *val; if (error != NULL) *error = 0; if (msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } header = sip_get_header(msg, SIP_CSEQ, NULL, error); if (header == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } val = (sip_hdr_value_t *)sip_get_header_value(header, error); if (val == NULL) { if (error != NULL) *error = EPROTO; return (NULL); } if (error != NULL && val->sip_value.value_state == SIP_VALUE_BAD) *error = EPROTO; switch (type) { case SIP_CSEQ_NUM: return (&(val->cseq_num)); case SIP_CSEQ_METHOD: return (&(val->cseq_method)); } if (error != NULL) *error = EINVAL; return (NULL);}/* Get CSEQ number */intsip_get_callseq_num(sip_msg_t sip_msg, int *error){ int *r; r = (int *)sip_get_cseq_val(sip_msg, SIP_CSEQ_NUM, error); return (r == NULL ? -1 : *r);}/* Get CSEQ method */sip_method_tsip_get_callseq_method(sip_msg_t sip_msg, int *error){ sip_method_t *r; r = (sip_method_t *)sip_get_cseq_val(sip_msg, SIP_CSEQ_METHOD, error); return (r == NULL ? -1 : *r);}/* * Via header can have more than one value * so we require a value to be passed in. */const sip_str_t *sip_get_via_sent_by_host(sip_header_value_t value, int *error){ sip_hdr_value_t *via_value; if (error != NULL) *error = 0; if (value == NULL || value->value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (NULL); } via_value = (sip_hdr_value_t *)value; if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL) *error = EPROTO; return (&via_value->via_sent_by_host);}/* * Via header can have more than one value * so we require a value to be passed in. */intsip_get_via_sent_by_port(sip_header_value_t value, int *error){ sip_hdr_value_t *via_value; if (error != NULL) *error = 0; if (value == NULL || value->value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (-1); } via_value = (sip_hdr_value_t *)value; if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL) *error = EPROTO; return (via_value->via_sent_by_port);}/* Return the protocol version from the VIA value */const sip_str_t *sip_get_via_sent_protocol_version(sip_header_value_t value, int *error){ sip_hdr_value_t *via_value; if (value == NULL || value->value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (NULL); } via_value = (sip_hdr_value_t *)value; if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL) *error = EPROTO; return (&via_value->via_protocol_vers);}/* Return the protocol name */const sip_str_t *sip_get_via_sent_protocol_name(sip_header_value_t value, int *error){ sip_hdr_value_t *via_value; if (error != NULL) *error = 0; if (value == NULL || value->value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (NULL); } via_value = (sip_hdr_value_t *)value; if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL) *error = EPROTO; return (&via_value->via_protocol_name);}/* Return the transport from the VIA value */const sip_str_t *sip_get_via_sent_transport(sip_header_value_t value, int *error){ sip_hdr_value_t *via_value; if (error != NULL) *error = 0; if (value == NULL || value->value_state == SIP_VALUE_DELETED) { if (error != NULL) *error = EINVAL; return (NULL); } via_value = (sip_hdr_value_t *)value; if (via_value->sip_value_state == SIP_VALUE_BAD && error != NULL) *error = EPROTO; return (&via_value->via_protocol_transport);}/* Return Max-Forward value */intsip_get_maxforward(sip_msg_t sip_msg, int *error){ int *r; r = (int *)sip_get_val_from_msg(sip_msg, SIP_MAX_FORWARDS, SIP_INT_VAL, B_FALSE, B_FALSE, error); if (r == NULL) return (-1); return (*r);}/* Get the content type */const sip_str_t *sip_get_content_type(sip_msg_t sip_msg, int *error){ sip_str_t *r; r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE, SIP_STRS_VAL, B_TRUE, B_FALSE, error); return (r);}/* Get the content sub-type */const sip_str_t *sip_get_content_sub_type(sip_msg_t sip_msg, int *error){ sip_str_t *r; r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_TYPE, SIP_STRS_VAL, B_FALSE, B_FALSE, error); return (r);}/* Get content as a string. Caller frees the string */char *sip_get_content(sip_msg_t sip_msg, int *error){ _sip_msg_t *_sip_msg; sip_content_t *sip_content; char *content; int len; char *p; if (error != NULL) *error = 0; if (sip_msg == NULL) { if (error != NULL) *error = EINVAL; return (NULL); } _sip_msg = (_sip_msg_t *)sip_msg; (void) pthread_mutex_lock(&_sip_msg->sip_msg_mutex); if (_sip_msg->sip_msg_content == NULL) { (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex); if (error != NULL) *error = EINVAL; return (NULL); } content = malloc(_sip_msg->sip_msg_content_len + 1); if (content == NULL) { (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex); if (error != NULL) *error = ENOMEM; return (NULL); } p = content; sip_content = _sip_msg->sip_msg_content; while (sip_content != NULL) { len = sip_content->sip_content_end - sip_content->sip_content_start; (void) strncpy(p, sip_content->sip_content_start, len); p += len; sip_content = sip_content->sip_content_next; } content[_sip_msg->sip_msg_content_len] = '\0'; (void) pthread_mutex_unlock(&_sip_msg->sip_msg_mutex); return (content);}/* Return the content-length value */intsip_get_content_length(sip_msg_t sip_msg, int *error){ int *r; r = (int *)sip_get_val_from_msg(sip_msg, SIP_CONTENT_LENGTH, SIP_INT_VAL, B_FALSE, B_FALSE, error); if (r == NULL) return (-1); return (*r);}/* get allow-events */const sip_str_t *sip_get_allow_events(sip_header_value_t value, int *error){ sip_str_t *r; sip_hdr_value_t *val = (sip_hdr_value_t *)value; r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STR_VAL, B_TRUE, error); return (r);}/* get event */const sip_str_t *sip_get_event(sip_msg_t sip_msg, int *error){ sip_str_t *r; r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_EVENT, SIP_STR_VAL, B_FALSE, B_FALSE, error); return (r);}/* get subscription state */const sip_str_t *sip_get_substate(sip_msg_t sip_msg, int *error){ sip_str_t *r; r = (sip_str_t *)sip_get_val_from_msg(sip_msg, SIP_SUBSCRIPTION_STATE, SIP_STR_VAL, B_FALSE, B_FALSE, error); return (r);}/* get accept type */const sip_str_t *sip_get_accept_type(sip_header_value_t value, int *error){ sip_str_t *r; sip_hdr_value_t *val = (sip_hdr_value_t *)value; r = (sip_str_t *)sip_get_val_from_hdr(val, SIP_STRS_VAL, B_TRUE, error); return (r);}/* get accept subtype */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -