Module: sip-router Branch: master Commit: 0d54a7754641467aa3dab8ed86979a6f6f96532d URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0d54a775...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Jan Janak jan@iptel.org Date: Fri Mar 20 17:19:22 2009 +0100
Allow parser syn'ced with kamailio version
Sync'ed parse_allow_header() prototype name with implementation. New parse_allow() function that work over sim_msg structure
Signed-off-by: Jan Janak jan@iptel.org
---
parser/hf.c | 2 + parser/parse_allow.c | 83 +++++++++++++++++++++++++++++++++++++++----------- parser/parse_allow.h | 28 ++++++++++++++-- 3 files changed, 91 insertions(+), 22 deletions(-)
diff --git a/parser/hf.c b/parser/hf.c index c5f7ba3..f33aaa1 100644 --- a/parser/hf.c +++ b/parser/hf.c @@ -52,6 +52,7 @@ #include "parse_subscription_state.h" #include "contact/parse_contact.h" #include "parse_disposition.h" +#include "parse_allow.h" #include "../ut.h"
@@ -138,6 +139,7 @@ void clean_hdr_field(struct hdr_field* hf) break;
case HDR_ALLOW_T: + free_allow_header(hf); break;
case HDR_EVENT_T: diff --git a/parser/parse_allow.c b/parser/parse_allow.c index 62cec93..ce435ac 100644 --- a/parser/parse_allow.c +++ b/parser/parse_allow.c @@ -43,41 +43,88 @@ */ int parse_allow_header(struct hdr_field* _hf) { - unsigned int* methods; - + struct allow_body* ab = 0; + if (!_hf) { LOG(L_ERR, "parse_allow_header: Invalid parameter value\n"); return -1; } - /* maybe the header is already parsed! */ + /* maybe the header is already parsed! */ if (_hf->parsed) { return 0; }
- /* bad luck! :-( - we have to parse it */ - methods = pkg_malloc(sizeof(unsigned int)); - if (methods == 0) { - LOG(L_ERR, "ERROR:parse_allow_header: Out of pkg_memory\n"); - return -1; - } + ab = (struct allow_body*)pkg_malloc(sizeof(struct allow_body)); + if (ab == 0) { + LOG(L_ERR, "ERROR:parse_allow_header: out of pkg_memory\n"); + return -1; + } + memset(ab,'\0', sizeof(struct allow_body)); + + if (parse_methods(&(_hf->body), &(ab->allow)) !=0 ) { + LOG(L_ERR, "ERROR:parse_allow_header: bad allow body header\n"); + goto error; + } + + ab->allow_all = 0; + _hf->parsed = (void*)ab; + return 0; + +error: + if (ab) pkg_free(ab); + return -1; +} + +/*! + * \brief This method is used to parse all Allow HF body. + * \param msg sip msg + * \return 0 on success,-1 on failure. + */ +int parse_allow(struct sip_msg *msg) +{ + unsigned int allow; + struct hdr_field *hdr; + + /* maybe the header is already parsed! */ + if (msg->allow && msg->allow->parsed) { + return 0; + }
- if (!parse_methods(&(_hf->body), methods)) { - LOG(L_ERR, "ERROR:parse_allow_header: Bad allow header\n"); - pkg_free(methods); + /* parse to the end in order to get all ALLOW headers */ + if (parse_headers(msg,HDR_EOH_F,0)==-1 || !msg->allow) { return -1; - } + } + allow = 0;
- _hf->parsed = methods; - return 0; + for(hdr = msg->allow ; hdr ; hdr = next_sibling_hdr(hdr)) { + if (hdr->parsed == 0) { + if(parse_allow_header(hdr) < 0) { + return -1; + } + } + + allow |= ((struct allow_body*)hdr->parsed)->allow; + } + + ((struct allow_body*)msg->allow->parsed)->allow_all = allow; + return 0; }
/* * Release memory */ -void free_allow(unsigned int** _methods) +void free_allow_body(struct allow_body **ab) +{ + if (ab && *ab) { + pkg_free(*ab); + *ab = 0; + } +} + + +void free_allow_header(struct hdr_field* hf) { - if (_methods && *_methods) pkg_free(*_methods); - *_methods = 0; + free_allow_body((struct allow_body**)(void*)(&(hf->parsed))); } diff --git a/parser/parse_allow.h b/parser/parse_allow.h index b939c7a..743e6bb 100644 --- a/parser/parse_allow.h +++ b/parser/parse_allow.h @@ -29,23 +29,43 @@ #define PARSE_ALLOW_H
#include "hf.h" +#include "msg_parser.h"
/* - * casting macro for accessing RPID body + * casting macro for accessing Allow body */ -#define get_allow_methods(p_msg) (unsigned int)(p_msg)->allow->parsed) +#define get_allow_methods(p_msg) \ + (((struct allow_body*)(p_msg)->allow->parsed)->allow_all) + + +struct allow_body { + unsigned int allow; /* allow mask for the current hdr */ + unsigned int allow_all; /* allow mask for the all allow hdr - it's + * set only for the first hdr in sibling + * list*/ +}; + + +/* + * Parse all Allow HFs + */ +int parse_allow(struct sip_msg *msg);
/* * Parse Allow HF body */ -int parse_allow(struct hdr_field* _h); +int parse_allow_header(struct hdr_field* _h);
/* * Release memory */ -void free_allow(unsigned int** _methods); +void free_allow_body(struct allow_body **ab); + +void free_allow_header(struct hdr_field* hf); + +
#endif /* PARSE_ALLOW_H */