Browse Source

- duplicate_parameters function added
- duplicate_rr function added

Jan Janak 22 years ago
parent
commit
5d17eb170a
4 changed files with 109 additions and 1 deletions
  1. 37 0
      parser/parse_param.c
  2. 6 0
      parser/parse_param.h
  3. 59 0
      parser/parse_rr.c
  4. 7 1
      parser/parse_rr.h

+ 37 - 0
parser/parse_param.c

@@ -418,3 +418,40 @@ void print_params(param_t* _p)
 		ptr = ptr->next;
 	}
 }
+
+
+/*
+ * Duplicate linked list of parameters
+ */
+int duplicate_params(param_t** _n, param_t* _p)
+{
+	param_t* last, *ptr, *t;
+
+	if (!_n || !_p) {
+		LOG(L_ERR, "duplicate_params(): Invalid parameter value\n");
+		return -1;
+	}
+	
+	last = 0;
+	*_n = 0;
+	ptr = _p;
+	while(ptr) {
+		t = (param_t*)pkg_malloc(sizeof(param_t));
+		if (!t) {
+			LOG(L_ERR, "duplicate_params(): Invalid parameter value\n");
+			goto err;
+		}
+		memcpy(t, ptr, sizeof(param_t));
+		t->next = 0;
+
+		if (!*_n) *_n = t;
+		if (last) last->next = t;
+		last = t;
+
+		ptr = ptr->next;
+	}
+
+ err:
+	free_params(*_n);
+	return 0;
+}

+ 6 - 0
parser/parse_param.h

@@ -123,4 +123,10 @@ void free_params(param_t* _p);
 void print_params(param_t* _p);
 
 
+/*
+ * Duplicate linked list of parameters
+ */
+int duplicate_params(param_t** _n, param_t* _p);
+
+
 #endif /* PARSE_PARAM_H */

+ 59 - 0
parser/parse_rr.c

@@ -173,3 +173,62 @@ void print_rr(rr_t* _r)
 		ptr = ptr->next;
 	}
 }
+
+
+/*
+ * Translate all pointers in the structure and also
+ * in all parameters in the list
+ */
+static inline void xlate_pointers(struct sip_msg* _m, rr_t* _r)
+{
+	param_t* ptr;
+	_r->nameaddr.uri.s = translate_pointer(_r->nameaddr.name.s, _m->buf, _r->nameaddr.uri.s);
+	
+	ptr = _r->params;
+	while(ptr) {
+		if (ptr->type == P_R2) _r->r2 = ptr;
+		ptr->name.s = translate_pointer(_r->nameaddr.name.s, _m->buf, ptr->name.s);
+		ptr->body.s = translate_pointer(_r->nameaddr.name.s, _m->buf, ptr->body.s);		
+		ptr = ptr->next;
+	}
+}
+
+
+/*
+ * Duplicate a single rr_t structure using pkg_malloc
+ */
+int duplicate_rr(struct sip_msg* _m, rr_t** _new, rr_t* _r)
+{
+	int len;
+	rr_t* res;
+
+	if (!_m || !_new || _r) {
+		LOG(L_ERR, "duplicate_rr(): Invalid parameter value\n");
+		return -1;
+	}
+
+	if (_r->params) {
+		len = _r->params->name.s + _r->params->len - _r->nameaddr.name.s;
+	} else {
+		len = _r->nameaddr.len;
+	}
+
+	res = pkg_malloc(sizeof(rr_t) + len);
+	if (!res) {
+		LOG(L_ERR, "duplicate_rr(): No memory left\n");
+		return -2;
+	}
+
+        res->nameaddr.name.s = (char*)res + sizeof(rr_t);
+	memcpy(res->nameaddr.name.s, _r->nameaddr.name.s, len);
+
+	if (duplicate_params(&res->params, _r->params) < 0) {
+		LOG(L_ERR, "Error while duplicating parameters\n");
+		pkg_free(res);
+		return -3;
+	}
+
+	xlate_pointers(_m, res);
+	*_new = res;
+	return 0;
+}

+ 7 - 1
parser/parse_rr.h

@@ -31,7 +31,7 @@
 #ifndef PARSE_RR_H
 #define PARSE_RR_H
 
-
+#include "msg_parser.h"
 #include "parse_nameaddr.h"
 #include "parse_param.h"
 #include "hf.h"
@@ -67,4 +67,10 @@ void free_rr(rr_t** _r);
 void print_rr(rr_t* _r);
 
 
+/*
+ * Duplicate a single rr_t structure using pkg_malloc
+ */
+int duplicate_rr(struct sip_msg* _m, rr_t** _new, rr_t* _r);
+
+
 #endif /* PARSE_RR_H */