parser/sdp: more suggestive debug message
[sip-router] / nonsip_hooks.c
1 /* 
2  * $Id$
3  * 
4  * Copyright (C) 2006 iptelorg GmbH
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27 /*
28  * non-sip callbacks, called whenever a message with protocol != SIP/2.0
29  * is received (the message must have at least a sip like first line or
30  * else they will be dropped before this callbacks are called
31  */
32 /* 
33  * History:
34  * --------
35  *  2006-11-29  created by andrei
36  */
37
38 /*!
39  * \file
40  * \brief SIP-router core :: 
41  * \ingroup core
42  * Module: \ref core
43  */
44
45 #include "nonsip_hooks.h"
46 #include "mem/mem.h"
47
48 static struct nonsip_hook* nonsip_hooks;
49 static unsigned int nonsip_max_hooks=MAX_NONSIP_HOOKS;
50 static int last_hook_idx=0;
51
52
53
54 int init_nonsip_hooks()
55 {
56         nonsip_hooks=pkg_malloc(nonsip_max_hooks*
57                                                                         sizeof(struct nonsip_hook));
58         if (nonsip_hooks==0){
59                 goto error;
60         }
61         memset(nonsip_hooks, 0, nonsip_max_hooks*sizeof(struct nonsip_hook));
62         return 0;
63 error:
64         LOG(L_ERR, "nonsip_hooks: memory allocation failure\n");
65         return -1;
66 }
67
68
69
70 void destroy_nonsip_hooks()
71 {
72         int r;
73         
74         if (nonsip_hooks){
75                 for (r=0; r<last_hook_idx; r++){
76                         if (nonsip_hooks[r].destroy)
77                                 nonsip_hooks[r].destroy();
78                 }
79                 pkg_free(nonsip_hooks);
80                 nonsip_hooks=0;
81         }
82 }
83
84
85
86 /* allocates a new hook
87  * returns 0 on success and -1 on error */
88 int register_nonsip_msg_hook(struct nonsip_hook *h)
89 {
90         struct nonsip_hook* tmp;
91         int new_max_hooks;
92         
93         if (nonsip_max_hooks==0)
94                 goto error;
95         if (last_hook_idx >= nonsip_max_hooks){
96                 new_max_hooks=2*nonsip_max_hooks;
97                 tmp=pkg_realloc(nonsip_hooks, 
98                                 new_max_hooks*sizeof(struct nonsip_hook));
99                 if (tmp==0){
100                         goto error;
101                 }
102                 nonsip_hooks=tmp;
103                 /* init the new chunk */
104                 memset(&nonsip_hooks[last_hook_idx+1], 0, 
105                                         (new_max_hooks-nonsip_max_hooks-1)*
106                                                 sizeof(struct nonsip_hook));
107                 nonsip_max_hooks=new_max_hooks;
108         }
109         nonsip_hooks[last_hook_idx]=*h;
110         last_hook_idx++;
111         return 0;
112 error:
113         return -1;
114 }
115
116
117
118 int nonsip_msg_run_hooks(struct sip_msg* msg)
119 {
120         int r;
121         int ret;
122         
123         ret=NONSIP_MSG_DROP; /* default, if no hook installed, drop */
124         for (r=0; r<last_hook_idx; r++){
125                 ret=nonsip_hooks[r].on_nonsip_req(msg);
126                 if (ret!=NONSIP_MSG_PASS) break;
127         }
128         return ret;
129 }
130
131
132