modules/ims_qos: added patch for flow-description bug when request originates from...
[sip-router] / fix_lumps.h
1 /*
2  * here, we delete message lumps which are generated in
3  * core functions using pkg_malloc and applied to shmem
4  * requests; not doing so would result ugly memory problems
5  *
6  * I admit it is not a nice hack; -jiri 
7  *
8  * Copyright (C) 2001-2003 FhG Fokus
9  *
10  * This file is part of Kamailio, a free SIP server.
11  *
12  * Kamailio is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version
16  *
17  * Kamailio is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License 
23  * along with this program; if not, write to the Free Software 
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
25  */
26 /*!
27 * \file
28 * \brief Kamailio core :: Lump handling
29 * \ingroup core
30 * Module: \ref core
31  * here, we delete message lumps which are generated in
32  * core functions using pkg_malloc and applied to shmem
33  * requests; not doing so would result ugly memory problems
34  *
35  * I admit it is not a nice hack; -jiri 
36 */
37
38
39
40 #ifndef _FIX_LUMPS_H
41 #define _FIX_LUMPS_H
42
43
44
45 /** @brief used to delete attached via lumps from msg;
46
47    msg can be either an original pkg msg, whose Via lump I want
48    to delete before generating next branch, or a shmem-stored
49    message processed during on_reply -- then I want to
50    delete the Via lump for the same reason
51
52    the other case when I want to delete them is when a message
53    is stored in shmem for branch picking, forwarded lated and
54    Via removal is applied to the shmem-ed message
55
56    the same thing for Content-Length lumps (FIXME: this
57    should be done in a nicer way)
58 */
59 inline static void free_via_clen_lump( struct lump **list )
60 {
61         struct lump *prev_lump, *lump, *a, *foo, *next;
62
63         next=0;
64         prev_lump=0;
65         for(lump=*list;lump;lump=next) {
66                 next=lump->next;
67                 if (lump->type==HDR_VIA_T||lump->type==HDR_CONTENTLENGTH_T) {
68                         if (lump->flags & (LUMPFLAG_DUPED|LUMPFLAG_SHMEM)){
69                                 LM_CRIT("free_via_clen_lmp: lump %p, flags %x\n",
70                                                 lump, lump->flags);
71                                 /* ty to continue */
72                         }
73                         a=lump->before;
74                         while(a) {
75                                 foo=a; a=a->before;
76                                 if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
77                                         free_lump(foo);
78                                 if (!(foo->flags&LUMPFLAG_SHMEM))
79                                         pkg_free(foo);
80                         }
81                         a=lump->after;
82                         while(a) {
83                                 foo=a; a=a->after;
84                                 if (!(foo->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
85                                         free_lump(foo);
86                                 if (!(foo->flags&LUMPFLAG_SHMEM))
87                                         pkg_free(foo);
88                         }
89                         if (prev_lump) prev_lump->next = lump->next;
90                         else *list = lump->next;
91                         if (!(lump->flags&(LUMPFLAG_DUPED|LUMPFLAG_SHMEM)))
92                                 free_lump(lump);
93                         if (!(lump->flags&LUMPFLAG_SHMEM))
94                                 pkg_free(lump);
95                 } else {
96                         /* store previous position */
97                         prev_lump=lump;
98                 }
99         }
100 }
101
102 #endif