void evrexec_process(evrexec_task_t *it, int idx) { sip_msg_t *fmsg; sr_kemi_eng_t *keng = NULL; str sidx = STR_NULL; if(it!=NULL) { fmsg = faked_msg_next(); set_route_type(LOCAL_ROUTE); if(it->wait>0) sleep_us(it->wait); keng = sr_kemi_eng_get(); if(keng==NULL) { if(it->rtid>=0 && event_rt.rlist[it->rtid]!=NULL) { run_top_route(event_rt.rlist[it->rtid], fmsg, 0); } else { LM_WARN("empty event route block [%.*s]\n", it->ename.len, it->ename.s); } } else { sidx.s = int2str(idx, &sidx.len); if(sr_kemi_route(keng, fmsg, EVENT_ROUTE, &it->ename, &sidx)<0) { LM_ERR("error running event route kemi callback\n"); } } } /* avoid exiting the process */ while(1) { sleep(3600); } }
void rpc_evr_run(rpc_t *rpc, void *c) { str evr_name = STR_NULL; str evr_data = STR_NULL; int ret = 0; int evr_id = -1; sr_kemi_eng_t *keng = NULL; sip_msg_t *fmsg = NULL; int rtbk = 0; char evr_buf[2]; ret = rpc->scan(c, "s*s", &evr_name.s, &evr_data.s); if(ret<1) { LM_ERR("failed getting the parameters"); rpc->fault(c, 500, "Invalid parameters"); return; } evr_name.len = strlen(evr_name.s); if(ret<2) { evr_buf[0] = '\0'; evr_data.s = evr_buf; evr_data.len = 0; } else { evr_data.len = strlen(evr_data.s); } pv_evr_data = &evr_data; keng = sr_kemi_eng_get(); if(keng==NULL) { evr_id = route_lookup(&event_rt, evr_name.s); if(evr_id == -1) { pv_evr_data = NULL; LM_ERR("event route not found: %.*s\n", evr_name.len, evr_name.s); rpc->fault(c, 500, "Event route not found"); return; } } else { evr_id = -1; } fmsg = faked_msg_next(); rtbk = get_route_type(); set_route_type(LOCAL_ROUTE); if(evr_id>=0) { if(event_rt.rlist[evr_id]!=NULL) { run_top_route(event_rt.rlist[evr_id], fmsg, 0); } else { LM_WARN("empty event route block [%.*s]\n", evr_name.len, evr_name.s); } } else { if(sr_kemi_route(keng, fmsg, EVENT_ROUTE, &evr_name, &evr_data)<0) { LM_ERR("error running event route kemi callback\n"); } } set_route_type(rtbk); pv_evr_data = NULL; }