data_lump_rpl.c
93d87145
 /*
53c7e0f1
  * Copyright (C) 2001-2003 FhG Fokus
7dd0b342
  *
6a0f4382
  * This file is part of Kamailio, a free SIP server.
7dd0b342
  *
6a0f4382
  * Kamailio is free software; you can redistribute it and/or modify
7dd0b342
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version
  *
6a0f4382
  * Kamailio is distributed in the hope that it will be useful,
7dd0b342
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
9e1ff448
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
6ec61efb
  *
93d87145
  */
1d0661db
 /*!
  * \file
88693a29
  * \brief Kamailio core :: Data lump handling
1d0661db
  * \ingroup core
  * Module: \ref core
  */
 
e1f5e142
 
7dd0b342
 
e22bbdb8
 #include <string.h>
e1f5e142
 #include "dprint.h"
 #include "mem/mem.h"
 #include "data_lump_rpl.h"
 
 
6ec61efb
 
9dbf5e57
 struct lump_rpl** add_lump_rpl2(struct sip_msg *msg, char *s, 
 									int len, int flags)
e1f5e142
 {
 	struct lump_rpl *lump = 0;
6ec61efb
 	struct lump_rpl *foo;
9dbf5e57
 	struct lump_rpl** ret;
e1f5e142
 
53c7e0f1
 	/* some checking */
6ec61efb
 	if ( (flags&(LUMP_RPL_HDR|LUMP_RPL_BODY))==(LUMP_RPL_HDR|LUMP_RPL_BODY)
36a1abc0
 	|| (flags&(LUMP_RPL_HDR|LUMP_RPL_BODY))==0 || (flags&LUMP_RPL_SHMEM) ) {
1e3aab0b
 		LM_ERR("bad flags combination (%d)!\n",flags);
6ec61efb
 		goto error;
 	}
 	if (len<=0 || s==0) {
1e3aab0b
 		LM_ERR("I won't add an empty lump!\n");
e1f5e142
 		goto error;
 	}
 
6ec61efb
 	/* build the lump */
 	lump = (struct lump_rpl*) pkg_malloc
 		( sizeof(struct lump_rpl) + ((flags&LUMP_RPL_NODUP)?0:len) );
 	if (!lump) {
1e3aab0b
 		LM_ERR("no free pkg memory !\n");
e1f5e142
 		goto error;
 	}
 
6ec61efb
 	if (flags&LUMP_RPL_NODUP) {
 		lump->text.s = s;
 	} else {
 		lump->text.s = ((char*)lump)+sizeof(struct lump_rpl);
 		memcpy( lump->text.s, s, len);
 	}
e1f5e142
 	lump->text.len = len;
6ec61efb
 	lump->flags = flags;
e1f5e142
 	lump->next = 0;
 
6ec61efb
 	/* add the lump to the msg */
 	if (!msg->reply_lump) {
e1f5e142
 		msg->reply_lump = lump;
9dbf5e57
 		ret=&msg->reply_lump;
e1f5e142
 	}else{
6ec61efb
 		if (!(flags&LUMP_RPL_BODY))
7e8d3f17
 			for(foo=msg->reply_lump;foo->next;foo=foo->next);
 		else
52df021c
 			for(foo=msg->reply_lump; ;foo=foo->next) {
 				if (foo->flags&LUMP_RPL_BODY) {
1e3aab0b
 					LM_ERR("LUMP_RPL_BODY already added!\n");
6ec61efb
 					pkg_free(lump);
 					goto error;
7e8d3f17
 				}
52df021c
 				if (foo->next==0)
 					break;
 			}
e1f5e142
 		foo->next = lump;
9dbf5e57
 		ret= &(foo->next);
e1f5e142
 	}
6ec61efb
 
9dbf5e57
 	return ret;
6ec61efb
 error:
7e8d3f17
 	return 0;
e1f5e142
 }
 
 
 
d7a3fdea
 void free_lump_rpl(struct lump_rpl* lump)
e1f5e142
 {
6ec61efb
 	if (lump) {
 		if (!((lump->flags)&LUMP_RPL_NOFREE) && ((lump->flags)&LUMP_RPL_NODUP)
e7055089
 		&& lump->text.s) {
6ec61efb
 			pkg_free(lump->text.s);
e7055089
 			lump->text.s = 0;
 		}
6ec61efb
 		pkg_free(lump);
e7055089
 		lump = 0;
6ec61efb
 	}
e1f5e142
 }
 
 
7e8d3f17
 void unlink_lump_rpl(struct sip_msg * msg, struct lump_rpl* lump)
 {
 	struct lump_rpl *foo,*prev;
 
 	/* look for the lump to be unlink */
 	foo = msg->reply_lump;
 	prev = 0;
 	while( foo && foo!=lump ) {
 		prev = foo;
 		foo = foo->next;
 	}
 
 	/* if the lump was found into the list -> unlink it */
 	if (foo) {
 		if (prev)
 			prev->next = foo->next;
 		else
 			msg->reply_lump = foo->next;
 	}
 }
 
48b79d65
 void del_nonshm_lump_rpl(struct lump_rpl** list)
36a1abc0
 {
48b79d65
         struct lump_rpl* it, *tmp;
         struct lump_rpl** pred;
 
         it = *list;
         pred = list;
 
         while(it) {
                 if (!(it->flags & LUMP_RPL_SHMEM)) {
                         tmp = it;
                         *pred = it->next;
                         it = it->next;
                         free_lump_rpl(tmp);
                         continue;
                 }
 
                 pred = &it->next;
                 it = it->next;
         }
36a1abc0
 }