Modifying the return value of cfg_set* functions, in order to make
[sip-router] / data_lump_rpl.c
1 /*
2  * $Id$
3  *
4  *
5  * Copyright (C) 2001-2003 FhG Fokus
6  *
7  * This file is part of ser, a free SIP server.
8  *
9  * ser is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version
13  *
14  * For a license to use the ser software under conditions
15  * other than those described here, or to purchase support for this
16  * software, please contact iptel.org by e-mail at the following addresses:
17  *    info@iptel.org
18  *
19  * ser is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License 
25  * along with this program; if not, write to the Free Software 
26  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27  *
28  * History:
29  * 2002-02-14 : created by bogdan
30  * 2003-09-11 : lump_rpl type added - LUMP_RPL_BODY & LUMP_RPL_HDR (bogdan)
31  * 2003-11-11 : build_lump_rpl merged into add_lump_rpl; types -> flags ;
32  *              flags LUMP_RPL_NODUP and LUMP_RPL_NOFREE added (bogdan)
33  * 2006-10-16   add_lump_rpl2 added: same as the old add_lump_rpl, but
34  *               returns a lump_rpl**, making a specific lump removal much
35  *               more easy (andrei)
36  */
37
38
39 #include <string.h>
40 #include "dprint.h"
41 #include "mem/mem.h"
42 #include "data_lump_rpl.h"
43
44
45
46 struct lump_rpl** add_lump_rpl2(struct sip_msg *msg, char *s, 
47                                                                         int len, int flags)
48 {
49         struct lump_rpl *lump = 0;
50         struct lump_rpl *foo;
51         struct lump_rpl** ret;
52
53         /* some checking */
54         if ( (flags&(LUMP_RPL_HDR|LUMP_RPL_BODY))==(LUMP_RPL_HDR|LUMP_RPL_BODY)
55         || (flags&(LUMP_RPL_HDR|LUMP_RPL_BODY))==0 || (flags&LUMP_RPL_SHMEM) ) {
56                 LOG(L_ERR,"ERROR:add_lump_rpl: bad flags combination (%d)!\n",flags);
57                 goto error;
58         }
59         if (len<=0 || s==0) {
60                 LOG(L_ERR,"ERROR:add_lump_rpl: I won't add an empty lump!\n");
61                 goto error;
62         }
63
64         /* build the lump */
65         lump = (struct lump_rpl*) pkg_malloc
66                 ( sizeof(struct lump_rpl) + ((flags&LUMP_RPL_NODUP)?0:len) );
67         if (!lump) {
68                 LOG(L_ERR,"ERROR:add_lump_rpl : no free pkg memory !\n");
69                 goto error;
70         }
71
72         if (flags&LUMP_RPL_NODUP) {
73                 lump->text.s = s;
74         } else {
75                 lump->text.s = ((char*)lump)+sizeof(struct lump_rpl);
76                 memcpy( lump->text.s, s, len);
77         }
78         lump->text.len = len;
79         lump->flags = flags;
80         lump->next = 0;
81
82         /* add the lump to the msg */
83         if (!msg->reply_lump) {
84                 msg->reply_lump = lump;
85                 ret=&msg->reply_lump;
86         }else{
87                 if (!(flags&LUMP_RPL_BODY))
88                         for(foo=msg->reply_lump;foo->next;foo=foo->next);
89                 else
90                         for(foo=msg->reply_lump; ;foo=foo->next) {
91                                 if (foo->flags&LUMP_RPL_BODY) {
92                                         LOG(L_ERR,"ERROR:add_lump_rpl: LUMP_RPL_BODY "
93                                                 "already added!\n");
94                                         pkg_free(lump);
95                                         goto error;
96                                 }
97                                 if (foo->next==0)
98                                         break;
99                         }
100                 foo->next = lump;
101                 ret= &(foo->next);
102         }
103
104         return ret;
105 error:
106         return 0;
107 }
108
109
110
111 void free_lump_rpl(struct lump_rpl* lump)
112 {
113         if (lump) {
114                 if (!((lump->flags)&LUMP_RPL_NOFREE) && ((lump->flags)&LUMP_RPL_NODUP)
115                 && lump->text.s)
116                         pkg_free(lump->text.s);
117                 pkg_free(lump);
118         }
119 }
120
121
122 void unlink_lump_rpl(struct sip_msg * msg, struct lump_rpl* lump)
123 {
124         struct lump_rpl *foo,*prev;
125
126         /* look for the lump to be unlink */
127         foo = msg->reply_lump;
128         prev = 0;
129         while( foo && foo!=lump ) {
130                 prev = foo;
131                 foo = foo->next;
132         }
133
134         /* if the lump was found into the list -> unlink it */
135         if (foo) {
136                 if (prev)
137                         prev->next = foo->next;
138                 else
139                         msg->reply_lump = foo->next;
140         }
141 }
142
143 void del_nonshm_lump_rpl(struct lump_rpl** list)
144 {
145         struct lump_rpl* it, *tmp;
146         struct lump_rpl** pred;
147
148         it = *list;
149         pred = list;
150
151         while(it) {
152                 if (!(it->flags & LUMP_RPL_SHMEM)) {
153                         tmp = it;
154                         *pred = it->next;
155                         it = it->next;
156                         free_lump_rpl(tmp);
157                         continue;
158                 }
159
160                 pred = &it->next;
161                 it = it->next;
162         }
163 }
164