📄 sip_headers.c
字号:
#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 + -