47 #include <sofia-sip/bnf.h> 50 #include <sofia-sip/url.h> 60 #if HAVE_STRUCT_KEYWORDS && 0 62 #define MSG_HEADER_CLASS(pr, c, l, s, params, kind, dup, upd) \ 64 hc_hash: pr##c##_hash, \ 65 hc_parse: pr##c##_d, \ 66 hc_print: pr##c##_e, \ 67 hc_dxtra: dup##_dup_xtra, \ 68 hc_dup_one: dup##_dup_one, \ 69 hc_update: upd##_update, \ 71 hc_len: sizeof(l) - 1, \ 73 hc_size: MSG_ALIGN(sizeof(pr##c##_t), sizeof(void*)), \ 74 hc_params: offsetof(pr##c##_t, params), \ 75 hc_kind: msg_kind_##kind, \ 79 #define MSG_HEADER_CLASS(pr, c, l, s, params, kind, dup, upd) \ 90 MSG_ALIGN(sizeof(pr##c##_t), sizeof(void*)), \ 91 offsetof(pr##c##_t, params), \ 97 #define msg_kind_single_critical msg_kind_single, 1 98 #define msg_kind_list_critical msg_kind_list, 1 101 char b[], isize_t bsiz,
int eos);
103 char b[], isize_t bsiz,
int eos);
107 char b[], isize_t bsiz,
int eos);
129 char *b, isize_t xtra);
142 char *b, isize_t xtra);
147 char *b, isize_t xtra);
154 char *b, isize_t xtra);
163 char *b, isize_t xtra);
169 #define MSG_HEADER_DATA(h) ((char *)(h) + (h)->sh_class->hc_size) 171 #define MSG_HEADER_TEST(h) ((h) && (h)->sh_class) 176 char const **return_host,
177 char const **return_port);
186 char *s, isize_t slen);
188 #define msg_parse_next_field_without_recursion() { \ 189 msg_header_t *prev = h; \ 190 msg_hclass_t *hc = prev->sh_class; \ 191 char *end = s + slen; \ 193 if (*s && *s != ',') \ 196 if (msg_header_update_params(prev->sh_common, 0) < 0) \ 200 *s = '\0', s += span_lws(s + 1) + 1; \ 205 h = msg_header_alloc(home, hc, 0); \ 209 prev->sh_succ = h, h->sh_prev = &prev->sh_succ; \ 217 #define MSG_TERM_E(p, e) ((p) < (e) ? (p)[0] = '\0' : '\0') 220 #define MSG_CHAR_E(p, e, c) (++(p) < (e) ? ((p)[-1]=(c)) : (c)) 223 #define MSG_STRING_LEN(s, sep_size) ((s) ? (strlen(s) + sep_size) : 0) 226 #define MSG_STRING_E(p, e, s) do { \ 227 size_t _n = strlen(s); if (p + _n+1 < e) memcpy(p, s, _n+1); p+= _n; } while(0) 230 #define MSG_STRING_DUP(p, d, s) \ 231 (void)((s)?((p)=(char*)memccpy((void *)((d)=(char*)p),(s),0,INT_MAX))\ 237 #define MSG_STRING_SIZE(s) ((s) ? (strlen(s) + 1) : 0) 240 msg_param_t **append_list,
241 issize_t (*scanner)(
char *s));
246 msg_param_t **append_list,
247 issize_t (*scanner)(
char *s),
251 #define MSG_COMMALIST_E(b, end, params, compact) do { \ 252 char const * const *p_; char const * c_ = ""; \ 253 for (p_ = (params); p_ && *p_; p_++, c_ = (compact ? "," : ", ")) \ 254 { MSG_STRING_E(b, (end), c_); MSG_STRING_E(b, (end), *p_); } \ 262 #define MSG_PARAM_MATCH(v, s, name) \ 263 (strncasecmp(s, name "=", sizeof(name)) == 0 ? (v = s + sizeof(name)) : NULL) 266 #define MSG_PARAM_MATCH_P(v, s, name) \ 267 ((strncasecmp((s), name "", sizeof(name) - 1) == 0 && \ 268 ((s)[sizeof(name) - 1] == '=' || (s)[sizeof(name) - 1] == '\0')) ? \ 272 #define MSG_PARAMS_NUM(n) (((n) + MSG_N_PARAMS - 1) & (size_t)(0 - MSG_N_PARAMS)) 276 msg_param_t
const **return_params);
280 msg_param_t
const **return_params);
288 msg_param_t
const *src,
293 #define MSG_PARAMS_E(b, end, params, flags) \ 294 (b) += msg_params_e((b), (size_t)((b) < (end) ? (end) - (b) : 0), (params)) 297 #define MSG_PARAMS_SIZE(rv, params) (rv = msg_params_dup_xtra(params, rv)) 301 char *b, isize_t xtra);
308 for (n = 0; params[n]; n++)
322 MSG_STRUCT_SIZE_ALIGN(offset);
324 for (n = 0; params[n]; n++)
325 offset += strlen(params[n]) + 1;
334 return (
char *)h + h->
h_class->hc_size;
issize_t msg_separator_d(su_home_t *, msg_header_t *, char *, isize_t)
Parse a separator line.
Definition: msg_basic.c:328
char * msg_default_dup_one(msg_header_t *dst, msg_header_t const *src, char *b, isize_t xtra)
Duplicate a header object without external references.
Definition: msg_header_copy.c:344
Common part of the header objects (or message fragments).
Definition: msg_types.h:111
issize_t msg_attribute_value_scanner(char *s)
Scan an attribute (name [= value]) pair.
Definition: msg_parser_util.c:290
issize_t msg_any_list_d(su_home_t *, char **ss, msg_param_t **append_list, issize_t(*scanner)(char *s), int sep)
Parse any list.
Definition: msg_parser_util.c:189
issize_t msg_token_d(char **ss, char const **return_token)
Parse a token.
Definition: msg_parser_util.c:106
isize_t msg_params_count(msg_param_t const params[])
Count number of parameters in the list.
Definition: msg_parser.h:304
issize_t msg_uint32_d(char **ss, uint32_t *return_value)
Parse a 32-bit unsigned int.
Definition: msg_parser_util.c:129
isize_t msg_params_e(char b[], isize_t bsiz, msg_param_t const pparams[])
Encode a list of parameters.
Definition: msg_parser_util.c:503
issize_t msg_parse_next_field(su_home_t *home, msg_header_t *prev, char *s, isize_t slen)
Complete this header field and parse next header field.
Definition: msg_parser.c:1213
isize_t msg_default_dup_xtra(msg_header_t const *header, isize_t offset)
Calculate extra size of a plain header.
Definition: msg_header_copy.c:325
int msg_header_update_params(msg_common_t *h, int clear)
Update shortcuts to parameter values.
Definition: msg_parser_util.c:1064
MSG_PUB_T msg_pub_t
Public protocol-specific message structure for accessing the message.
Definition: msg_types.h:81
char * msg_generic_dup_one(msg_header_t *dst, msg_header_t const *src, char *b, isize_t xtra)
Duplicate one msg_generic_t object.
Definition: msg_generic.c:101
issize_t msg_extract_payload(msg_t *msg, msg_pub_t *mo, msg_header_t **return_payload, usize_t body_len, char b[], isize_t bsiz, int eos)
Extract a message body of body_len bytes.
Definition: msg_parser.c:1314
msg_hclass_t * h_class
Header class.
Definition: msg_types.h:114
msg_print_f msg_payload_e
Print a message payload.
Definition: msg_protos.h:815
issize_t msg_quoted_d(char **ss, char **return_unquoted)
Parse a quoted string.
Definition: msg_parser_util.c:686
int msg_firstline_d(char *s, char **ss2, char **ss3)
Parse first line.
Definition: msg_parser_util.c:66
issize_t msg_params_join(su_home_t *, msg_param_t **dst, msg_param_t const *src, unsigned prune, int dup)
Join list of parameters.
Definition: msg_parser_util.c:1459
issize_t msg_extract_separator(msg_t *msg, msg_pub_t *mo, char b[], isize_t bsiz, int eos)
Extract a separator line.
Definition: msg_parser.c:1285
isize_t msg_generic_dup_xtra(msg_header_t const *h, isize_t offset)
Calculate the size of strings associated with a msg_generic_t object.
Definition: msg_generic.c:94
issize_t msg_separator_e(char [], isize_t, msg_header_t const *, int)
Encode a separator line.
Definition: msg_basic.c:343
void * msg_header_data(msg_frg_t *h)
Return pointer to extra data after header structure.
Definition: msg_parser.h:331
issize_t msg_payload_d(su_home_t *, msg_header_t *h, char *s, isize_t slen)
Parse payload.
Definition: msg_basic.c:236
issize_t msg_unquoted_e(char *b, isize_t bsiz, char const *s)
Quote string.
Definition: msg_parser_util.c:1744
MSG_HDR_T msg_header_t
Any protocol-specific header object.
Definition: msg_types.h:87
char * msg_params_dup(msg_param_t const **d, msg_param_t const *s, char *b, isize_t xtra)
Duplicate a parameter list.
issize_t msg_generic_d(su_home_t *, msg_header_t *, char *, isize_t)
Parse a generic header.
Definition: msg_generic.c:66
int msg_hostport_d(char **ss, char const **return_host, char const **return_port)
Parse host[":"port] pair.
Definition: msg_parser_util.c:755
issize_t msg_params_d(su_home_t *, char **ss, msg_param_t const **return_params)
Parse a semicolon-separated parameter list starting with semicolon.
Definition: msg_parser_util.c:485
char * msg_auth_dup_one(msg_header_t *dst, msg_header_t const *src, char *b, isize_t xtra)
Duplicate one msg_auth_t object.
Definition: msg_auth.c:142
Message object.
Definition: msg_internal.h:59
isize_t msg_params_dup_xtra(msg_param_t const params[], isize_t offset)
Calculate memory size required by parameter list.
Definition: msg_parser.h:318
issize_t msg_generic_e(char [], isize_t, msg_header_t const *, int)
Encode a generic header.
Definition: msg_generic.c:82
issize_t msg_avlist_d(su_home_t *, char **ss, msg_param_t const **return_params)
Parse a semicolong-separated attribute-value list.
Definition: msg_parser_util.c:351
issize_t msg_commalist_d(su_home_t *, char **ss, msg_param_t **append_list, issize_t(*scanner)(char *s))
Parse a comma-separated list.
Definition: msg_parser_util.c:583
issize_t msg_comment_d(char **ss, char const **return_comment)
Parse a comment.
Definition: msg_parser_util.c:654
issize_t msg_extract_header(msg_t *msg, msg_pub_t *mo, char b[], isize_t bsiz, int eos)
Extract a header.
Definition: msg_parser.c:1005
issize_t msg_auth_d(su_home_t *, msg_header_t *h, char *s, isize_t slen)
Parse security headers.
Definition: msg_auth.c:88
#define MSG_PARAMS_NUM(n)
Calculate allocated number of items in parameter list.
Definition: msg_parser.h:272
issize_t msg_token_scan(char *start)
Token scanner for msg_commalist_d() accepting also empty entries.
Definition: msg_parser_util.c:593