Module: kamailio
Branch: master
Commit: a70f973942621173756e0da38af23a1f54a4cdcb
URL:
https://github.com/kamailio/kamailio/commit/a70f973942621173756e0da38af23a1…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2016-11-14T10:44:11+01:00
htable: implementation of kemi callback for event routes
- done for event htable:mod-init
- new parameter 'event_callback' - set the name of the function from
kemi embedded scripting language to be executed on event. The function
receives a string parameter with event name
---
Modified: modules/htable/htable.c
---
Diff:
https://github.com/kamailio/kamailio/commit/a70f973942621173756e0da38af23a1…
Patch:
https://github.com/kamailio/kamailio/commit/a70f973942621173756e0da38af23a1…
---
diff --git a/modules/htable/htable.c b/modules/htable/htable.c
index dd29cb7..424a8e7 100644
--- a/modules/htable/htable.c
+++ b/modules/htable/htable.c
@@ -55,6 +55,8 @@ int ht_db_expires_flag = 0;
int ht_enable_dmq = 0;
int ht_timer_procs = 0;
+str ht_event_callback = STR_NULL;
+
static int htable_init_rpc(void);
/** module functions */
@@ -148,6 +150,7 @@ static param_export_t params[]={
{"db_expires", INT_PARAM, &ht_db_expires_flag},
{"enable_dmq", INT_PARAM, &ht_enable_dmq},
{"timer_procs", PARAM_INT, &ht_timer_procs},
+ {"event_callback", PARAM_STR, &ht_event_callback},
{0,0,0}
};
@@ -234,6 +237,8 @@ static int child_init(int rank)
struct run_act_ctx ctx;
int rtb, rt;
int i;
+ sr_kemi_eng_t *keng = NULL;
+ str evname = str_init("htable:mod-init");
LM_DBG("rank is (%d)\n", rank);
@@ -252,24 +257,49 @@ static int child_init(int rank)
if (rank!=PROC_INIT)
return 0;
+
+ rt = -1;
+ if(ht_event_callback.s==NULL || ht_event_callback.len<=0) {
+ rt = route_lookup(&event_rt, evname.s);
+ if(rt<0 || event_rt.rlist[rt]==NULL) {
+ rt = -1;
+ }
+ } else {
+ keng = sr_kemi_eng_get();
+ if(keng==NULL) {
+ LM_DBG("event callback (%s) set, but no cfg engine\n",
+ ht_event_callback.s);
+ goto done;
+ }
+ }
rt = route_get(&event_rt, "htable:mod-init");
- if(rt>=0 && event_rt.rlist[rt]!=NULL) {
- LM_DBG("executing event_route[htable:mod-init] (%d)\n", rt);
+ if(rt>=0 || ht_event_callback.len>0) {
+ LM_DBG("executing event_route[%s] (%d)\n", evname.s, rt);
if(faked_msg_init()<0)
return -1;
fmsg = faked_msg_next();
rtb = get_route_type();
set_route_type(REQUEST_ROUTE);
init_run_actions_ctx(&ctx);
- run_top_route(event_rt.rlist[rt], fmsg, &ctx);
- if(ctx.run_flags&DROP_R_F)
- {
+ if(rt>0) {
+ run_top_route(event_rt.rlist[rt], fmsg, &ctx);
+ } else {
+ if(keng!=NULL) {
+ if(keng->froute(fmsg, EVENT_ROUTE,
+ &ht_event_callback, &evname)<0) {
+ LM_ERR("error running event route kemi callback\n");
+ return -1;
+ }
+ }
+ }
+ if(ctx.run_flags&DROP_R_F) {
LM_ERR("exit due to 'drop' in event route\n");
return -1;
}
set_route_type(rtb);
}
+done:
return 0;
}