Selaa lähdekoodia

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 <[email protected]>
Daniel-Constantin Mierla 16 vuotta sitten
vanhempi
commit
0d54a77546
3 muutettua tiedostoa jossa 91 lisäystä ja 22 poistoa
  1. 2 0
      parser/hf.c
  2. 65 18
      parser/parse_allow.c
  3. 24 4
      parser/parse_allow.h

+ 2 - 0
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:

+ 65 - 18
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)));
 }

+ 24 - 4
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 */