0bfebd2f4b1417f65e5e17918b70522d6406b492
[sip-router] / modules / tm / t_hooks.c
1 /*
2  * $Id$
3  */
4
5 #include "stdlib.h"
6 #include "../../dprint.h"
7 #include "../../error.h"
8 #include "t_hooks.h"
9
10 static struct tm_callback_s* callback_array[ TMCB_END ] = { 0, 0 } ;
11 static int callback_id=0;
12
13 /* register a callback function 'f' of type 'cbt'; will be called
14    back whenever the event 'cbt' occurs in transaction module
15 */
16 int register_tmcb( tmcb_type cbt, transaction_cb f, void *param )
17 {
18         struct tm_callback_s *cbs;
19
20         if (cbt<0 || cbt>=TMCB_END ) {
21                 LOG(L_ERR, "ERROR: register_tmcb: invalid callback type: %d\n",
22                         cbt );
23                 return E_BUG;
24         }
25
26         if (!(cbs=malloc( sizeof( struct tm_callback_s)))) {
27                 LOG(L_ERR, "ERROR: register_tmcb: out of mem\n");
28                 return E_OUT_OF_MEM;
29         }
30
31         callback_id++;
32         cbs->id=callback_id;
33         cbs->callback=f;
34         cbs->next=callback_array[ cbt ];
35         cbs->param=param;
36         callback_array[ cbt ]=cbs;
37
38         return callback_id;
39 }
40
41 void callback_event( tmcb_type cbt , struct cell *trans,
42         struct sip_msg *msg, int code )
43 {
44         struct tm_callback_s *cbs;
45
46         for (cbs=callback_array[ cbt ]; cbs; cbs=cbs->next)  {
47                 DBG("DBG: callback type %d, id %d entered\n", cbt, cbs->id );
48                 cbs->callback( trans, msg, code, cbs->param );
49         }
50 }