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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
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}
 };
 


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to