📄 sip_parse_generic.c
字号:
hdr->sip_hdr_current = t; } /* * if SEMI exists in the value, set params list * two situations, there is or not SLASH before SEMI */ ret = sip_parse_params(hdr, &value->sip_param_list); if (ret == EPROTO) { value->sip_value_state = SIP_VALUE_BAD; } else if (ret != 0) { sip_free_phdr(parsed_header); return (ret); } goto get_next_val; } else { value->str_val_ptr = value->sip_value_start; value->str_val_len = hdr->sip_hdr_current - value->sip_value_start; goto end; }get_next_val: if (sip_find_token(hdr, SIP_COMMA) != 0) break; value->sip_value_end = hdr->sip_hdr_current - 1; last_value = value; (void) sip_skip_white_space(hdr); }end: *phdr = parsed_header; return (0);}/* * header_name: int * headers: Expires, Min-Expires *//* ARGSUSED */intsip_parse_hdr_parser2(_sip_header_t *hdr, sip_parsed_header_t **phdr, int val_type){ sip_parsed_header_t *parsed_header; int ret = 0; sip_hdr_value_t *value = NULL; if (hdr == NULL || phdr == NULL) return (EINVAL); /* check if already parsed */ if (hdr->sip_hdr_parsed != NULL) { *phdr = hdr->sip_hdr_parsed; return (0); } *phdr = NULL; assert(hdr->sip_hdr_start == hdr->sip_hdr_current); if (sip_parse_goto_values(hdr) != 0) return (EPROTO); parsed_header = calloc(1, sizeof (sip_parsed_header_t)); if (parsed_header == NULL) return (ENOMEM); parsed_header->sip_header = hdr; value = calloc(1, sizeof (sip_hdr_value_t)); if (value == NULL) { sip_free_phdr(parsed_header); return (ENOMEM); } parsed_header->value = (sip_value_t *)value; value->sip_value_start = hdr->sip_hdr_current; value->sip_value_header = parsed_header; ret = sip_atoi(hdr, &value->int_val); if (ret != 0) { value->int_val = 0; value->sip_value_state = SIP_VALUE_BAD; } value->sip_value_end = hdr->sip_hdr_current - 1; *phdr = parsed_header; return (0);}/* * parser3 parses hdr format * header_name: <val1>[, <val2>] * Alert-Info, Call-Info, Error-Info, reply-to */intsip_parse_hdr_parser3(_sip_header_t *hdr, sip_parsed_header_t **phdr, int type, boolean_t parse_uri){ sip_parsed_header_t *parsed_header; sip_hdr_value_t *value = NULL; sip_hdr_value_t *last_value = NULL; if (hdr == NULL || phdr == NULL) return (EINVAL); /* * check if previously parsed */ if (hdr->sip_hdr_parsed != NULL) { *phdr = hdr->sip_hdr_parsed; return (0); } *phdr = NULL; assert(hdr->sip_hdr_start == hdr->sip_hdr_current); if (sip_parse_goto_values(hdr) != 0) return (EPROTO); parsed_header = calloc(1, sizeof (sip_parsed_header_t)); if (parsed_header == NULL) return (ENOMEM); parsed_header->sip_header = hdr; while (hdr->sip_hdr_current < hdr->sip_hdr_end) { int r; value = calloc(1, sizeof (sip_hdr_value_t)); if (value == NULL) { sip_free_phdr(parsed_header); return (ENOMEM); } if (last_value != NULL) last_value->sip_next_value = value; else parsed_header->value = (sip_value_t *)value; value->sip_value_start = hdr->sip_hdr_current; value->sip_value_header = parsed_header; if (type == SIP_STRS_VAL) { if (sip_find_token(hdr, SIP_LAQUOT) == 0) { char *cur; /* record the position after LAQUOT */ cur = hdr->sip_hdr_current; /* get display name and store in str1 */ hdr->sip_hdr_current = value->sip_value_start; if (*(hdr->sip_hdr_current) != SIP_LAQUOT) { /* record start pos of display name */ char *tmp = hdr->sip_hdr_current; if (*hdr->sip_hdr_current == SIP_QUOTE) { hdr->sip_hdr_current++; tmp++; if (sip_find_token(hdr, SIP_QUOTE) != 0) { value->sip_value_state = SIP_VALUE_BAD; goto get_next_val; } hdr->sip_hdr_current -= 2; } else { hdr->sip_hdr_current = cur - 2; (void) sip_reverse_skip_white_space (hdr); } value->strs1_val_ptr = tmp; value->strs1_val_len = hdr->sip_hdr_current - tmp + 1; } else { value->strs1_val_ptr = NULL; value->strs1_val_len = 0; } /* set current to the char after LAQUOT */ hdr->sip_hdr_current = cur; value->strs2_val_ptr = hdr->sip_hdr_current; if (sip_find_token(hdr, SIP_RAQUOT)) { /* no RAQUOT */ value->strs1_val_ptr = NULL; value->strs1_val_len = 0; value->strs2_val_ptr = NULL; value->strs2_val_len = 0; value->sip_value_state = SIP_VALUE_BAD; goto get_next_val; } value->strs2_val_len = hdr->sip_hdr_current - value->strs2_val_ptr - 1; } else { /* * have to be surrounded by AQUOT * invalid value */ value->strs1_val_ptr = NULL; value->strs1_val_len = 0; value->strs2_val_ptr = NULL; value->strs2_val_len = 0; value->sip_value_state = SIP_VALUE_BAD; goto get_next_val; } if (parse_uri) { sip_parse_uri_str(&value->strs_s2, parsed_header, value); } } if (type == SIP_STR_VAL) { /* alert-info, error-info, call-info */ if (sip_find_token(hdr, SIP_LAQUOT) == 0) { value->str_val_ptr = hdr->sip_hdr_current; if (sip_find_token(hdr, SIP_RAQUOT) == 0) { value->str_val_len = hdr->sip_hdr_current - value->str_val_ptr - 1; } else { value->str_val_ptr = NULL; value->str_val_len = 0; value->sip_value_state = SIP_VALUE_BAD; goto get_next_val; } hdr->sip_hdr_current--; } else { value->str_val_ptr = NULL; value->str_val_len = 0; value->sip_value_state = SIP_VALUE_BAD; goto get_next_val; } if (parse_uri) { sip_parse_uri_str(&value->str_val, parsed_header, value); } } r = sip_find_separator(hdr, SIP_COMMA, SIP_SEMI, (char)NULL); if (r != 0) goto end; if (*hdr->sip_hdr_current == SIP_SEMI) { (void) sip_parse_params(hdr, &(value->sip_param_list)); goto get_next_val; } if (*hdr->sip_hdr_current == SIP_COMMA) { hdr->sip_hdr_current--; goto get_next_val; }get_next_val: if (sip_find_token(hdr, SIP_COMMA) != 0) break; value->sip_value_end = hdr->sip_hdr_current - 1; last_value = value; (void) sip_skip_white_space(hdr); }end: *phdr = parsed_header; return (0);}/* * parser4 parses hdr format, the whole field is one single str * header: Subject, MIME-Version, Organization, Server, User-Agent */intsip_parse_hdr_parser4(_sip_header_t *hdr, sip_parsed_header_t **phdr){ sip_parsed_header_t *parsed_header; sip_hdr_value_t *value = NULL; if (hdr == NULL || phdr == NULL) return (EINVAL); /* * check if previously parsed */ if (hdr->sip_hdr_parsed != NULL) { *phdr = hdr->sip_hdr_parsed; return (0); } *phdr = NULL; assert(hdr->sip_hdr_start == hdr->sip_hdr_current); if (sip_parse_goto_values(hdr) != 0) return (EPROTO); parsed_header = calloc(1, sizeof (sip_parsed_header_t)); if (parsed_header == NULL) return (ENOMEM); parsed_header->sip_header = hdr; value = calloc(1, sizeof (sip_hdr_value_t)); if (value == NULL) { sip_free_phdr(parsed_header); return (ENOMEM); } parsed_header->value = (sip_value_t *)value; value->sip_value_start = hdr->sip_hdr_current; value->sip_value_header = parsed_header; value->str_val_ptr = hdr->sip_hdr_current; /* get rid of CRLF at end */ value->str_val_len = hdr->sip_hdr_end - value->str_val_ptr - 2; value->sip_value_end = hdr->sip_hdr_end; *phdr = parsed_header; return (0);}intsip_parse_hdr_parser5(_sip_header_t *hdr, sip_parsed_header_t **phdr, boolean_t parse_uri){ sip_parsed_header_t *parsed_header; sip_hdr_value_t *value = NULL; sip_param_t *tmp_param; boolean_t first_param = B_TRUE; if (hdr == NULL || phdr == NULL) return (EINVAL); /* * check if previously parsed */ if (hdr->sip_hdr_parsed != NULL) { *phdr = hdr->sip_hdr_parsed; return (0); } *phdr = NULL; assert(hdr->sip_hdr_start == hdr->sip_hdr_current); if (sip_parse_goto_values(hdr) != 0) return (EPROTO); parsed_header = calloc(1, sizeof (sip_parsed_header_t)); if (parsed_header == NULL) return (ENOMEM); parsed_header->sip_header = hdr; value = calloc(1, sizeof (sip_hdr_value_t)); if (value == NULL) { sip_free_phdr(parsed_header); return (ENOMEM); } parsed_header->value = (sip_value_t *)value; value->sip_value_start = hdr->sip_hdr_current; value->auth_scheme_ptr = value->sip_value_start; value->sip_value_header = parsed_header; /* get auth_scheme */ if (sip_find_white_space(hdr)) { value->sip_value_state = SIP_VALUE_BAD; return (EINVAL); } value->auth_scheme_len = hdr->sip_hdr_current - value->auth_scheme_ptr; tmp_param = value->auth_param; /* parse auth_param */ for (;;) { char *tmp_cur; boolean_t quoted_name = B_FALSE; char quoted_char = (char)0; sip_param_t *new_param; boolean_t pval_is_uri = B_FALSE; if (sip_skip_white_space(hdr) != 0) { value->sip_value_state = SIP_VALUE_BAD; return (EPROTO); } tmp_cur = hdr->sip_hdr_current; new_param = calloc(1, sizeof (sip_param_t)); if (new_param == NULL) return (ENOMEM); if (first_param == B_FALSE) tmp_param->param_next = new_param; else value->auth_param = new_param; tmp_param = new_param; tmp_param->param_name.sip_str_ptr = tmp_cur; if (sip_find_separator(hdr, SIP_EQUAL, SIP_COMMA, (char)NULL) != 0) { tmp_param->param_name.sip_str_len = hdr->sip_hdr_current - tmp_cur; tmp_param->param_value.sip_str_ptr = NULL; tmp_param->param_value.sip_str_len = 0; goto end; } /* * End of param name */ tmp_param->param_name.sip_str_len = hdr->sip_hdr_current - tmp_cur; if (sip_skip_white_space(hdr) != 0 || *hdr->sip_hdr_current == SIP_COMMA) { tmp_param->param_value.sip_str_ptr = NULL; tmp_param->param_value.sip_str_len = 0; continue; } /* * We are at EQUAL */ hdr->sip_hdr_current++; if (sip_skip_white_space(hdr) != 0) { value->sip_value_state = SIP_VALUE_BAD; free(tmp_param); return (EPROTO); } if (*hdr->sip_hdr_current == SIP_QUOTE || *hdr->sip_hdr_current == SIP_LAQUOT) { if (*hdr->sip_hdr_current == SIP_QUOTE) quoted_char = SIP_QUOTE; else { quoted_char = SIP_RAQUOT; pval_is_uri = B_TRUE; } hdr->sip_hdr_current++; quoted_name = B_TRUE; } /* * start of param value */ tmp_cur = hdr->sip_hdr_current; tmp_param->param_value.sip_str_ptr = tmp_cur; if (quoted_name) { if (sip_find_token(hdr, quoted_char) != 0) { value->sip_value_state = SIP_VALUE_BAD; free(tmp_param); return (EPROTO); } tmp_param->param_value.sip_str_len = hdr->sip_hdr_current - tmp_cur - 1; } if (sip_find_token(hdr, SIP_COMMA) != 0) goto end; else { if (!quoted_name) { char *t = hdr->sip_hdr_current; hdr->sip_hdr_current--; (void) sip_reverse_skip_white_space(hdr); tmp_param->param_value.sip_str_len = hdr->sip_hdr_current - tmp_cur; hdr->sip_hdr_current = t; } } if (first_param == B_TRUE) first_param = B_FALSE; if ((pval_is_uri == B_TRUE) && (parse_uri == B_TRUE)) { /* Parse uri */ sip_parse_uri_str(&tmp_param->param_value, parsed_header, value); } }end: *phdr = parsed_header; return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -