[sr-dev] git:master:4643c510: evapi: allow setting max number of clients via param

Daniel-Constantin Mierla miconda at gmail.com
Fri Nov 3 09:14:27 CET 2017


Module: kamailio
Branch: master
Commit: 4643c51032b8d28c1dede12792c1e1737fdb60e8
URL: https://github.com/kamailio/kamailio/commit/4643c51032b8d28c1dede12792c1e1737fdb60e8

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2017-11-03T09:07:55+01:00

evapi: allow setting max number of clients via param

- reported by GH #1290

---

Modified: src/modules/evapi/evapi_dispatch.c
Modified: src/modules/evapi/evapi_mod.c

---

Diff:  https://github.com/kamailio/kamailio/commit/4643c51032b8d28c1dede12792c1e1737fdb60e8.diff
Patch: https://github.com/kamailio/kamailio/commit/4643c51032b8d28c1dede12792c1e1737fdb60e8.patch

---

diff --git a/src/modules/evapi/evapi_dispatch.c b/src/modules/evapi/evapi_dispatch.c
index 93eef3c445..e5b11b18cf 100644
--- a/src/modules/evapi/evapi_dispatch.c
+++ b/src/modules/evapi/evapi_dispatch.c
@@ -47,6 +47,7 @@ static int _evapi_netstring_format = 1;
 
 extern str _evapi_event_callback;
 extern int _evapi_dispatcher_pid;
+extern int _evapi_max_clients;
 
 #define EVAPI_IPADDR_SIZE	64
 #define EVAPI_TAG_SIZE	64
@@ -75,9 +76,10 @@ typedef struct _evapi_msg {
 	int unicast;
 } evapi_msg_t;
 
-#define EVAPI_MAX_CLIENTS	8
+#define EVAPI_MAX_CLIENTS	_evapi_max_clients
+
 /* last one used for error handling, not a real connected client */
-static evapi_client_t _evapi_clients[EVAPI_MAX_CLIENTS+1];
+static evapi_client_t *_evapi_clients = NULL;
 
 typedef struct _evapi_evroutes {
 	int con_new;
@@ -176,7 +178,7 @@ int evapi_run_cfg_route(evapi_env_t *evenv, int rt, str *rtname)
  */
 int evapi_close_connection(int cidx)
 {
-	if(cidx<0 || cidx>=EVAPI_MAX_CLIENTS)
+	if(cidx<0 || cidx>=EVAPI_MAX_CLIENTS || _evapi_clients==NULL)
 		return -1;
 	if(_evapi_clients[cidx].connected==1
 			&& _evapi_clients[cidx].sock >= 0) {
@@ -212,7 +214,7 @@ int evapi_set_tag(sip_msg_t* msg, str* stag)
 {
 	evapi_env_t *evenv;
 
-	if(msg==NULL || stag==NULL)
+	if(msg==NULL || stag==NULL || _evapi_clients==NULL)
 		return -1;
 
 	evenv = evapi_get_msg_env(msg);
@@ -280,6 +282,10 @@ int evapi_dispatch_notify(evapi_msg_t *emsg)
 	int n;
 	int wlen;
 
+	if(_evapi_clients==NULL) {
+		return 0;
+	}
+
 	n = 0;
 	for(i=0; i<EVAPI_MAX_CLIENTS; i++) {
 		if(_evapi_clients[i].connected==1 && _evapi_clients[i].sock>=0) {
@@ -319,7 +325,11 @@ void evapi_recv_client(struct ev_loop *loop, struct ev_io *watcher, int revents)
 	char *efp;
 
 	if(EV_ERROR & revents) {
-		perror("received invalid event\n");
+		LM_ERR("received invalid event (%d)\n", revents);
+		return;
+	}
+	if(_evapi_clients==NULL) {
+		LM_ERR("no client structures\n");
 		return;
 	}
 
@@ -479,6 +489,10 @@ void evapi_accept_client(struct ev_loop *loop, struct ev_io *watcher, int revent
 	int i;
 	evapi_env_t evenv;
 
+	if(_evapi_clients==NULL) {
+		LM_ERR("no client structures\n");
+		return;
+	}
 	evapi_client = (struct ev_io*) malloc (sizeof(struct ev_io));
 	if(evapi_client==NULL) {
 		LM_ERR("no more memory\n");
@@ -601,6 +615,12 @@ int evapi_run_dispatcher(char *laddr, int lport)
 
 	LM_DBG("starting dispatcher processing\n");
 
+	_evapi_clients = (evapi_client_t*)malloc(sizeof(evapi_client_t)
+			* (EVAPI_MAX_CLIENTS+1));
+	if(_evapi_clients==NULL) {
+		LM_ERR("failed to allocate client structures\n");
+		exit(-1);
+	}
 	memset(_evapi_clients, 0, sizeof(evapi_client_t) * EVAPI_MAX_CLIENTS);
 	for(i=0; i<EVAPI_MAX_CLIENTS; i++) {
 		_evapi_clients[i].sock = -1;
@@ -872,6 +892,9 @@ int pv_get_evapi(sip_msg_t *msg, pv_param_t *param, pv_value_t *res)
 	if(param==NULL || res==NULL)
 		return -1;
 
+	if(_evapi_clients==NULL) {
+		return pv_get_null(msg, param, res);
+	}
 	evenv = evapi_get_msg_env(msg);
 
 	if(evenv==NULL || evenv->conidx<0 || evenv->conidx>=EVAPI_MAX_CLIENTS)
diff --git a/src/modules/evapi/evapi_mod.c b/src/modules/evapi/evapi_mod.c
index e5eac596ae..7673cb262e 100644
--- a/src/modules/evapi/evapi_mod.c
+++ b/src/modules/evapi/evapi_mod.c
@@ -53,6 +53,7 @@ static int   _evapi_netstring_format_param = 1;
 
 str _evapi_event_callback = STR_NULL;
 int _evapi_dispatcher_pid = -1;
+int _evapi_max_clients = 8;
 
 static tm_api_t tmb;
 
@@ -98,6 +99,7 @@ static param_export_t params[]={
 	{"bind_addr",         PARAM_STRING,   &_evapi_bind_param},
 	{"netstring_format",  INT_PARAM,   &_evapi_netstring_format_param},
 	{"event_callback",    PARAM_STR,   &_evapi_event_callback},
+	{"max_clients",       PARAM_INT,   &_evapi_max_clients},
 	{0, 0, 0}
 };
 




More information about the sr-dev mailing list