[sr-dev] git:master: evapi: pass local env via sip msg structure
Daniel-Constantin Mierla
miconda at gmail.com
Mon Mar 31 09:42:05 CEST 2014
Module: sip-router
Branch: master
Commit: b78239c7b389f871b8489fddc3a5a2988be460ec
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b78239c7b389f871b8489fddc3a5a2988be460ec
Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: Mon Mar 31 09:18:22 2014 +0200
evapi: pass local env via sip msg structure
---
modules/evapi/evapi_dispatch.c | 83 ++++++++++++++++++++++------------------
modules/evapi/evapi_dispatch.h | 6 +++
2 files changed, 52 insertions(+), 37 deletions(-)
diff --git a/modules/evapi/evapi_dispatch.c b/modules/evapi/evapi_dispatch.c
index fadf886..72add89 100644
--- a/modules/evapi/evapi_dispatch.c
+++ b/modules/evapi/evapi_dispatch.c
@@ -66,15 +66,15 @@ typedef struct _evapi_evroutes {
static evapi_evroutes_t _evapi_rts;
-static evapi_env_t _evapi_env_data;
-
/**
*
*/
-void evapi_env_reset(void)
+void evapi_env_reset(evapi_env_t *evenv)
{
- memset(&_evapi_env_data, 0, sizeof(evapi_env_t));
- _evapi_env_data.conidx = -1;
+ if(evenv==0)
+ return;
+ memset(evenv, 0, sizeof(evapi_env_t));
+ evenv->conidx = -1;
}
/**
@@ -83,7 +83,6 @@ void evapi_env_reset(void)
void evapi_init_event_routes(void)
{
memset(&_evapi_rts, 0, sizeof(evapi_evroutes_t));
- evapi_env_reset();
_evapi_rts.con_new = route_get(&event_rt, "evapi:connection-new");
if (_evapi_rts.con_new < 0 || event_rt.rlist[_evapi_rts.con_new] == NULL)
@@ -99,13 +98,14 @@ void evapi_init_event_routes(void)
/**
*
*/
-int evapi_run_cfg_route(int rt)
+int evapi_run_cfg_route(evapi_env_t *evenv, int rt)
{
int backup_rt;
struct run_act_ctx ctx;
sip_msg_t *fmsg;
+ sip_msg_t tmsg;
- if(_evapi_env_data.eset==0) {
+ if(evenv==0 || evenv->eset==0) {
LM_ERR("evapi env not set\n");
return -1;
}
@@ -114,26 +114,30 @@ int evapi_run_cfg_route(int rt)
return 0;
fmsg = faked_msg_next();
+ memcpy(&tmsg, fmsg, sizeof(sip_msg_t));
+ fmsg = &tmsg;
+ evapi_set_msg_env(fmsg, evenv);
backup_rt = get_route_type();
set_route_type(REQUEST_ROUTE);
init_run_actions_ctx(&ctx);
run_top_route(event_rt.rlist[rt], fmsg, 0);
set_route_type(backup_rt);
+ evapi_set_msg_env(fmsg, NULL);
return 0;
}
/**
*
*/
-int evapi_cfg_close_connection(void)
+int evapi_cfg_close_connection(int cidx)
{
- if(_evapi_env_data.conidx<0 || _evapi_env_data.conidx>=EVAPI_MAX_CLIENTS)
+ if(cidx<0 || cidx>=EVAPI_MAX_CLIENTS)
return -1;
- if(_evapi_clients[_evapi_env_data.conidx].connected==1
- && _evapi_clients[_evapi_env_data.conidx].sock > 0) {
- close(_evapi_clients[_evapi_env_data.conidx].sock);
- _evapi_clients[_evapi_env_data.conidx].connected = 0;
- _evapi_clients[_evapi_env_data.conidx].sock = 0;
+ if(_evapi_clients[cidx].connected==1
+ && _evapi_clients[cidx].sock > 0) {
+ close(_evapi_clients[cidx].sock);
+ _evapi_clients[cidx].connected = 0;
+ _evapi_clients[cidx].sock = 0;
return 0;
}
return -2;
@@ -203,6 +207,7 @@ void evapi_recv_client(struct ev_loop *loop, struct ev_io *watcher, int revents)
char rbuffer[CLIENT_BUFFER_SIZE];
ssize_t rlen;
int i;
+ evapi_env_t evenv;
if(EV_ERROR & revents) {
perror("received invalid event\n");
@@ -227,12 +232,12 @@ void evapi_recv_client(struct ev_loop *loop, struct ev_io *watcher, int revents)
return;
}
+ evapi_env_reset(&evenv);
if(rlen == 0) {
/* client is gone */
- _evapi_env_data.eset = 1;
- _evapi_env_data.conidx = i;
- evapi_run_cfg_route(_evapi_rts.con_closed);
- evapi_env_reset();
+ evenv.eset = 1;
+ evenv.conidx = i;
+ evapi_run_cfg_route(&evenv, _evapi_rts.con_closed);
_evapi_clients[i].connected = 0;
_evapi_clients[i].sock = 0;
ev_io_stop(loop, watcher);
@@ -247,12 +252,11 @@ void evapi_recv_client(struct ev_loop *loop, struct ev_io *watcher, int revents)
LM_NOTICE("{%d} [%s:%d] - received [%.*s]\n",
i, _evapi_clients[i].src_addr, _evapi_clients[i].src_port,
(int)rlen, rbuffer);
- _evapi_env_data.conidx = i;
- _evapi_env_data.msg.s = rbuffer;
- _evapi_env_data.msg.len = rlen;
- _evapi_env_data.eset = 1;
- evapi_run_cfg_route(_evapi_rts.msg_received);
- evapi_env_reset();
+ evenv.conidx = i;
+ evenv.msg.s = rbuffer;
+ evenv.msg.len = rlen;
+ evenv.eset = 1;
+ evapi_run_cfg_route(&evenv, _evapi_rts.msg_received);
}
/**
@@ -265,6 +269,7 @@ void evapi_accept_client(struct ev_loop *loop, struct ev_io *watcher, int revent
int csock;
struct ev_io *evapi_client;
int i;
+ evapi_env_t evenv;
evapi_client = (struct ev_io*) malloc (sizeof(struct ev_io));
if(evapi_client==NULL) {
@@ -320,10 +325,10 @@ void evapi_accept_client(struct ev_loop *loop, struct ev_io *watcher, int revent
LM_DBG("new connection - pos[%d] from: [%s:%d]\n", i,
_evapi_clients[i].src_addr, _evapi_clients[i].src_port);
- _evapi_env_data.conidx = i;
- _evapi_env_data.eset = 1;
- evapi_run_cfg_route(_evapi_rts.con_new);
- evapi_env_reset();
+ evapi_env_reset(&evenv);
+ evenv.conidx = i;
+ evenv.eset = 1;
+ evapi_run_cfg_route(&evenv, _evapi_rts.con_new);
if(_evapi_clients[i].connected == 0)
return;
@@ -564,30 +569,34 @@ error:
*/
int pv_get_evapi(sip_msg_t *msg, pv_param_t *param, pv_value_t *res)
{
+ evapi_env_t *evenv;
+
if(param==NULL || res==NULL)
return -1;
- if(_evapi_env_data.conidx<0 || _evapi_env_data.conidx>=EVAPI_MAX_CLIENTS)
+ evenv = (evapi_env_t*)msg->date;
+
+ if(evenv==NULL || evenv->conidx<0 || evenv->conidx>=EVAPI_MAX_CLIENTS)
return pv_get_null(msg, param, res);
- if(_evapi_clients[_evapi_env_data.conidx].connected==0
- && _evapi_clients[_evapi_env_data.conidx].sock <= 0)
+ if(_evapi_clients[evenv->conidx].connected==0
+ && _evapi_clients[evenv->conidx].sock <= 0)
return pv_get_null(msg, param, res);
switch(param->pvn.u.isname.name.n)
{
case 0:
- return pv_get_sintval(msg, param, res, _evapi_env_data.conidx);
+ return pv_get_sintval(msg, param, res, evenv->conidx);
case 1:
- if(_evapi_env_data.msg.s==NULL)
+ if(evenv->msg.s==NULL)
return pv_get_null(msg, param, res);
- return pv_get_strval(msg, param, res, &_evapi_env_data.msg);
+ return pv_get_strval(msg, param, res, &evenv->msg);
case 2:
return pv_get_strzval(msg, param, res,
- _evapi_clients[_evapi_env_data.conidx].src_addr);
+ _evapi_clients[evenv->conidx].src_addr);
case 3:
return pv_get_sintval(msg, param, res,
- _evapi_clients[_evapi_env_data.conidx].src_port);
+ _evapi_clients[evenv->conidx].src_port);
default:
return pv_get_null(msg, param, res);
}
diff --git a/modules/evapi/evapi_dispatch.h b/modules/evapi/evapi_dispatch.h
index 4614beb..ff49946 100644
--- a/modules/evapi/evapi_dispatch.h
+++ b/modules/evapi/evapi_dispatch.h
@@ -44,4 +44,10 @@ int pv_get_evapi(sip_msg_t *msg, pv_param_t *param, pv_value_t *res);
int pv_set_evapi(sip_msg_t *msg, pv_param_t *param, int op,
pv_value_t *val);
+/* set evapi env to shortcut of hdr date - not used in faked msg */
+#define evapi_set_msg_env(_msg, _evenv) do { _msg->date=(hdr_field_t*)_evenv; } while(0)
+#define evapi_get_msg_env(_msg) ((evapi_env_t*)_msg->date)
+
+int evapi_cfg_close_connection(int cidx);
+
#endif
More information about the sr-dev
mailing list