Module: sip-router
Branch: master
Commit: 0d54a7754641467aa3dab8ed86979a6f6f96532d
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=0d54a77…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Jan Janak <jan(a)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(a)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 */