|
@@ -11,143 +11,232 @@
|
|
|
#include "../../ut.h"
|
|
|
|
|
|
|
|
|
-/*#define ROUND4(s) (((s)%4)?((s)+4)/4*4:(s))*/
|
|
|
|
|
|
-#define ROUND4(s) (((s)+3)&(~(3UL)))
|
|
|
+#define ROUND4(s) \
|
|
|
+ (((s)+3)&(~(3UL)))
|
|
|
+#define lump_len( _lump) \
|
|
|
+ (ROUND4(sizeof(struct lump)) +\
|
|
|
+ ROUND4(((_lump)->op==LUMP_ADD)?(_lump)->len:0))
|
|
|
+#define lump_clone( _new,_old,_ptr) \
|
|
|
+ {\
|
|
|
+ (_new) = (struct lump*)(_ptr);\
|
|
|
+ memcpy( (_new), (_old), sizeof(struct lump) );\
|
|
|
+ (_ptr)+=ROUND4(sizeof(struct lump));\
|
|
|
+ if ( (_old)->op==LUMP_ADD) {\
|
|
|
+ (_new)->u.value = (char*)(_ptr);\
|
|
|
+ memcpy( (_new)->u.value , (_old)->u.value , (_old)->len);\
|
|
|
+ (_ptr)+=ROUND4((_old)->len);}\
|
|
|
+ }
|
|
|
|
|
|
|
|
|
-#define lump_len( _lump) (ROUND4(sizeof(struct lump)) + \
|
|
|
- ROUND4( ((_lump)->op==LUMP_ADD)?(_lump)->len:0 ))
|
|
|
|
|
|
-#define lump_clone( _new,_old,_ptr) \
|
|
|
- {(_new) = (struct lump*)(_ptr);\
|
|
|
- memcpy( (_new), (_old), sizeof(struct lump) );\
|
|
|
- (_ptr)+=ROUND4(sizeof(struct lump));\
|
|
|
- if ( (_old)->op==LUMP_ADD) {\
|
|
|
- (_new)->u.value = (char*)(_ptr);\
|
|
|
- memcpy( (_new)->u.value , (_old)->u.value , (_old)->len);\
|
|
|
- (_ptr)+=ROUND4((_old)->len);}\
|
|
|
- }
|
|
|
|
|
|
-struct via_body* via_body_cloner_2( char* new_buf , char *org_buf , struct via_body *org_via, char **p);
|
|
|
+inline struct via_body* via_body_cloner( char* new_buf,
|
|
|
+ char *org_buf, struct via_body *param_org_via, char **p)
|
|
|
+{
|
|
|
+ struct via_body *new_via;
|
|
|
+ struct via_body *first_via, *last_via;
|
|
|
+ struct via_body *org_via;
|
|
|
+
|
|
|
+ first_via = last_via = 0;
|
|
|
+ org_via = param_org_via;
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ /* clones the via_body structure */
|
|
|
+ new_via = (struct via_body*)(*p);
|
|
|
+ memcpy( new_via , org_via , sizeof( struct via_body) );
|
|
|
+ (*p) += ROUND4(sizeof( struct via_body ));
|
|
|
+
|
|
|
+ /* hdr (str type) */
|
|
|
+ new_via->hdr.s=translate_pointer(new_buf,org_buf,org_via->hdr.s);
|
|
|
+ /* name (str type) */
|
|
|
+ new_via->name.s=translate_pointer(new_buf,org_buf,org_via->name.s);
|
|
|
+ /* version (str type) */
|
|
|
+ new_via->version.s=
|
|
|
+ translate_pointer(new_buf,org_buf,org_via->version.s);
|
|
|
+ /* transport (str type) */
|
|
|
+ new_via->transport.s=
|
|
|
+ translate_pointer(new_buf,org_buf,org_via->transport.s);
|
|
|
+ /* host (str type) */
|
|
|
+ new_via->host.s=translate_pointer(new_buf,org_buf,org_via->host.s);
|
|
|
+ /* port_str (str type) */
|
|
|
+ new_via->port_str.s=
|
|
|
+ translate_pointer(new_buf,org_buf,org_via->port_str.s);
|
|
|
+ /* params (str type) */
|
|
|
+ new_via->params.s=translate_pointer(new_buf,org_buf,org_via->params.s);
|
|
|
+ /* comment (str type) */
|
|
|
+ new_via->comment.s=
|
|
|
+ translate_pointer(new_buf,org_buf,org_via->comment.s);
|
|
|
+
|
|
|
+ if ( org_via->param_lst )
|
|
|
+ {
|
|
|
+ struct via_param *vp, *new_vp, *last_new_vp;
|
|
|
+ for( vp=org_via->param_lst, last_new_vp=0 ; vp ; vp=vp->next )
|
|
|
+ {
|
|
|
+ new_vp = (struct via_param*)(*p);
|
|
|
+ memcpy( new_vp , vp , sizeof(struct via_param));
|
|
|
+ (*p) += ROUND4(sizeof(struct via_param));
|
|
|
+ new_vp->name.s=translate_pointer(new_buf,org_buf,vp->name.s);
|
|
|
+ new_vp->value.s=translate_pointer(new_buf,org_buf,vp->value.s);
|
|
|
+
|
|
|
+ if (new_vp->type==PARAM_BRANCH)
|
|
|
+ new_via->branch = new_vp;
|
|
|
+
|
|
|
+ if (last_new_vp)
|
|
|
+ last_new_vp->next = new_vp;
|
|
|
+ else
|
|
|
+ new_via->param_lst = new_vp;
|
|
|
+
|
|
|
+ last_new_vp = new_vp;
|
|
|
+ last_new_vp->next = NULL;
|
|
|
+ }
|
|
|
+ new_via->last_param = new_vp;
|
|
|
+ }/*end if via has params */
|
|
|
+
|
|
|
+ if (last_via)
|
|
|
+ last_via->next = new_via;
|
|
|
+ else
|
|
|
+ first_via = new_via;
|
|
|
+ last_via = new_via;
|
|
|
+ org_via = org_via->next;
|
|
|
+ }while(org_via);
|
|
|
+
|
|
|
+ return first_via;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
struct sip_msg* sip_msg_cloner( struct sip_msg *org_msg )
|
|
|
{
|
|
|
- unsigned int len;
|
|
|
- struct hdr_field *hdr,*new_hdr,*last_hdr;
|
|
|
- struct via_body *via;
|
|
|
- struct via_param *prm;
|
|
|
- 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, **rpl_lump_anchor;
|
|
|
- char *p,*foo;
|
|
|
-
|
|
|
-
|
|
|
- /*computing the length of entire sip_msg structure*/
|
|
|
- len = ROUND4(sizeof( struct sip_msg ));
|
|
|
- /*we will keep only the original msg*/
|
|
|
- len += ROUND4(org_msg->len);
|
|
|
- /*the new uri (if any)*/
|
|
|
- if (org_msg->new_uri.s && org_msg->new_uri.len)
|
|
|
- len+= ROUND4(org_msg->new_uri.len);
|
|
|
- /*all the headers*/
|
|
|
- for( hdr=org_msg->headers ; hdr ; hdr=hdr->next )
|
|
|
- {
|
|
|
- /*size of header struct*/
|
|
|
- len += ROUND4(sizeof( struct hdr_field));
|
|
|
- switch (hdr->type)
|
|
|
- {
|
|
|
- case HDR_CSEQ:
|
|
|
- len+=ROUND4(sizeof(struct cseq_body));
|
|
|
- break;
|
|
|
- case HDR_TO:
|
|
|
- len+=ROUND4(sizeof(struct to_body));
|
|
|
- /*to param*/
|
|
|
- to_prm = ((struct to_body*)(hdr->parsed))->param_lst;
|
|
|
- for(;to_prm;to_prm=to_prm->next)
|
|
|
- len+=ROUND4(sizeof(struct to_param ));
|
|
|
- break;
|
|
|
- case HDR_VIA:
|
|
|
- for (via=(struct via_body*)hdr->parsed;via;via=via->next)
|
|
|
- {
|
|
|
- len+=ROUND4(sizeof(struct via_body));
|
|
|
- /*via param*/
|
|
|
- for(prm=via->param_lst;prm;prm=prm->next)
|
|
|
- len+=ROUND4(sizeof(struct via_param ));
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- /* length of the data lump structures */
|
|
|
- if (org_msg->first_line.type==SIP_REQUEST)
|
|
|
- lump_chain = org_msg->add_rm;
|
|
|
- else
|
|
|
- lump_chain = org_msg->repl_add_rm;
|
|
|
- while (lump_chain)
|
|
|
- {
|
|
|
- len += lump_len( lump_chain );
|
|
|
- lump_tmp = lump_chain->before;
|
|
|
- while ( lump_tmp )
|
|
|
- {
|
|
|
- len += lump_len( lump_tmp );
|
|
|
- lump_tmp = lump_tmp->before;
|
|
|
- }
|
|
|
- lump_tmp = lump_chain->after;
|
|
|
- while ( lump_tmp )
|
|
|
- {
|
|
|
- len += lump_len( lump_tmp );
|
|
|
- lump_tmp = lump_tmp->after;
|
|
|
- }
|
|
|
- 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)
|
|
|
- {
|
|
|
- LOG(L_ERR , "ERROR: sip_msg_cloner_2: cannot allocate memory\n" );
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- /*filling up the new structure*/
|
|
|
- new_msg = (struct sip_msg*)p;
|
|
|
- /*sip msg structure*/
|
|
|
- memcpy( new_msg , org_msg , sizeof(struct sip_msg) );
|
|
|
- p += ROUND4(sizeof(struct sip_msg));
|
|
|
- new_msg->add_rm = new_msg->repl_add_rm = 0;
|
|
|
- /*new_uri*/
|
|
|
- if (org_msg->new_uri.s && org_msg->new_uri.len)
|
|
|
- {
|
|
|
- new_msg->new_uri.s = p;
|
|
|
- memcpy( p , org_msg->new_uri.s , org_msg->new_uri.len);
|
|
|
- p += ROUND4(org_msg->new_uri.len);
|
|
|
- }
|
|
|
- /*message buffers(org and scratch pad)*/
|
|
|
- memcpy( p , org_msg->orig , org_msg->len);
|
|
|
- new_msg->orig = new_msg->buf = p;
|
|
|
- p += ROUND4(new_msg->len);
|
|
|
- /*unparsed and eoh pointer*/
|
|
|
- new_msg->unparsed = translate_pointer( new_msg->buf ,
|
|
|
- org_msg->buf , org_msg->unparsed );
|
|
|
- new_msg->eoh = translate_pointer( new_msg->buf ,
|
|
|
- org_msg->buf , org_msg->eoh );
|
|
|
- /* first line, updating the pointers*/
|
|
|
- if ( org_msg->first_line.type==SIP_REQUEST )
|
|
|
- {
|
|
|
- new_msg->first_line.u.request.method.s = translate_pointer( new_msg->buf , org_msg->buf , org_msg->first_line.u.request.method.s );
|
|
|
- new_msg->first_line.u.request.uri.s = translate_pointer( new_msg->buf , org_msg->buf , org_msg->first_line.u.request.uri.s );
|
|
|
- new_msg->first_line.u.request.version.s = translate_pointer( new_msg->buf , org_msg->buf , org_msg->first_line.u.request.version.s );
|
|
|
- }
|
|
|
- else if ( org_msg->first_line.type==SIP_REPLY )
|
|
|
- {
|
|
|
- new_msg->first_line.u.reply.version.s = translate_pointer( new_msg->buf , org_msg->buf , org_msg->first_line.u.reply.version.s );
|
|
|
- new_msg->first_line.u.reply.status.s = translate_pointer( new_msg->buf , org_msg->buf , org_msg->first_line.u.reply.status.s );
|
|
|
- new_msg->first_line.u.reply.reason.s = translate_pointer( new_msg->buf , org_msg->buf , org_msg->first_line.u.reply.reason.s );
|
|
|
- }
|
|
|
+ unsigned int len;
|
|
|
+ struct hdr_field *hdr,*new_hdr,*last_hdr;
|
|
|
+ struct via_body *via;
|
|
|
+ struct via_param *prm;
|
|
|
+ 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, **rpl_lump_anchor;
|
|
|
+ char *p,*foo;
|
|
|
+
|
|
|
+
|
|
|
+ /*computing the length of entire sip_msg structure*/
|
|
|
+ len = ROUND4(sizeof( struct sip_msg ));
|
|
|
+ /*we will keep only the original msg*/
|
|
|
+ len += ROUND4(org_msg->len);
|
|
|
+ /*the new uri (if any)*/
|
|
|
+ if (org_msg->new_uri.s && org_msg->new_uri.len)
|
|
|
+ len+= ROUND4(org_msg->new_uri.len);
|
|
|
+ /*all the headers*/
|
|
|
+ for( hdr=org_msg->headers ; hdr ; hdr=hdr->next )
|
|
|
+ {
|
|
|
+ /*size of header struct*/
|
|
|
+ len += ROUND4(sizeof( struct hdr_field));
|
|
|
+ switch (hdr->type)
|
|
|
+ {
|
|
|
+ case HDR_CSEQ:
|
|
|
+ len+=ROUND4(sizeof(struct cseq_body));
|
|
|
+ break;
|
|
|
+ case HDR_TO:
|
|
|
+ len+=ROUND4(sizeof(struct to_body));
|
|
|
+ /*to param*/
|
|
|
+ to_prm = ((struct to_body*)(hdr->parsed))->param_lst;
|
|
|
+ for(;to_prm;to_prm=to_prm->next)
|
|
|
+ len+=ROUND4(sizeof(struct to_param ));
|
|
|
+ break;
|
|
|
+ case HDR_VIA:
|
|
|
+ for (via=(struct via_body*)hdr->parsed;via;via=via->next)
|
|
|
+ {
|
|
|
+ len+=ROUND4(sizeof(struct via_body));
|
|
|
+ /*via param*/
|
|
|
+ for(prm=via->param_lst;prm;prm=prm->next)
|
|
|
+ len+=ROUND4(sizeof(struct via_param ));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }/*switch*/
|
|
|
+ }/*for all headers*/
|
|
|
+
|
|
|
+ /* length of the data lump structures */
|
|
|
+ if (org_msg->first_line.type==SIP_REQUEST)
|
|
|
+ lump_chain = org_msg->add_rm;
|
|
|
+ else
|
|
|
+ lump_chain = org_msg->repl_add_rm;
|
|
|
+ while (lump_chain)
|
|
|
+ {
|
|
|
+ len += lump_len( lump_chain );
|
|
|
+ lump_tmp = lump_chain->before;
|
|
|
+ while ( lump_tmp )
|
|
|
+ {
|
|
|
+ len += lump_len( lump_tmp );
|
|
|
+ lump_tmp = lump_tmp->before;
|
|
|
+ }
|
|
|
+ lump_tmp = lump_chain->after;
|
|
|
+ while ( lump_tmp )
|
|
|
+ {
|
|
|
+ len += lump_len( lump_tmp );
|
|
|
+ lump_tmp = lump_tmp->after;
|
|
|
+ }
|
|
|
+ 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)
|
|
|
+ {
|
|
|
+ LOG(L_ERR , "ERROR: sip_msg_cloner_2: cannot allocate memory\n" );
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* filling up the new structure */
|
|
|
+ new_msg = (struct sip_msg*)p;
|
|
|
+ /* sip msg structure */
|
|
|
+ memcpy( new_msg , org_msg , sizeof(struct sip_msg) );
|
|
|
+ p += ROUND4(sizeof(struct sip_msg));
|
|
|
+ new_msg->add_rm = new_msg->repl_add_rm = 0;
|
|
|
+ /* new_uri */
|
|
|
+ if (org_msg->new_uri.s && org_msg->new_uri.len)
|
|
|
+ {
|
|
|
+ new_msg->new_uri.s = p;
|
|
|
+ memcpy( p , org_msg->new_uri.s , org_msg->new_uri.len);
|
|
|
+ p += ROUND4(org_msg->new_uri.len);
|
|
|
+ }
|
|
|
+ /* message buffers(org and scratch pad) */
|
|
|
+ memcpy( p , org_msg->orig , org_msg->len);
|
|
|
+ new_msg->orig = new_msg->buf = p;
|
|
|
+ p += ROUND4(new_msg->len);
|
|
|
+ /* unparsed and eoh pointer */
|
|
|
+ new_msg->unparsed = translate_pointer(new_msg->buf ,org_msg->buf,
|
|
|
+ org_msg->unparsed );
|
|
|
+ new_msg->eoh = translate_pointer(new_msg->buf,org_msg->buf,org_msg->eoh);
|
|
|
+ /* first line, updating the pointers*/
|
|
|
+ if ( org_msg->first_line.type==SIP_REQUEST )
|
|
|
+ {
|
|
|
+ new_msg->first_line.u.request.method.s =
|
|
|
+ translate_pointer( new_msg->buf , org_msg->buf ,
|
|
|
+ org_msg->first_line.u.request.method.s );
|
|
|
+ new_msg->first_line.u.request.uri.s =
|
|
|
+ translate_pointer( new_msg->buf , org_msg->buf ,
|
|
|
+ org_msg->first_line.u.request.uri.s );
|
|
|
+ new_msg->first_line.u.request.version.s =
|
|
|
+ translate_pointer( new_msg->buf , org_msg->buf ,
|
|
|
+ org_msg->first_line.u.request.version.s );
|
|
|
+ }
|
|
|
+ else if ( org_msg->first_line.type==SIP_REPLY )
|
|
|
+ {
|
|
|
+ new_msg->first_line.u.reply.version.s =
|
|
|
+ translate_pointer( new_msg->buf , org_msg->buf ,
|
|
|
+ org_msg->first_line.u.reply.version.s );
|
|
|
+ new_msg->first_line.u.reply.status.s =
|
|
|
+ translate_pointer( new_msg->buf , org_msg->buf ,
|
|
|
+ org_msg->first_line.u.reply.status.s );
|
|
|
+ new_msg->first_line.u.reply.reason.s =
|
|
|
+ translate_pointer( new_msg->buf , org_msg->buf ,
|
|
|
+ org_msg->first_line.u.reply.reason.s );
|
|
|
+ }
|
|
|
|
|
|
/*headers list*/
|
|
|
new_msg->via1=0;
|
|
@@ -168,27 +257,30 @@ struct sip_msg* sip_msg_cloner( struct sip_msg *org_msg )
|
|
|
if ( !new_msg->via1 )
|
|
|
{
|
|
|
new_msg->h_via1 = new_hdr;
|
|
|
- new_msg->via1 = via_body_cloner_2(new_msg->buf,
|
|
|
+ new_msg->via1 = via_body_cloner(new_msg->buf,
|
|
|
org_msg->buf, (struct via_body*)hdr->parsed, &p);
|
|
|
new_hdr->parsed = (void*)new_msg->via1;
|
|
|
if ( new_msg->via1->next )
|
|
|
new_msg->via2 = new_msg->via1->next;
|
|
|
}
|
|
|
else if ( !new_msg->via2 && new_msg->via1 )
|
|
|
- {
|
|
|
- new_msg->h_via2 = new_hdr;
|
|
|
- if ( new_msg->via1->next )
|
|
|
- new_hdr->parsed = (void*)new_msg->via1->next;
|
|
|
- else{
|
|
|
- new_msg->via2 = via_body_cloner_2( new_msg->buf , org_msg->buf , (struct via_body*)hdr->parsed , &p);
|
|
|
- new_hdr->parsed = (void*)new_msg->via2;
|
|
|
- }
|
|
|
- }
|
|
|
+ {
|
|
|
+ new_msg->h_via2 = new_hdr;
|
|
|
+ if ( new_msg->via1->next )
|
|
|
+ new_hdr->parsed = (void*)new_msg->via1->next;
|
|
|
+ else{
|
|
|
+ new_msg->via2 = via_body_cloner( new_msg->buf,
|
|
|
+ org_msg->buf, (struct via_body*)hdr->parsed, &p);
|
|
|
+ new_hdr->parsed = (void*)new_msg->via2;
|
|
|
+ }
|
|
|
+ }
|
|
|
else if ( new_msg->via2 && new_msg->via1 )
|
|
|
- {
|
|
|
- new_hdr->parsed = new_msg->via1 = via_body_cloner_2( new_msg->buf , org_msg->buf , (struct via_body*)hdr->parsed , &p);
|
|
|
- }
|
|
|
- break;
|
|
|
+ {
|
|
|
+ new_hdr->parsed = new_msg->via1 =
|
|
|
+ via_body_cloner( new_msg->buf , org_msg->buf ,
|
|
|
+ (struct via_body*)hdr->parsed , &p);
|
|
|
+ }
|
|
|
+ break;
|
|
|
case HDR_CSEQ:
|
|
|
new_hdr->parsed = p;
|
|
|
p +=ROUND4(sizeof(struct cseq_body));
|
|
@@ -219,25 +311,25 @@ struct sip_msg* sip_msg_cloner( struct sip_msg *org_msg )
|
|
|
to_prm = ((struct to_body*)(hdr->parsed))->param_lst;
|
|
|
for(;to_prm;to_prm=to_prm->next)
|
|
|
{
|
|
|
- /*alloc*/
|
|
|
- new_to_prm = (struct to_param*)p;
|
|
|
- p +=ROUND4(sizeof(struct to_param ));
|
|
|
- /*coping*/
|
|
|
- memcpy( new_to_prm, to_prm, sizeof(struct to_param ));
|
|
|
- ((struct to_body*)new_hdr->parsed)->param_lst = 0;
|
|
|
- new_to_prm->name.s = translate_pointer( new_msg->buf,
|
|
|
- org_msg->buf , to_prm->name.s );
|
|
|
- new_to_prm->value.s = translate_pointer( new_msg->buf,
|
|
|
- org_msg->buf , to_prm->value.s );
|
|
|
- /*linking*/
|
|
|
- if ( !((struct to_body*)new_hdr->parsed)->param_lst )
|
|
|
- ((struct to_body*)new_hdr->parsed)->param_lst
|
|
|
- = new_to_prm;
|
|
|
- else
|
|
|
- ((struct to_body*)new_hdr->parsed)->last_param->next
|
|
|
- = new_to_prm;
|
|
|
- ((struct to_body*)new_hdr->parsed)->last_param
|
|
|
- = new_to_prm;
|
|
|
+ /*alloc*/
|
|
|
+ new_to_prm = (struct to_param*)p;
|
|
|
+ p +=ROUND4(sizeof(struct to_param ));
|
|
|
+ /*coping*/
|
|
|
+ memcpy( new_to_prm, to_prm, sizeof(struct to_param ));
|
|
|
+ ((struct to_body*)new_hdr->parsed)->param_lst = 0;
|
|
|
+ new_to_prm->name.s = translate_pointer( new_msg->buf,
|
|
|
+ org_msg->buf , to_prm->name.s );
|
|
|
+ new_to_prm->value.s = translate_pointer( new_msg->buf,
|
|
|
+ org_msg->buf , to_prm->value.s );
|
|
|
+ /*linking*/
|
|
|
+ if ( !((struct to_body*)new_hdr->parsed)->param_lst )
|
|
|
+ ((struct to_body*)new_hdr->parsed)->param_lst
|
|
|
+ = new_to_prm;
|
|
|
+ else
|
|
|
+ ((struct to_body*)new_hdr->parsed)->last_param->next
|
|
|
+ = new_to_prm;
|
|
|
+ ((struct to_body*)new_hdr->parsed)->last_param
|
|
|
+ = new_to_prm;
|
|
|
}
|
|
|
new_msg->to = new_hdr;
|
|
|
break;
|
|
@@ -245,141 +337,81 @@ struct sip_msg* sip_msg_cloner( struct sip_msg *org_msg )
|
|
|
new_msg->callid = new_hdr;
|
|
|
break;
|
|
|
case HDR_FROM:
|
|
|
- new_msg->from = new_hdr;
|
|
|
- break;
|
|
|
+ new_msg->from = new_hdr;
|
|
|
+ break;
|
|
|
case HDR_CONTACT:
|
|
|
- new_msg->contact = new_hdr;
|
|
|
- break;
|
|
|
+ new_msg->contact = new_hdr;
|
|
|
+ break;
|
|
|
case HDR_MAXFORWARDS :
|
|
|
- new_msg->maxforwards = new_hdr;
|
|
|
- break;
|
|
|
+ new_msg->maxforwards = new_hdr;
|
|
|
+ break;
|
|
|
case HDR_ROUTE :
|
|
|
- new_msg->route = new_hdr;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if ( last_hdr )
|
|
|
- {
|
|
|
- last_hdr->next = new_hdr;
|
|
|
- last_hdr=last_hdr->next;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- last_hdr=new_hdr;
|
|
|
- new_msg->headers =new_hdr;
|
|
|
- }
|
|
|
- last_hdr->next = 0;
|
|
|
- new_msg->last_header = last_hdr;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /* clonning data lump */
|
|
|
- if (org_msg->first_line.type==SIP_REQUEST) {
|
|
|
- lump_chain = org_msg->add_rm;
|
|
|
- lump_anchor = &(new_msg->add_rm);
|
|
|
- }else{
|
|
|
- lump_chain = org_msg->repl_add_rm;
|
|
|
- lump_anchor = &(new_msg->repl_add_rm);
|
|
|
- }
|
|
|
- while (lump_chain)
|
|
|
- {
|
|
|
- lump_clone( (*lump_anchor) , lump_chain , p );
|
|
|
- /*before list*/
|
|
|
- lump_tmp = lump_chain->before;
|
|
|
- lump_anchor2 = &((*lump_anchor)->before);
|
|
|
- while ( lump_tmp )
|
|
|
- {
|
|
|
- lump_clone( (*lump_anchor2) , lump_tmp , p );
|
|
|
- lump_anchor2 = &((*lump_anchor2)->before);
|
|
|
- lump_tmp = lump_tmp->before;
|
|
|
- }
|
|
|
- /*after list*/
|
|
|
- lump_tmp = lump_chain->after;
|
|
|
- lump_anchor2 = &((*lump_anchor)->after);
|
|
|
- while ( lump_tmp )
|
|
|
- {
|
|
|
- lump_clone( (*lump_anchor2) , lump_tmp , p );
|
|
|
- lump_anchor2 = &((*lump_anchor2)->after);
|
|
|
- lump_tmp = lump_tmp->after;
|
|
|
- }
|
|
|
- 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;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
+ new_msg->route = new_hdr;
|
|
|
+ break;
|
|
|
+ }/*switch*/
|
|
|
|
|
|
-struct via_body* via_body_cloner_2( char* new_buf , char *org_buf , struct via_body *org_via, char **p)
|
|
|
-{
|
|
|
- struct via_body *new_via;
|
|
|
-
|
|
|
- /* clones the via_body structure */
|
|
|
- new_via = (struct via_body*)(*p);
|
|
|
- memcpy( new_via , org_via , sizeof( struct via_body) );
|
|
|
- (*p) += ROUND4(sizeof( struct via_body ));
|
|
|
-
|
|
|
- /* hdr (str type) */
|
|
|
- new_via->hdr.s = translate_pointer( new_buf , org_buf , org_via->hdr.s );
|
|
|
- /* name (str type) */
|
|
|
- new_via->name.s = translate_pointer( new_buf , org_buf , org_via->name.s );
|
|
|
- /* version (str type) */
|
|
|
- new_via->version.s = translate_pointer( new_buf , org_buf , org_via->version.s );
|
|
|
- /* transport (str type) */
|
|
|
- new_via->transport.s = translate_pointer( new_buf , org_buf , org_via->transport.s );
|
|
|
- /* host (str type) */
|
|
|
- new_via->host.s = translate_pointer( new_buf , org_buf , org_via->host.s );
|
|
|
- /* port_str (str type) */
|
|
|
- new_via->port_str.s = translate_pointer( new_buf , org_buf , org_via->port_str.s );
|
|
|
- /* params (str type) */
|
|
|
- new_via->params.s = translate_pointer( new_buf , org_buf , org_via->params.s );
|
|
|
- /* comment (str type) */
|
|
|
- new_via->comment.s = translate_pointer( new_buf , org_buf , org_via->comment.s );
|
|
|
-
|
|
|
-
|
|
|
- if ( org_via->param_lst )
|
|
|
- {
|
|
|
- struct via_param *vp, *new_vp, *last_new_vp;
|
|
|
- for( vp=org_via->param_lst, last_new_vp=0 ; vp ; vp=vp->next )
|
|
|
- {
|
|
|
- new_vp = (struct via_param*)(*p);
|
|
|
- memcpy( new_vp , vp , sizeof(struct via_param));
|
|
|
- (*p) += ROUND4(sizeof(struct via_param));
|
|
|
- new_vp->name.s = translate_pointer( new_buf , org_buf , vp->name.s );
|
|
|
- new_vp->value.s = translate_pointer( new_buf , org_buf , vp->value.s );
|
|
|
-
|
|
|
- if (new_vp->type==PARAM_BRANCH)
|
|
|
- new_via->branch = new_vp;
|
|
|
-
|
|
|
- if (last_new_vp)
|
|
|
- last_new_vp->next = new_vp;
|
|
|
- else
|
|
|
- new_via->param_lst = new_vp;
|
|
|
-
|
|
|
- last_new_vp = new_vp;
|
|
|
- last_new_vp->next = NULL;
|
|
|
- }
|
|
|
- new_via->last_param = new_vp;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if ( org_via->next )
|
|
|
- new_via->next = via_body_cloner_2( new_buf , org_buf , org_via->next , p );
|
|
|
-
|
|
|
- return new_via;
|
|
|
+ if ( last_hdr )
|
|
|
+ {
|
|
|
+ last_hdr->next = new_hdr;
|
|
|
+ last_hdr=last_hdr->next;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ last_hdr=new_hdr;
|
|
|
+ new_msg->headers =new_hdr;
|
|
|
+ }
|
|
|
+ last_hdr->next = 0;
|
|
|
+ new_msg->last_header = last_hdr;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* clonning data lump */
|
|
|
+ if (org_msg->first_line.type==SIP_REQUEST) {
|
|
|
+ lump_chain = org_msg->add_rm;
|
|
|
+ lump_anchor = &(new_msg->add_rm);
|
|
|
+ }else{
|
|
|
+ lump_chain = org_msg->repl_add_rm;
|
|
|
+ lump_anchor = &(new_msg->repl_add_rm);
|
|
|
+ }
|
|
|
+ while (lump_chain)
|
|
|
+ {
|
|
|
+ lump_clone( (*lump_anchor) , lump_chain , p );
|
|
|
+ /*before list*/
|
|
|
+ lump_tmp = lump_chain->before;
|
|
|
+ lump_anchor2 = &((*lump_anchor)->before);
|
|
|
+ while ( lump_tmp )
|
|
|
+ {
|
|
|
+ lump_clone( (*lump_anchor2) , lump_tmp , p );
|
|
|
+ lump_anchor2 = &((*lump_anchor2)->before);
|
|
|
+ lump_tmp = lump_tmp->before;
|
|
|
+ }
|
|
|
+ /*after list*/
|
|
|
+ lump_tmp = lump_chain->after;
|
|
|
+ lump_anchor2 = &((*lump_anchor)->after);
|
|
|
+ while ( lump_tmp )
|
|
|
+ {
|
|
|
+ lump_clone( (*lump_anchor2) , lump_tmp , p );
|
|
|
+ lump_anchor2 = &((*lump_anchor2)->after);
|
|
|
+ lump_tmp = lump_tmp->after;
|
|
|
+ }
|
|
|
+ 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;
|
|
|
}
|
|
|
|
|
|
+
|