Bogdan-Andrei Iancu пре 23 година
родитељ
комит
e1f5e1423d
3 измењених фајлова са 104 додато и 2 уклоњено
  1. 61 0
      data_lump_rpl.c
  2. 24 0
      data_lump_rpl.h
  3. 19 2
      modules/tm/sip_msg.c

+ 61 - 0
data_lump_rpl.c

@@ -0,0 +1,61 @@
+
+
+#include "dprint.h"
+#include "mem/mem.h"
+#include "data_lump_rpl.h"
+
+
+struct lump_rpl* build_lump_rpl( char* text, int len )
+{
+	struct lump_rpl *lump = 0;
+
+	lump = (struct lump_rpl*) pkg_malloc(sizeof(struct lump_rpl));
+	if (!lump)
+	{
+		LOG(L_ERR,"ERROR:build_lump_rpl : no free memory!\n");
+		goto error;
+	}
+
+	lump->text.s = pkg_malloc( len );
+	if (!lump->text.s)
+	{
+		LOG(L_ERR,"ERROR:build_lump_rpl : no free memory!\n");
+		goto error;
+	}
+
+	memcpy(lump->text.s,text,len);
+	lump->text.len = len;
+	lump->next = 0;
+
+	return lump;
+
+error:
+	if (lump) pkg_free(lump);
+	return 0;
+}
+
+
+
+int add_lump_rpl(struct sip_msg * msg, struct lump_rpl* lump)
+{
+	struct lump_rpl *foo;
+
+	if (!msg->reply_lump)
+	{
+		msg->reply_lump = lump;
+	}else{
+		for(foo=msg->reply_lump;foo->next;foo=foo->next);
+		foo->next = lump;
+	}
+}
+
+
+
+int free_lump_rpl(struct lump_rpl* lump)
+{
+	if (lump && lump->text.s)  pkg_free(lump->text.s);
+	if (lump) pkg_free(lump);
+}
+
+
+

+ 24 - 0
data_lump_rpl.h

@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ *
+ */
+
+#ifndef data_lump_rpl_h
+#define data_lump_rpl_h
+
+#include "msg_parser.h"
+
+
+struct lump_rpl
+{
+	str text;
+	struct lump_rpl* next;
+};
+
+struct lump_rpl* build_lump_rpl( char* , int );
+
+int add_lump_rpl(struct sip_msg * , struct lump_rpl* );
+
+int free_lump_rpl(struct lump_rpl* );
+
+#endif

+ 19 - 2
modules/tm/sip_msg.c

@@ -36,6 +36,7 @@ struct sip_msg*  sip_msg_cloner( struct sip_msg *org_msg )
    struct to_param   *to_prm,*new_to_prm;
    struct sip_msg     *new_msg;
    struct lump          *lump_chain, *lump_tmp, **lump_anchor, **lump_anchor2;
+   struct lump_rpl    *rpl_lump, *new_rpl_lump, **rpl_lump_anchor;
    char                       *p,*foo;
 
 
@@ -97,8 +98,9 @@ struct sip_msg*  sip_msg_cloner( struct sip_msg *org_msg )
       lump_chain = lump_chain->next;
    }
 
-   /**/
-
+   /*length of reply lump structures*/
+   for(rpl_lump=org_msg->reply_lump;rpl_lump;rpl_lump=rpl_lump->next)
+       len+=rpl_lump->text.len;
 
    p=(char *)sh_malloc(len);foo=p;
    if (!p)
@@ -290,6 +292,21 @@ struct sip_msg*  sip_msg_cloner( struct sip_msg *org_msg )
       lump_anchor = &((*lump_anchor)->next);
       lump_chain = lump_chain->next;
    }
+
+   /*cloning reply lump structures*/
+   rpl_lump_anchor = &(new_msg->reply_lump);
+   for(rpl_lump=org_msg->reply_lump;rpl_lump;rpl_lump=rpl_lump->next)
+   {
+       *(rpl_lump_anchor)=(struct lump_rpl*)p;
+       p+=sizeof( struct lump_rpl );
+       (*rpl_lump_anchor)->text.len = rpl_lump->text.len;
+       (*rpl_lump_anchor)->text.s=p;
+       p+=rpl_lump->text.len;
+       memcpy((*rpl_lump_anchor)->text.s,rpl_lump->text.s,rpl_lump->text.len);
+       (*rpl_lump_anchor)->next=0;
+       rpl_lump_anchor = &((*rpl_lump_anchor)->next)
+   }
+
    return new_msg;
 }