Merge pull request #2326 from NGSegovia/keepalive/first_check_on_start
authorDaniel-Constantin Mierla <miconda@gmail.com>
Tue, 19 May 2020 10:56:58 +0000 (12:56 +0200)
committerGitHub <noreply@github.com>
Tue, 19 May 2020 10:56:58 +0000 (12:56 +0200)
keepalive: early start of OPTIONS checking

76 files changed:
misc/examples/kemi/kamailio-basic-kemi-lua.lua
src/core/async_task.c
src/core/config.h
src/core/dns_cache.h
src/core/dprint.c
src/core/events.h
src/core/ip_addr.h
src/core/kemi.c
src/core/str_hash.h
src/core/tcp_main.c
src/core/udp_server.c
src/modules/acc/acc.c
src/modules/acc/acc_cdr.c
src/modules/acc_diameter/diam_message.h
src/modules/auth_diameter/diameter_msg.h
src/modules/cdp/diameter_peer.c
src/modules/cfgt/cfgt_int.c
src/modules/ctl/binrpc.h
src/modules/db_mysql/my_cmd.c
src/modules/db_redis/redis_dbase.c
src/modules/dmq/bind_dmq.h
src/modules/dmq/dmq.c
src/modules/dmq/dmq.h
src/modules/dmq/dmq_funcs.c
src/modules/dmq/dmq_funcs.h
src/modules/dmq/dmqnode.c
src/modules/dmq/dmqnode.h
src/modules/dmq/message.h
src/modules/dmq/notification_peer.c
src/modules/dmq/notification_peer.h
src/modules/dmq/peer.c
src/modules/dmq/peer.h
src/modules/dmq/worker.c
src/modules/dmq/worker.h
src/modules/drouting/dr_time.c
src/modules/evapi/evapi_dispatch.c
src/modules/imc/imc_cmd.c
src/modules/jansson/jansson_funcs.c
src/modules/jsonrpcs/jsonrpcs_mod.c
src/modules/keepalive/README
src/modules/keepalive/keepalive_rpc.c
src/modules/msilo/msfuncs.c
src/modules/msilo/msilo.c
src/modules/msrp/msrp_cmap.c
src/modules/ndb_redis/redis_client.c
src/modules/outbound/api.h
src/modules/outbound/outbound_mod.c
src/modules/path/path.c
src/modules/presence/hash.c
src/modules/pua_reginfo/usrloc_cb.c
src/modules/pv/pv_time.c
src/modules/regex/regex_mod.c
src/modules/rr/record.c
src/modules/rtpengine/README
src/modules/rtpengine/doc/rtpengine_admin.xml
src/modules/sipdump/sipdump_mod.c
src/modules/sipdump/sipdump_write.c
src/modules/smsops/smsops_impl.c
src/modules/textops/textops.c
src/modules/tls/README
src/modules/tls/doc/params.xml
src/modules/tm/t_cancel.c
src/modules/tm/t_fwd.c
src/modules/tm/t_msgbuilder.c
src/modules/tm/t_reply.c
src/modules/tm/uac.c
src/modules/tmrec/tmrec_mod.c
src/modules/uid_uri_db/uid_uri_db_mod.h
src/modules/usrloc/dlist.c
src/modules/websocket/websocket.c
src/modules/websocket/ws_conn.c
src/modules/websocket/ws_conn.h
src/modules/websocket/ws_frame.h
src/modules/websocket/ws_handshake.c
src/modules/xhttp_rpc/xhttp_rpc.c
src/modules/xprint/xp_lib.c

index 4be9b13..f5906d0 100644 (file)
@@ -238,7 +238,7 @@ function ksr_route_location()
 end
 
 
--- IP authorization and user uthentication
+-- IP authorization and user authentication
 function ksr_route_auth()
        if not KSR.auth then
                return 1;
index 870241b..ee50412 100644 (file)
@@ -277,8 +277,8 @@ int async_task_run(int idx)
                        continue;
                }
                if(ptask->exec!=NULL) {
-                       LM_DBG("task executed [%p] (%p/%p)\n", ptask,
-                                       ptask->exec, ptask->param);
+                       LM_DBG("task executed [%p] (%p/%p)\n", (void*)ptask,
+                                       (void*)ptask->exec, (void*)ptask->param);
                        ptask->exec(ptask->param);
                }
                shm_free(ptask);
index 63ff8dc..e35fd6d 100644 (file)
 #define CONTENT_LENGTH "Content-Length: "
 #define CONTENT_LENGTH_LEN (sizeof(CONTENT_LENGTH)-1)
 
-#define USER_AGENT "User-Agent: " NAME \
+#define SRVAPP_SIGNATURE NAME \
                " (" VERSION " (" ARCH "/" OS_QUOTED "))"
+#define SRVAPP_SIGNATURE_LEN (sizeof(SRVAPP_SIGNATURE)-1)
+
+
+#define USER_AGENT "User-Agent: " SRVAPP_SIGNATURE
 #define USER_AGENT_LEN (sizeof(USER_AGENT)-1)
 
-#define SERVER_HDR "Server: " NAME \
-               " (" VERSION " (" ARCH "/" OS_QUOTED "))"
+#define SERVER_HDR "Server: " SRVAPP_SIGNATURE
 #define SERVER_HDR_LEN (sizeof(SERVER_HDR)-1)
 
 #define MAX_WARNING_LEN  256
index 3552e83..b09c79b 100644 (file)
@@ -70,7 +70,7 @@ enum dns_errors{
                                                      -- returned only by the dns_resolve*
                                                                  functions when called iteratively,; it
                                                                  signals the end of the ip/records list */
-                                       E_DNS_UNKNOWN /**< unkown error */,
+                                       E_DNS_UNKNOWN /**< unknown error */,
                                        E_DNS_INTERNAL_ERR /**< internal error */,
                                        E_DNS_BAD_SRV_ENTRY,
                                        E_DNS_NO_SRV /**< unresolvable srv record */,
index f75b2f1..ba5cad0 100644 (file)
@@ -521,7 +521,7 @@ static void ksr_slog_json_str_escape(str *s_in, str *s_out, int *emode)
                if (strchr("\"\\\b\f\n\r\t", s_in->s[i])) {
                        len += 2;
                } else if (s_in->s[i] < 32) {
-                       len += 5;
+                       len += 6;
                } else {
                        len++;
                }
@@ -542,9 +542,9 @@ static void ksr_slog_json_str_escape(str *s_in, str *s_out, int *emode)
        p2 = s_out->s;
        p1 = s_in->s;
        while (p1 < s_in->s + s_in->len) {
-               if ((unsigned char) *p1 > 31 && *p1 != '\"' && *p1 != '\\')
+               if ((unsigned char) *p1 > 31 && *p1 != '\"' && *p1 != '\\') {
                        *p2++ = *p1++;
-               else {
+               else {
                        *p2++ = '\\';
                        switch (token = *p1++) {
                        case '\\':
@@ -569,9 +569,10 @@ static void ksr_slog_json_str_escape(str *s_in, str *s_out, int *emode)
                                *p2++ = 't';
                                break;
                        default:
+                               /* escape and print */
                                snprintf(p2, 6, "u%04x", token);
                                p2 += 5;
-                               break;  /* escape and print */
+                               break;
                        }
                }
        }
index 6282e65..df8a313 100644 (file)
@@ -38,7 +38,7 @@
 #define SREV_NET_DATA_RECV             14
 #define SREV_NET_DATA_SEND             15
 
-#define SREV_CB_LIST_SIZE      3
+#define SREV_CB_LIST_SIZE      8
 
 typedef struct sr_event_param {
        void *data;
index 6fba6bf..bfde61c 100644 (file)
@@ -71,6 +71,7 @@ union sockaddr_union{
        struct sockaddr     s;
        struct sockaddr_in  sin;
        struct sockaddr_in6 sin6;
+       struct sockaddr_storage sas;
 };
 
 
@@ -800,11 +801,14 @@ static inline struct hostent* ip_addr2he(str* name, struct ip_addr* ip)
        static char* p_aliases[1];
        static char* p_addr[2];
        static char address[16];
+       int len;
 
        p_aliases[0]=0; /* no aliases*/
        p_addr[1]=0; /* only one address*/
        p_addr[0]=address;
-       strncpy(hostname, name->s, (name->len<256)?(name->len)+1:256);
+       len = (name->len<255)?name->len:255;
+       memcpy(hostname, name->s, len);
+       hostname[len] = '\0';
        if (ip->len>16) return 0;
        memcpy(address, ip->u.addr, ip->len);
 
index 8a77c22..c156216 100644 (file)
@@ -1057,6 +1057,25 @@ static int sr_kemi_core_is_method_prack(sip_msg_t *msg)
        return sr_kemi_core_is_method_type(msg, METHOD_PRACK);
 }
 
+
+/**
+ *
+ */
+static int sr_kemi_core_is_method_message(sip_msg_t *msg)
+{
+       return sr_kemi_core_is_method_type(msg, METHOD_MESSAGE);
+}
+
+
+/**
+ *
+ */
+static int sr_kemi_core_is_method_kdmq(sip_msg_t *msg)
+{
+       return sr_kemi_core_is_method_type(msg, METHOD_KDMQ);
+}
+
+
 /**
  *
  */
@@ -1740,6 +1759,16 @@ static sr_kemi_t _sr_kemi_core[] = {
                { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
                        SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
        },
+       { str_init(""), str_init("is_MESSAGE"),
+               SR_KEMIP_BOOL, sr_kemi_core_is_method_message,
+               { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+                       SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+       },
+       { str_init(""), str_init("is_KDMQ"),
+               SR_KEMIP_BOOL, sr_kemi_core_is_method_kdmq,
+               { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
+                       SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+       },
        { str_init(""), str_init("is_UDP"),
                SR_KEMIP_BOOL, sr_kemi_core_is_proto_udp,
                { SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
index 8755a62..263bb3c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 iptelorg GmbH 
+ * Copyright (C) 2006 iptelorg GmbH
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -70,17 +70,17 @@ inline static int str_hash_alloc(struct str_hash_table* ht, int size)
 inline static void str_hash_init(struct str_hash_table* ht)
 {
        int r;
-       
+
        for (r=0; r<ht->size; r++) clist_init(&(ht->table[r]), next, prev);
 }
 
 
 
-inline static void str_hash_add(struct str_hash_table* ht, 
+inline static void str_hash_add(struct str_hash_table* ht,
                                                                struct str_hash_entry* e)
 {
        int h;
-       
+
        h=get_hash1_raw(e->key.s, e->key.len) % ht->size;
        clist_insert(&ht->table[h], e, next, prev);
 }
@@ -92,7 +92,7 @@ inline static struct str_hash_entry* str_hash_get(struct str_hash_table* ht,
 {
        int h;
        struct str_hash_entry* e;
-       
+
        h=get_hash1_raw(key, len) % ht->size;
        clist_foreach(&ht->table[h], e, next){
                if ((e->key.len==len) && (memcmp(e->key.s, key, len)==0))
@@ -101,6 +101,30 @@ inline static struct str_hash_entry* str_hash_get(struct str_hash_table* ht,
        return 0;
 }
 
+inline static void str_hash_case_add(struct str_hash_table* ht,
+                                                               struct str_hash_entry* e)
+{
+       int h;
+
+       h=get_hash1_case_raw(e->key.s, e->key.len) % ht->size;
+       clist_insert(&ht->table[h], e, next, prev);
+}
+
+
+
+inline static struct str_hash_entry* str_hash_case_get(struct str_hash_table* ht,
+                                                                       const char* key, int len)
+{
+       int h;
+       struct str_hash_entry* e;
+
+       h=get_hash1_case_raw(key, len) % ht->size;
+       clist_foreach(&ht->table[h], e, next){
+               if ((e->key.len==len) && (strncasecmp(e->key.s, key, len)==0))
+                       return e;
+       }
+       return 0;
+}
 
 #define str_hash_del(e) clist_rm(e, next, prev)
 
index 89e3b56..fd5a644 100644 (file)
@@ -3606,7 +3606,7 @@ inline static int handle_tcp_child(struct tcp_child* tcp_c, int fd_i)
                                                        _wbufq_non_empty(tcpconn) )){
                                if (unlikely(TICKS_GE(t, tcpconn->wbuf_q.wr_timeout))){
                                        LM_DBG("wr. timeout on CONN_RELEASE for %p refcnt= %d\n",
-                                                       tcpconn, atomic_get(&tcpconn->refcnt));
+                                                       (void*)tcpconn, atomic_get(&tcpconn->refcnt));
                                        /* timeout */
                                        if (unlikely(tcpconn->state==S_CONN_CONNECT)){
 #ifdef USE_DST_BLACKLIST
index 2b874ab..b718895 100644 (file)
@@ -428,9 +428,9 @@ int udp_rcv_loop()
        static char buf [BUF_SIZE+1];
 #endif
        char *tmp;
-       union sockaddr_union* from;
-       unsigned int fromlen;
-       struct receive_info ri;
+       union sockaddr_union* fromaddr;
+       unsigned int fromaddrlen;
+       receive_info_t rcvi;
        sr_event_param_t evp = {0};
 #define UDP_RCV_PRINTBUF_SIZE 512
 #define UDP_RCV_PRINT_LEN 100
@@ -440,17 +440,18 @@ int udp_rcv_loop()
        int l;
 
 
-       from=(union sockaddr_union*) pkg_malloc(sizeof(union sockaddr_union));
-       if (from==0){
+       fromaddr=(union sockaddr_union*) pkg_malloc(sizeof(union sockaddr_union));
+       if (fromaddr==0){
                PKG_MEM_ERROR;
                goto error;
        }
-       memset(from, 0 , sizeof(union sockaddr_union));
-       ri.bind_address=bind_address; /* this will not change, we do it only once*/
-       ri.dst_port=bind_address->port_no;
-       ri.dst_ip=bind_address->address;
-       ri.proto=PROTO_UDP;
-       ri.proto_reserved1=ri.proto_reserved2=0;
+       memset(fromaddr, 0,sizeof(union sockaddr_union));
+       memset(&rcvi, 0, sizeof(receive_info_t));
+       /* these do not change, set only once*/
+       rcvi.bind_address=bind_address;
+       rcvi.dst_port=bind_address->port_no;
+       rcvi.dst_ip=bind_address->address;
+       rcvi.proto=PROTO_UDP;
 
        /* initialize the config framework */
        if (cfg_child_init()) goto error;
@@ -463,9 +464,9 @@ int udp_rcv_loop()
                        goto error;
                }
 #endif
-               fromlen=sockaddru_len(bind_address->su);
-               len=recvfrom(bind_address->socket, buf, BUF_SIZE, 0, &from->s,
-                                                                                       &fromlen);
+               fromaddrlen=sizeof(union sockaddr_union);
+               len=recvfrom(bind_address->socket, buf, BUF_SIZE, 0,
+                               (struct sockaddr*)fromaddr, &fromaddrlen);
                if (len==-1){
                        if (errno==EAGAIN){
                                LM_DBG("packet with bad checksum received\n");
@@ -476,6 +477,11 @@ int udp_rcv_loop()
                                continue; /* goto skip;*/
                        else goto error;
                }
+               if(fromaddrlen != (unsigned int)sockaddru_len(bind_address->su)) {
+                       LM_ERR("ignoring data - unexpected from addr len: %u != %u\n",
+                                       fromaddrlen, (unsigned int)sockaddru_len(bind_address->su));
+                       continue;
+               }
                /* we must 0-term the messages, receive_msg expects it */
                buf[len]=0; /* no need to save the previous char */
 
@@ -498,16 +504,16 @@ int udp_rcv_loop()
                        LM_DBG("received on udp socket: (%d/%d/%d) [[%.*s]]\n",
                                        j, i, len, j, printbuf);
                }
-               ri.src_su=*from;
-               su2ip_addr(&ri.src_ip, from);
-               ri.src_port=su_getport(from);
+               rcvi.src_su=*fromaddr;
+               su2ip_addr(&rcvi.src_ip, fromaddr);
+               rcvi.src_port=su_getport(fromaddr);
 
                if(unlikely(sr_event_enabled(SREV_NET_DGRAM_IN)))
                {
                        void *sredp[3];
                        sredp[0] = (void*)buf;
                        sredp[1] = (void*)(&len);
-                       sredp[2] = (void*)(&ri);
+                       sredp[2] = (void*)(&rcvi);
                        evp.data = (void*)sredp;
                        if(sr_event_exec(SREV_NET_DGRAM_IN, &evp)<0) {
                                /* data handled by callback - continue to next packet */
@@ -517,8 +523,8 @@ int udp_rcv_loop()
 #ifndef NO_ZERO_CHECKS
                if (!unlikely(sr_event_enabled(SREV_STUN_IN)) || (unsigned char)*buf != 0x00) {
                        if (len<MIN_UDP_PACKET) {
-                               tmp=ip_addr2a(&ri.src_ip);
-                               LM_DBG("probing packet received from %s %d\n", tmp, htons(ri.src_port));
+                               tmp=ip_addr2a(&rcvi.src_ip);
+                               LM_DBG("probing packet received from %s %d\n", tmp, htons(rcvi.src_port));
                                continue;
                        }
                }
@@ -530,8 +536,8 @@ int udp_rcv_loop()
                        continue;
                }
 #endif
-               if (ri.src_port==0){
-                       tmp=ip_addr2a(&ri.src_ip);
+               if (rcvi.src_port==0){
+                       tmp=ip_addr2a(&rcvi.src_ip);
                        LM_INFO("dropping 0 port packet from %s\n", tmp);
                        continue;
                }
@@ -540,24 +546,24 @@ int udp_rcv_loop()
                cfg_update();
                if (unlikely(sr_event_enabled(SREV_STUN_IN)) && (unsigned char)*buf == 0x00) {
                        /* stun_process_msg releases buf memory if necessary */
-                       if ((stun_process_msg(buf, len, &ri)) != 0) {
+                       if ((stun_process_msg(buf, len, &rcvi)) != 0) {
                                continue; /* some error occurred */
                        }
                } else {
                        /* receive_msg must free buf too!*/
-                       receive_msg(buf, len, &ri);
+                       receive_msg(buf, len, &rcvi);
                }
 
        /* skip: do other stuff */
 
        }
        /*
-       if (from) pkg_free(from);
+       if (fromaddr) pkg_free(fromaddr);
        return 0;
        */
 
 error:
-       if (from) pkg_free(from);
+       if (fromaddr) pkg_free(fromaddr);
        return -1;
 }
 
index 9879e69..91a12f6 100644 (file)
@@ -195,7 +195,7 @@ int acc_log_request( struct sip_msg *rq)
        int m;
        int o;
        int i;
-       struct tm *t;
+       struct tm t;
        double dtime;
 
        /* get default values */
@@ -262,12 +262,12 @@ int acc_log_request( struct sip_msg *rq)
                                acc_time_attr.s, dtime, log_msg);
        } else if(acc_time_mode==3 || acc_time_mode==4) {
                if(acc_time_mode==3) {
-                       t = localtime(&acc_env.ts);
+                       localtime_r(&acc_env.ts, &t);
                } else {
-                       t = gmtime(&acc_env.ts);
+                       gmtime_r(&acc_env.ts, &t);
                }
                if(strftime(acc_time_format_buf, ACC_TIME_FORMAT_SIZE,
-                                       acc_time_format, t)<=0) {
+                                       acc_time_format, &t)<=0) {
                        acc_time_format_buf[0] = '\0';
                }
                LM_GEN2(log_facility, log_level, "%.*stimestamp=%lu;%s=%s%s",
@@ -412,7 +412,7 @@ int acc_db_request( struct sip_msg *rq)
        int n;
        int i;
        int o;
-       struct tm *t;
+       struct tm t;
        double dtime;
 
        /* formated database columns */
@@ -435,12 +435,12 @@ int acc_db_request( struct sip_msg *rq)
                i++;
        } else if(acc_time_mode==3 || acc_time_mode==4) {
                if(acc_time_mode==3) {
-                       t = localtime(&acc_env.ts);
+                       localtime_r(&acc_env.ts, &t);
                } else {
-                       t = gmtime(&acc_env.ts);
+                       gmtime_r(&acc_env.ts, &t);
                }
                if(strftime(acc_time_format_buf, ACC_TIME_FORMAT_SIZE,
-                                       acc_time_format, t)<=0) {
+                                       acc_time_format, &t)<=0) {
                        acc_time_format_buf[0] = '\0';
                }
                VAL_STRING(db_vals+(m++)) = acc_time_format_buf;
index 7b05244..d591921 100644 (file)
@@ -141,7 +141,7 @@ static int db_write_cdr( struct dlg_cell* dialog,
        long long_val;
        double double_val;
        char * end;
-       struct tm *t;
+       struct tm t;
        char cdr_time_format_buf[MAX_CDR_CORE][TIME_STR_BUFFER_SIZE];
 
        if(acc_cdrs_table.len<=0)
@@ -191,9 +191,9 @@ static int db_write_cdr( struct dlg_cell* dialog,
                                }
                                if (acc_time_mode==4) {
                                        VAL_TYPE(db_cdr_vals+i)=DB1_STRING;
-                                       t = gmtime(&timeval_val.tv_sec);
+                                       gmtime_r(&timeval_val.tv_sec, &t);
                                        /* Convert time_t structure to format accepted by the database */
-                                       if (strftime(cdr_time_format_buf[i], TIME_STR_BUFFER_SIZE, TIME_STRING_FORMAT, t) <= 0) {
+                                       if (strftime(cdr_time_format_buf[i], TIME_STR_BUFFER_SIZE, TIME_STRING_FORMAT, &t) <= 0) {
                                                cdr_time_format_buf[i][0] = '\0';
                                        }
 
index 9051f0f..7ca1caf 100644 (file)
@@ -26,8 +26,8 @@
  * - Module: \ref acc
  */
 
-#ifndef _AAA_DIAMETER_MSG_H
-#define _AAA_DIAMETER_MSG_H
+#ifndef _ACC_DIAM_MESSAGE_H_
+#define _ACC_DIAM_MESSAGE_H_
 
 #include "../../core/str.h"
 #include "../../core/mem/mem.h"
index 7ab5a8c..e8e7eea 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 
 
-#ifndef _AAA_DIAMETER_MSG_H
-#define _AAA_DIAMETER_MSG_H
+#ifndef _AUTH_DIAM_MESSAGE_H_
+#define _AUTH_DIAM_MESSAGE_H_
 
 #include "../../core/str.h"
 #include "../../core/mem/mem.h"
index 043d4f3..38386be 100644 (file)
@@ -257,7 +257,7 @@ int diameter_peer_start(int blocking)
 
        /* fork receiver for unknown peers */
        seed = random();
-       pid = fork_process(1001+k,"cdp_receiver_peer_unkown",1);
+       pid = fork_process(1001+k,"cdp_receiver_peer_unknown",1);
 
        if (pid==-1){
                LM_CRIT("init_diameter_peer(): Error on fork() for unknown peer receiver!\n");
index 382d696..c47a1ce 100644 (file)
@@ -19,6 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  *
  */
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <sys/stat.h>
 #include <dirent.h>
index 29e0667..3642a00 100644 (file)
                                                                  more bytes available */
 #define E_BINRPC_EOP           -5      /* end of packet reached */
 #define E_BINRPC_NOTINIT       -6  /* parse ctx not initialized */
-#define E_BINRPC_TYPE          -7  /* unkown type for record, or requested
+#define E_BINRPC_TYPE          -7  /* unknown type for record, or requested
                                                                   type doesn't match record type */
 #define E_BINRPC_RECORD                -8  /* bad record (unexpected, bad struct a.s.o)*/
 #define E_BINRPC_BUG           -9  /* internal error, bug */
index c12d649..23dfb27 100644 (file)
@@ -476,7 +476,7 @@ err:
 static inline void update_field(MYSQL_BIND *param, db_fld_t* fld)
 {
        struct my_fld* fp;      /* field payload */
-       struct tm* t;
+       struct tm t;
 
        fp = DB_GET_PAYLOAD(fld);
 
@@ -524,13 +524,13 @@ static inline void update_field(MYSQL_BIND *param, db_fld_t* fld)
                        break;
 
                case DB_DATETIME:
-                       t = gmtime(&fld->v.time);
-                       fp->time.second = t->tm_sec;
-                       fp->time.minute = t->tm_min;
-                       fp->time.hour = t->tm_hour;
-                       fp->time.day = t->tm_mday;
-                       fp->time.month = t->tm_mon + 1;
-                       fp->time.year = t->tm_year + 1900;
+                       gmtime_r(&fld->v.time, &t);
+                       fp->time.second = t.tm_sec;
+                       fp->time.minute = t.tm_min;
+                       fp->time.hour = t.tm_hour;
+                       fp->time.day = t.tm_mday;
+                       fp->time.month = t.tm_mon + 1;
+                       fp->time.year = t.tm_year + 1900;
                        break;
 
                case DB_NONE:
index f3b7c1f..ea1a6aa 100644 (file)
@@ -81,6 +81,7 @@ static int db_redis_val2str(const db_val_t *v, str *_str) {
     const char *s;
     const str *tmpstr;
     int vtype = VAL_TYPE(v);
+    struct tm _time;
     _str->s = NULL;
     _str->len = 32; // default for numbers
 
@@ -144,7 +145,8 @@ static int db_redis_val2str(const db_val_t *v, str *_str) {
             LM_DBG("converting datetime value %ld to str\n", VAL_TIME(v));
             _str->s = (char*)pkg_malloc(_str->len);
             if (!_str->s) goto memerr;
-            strftime(_str->s, _str->len, "%Y-%m-%d %H:%M:%S", localtime(&(VAL_TIME(v))));
+            localtime_r(&(VAL_TIME(v)), &_time);
+            strftime(_str->s, _str->len, "%Y-%m-%d %H:%M:%S", &_time);
             _str->len = strlen(_str->s);
             break;
         case DB1_DOUBLE:
index 8b4694e..78a09cb 100644 (file)
@@ -16,8 +16,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
index 4fa61d9..509c42c 100644 (file)
 #include "notification_peer.h"
 #include "dmqnode.h"
 
-static int mod_init(void);
-static int child_init(int);
-static void destroy(void);
-
 MODULE_VERSION
 
-int startup_time = 0;
-int pid = 0;
+int dmq_startup_time = 0;
+int dmq_pid = 0;
 
 /* module parameters */
-int num_workers = DEFAULT_NUM_WORKERS;
-int worker_usleep = 0;
+int dmq_num_workers = DEFAULT_NUM_WORKERS;
+int dmq_worker_usleep = 0;
 str dmq_server_address = {0, 0};
 str dmq_server_socket = {0, 0};
-struct sip_uri dmq_server_uri;
+sip_uri_t dmq_server_uri = {0};
 
 str dmq_notification_address = {0, 0};
-int multi_notify = 0;
-struct sip_uri dmq_notification_uri;
-int ping_interval = 60;
+int dmq_multi_notify = 0;
+sip_uri_t dmq_notification_uri = {0};
+int dmq_ping_interval = 60;
 
 /* TM bind */
-struct tm_binds tmb;
+struct tm_binds tmb = {0};
 /* SL API structure */
-sl_api_t slb;
+sl_api_t slb = {0};
 
 /** module variables */
 str dmq_request_method = str_init("KDMQ");
-dmq_worker_t *workers = NULL;
-dmq_peer_list_t *peer_list = 0;
+dmq_worker_t *dmq_workers = NULL;
+dmq_peer_list_t *dmq_peer_list = 0;
 /* the list of dmq servers */
-dmq_node_list_t *node_list = NULL;
-// the dmq module is a peer itself for receiving notifications regarding nodes
+dmq_node_list_t *dmq_node_list = NULL;
+/* dmq module is a peer itself for receiving notifications regarding nodes */
 dmq_peer_t *dmq_notification_peer = NULL;
 
 /** module functions */
@@ -109,12 +105,12 @@ static cmd_export_t cmds[] = {
 };
 
 static param_export_t params[] = {
-       {"num_workers", INT_PARAM, &num_workers},
-       {"ping_interval", INT_PARAM, &ping_interval},
+       {"num_workers", INT_PARAM, &dmq_num_workers},
+       {"ping_interval", INT_PARAM, &dmq_ping_interval},
        {"server_address", PARAM_STR, &dmq_server_address},
        {"notification_address", PARAM_STR, &dmq_notification_address},
-       {"multi_notify", INT_PARAM, &multi_notify},
-       {"worker_usleep", INT_PARAM, &worker_usleep},
+       {"multi_notify", INT_PARAM, &dmq_multi_notify},
+       {"worker_usleep", INT_PARAM, &dmq_worker_usleep},
        {0, 0, 0}
 };
 
@@ -184,15 +180,15 @@ static int mod_init(void)
        }
 
        /* load peer list - the list containing the module callbacks for dmq */
-       peer_list = init_peer_list();
-       if(peer_list == NULL) {
+       dmq_peer_list = init_peer_list();
+       if(dmq_peer_list == NULL) {
                LM_ERR("cannot initialize peer list\n");
                return -1;
        }
 
        /* load the dmq node list - the list containing the dmq servers */
-       node_list = init_dmq_node_list();
-       if(node_list == NULL) {
+       dmq_node_list = init_dmq_node_list();
+       if(dmq_node_list == NULL) {
                LM_ERR("cannot initialize node list\n");
                return -1;
        }
@@ -203,7 +199,7 @@ static int mod_init(void)
        }
 
        /* register worker processes - add one because of the ping process */
-       register_procs(num_workers);
+       register_procs(dmq_num_workers);
 
        /* check server_address and notification_address are not empty and correct */
        if(parse_uri(dmq_server_address.s, dmq_server_address.len, &dmq_server_uri)
@@ -230,12 +226,12 @@ static int mod_init(void)
        }
 
        /* allocate workers array */
-       workers = shm_malloc(num_workers * sizeof(dmq_worker_t));
-       if(workers == NULL) {
+       dmq_workers = shm_malloc(dmq_num_workers * sizeof(dmq_worker_t));
+       if(dmq_workers == NULL) {
                LM_ERR("error in shm_malloc\n");
                return -1;
        }
-       memset(workers, 0, num_workers * sizeof(dmq_worker_t));
+       memset(dmq_workers, 0, dmq_num_workers * sizeof(dmq_worker_t));
 
        dmq_init_callback_done = shm_malloc(sizeof(int));
        if(!dmq_init_callback_done) {
@@ -253,16 +249,16 @@ static int mod_init(void)
                return -1;
        }
 
-       startup_time = (int)time(NULL);
+       dmq_startup_time = (int)time(NULL);
 
        /**
         * add the ping timer
         * it pings the servers once in a while so that we know which failed
         */
-       if(ping_interval < MIN_PING_INTERVAL) {
-               ping_interval = MIN_PING_INTERVAL;
+       if(dmq_ping_interval < MIN_PING_INTERVAL) {
+               dmq_ping_interval = MIN_PING_INTERVAL;
        }
-       if(register_timer(ping_servers, 0, ping_interval) < 0) {
+       if(register_timer(ping_servers, 0, dmq_ping_interval) < 0) {
                LM_ERR("cannot register timer callback\n");
                return -1;
        }
@@ -278,8 +274,8 @@ static int child_init(int rank)
        int i, newpid;
 
        if(rank == PROC_INIT) {
-               for(i = 0; i < num_workers; i++) {
-                       if (init_worker(&workers[i]) < 0) {
+               for(i = 0; i < dmq_num_workers; i++) {
+                       if (init_worker(&dmq_workers[i]) < 0) {
                                LM_ERR("failed to init struct for worker[%d]\n", i);
                                return -1;
                        }
@@ -289,7 +285,7 @@ static int child_init(int rank)
 
        if(rank == PROC_MAIN) {
                /* fork worker processes */
-               for(i = 0; i < num_workers; i++) {
+               for(i = 0; i < dmq_num_workers; i++) {
                        LM_DBG("starting worker process %d\n", i);
                        newpid = fork_process(PROC_RPC, "DMQ WORKER", 0);
                        if(newpid < 0) {
@@ -299,7 +295,7 @@ static int child_init(int rank)
                                /* child - this will loop forever */
                                worker_loop(i);
                        } else {
-                               workers[i].pid = newpid;
+                               dmq_workers[i].pid = newpid;
                        }
                }
                /* notification_node - the node from which the Kamailio instance
@@ -309,9 +305,9 @@ static int child_init(int rank)
                 * a master in this architecture
                 */
                if(dmq_notification_address.s) {
-                       notification_node =
+                       dmq_notification_node =
                                        add_server_and_notify(&dmq_notification_address);
-                       if(!notification_node) {
+                       if(!dmq_notification_node) {
                                LM_WARN("cannot retrieve initial nodelist from %.*s\n",
                                                STR_FMT(&dmq_notification_address));
                        }
@@ -323,7 +319,7 @@ static int child_init(int rank)
                return 0;
        }
 
-       pid = my_pid();
+       dmq_pid = my_pid();
        return 0;
 }
 
@@ -333,10 +329,10 @@ static int child_init(int rank)
 static void destroy(void)
 {
        /* TODO unregister dmq node, free resources */
-       if(dmq_notification_address.s && notification_node && self_node) {
-               LM_DBG("unregistering node %.*s\n", STR_FMT(&self_node->orig_uri));
-               self_node->status = DMQ_NODE_DISABLED;
-               request_nodelist(notification_node, 1);
+       if(dmq_notification_address.s && dmq_notification_node && dmq_self_node) {
+               LM_DBG("unregistering node %.*s\n", STR_FMT(&dmq_self_node->orig_uri));
+               dmq_self_node->status = DMQ_NODE_DISABLED;
+               request_nodelist(dmq_notification_node, 1);
        }
        if(dmq_server_socket.s) {
                pkg_free(dmq_server_socket.s);
@@ -349,7 +345,7 @@ static void destroy(void)
 static void dmq_rpc_list_nodes(rpc_t *rpc, void *c)
 {
        void *h;
-       dmq_node_t *cur = node_list->nodes;
+       dmq_node_t *cur = dmq_node_list->nodes;
        char ip[IP6_MAX_STR_SIZE + 1];
 
        while(cur) {
index 411e41a..dbf5cfb 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #define DEFAULT_NUM_WORKERS 2
 #define MIN_PING_INTERVAL 5
 
-extern int num_workers;
-extern int worker_usleep;
-extern dmq_worker_t *workers;
+extern int dmq_num_workers;
+extern int dmq_worker_usleep;
+extern dmq_worker_t *dmq_workers;
 extern dmq_peer_t *dmq_notification_peer;
 extern str dmq_server_address;
-extern dmq_peer_list_t *peer_list;
+extern dmq_peer_list_t *dmq_peer_list;
 extern str dmq_request_method;
 extern str dmq_server_socket;
-extern struct sip_uri dmq_server_uri;
+extern sip_uri_t dmq_server_uri;
 extern str dmq_notification_address;
-extern int multi_notify;
-extern struct sip_uri dmq_notification_uri;
+extern int dmq_multi_notify;
+extern sip_uri_t dmq_notification_uri;
 /* sl and tm */
 extern struct tm_binds tmb;
 extern sl_api_t slb;
index 27afbc4..f9fb5c7 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 dmq_peer_t *register_dmq_peer(dmq_peer_t *peer)
 {
        dmq_peer_t *new_peer;
-       if(!peer_list) {
+       if(!dmq_peer_list) {
                LM_ERR("peer list not initialized\n");
                return NULL;
        }
-       lock_get(&peer_list->lock);
-       if(search_peer_list(peer_list, peer)) {
+       lock_get(&dmq_peer_list->lock);
+       if(search_peer_list(dmq_peer_list, peer)) {
                LM_ERR("peer already exists: %.*s %.*s\n", peer->peer_id.len,
                                peer->peer_id.s, peer->description.len, peer->description.s);
-               lock_release(&peer_list->lock);
+               lock_release(&dmq_peer_list->lock);
                return NULL;
        }
-       new_peer = add_peer(peer_list, peer);
-       lock_release(&peer_list->lock);
+       new_peer = add_peer(dmq_peer_list, peer);
+       lock_release(&dmq_peer_list->lock);
        return new_peer;
 }
 
@@ -124,8 +124,8 @@ int is_from_remote_node(sip_msg_t *msg)
 
        ip = &msg->rcv.src_ip;
 
-       lock_get(&node_list->lock);
-       node = node_list->nodes;
+       lock_get(&dmq_node_list->lock);
+       node = dmq_node_list->nodes;
 
        while(node) {
                if(!node->local && ip_addr_cmp(ip, &node->ip_address)) {
@@ -135,7 +135,7 @@ int is_from_remote_node(sip_msg_t *msg)
                node = node->next;
        }
 done:
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        return result;
 }
 
@@ -153,8 +153,8 @@ int bcast_dmq_message1(dmq_peer_t *peer, str *body, dmq_node_t *except,
 {
        dmq_node_t *node;
 
-       lock_get(&node_list->lock);
-       node = node_list->nodes;
+       lock_get(&dmq_node_list->lock);
+       node = dmq_node_list->nodes;
        while(node) {
                /* we do not send the message to the following:
                 *   - the except node
@@ -175,10 +175,10 @@ int bcast_dmq_message1(dmq_peer_t *peer, str *body, dmq_node_t *except,
                }
                node = node->next;
        }
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        return 0;
 error:
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        return -1;
 }
 
@@ -295,13 +295,13 @@ int ki_dmq_send_message(sip_msg_t *msg, str *peer_str, str *to_str,
                        goto error;
                }
        }
-       dmq_node_t *to_dmq_node = find_dmq_node_uri(node_list, to_str);
+       dmq_node_t *to_dmq_node = find_dmq_node_uri(dmq_node_list, to_str);
        if(!to_dmq_node) {
                LM_ERR("cannot find dmq_node: %.*s\n", to_str->len, to_str->s);
                goto error;
        }
        if(dmq_send_message(destination_peer, body_str, to_dmq_node,
-                          &notification_callback, 1, ct_str)
+                          &dmq_notification_resp_callback, 1, ct_str)
                        < 0) {
                LM_ERR("cannot send dmq message\n");
                goto error;
@@ -366,7 +366,7 @@ int ki_dmq_bcast_message(sip_msg_t *msg, str *peer_str, str *body_str,
                        goto error;
                }
        }
-       if(bcast_dmq_message(destination_peer, body_str, 0, &notification_callback,
+       if(bcast_dmq_message(destination_peer, body_str, 0, &dmq_notification_resp_callback,
                           1, ct_str) < 0) {
                LM_ERR("cannot send dmq message\n");
                goto error;
@@ -425,8 +425,8 @@ int ki_dmq_t_replicate_mode(struct sip_msg *msg, int mode)
                set_force_socket(msg, sock);
        }
 
-       lock_get(&node_list->lock);
-       node = node_list->nodes;
+       lock_get(&dmq_node_list->lock);
+       node = dmq_node_list->nodes;
        while(node) {
                /* we do not send the message to the following:
                 *   - ourself
@@ -456,10 +456,10 @@ int ki_dmq_t_replicate_mode(struct sip_msg *msg, int mode)
 
                node = node->next;
        }
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        return 0;
 error:
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        return -1;
 }
 
@@ -504,15 +504,15 @@ void ping_servers(unsigned int ticks, void *param)
        int ret;
        LM_DBG("ping_servers\n");
 
-       if(!node_list->nodes
-                       || (node_list->nodes->local && !node_list->nodes->next)) {
+       if(!dmq_node_list->nodes
+                       || (dmq_node_list->nodes->local && !dmq_node_list->nodes->next)) {
                LM_DBG("node list is empty - attempt to rebuild from notification "
                           "address\n");
                *dmq_init_callback_done = 0;
                if(dmq_notification_address.s) {
-                       notification_node =
+                       dmq_notification_node =
                                        add_server_and_notify(&dmq_notification_address);
-                       if(!notification_node) {
+                       if(!dmq_notification_node) {
                                LM_ERR("cannot retrieve initial nodelist from %.*s\n",
                                                STR_FMT(&dmq_notification_address));
                        }
@@ -528,7 +528,7 @@ void ping_servers(unsigned int ticks, void *param)
                return;
        }
        ret = bcast_dmq_message1(dmq_notification_peer, body, NULL,
-                       &notification_callback, 1, &notification_content_type, 1);
+                       &dmq_notification_resp_callback, 1, &dmq_notification_content_type, 1);
        pkg_free(body->s);
        pkg_free(body);
        if(ret < 0) {
index a9c6da5..4cec59d 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
index 4ed926f..2eb3b1c 100644 (file)
@@ -26,8 +26,8 @@
 #include "dmqnode.h"
 #include "dmq.h"
 
-dmq_node_t *self_node;
-dmq_node_t *notification_node;
+dmq_node_t *dmq_self_node;
+dmq_node_t *dmq_notification_node;
 
 /* name */
 str dmq_node_status_str = str_init("status");
@@ -240,7 +240,7 @@ dmq_node_t *find_dmq_node_uri(dmq_node_list_t *list, str *uri)
 
 dmq_node_t *find_dmq_node_uri2(str *uri)
 {
-       return find_dmq_node_uri(node_list, uri);
+       return find_dmq_node_uri(dmq_node_list, uri);
 }
 
 /**
index fb0a9dc..45cac60 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
@@ -59,7 +59,7 @@ typedef struct dmq_node_list
 } dmq_node_list_t;
 
 extern str dmq_node_status_str;
-extern dmq_node_list_t *node_list;
+extern dmq_node_list_t *dmq_node_list;
 
 dmq_node_list_t *init_dmq_node_list();
 dmq_node_t *build_dmq_node(str *uri, int shm);
@@ -80,7 +80,7 @@ int set_dmq_node_params(dmq_node_t *node, param_t *params);
 str *dmq_get_status_str(int status);
 int build_node_str(dmq_node_t *node, char *buf, int buflen);
 
-extern dmq_node_t *self_node;
-extern dmq_node_t *notification_node;
+extern dmq_node_t *dmq_self_node;
+extern dmq_node_t *dmq_notification_node;
 
 #endif
index d47e421..d31386c 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
index 769b0e3..4cb44c0 100644 (file)
@@ -27,8 +27,8 @@
 #define MAXDMQURILEN 255
 #define MAXDMQHOSTS 30
 
-str notification_content_type = str_init("text/plain");
-dmq_resp_cback_t notification_callback = {&notification_resp_callback_f, 0};
+str dmq_notification_content_type = str_init("text/plain");
+dmq_resp_cback_t dmq_notification_resp_callback = {&notification_resp_callback_f, 0};
 
 int *dmq_init_callback_done = 0;
 
@@ -41,7 +41,7 @@ int add_notification_peer()
        dmq_peer_t not_peer;
 
        memset(&not_peer, 0, sizeof(dmq_peer_t));
-       not_peer.callback = dmq_notification_callback;
+       not_peer.callback = dmq_notification_callback_f;
        not_peer.init_callback = NULL;
        not_peer.description.s = "notification_peer";
        not_peer.description.len = 17;
@@ -53,14 +53,14 @@ int add_notification_peer()
                goto error;
        }
        /* add itself to the node list */
-       self_node = add_dmq_node(node_list, &dmq_server_address);
-       if(!self_node) {
+       dmq_self_node = add_dmq_node(dmq_node_list, &dmq_server_address);
+       if(!dmq_self_node) {
                LM_ERR("error adding self node\n");
                goto error;
        }
        /* local node - only for self */
-       self_node->local = 1;
-       self_node->status = DMQ_NODE_ACTIVE;
+       dmq_self_node->local = 1;
+       dmq_self_node->status = DMQ_NODE_ACTIVE;
        return 0;
 error:
        return -1;
@@ -296,8 +296,8 @@ dmq_node_t *add_server_and_notify(str *paddr)
        * o process list
        **********/
 
-       if(!multi_notify) {
-               pfirst = add_dmq_node(node_list, paddr);
+       if(!dmq_multi_notify) {
+               pfirst = add_dmq_node(dmq_node_list, paddr);
        } else {
                /**********
                * o init data area
@@ -319,8 +319,8 @@ dmq_node_t *add_server_and_notify(str *paddr)
                for(index = 0; index < host_cnt; index++) {
                        pstr->s = puri_list[index];
                        pstr->len = strlen(puri_list[index]);
-                       if(!find_dmq_node_uri(node_list, pstr)) { // check for duplicates
-                               pnode = add_dmq_node(node_list, pstr);
+                       if(!find_dmq_node_uri(dmq_node_list, pstr)) { // check for duplicates
+                               pnode = add_dmq_node(dmq_node_list, pstr);
                                if(pnode && !pfirst) {
                                        pfirst = pnode;
                                }
@@ -436,11 +436,11 @@ int run_init_callbacks()
 {
        dmq_peer_t *crt;
 
-       if(peer_list == 0) {
+       if(dmq_peer_list == 0) {
                LM_WARN("peer list is null\n");
                return 0;
        }
-       crt = peer_list->peers;
+       crt = dmq_peer_list->peers;
        while(crt) {
                if(crt->init_callback) {
                        crt->init_callback();
@@ -454,7 +454,7 @@ int run_init_callbacks()
 /**
  * @brief dmq notification callback
  */
-int dmq_notification_callback(
+int dmq_notification_callback_f(
                struct sip_msg *msg, peer_reponse_t *resp, dmq_node_t *dmq_node)
 {
        int nodes_recv;
@@ -474,14 +474,14 @@ int dmq_notification_callback(
                        maxforwards--;
                }
        }
-       nodes_recv = extract_node_list(node_list, msg);
+       nodes_recv = extract_node_list(dmq_node_list, msg);
        LM_DBG("received %d new or changed nodes\n", nodes_recv);
        response_body = build_notification_body();
        if(response_body == NULL) {
                LM_ERR("no response body\n");
                goto error;
        }
-       resp->content_type = notification_content_type;
+       resp->content_type = dmq_notification_content_type;
        resp->reason = dmq_200_rpl;
        resp->body = *response_body;
        resp->resp_code = 200;
@@ -490,8 +490,8 @@ int dmq_notification_callback(
        if(nodes_recv > 0 && maxforwards > 0) {
                /* maxforwards is set to 0 so that the message is will not be in a spiral */
                bcast_dmq_message(dmq_notification_peer, response_body, 0,
-                               &notification_callback, maxforwards,
-                               &notification_content_type);
+                               &dmq_notification_resp_callback, maxforwards,
+                               &dmq_notification_content_type);
        }
        pkg_free(response_body);
        if(dmq_init_callback_done && !*dmq_init_callback_done) {
@@ -533,8 +533,8 @@ str *build_notification_body()
                return NULL;
        }
        /* we add each server to the body - each on a different line */
-       lock_get(&node_list->lock);
-       cur_node = node_list->nodes;
+       lock_get(&dmq_node_list->lock);
+       cur_node = dmq_node_list->nodes;
        while(cur_node) {
                if (cur_node->local || cur_node->status == DMQ_NODE_ACTIVE) {
                        LM_DBG("body_len = %d - clen = %d\n", body->len, clen);
@@ -550,11 +550,11 @@ str *build_notification_body()
                }
                cur_node = cur_node->next;
        }
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        body->len = clen;
        return body;
 error:
-       lock_release(&node_list->lock);
+       lock_release(&dmq_node_list->lock);
        pkg_free(body->s);
        pkg_free(body);
        return NULL;
@@ -573,7 +573,8 @@ int request_nodelist(dmq_node_t *node, int forward)
                return -1;
        }
        ret = bcast_dmq_message1(dmq_notification_peer, body, NULL,
-                       &notification_callback, forward, &notification_content_type, 1);
+                       &dmq_notification_resp_callback, forward,
+                       &dmq_notification_content_type, 1);
        pkg_free(body->s);
        pkg_free(body);
        return ret;
@@ -591,8 +592,8 @@ int notification_resp_callback_f(
        LM_DBG("notification_callback_f triggered [%p %d %p]\n", msg, code, param);
        if(code == 200) {
                /* be sure that the node that answered is in active state */
-               update_dmq_node_status(node_list, node, DMQ_NODE_ACTIVE);
-               nodes_recv = extract_node_list(node_list, msg);
+               update_dmq_node_status(dmq_node_list, node, DMQ_NODE_ACTIVE);
+               nodes_recv = extract_node_list(dmq_node_list, msg);
                LM_DBG("received %d new or changed nodes\n", nodes_recv);
                if(dmq_init_callback_done && !*dmq_init_callback_done) {
                        *dmq_init_callback_done = 1;
@@ -601,18 +602,18 @@ int notification_resp_callback_f(
        } else if(code == 408) {
                if(STR_EQ(node->orig_uri, dmq_notification_address)) {
                        LM_ERR("not deleting notification_peer\n");
-                       update_dmq_node_status(node_list, node, DMQ_NODE_PENDING);      
+                       update_dmq_node_status(dmq_node_list, node, DMQ_NODE_PENDING);  
                        return 0;
                }
                if (node->status == DMQ_NODE_DISABLED) {
                        /* deleting node - the server did not respond */
                        LM_ERR("deleting server %.*s because of failed request\n",
                                STR_FMT(&node->orig_uri));
-                       ret = del_dmq_node(node_list, node);
+                       ret = del_dmq_node(dmq_node_list, node);
                        LM_DBG("del_dmq_node returned %d\n", ret);
                } else {
                        /* put the node in disabled state and wait for the next ping before deleting it */
-                       update_dmq_node_status(node_list, node, DMQ_NODE_DISABLED);
+                       update_dmq_node_status(dmq_node_list, node, DMQ_NODE_DISABLED);
                }
        }
        return 0;
index 2f0ac42..e913445 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #include "peer.h"
 #include "dmq_funcs.h"
 
-extern str notification_content_type;
+extern str dmq_notification_content_type;
 extern int *dmq_init_callback_done;
 
 int add_notification_peer();
-int dmq_notification_callback(
+int dmq_notification_callback_f(
                struct sip_msg *msg, peer_reponse_t *resp, dmq_node_t *dmq_node);
 int extract_node_list(dmq_node_list_t *update_list, struct sip_msg *msg);
 str *build_notification_body();
@@ -44,7 +44,7 @@ int build_node_str(dmq_node_t *node, char *buf, int buflen);
  * this is acomplished by a KDMQ request
  * KDMQ notification@server:port
  * node - the node to send to
- * forward - flag that tells if the node receiving the message is allowed to 
+ * forward - flag that tells if the node receiving the message is allowed to
  *           forward the request to its own list
  */
 int request_nodelist(dmq_node_t *node, int forward);
@@ -53,6 +53,6 @@ dmq_node_t *add_server_and_notify(str *server_address);
 /* helper functions */
 extern int notification_resp_callback_f(
                struct sip_msg *msg, int code, dmq_node_t *node, void *param);
-extern dmq_resp_cback_t notification_callback;
+extern dmq_resp_cback_t dmq_notification_resp_callback;
 
 #endif
index 7c2bf29..8311d7a 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  *
  */
  */
 dmq_peer_list_t *init_peer_list()
 {
-       dmq_peer_list_t *peer_list;
-       peer_list = shm_malloc(sizeof(dmq_peer_list_t));
-       if(peer_list == NULL) {
+       dmq_peer_list_t *dmq_peer_list;
+       dmq_peer_list = shm_malloc(sizeof(dmq_peer_list_t));
+       if(dmq_peer_list == NULL) {
                LM_ERR("no more shm\n");
                return NULL;
        }
-       memset(peer_list, 0, sizeof(dmq_peer_list_t));
-       lock_init(&peer_list->lock);
-       return peer_list;
+       memset(dmq_peer_list, 0, sizeof(dmq_peer_list_t));
+       lock_init(&dmq_peer_list->lock);
+       return dmq_peer_list;
 }
 
 /**
@@ -90,7 +90,7 @@ dmq_peer_t *find_peer(str peer_id)
 {
        dmq_peer_t foo_peer;
        foo_peer.peer_id = peer_id;
-       return search_peer_list(peer_list, &foo_peer);
+       return search_peer_list(dmq_peer_list, &foo_peer);
 }
 
 /**
index d4feba7..40a0c82 100644 (file)
@@ -61,7 +61,7 @@ typedef struct dmq_peer_list
        int count;
 } dmq_peer_list_t;
 
-extern dmq_peer_list_t *peer_list;
+extern dmq_peer_list_t *dmq_peer_list;
 
 dmq_peer_list_t *init_peer_list();
 dmq_peer_t *search_peer_list(dmq_peer_list_t *peer_list, dmq_peer_t *peer);
index a2ccc63..43d76da 100644 (file)
@@ -79,14 +79,14 @@ void worker_loop(int id)
        int not_parsed;
        dmq_node_t *dmq_node = NULL;
 
-       worker = &workers[id];
+       worker = &dmq_workers[id];
        for(;;) {
-               if(worker_usleep <= 0) {
+               if(dmq_worker_usleep <= 0) {
                        LM_DBG("dmq_worker [%d %d] getting lock\n", id, my_pid());
                        lock_get(&worker->lock);
                        LM_DBG("dmq_worker [%d %d] lock acquired\n", id, my_pid());
                } else {
-                       sleep_us(worker_usleep);
+                       sleep_us(dmq_worker_usleep);
                }
 
                /* remove from queue until empty */
@@ -105,7 +105,7 @@ void worker_loop(int id)
                                if(parse_from_header(current_job->msg) < 0) {
                                        LM_ERR("bad sip message or missing From hdr\n");
                                } else {
-                                       dmq_node = find_dmq_node_uri(node_list,
+                                       dmq_node = find_dmq_node_uri(dmq_node_list,
                                                        &((struct to_body *)current_job->msg->from->parsed)
                                                                         ->uri);
                                }
@@ -185,26 +185,26 @@ int add_dmq_job(struct sip_msg *msg, dmq_peer_t *peer)
        new_job.f = peer->callback;
        new_job.msg = cloned_msg;
        new_job.orig_peer = peer;
-       if(!num_workers) {
+       if(!dmq_num_workers) {
                LM_ERR("error in add_dmq_job: no workers spawned\n");
                goto error;
        }
-       if(!workers[0].queue) {
+       if(!dmq_workers[0].queue) {
                LM_ERR("workers not (yet) initialized\n");
                goto error;
        }
        /* initialize the worker with the first one */
-       worker = workers;
+       worker = dmq_workers;
        /* search for an available worker, or, if not possible,
         * for the least busy one */
-       for(i = 0; i < num_workers; i++) {
-               if(job_queue_size(workers[i].queue) == 0) {
-                       worker = &workers[i];
+       for(i = 0; i < dmq_num_workers; i++) {
+               if(job_queue_size(dmq_workers[i].queue) == 0) {
+                       worker = &dmq_workers[i];
                        found_available = 1;
                        break;
-               } else if(job_queue_size(workers[i].queue)
+               } else if(job_queue_size(dmq_workers[i].queue)
                                  < job_queue_size(worker->queue)) {
-                       worker = &workers[i];
+                       worker = &dmq_workers[i];
                }
        }
        if(!found_available) {
@@ -215,7 +215,7 @@ int add_dmq_job(struct sip_msg *msg, dmq_peer_t *peer)
        if(job_queue_push(worker->queue, &new_job) < 0) {
                goto error;
        }
-       if(worker_usleep <= 0) {
+       if(dmq_worker_usleep <= 0) {
                lock_release(&worker->lock);
        }
        return 0;
@@ -232,7 +232,7 @@ error:
 int init_worker(dmq_worker_t *worker)
 {
        memset(worker, 0, sizeof(*worker));
-       if(worker_usleep <= 0) {
+       if(dmq_worker_usleep <= 0) {
                lock_init(&worker->lock);
                // acquire the lock for the first time - so that dmq_worker_loop blocks
                lock_get(&worker->lock);
index cb4fce8..bca4c35 100644 (file)
@@ -15,8 +15,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
index 0af2e51..9e71ce7 100644 (file)
@@ -130,10 +130,12 @@ int ac_tm_fill(ac_tm_p _atp, struct tm *_tm)
 
 int ac_tm_set_time(ac_tm_p _atp, time_t _t)
 {
+       struct tm _tm;
        if(!_atp)
                return -1;
        _atp->time = _t;
-       return ac_tm_fill(_atp, localtime(&_t));
+       localtime_r(&_t, &_tm);
+       return ac_tm_fill(_atp, &_tm);
 }
 
 int ac_get_mweek(struct tm *_tm)
index 52e8f1d..e16d4c5 100644 (file)
@@ -606,7 +606,7 @@ void evapi_recv_notify(struct ev_loop *loop, struct ev_io *watcher, int revents)
                return;
        }
 
-       LM_DBG("received [%p] [%.*s] (%d)\n", emsg,
+       LM_DBG("received [%p] [%.*s] (%d)\n", (void*)emsg,
                        emsg->data.len, emsg->data.s, emsg->data.len);
        evapi_dispatch_notify(emsg);
        shm_free(emsg);
@@ -774,8 +774,8 @@ int _evapi_relay(str *evdata, str *ctag, int unicast)
                emsg->unicast = unicast;
        }
 
-       LM_DBG("sending [%p] [%.*s] (%d)\n", emsg, emsg->data.len, emsg->data.s,
-                       emsg->data.len);
+       LM_DBG("sending [%p] [%.*s] (%d)\n", (void*)emsg, emsg->data.len,
+                       emsg->data.s, emsg->data.len);
        if(_evapi_notify_sockets[1]!=-1) {
                len = write(_evapi_notify_sockets[1], &emsg, sizeof(evapi_msg_t*));
                if(len<=0) {
@@ -785,7 +785,7 @@ int _evapi_relay(str *evdata, str *ctag, int unicast)
                }
        } else {
                cfg_update();
-               LM_DBG("dispatching [%p] [%.*s] (%d)\n", emsg,
+               LM_DBG("dispatching [%p] [%.*s] (%d)\n", (void*)emsg,
                                emsg->data.len, emsg->data.s, emsg->data.len);
                if(evapi_dispatch_notify(emsg) == 0) {
                        shm_free(emsg);
@@ -855,7 +855,7 @@ int evapi_relay(str *event, str *data)
                LM_ERR("failed to pass the pointer to evapi dispatcher\n");
                return -1;
        }
-       LM_DBG("sent [%p] [%.*s] (%d)\n", sbuf, sbuf->len, sbuf->s, sbuf->len);
+       LM_DBG("sent [%p] [%.*s] (%d)\n", (void*)sbuf, sbuf->len, sbuf->s, sbuf->len);
        return 0;
 }
 #endif
index 757b17b..bf68967 100644 (file)
@@ -960,7 +960,8 @@ int imc_handle_members(struct sip_msg* msg, imc_cmd_t *cmd,
        }
 
        p = imc_body_buf;
-       left = sizeof(imc_body_buf);
+       imc_body_buf[IMC_BUF_SIZE - 1] = '\0';
+       left = sizeof(imc_body_buf) - 1;
 
        memcpy(p, MEMBERS, sizeof(MEMBERS) - 1);
        p += sizeof(MEMBERS) - 1;
@@ -975,22 +976,22 @@ int imc_handle_members(struct sip_msg* msg, imc_cmd_t *cmd,
                }
 
                if (imp->flags & IMC_MEMBER_OWNER) {
-                       if (left < 1) goto overrun;
+                       if (left < 2) goto overrun;
                        *p++ = '*';
                        left--;
                } else if (imp->flags & IMC_MEMBER_ADMIN) {
-                       if (left < 1) goto overrun;
+                       if (left < 2) goto overrun;
                        *p++ = '~';
                        left--;
                }
 
                name = format_uri(imp->uri);
-               if (left < name->len) goto overrun;
+               if (left < name->len + 1) goto overrun;
                strncpy(p, name->s, name->len);
                p += name->len;
                left -= name->len;
 
-               if (left < 1) goto overrun;
+               if (left < 2) goto overrun;
                *p++ = '\n';
                left--;
 
index 7eceae4..a5f8b1f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "../../core/mod_fix.h"
 #include "../../core/lvalue.h"
+#include "../../core/str.h"
 
 #include "jansson_path.h"
 #include "jansson_funcs.h"
 
 int janssonmod_get_helper(sip_msg_t* msg, str *path_s, str *src_s, pv_spec_t *dst_pv)
 {
-
+       char c;
        pv_value_t dst_val;
        json_t* json = NULL;
        json_error_t parsing_error;
-
+       STR_VTOZ(src_s->s[src_s->len], c);
        json = json_loads(src_s->s, JSON_REJECT_DUPLICATES, &parsing_error);
-
+       STR_ZTOV(src_s->s[src_s->len], c);
        if(!json) {
                ERR("failed to parse json: %.*s\n", src_s->len, src_s->s);
                ERR("json error at line %d, col %d: %s\n",
@@ -98,7 +99,7 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
        str type_s;
        str value_s;
        str path_s;
-
+       char c;
        pv_spec_t* result_pv;
        pv_value_t result_val;
 
@@ -126,14 +127,11 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
                result_val.rs.len = strlen("{}");
        }
 
-/*
-       ALERT("type is: %.*s\n", type_s.len, type_s.s);
-       ALERT("path is: %.*s\n", path_s.len, path_s.s);
-       ALERT("value is: %.*s\n", value_s.len, value_s.s);
-       ALERT("result is: %.*s\n", result_val.rs.len, result_val.rs.s);
-*/
 
-       char* result = result_val.rs.s;
+       LM_DBG("type is: %.*s\n", type_s.len, type_s.s);
+       LM_DBG("path is: %.*s\n", path_s.len, path_s.s);
+       LM_DBG("value is: %.*s\n", value_s.len, value_s.s);
+       LM_DBG("result is: %.*s\n", result_val.rs.len, result_val.rs.s);
 
        json_t* result_json = NULL;
        json_t* value = NULL;
@@ -143,14 +141,18 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
 
        /* check the type */
        if(STR_EQ_STATIC(type_s, "object") || STR_EQ_STATIC(type_s, "obj")){
+               STR_VTOZ(value_s.s[value_s.len], c);
                value = json_loads(value_s.s, JSON_REJECT_DUPLICATES, &parsing_error);
+               STR_ZTOV(value_s.s[value_s.len], c);
                if(value && !json_is_object(value)) {
                        ERR("value to add is not an object - \"%s\"\n", path_s.s);
                        goto fail;
                }
 
        }else if(STR_EQ_STATIC(type_s, "array")) {
+               STR_VTOZ(value_s.s[value_s.len], c);
                value = json_loads(value_s.s, JSON_REJECT_DUPLICATES, &parsing_error);
+               STR_ZTOV(value_s.s[value_s.len], c);
                if(value && !json_is_array(value)) {
                        ERR("value to add is not an array - \"%s\"\n", path_s.s);
                        goto fail;
@@ -211,9 +213,9 @@ int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
        }
 
        char* path = path_s.s;
-
-       result_json = json_loads(result, JSON_REJECT_DUPLICATES, &parsing_error);
-
+       STR_VTOZ(result_val.rs.s[result_val.rs.len], c);
+       result_json = json_loads(result_val.rs.s, JSON_REJECT_DUPLICATES, &parsing_error);
+       STR_ZTOV(result_val.rs.s[result_val.rs.len], c);
        if(!result_json) {
                ERR("result has json error at line %d: %s\n",
                                parsing_error.line, parsing_error.text);
@@ -240,6 +242,7 @@ fail:
 
 int janssonmod_array_size(struct sip_msg* msg, char* path_in, char* src_in, char* dst)
 {
+       char c;
        str src_s;
        str path_s;
        pv_spec_t *dst_pv;
@@ -259,9 +262,9 @@ int janssonmod_array_size(struct sip_msg* msg, char* path_in, char* src_in, char
 
        json_t* json = NULL;
        json_error_t parsing_error;
-
+       STR_VTOZ(src_s.s[src_s.len], c);
        json = json_loads(src_s.s, JSON_REJECT_DUPLICATES, &parsing_error);
-
+       STR_ZTOV(src_s.s[src_s.len], c);
        if(!json) {
                ERR("json error at line %d: %s\n",
                                parsing_error.line, parsing_error.text);
index 5843d87..b07ae80 100644 (file)
@@ -470,7 +470,7 @@ static srjson_t* jsonrpc_print_value(jsonrpc_ctx_t* ctx, char fmt, va_list* ap)
        srjson_t *nj = NULL;
        char buf[JSONRPC_PRINT_VALUE_BUF_LEN];
        time_t dt;
-       struct tm* t;
+       struct tm t;
        str *sp;
 
        switch(fmt) {
@@ -488,9 +488,9 @@ static srjson_t* jsonrpc_print_value(jsonrpc_ctx_t* ctx, char fmt, va_list* ap)
                break;
        case 't':
                dt = va_arg(*ap, time_t);
-               t = gmtime(&dt);
+               gmtime_r(&dt, &t);
                if (strftime(buf, JSONRPC_PRINT_VALUE_BUF_LEN,
-                               "%Y%m%dT%H:%M:%S", t) == 0) {
+                               "%Y%m%dT%H:%M:%S", &t) == 0) {
                        LM_ERR("Error while converting time\n");
                        return NULL;
                }
index 4437803..f69641e 100644 (file)
@@ -56,7 +56,7 @@ Yasin CANER
         1. Available Functions
 
               1.1. add_destination(uri, owner, flags, ping_interval,
-                      [callback, [user_attr]])
+                      [statechanged_clb, response_clb, [user_attr]])
 
               1.2. Examples
 
@@ -324,8 +324,8 @@ Chapter 2. Developer Guide
 
    1. Available Functions
 
-        1.1. add_destination(uri, owner, flags, ping_interval, [callback,
-                [user_attr]])
+        1.1. add_destination(uri, owner, flags, ping_interval,
+                [statechanged_clb, response_clb, [user_attr]])
 
         1.2. Examples
 
@@ -338,13 +338,13 @@ Chapter 2. Developer Guide
 
 1. Available Functions
 
-   1.1. add_destination(uri, owner, flags, ping_interval, [callback,
-          [user_attr]])
+   1.1. add_destination(uri, owner, flags, ping_interval,
+          [statechanged_clb, response_clb, [user_attr]])
 
    1.2. Examples
 
-1.1.  add_destination(uri, owner, flags, ping_interval, [callback,
-[user_attr]])
+1.1.  add_destination(uri, owner, flags, ping_interval, [statechanged_clb,
+response_clb, [user_attr]])
 
    This function registers a new destination to monitor. Monitoring of the
    destination starts as soon as it returns with success (0 value).
@@ -361,7 +361,7 @@ Chapter 2. Developer Guide
      * flags (integer) - destination flags (unused for now, use 0 value)
      * ping_interval (integer) - Pinging interval in seconds for this
        destination
-     * callback (ka_statechanged_f, optional) - callback function,
+     * statechanged_clb (ka_statechanged_f, optional) - callback function,
        executed on destination's state change.
        The callback function is of type void (*ka_statechanged_f)(str
        *uri, int state, void *user_attr);. Use NULL to set no callback.
@@ -370,9 +370,17 @@ Chapter 2. Developer Guide
             waiting first ping replies or timeout)
           + 1 - destination is UP
           + 2 - destination is DOWN
-     * user_attr (void * pointer, optional) - If callback function is
-       setup, this parameter will be forwarded to it, as last parameter.
-       Use NULL to set no user_attr parameter.
+     * response_clb (ka_response_f, optional) - callback function,
+       executed on destination's response provided.
+       The callback function is of type void (*ka_response_f)(str *uri,
+       struct tmcb_params *ps, void *user_attr);. Use NULL to set no
+       callback.
+       ps is a pack structure with all params passed to callback function.
+       Defined in t_hooks.h
+     * user_attr (void * pointer, optional) - If any callback function is
+       setup, this parameter will be forwarded to it (or both callbacks in
+       both are defined), as last parameter. Use NULL to set no user_attr
+       parameter.
 
    Returned values:
      * 0 if ok
@@ -395,17 +403,18 @@ if (bind_keepalive( &ka_api ) != 0) {
 }
 ...
 ...
-/* callback function */
-void my_callback(str uri, int state, void *user_attr) {
-
+/* callback function (on state changed) */
+void my_state_changed_clb(str uri, int state, void *user_attr) {
         printf("%.*s new state is: %d\n", uri.len, uri.str, state)
 }
 
-/* register a new destination */
-str dest  = str_init("sip:192.168.10.21:5060");
-str owner = str_init("mymodule");
+/* callback function (on each response received) */
+void my_response_clb(str *uri, struct tmcb_params *ps, void *user_attr) {
+        printf("response [%d] from %.*s\n", ps->code, uri.len, uri.str)
+}
 
-if (ka_api.add_destination(dest, owner, 0, 60, my_callback, NULL) != 0) {
+if (ka_api.add_destination(dest, owner, 0, 60, my_state_changed_clb,
+                                my_response_clb, NULL) != 0) {
     LM_ERR("can't add destination\n");
     goto error;
 }
index 8d9a84a..e6a64db 100644 (file)
@@ -78,24 +78,20 @@ static void keepalive_rpc_list(rpc_t *rpc, void *ctx)
 {
        void *sub;
        ka_dest_t *dest;
-       char *_ctime;
-       char *_utime;
-       char *_dtime;
+       char t_buf[26] = {0};
 
        for(dest = ka_destinations_list->first; dest != NULL; dest = dest->next) {
                rpc->add(ctx, "{", &sub);
 
                rpc->struct_add(sub, "SS", "uri", &dest->uri, "owner", &dest->owner);
 
-               _ctime = ctime(&dest->last_checked);
-               _ctime[strlen(_ctime) - 1] = '\0';
-               rpc->struct_add(sub, "s", "last checked", _ctime);
-               _utime = ctime(&dest->last_up);
-               _utime[strlen(_utime) - 1] = '\0';
-               rpc->struct_add(sub, "s", "last up", _utime);
-               _dtime = ctime(&dest->last_down);
-               _dtime[strlen(_dtime) - 1] = '\0';
-               rpc->struct_add(sub, "s", "last down", _dtime);
+               ctime_r(&dest->last_checked, t_buf);
+               rpc->struct_add(sub, "s", "last checked", t_buf);
+               ctime_r(&dest->last_up, t_buf);
+               rpc->struct_add(sub, "s", "last up", t_buf);
+               ctime_r(&dest->last_down, t_buf);
+               rpc->struct_add(sub, "s", "last down", t_buf);
+               rpc->struct_add(sub, "d", "state", (int) dest->state);
        }
 
        return;
index 5262a81..dd2f476 100644 (file)
@@ -93,24 +93,24 @@ int m_apo_escape(char* src, int slen, char* dst, int dlen)
   */
 int timetToSipDateStr(time_t date, char* buf, int bufLen)
 {
-       struct tm *gmt;
+       struct tm gmt;
        char* dayArray[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
        char* monthArray[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
        int len = 0;
 
-       gmt = gmtime(&date);
+       gmtime_r(&date, &gmt);
        /* In RFC 3261 the format is always GMT and in the string form like
         * "Wkday, Day Month Year HOUR:MIN:SEC GMT"
         * "Mon, 19 Feb 2007 18:42:27 GMT"
         */
        len = snprintf(buf,bufLen,"Date: %s, %02d %s %d %02d:%02d:%02d GMT\r\n",
-               dayArray[gmt->tm_wday],
-               gmt->tm_mday,
-               monthArray[gmt->tm_mon],
-               1900 + gmt->tm_year,
-               gmt->tm_hour,
-               gmt->tm_min,
-               gmt->tm_sec
+               dayArray[gmt.tm_wday],
+               gmt.tm_mday,
+               monthArray[gmt.tm_mon],
+               1900 + gmt.tm_year,
+               gmt.tm_hour,
+               gmt.tm_min,
+               gmt.tm_sec
                );
 
        /* snprintf returns number of chars it should have printed, so you 
@@ -243,7 +243,7 @@ error:
        return -1;
 }
 
-/** build MESSAGE body --- add incoming time and 'from' 
+/** build MESSAGE body --- add incoming time and 'from'
  *
  * expects - max buf len of the resulted body in body->len
  *         - body->s MUST be allocated
@@ -252,11 +252,12 @@ error:
 int m_build_body(str *body, time_t date, str msg, time_t sdate)
 {
        char *p;
-       
+       char t_buf[26] = {0};
+
        if(!body || !(body->s) || body->len <= 0 || msg.len <= 0
                        || date < 0 || msg.len < 0 || (46+msg.len > body->len) )
                goto error;
-       
+
        p = body->s;
 
        if(ms_add_date!=0)
@@ -265,28 +266,28 @@ int m_build_body(str *body, time_t date, str msg, time_t sdate)
                {
                        memcpy(p, "[Reminder message - ", 20);
                        p += 20;
-               
-                       memcpy(p, ctime(&sdate), 24);
+                       ctime_r(&sdate, t_buf);
+                       memcpy(p, t_buf, 24);
                        p += 24;
 
                        *p++ = ']';
                } else {
                        memcpy(p, "[Offline message - ", 19);
                        p += 19;
-       
-                       memcpy(p, ctime(&date), 24);
+                       ctime_r(&date, t_buf);
+                       memcpy(p, t_buf, 24);
                        p += 24;
 
                        *p++ = ']';
                }
                *p++ = ' ';
        }
-       
+
        memcpy(p, msg.s, msg.len);
        p += msg.len;
 
        body->len = p - body->s;
-       
+
        return 0;
 error:
        return -1;
index bf5758d..0bf53ec 100644 (file)
@@ -1337,6 +1337,7 @@ void m_send_ontimer(unsigned int ticks, void *param)
        str str_vals[4], hdr_str, body_str;
        str extra_hdrs_str = {0};
        time_t stime;
+       char t_buf[26] = {0};
 
        if(ms_reminder.s==NULL)
        {
@@ -1384,14 +1385,13 @@ void m_send_ontimer(unsigned int ticks, void *param)
                goto done;
        }
 
+       ctime_r((const time_t*)&ttime, t_buf);
        if (RES_ROW_N(db_res) <= 0)
        {
-               LM_DBG("no message for <%.*s>!\n", 24, ctime((const time_t*)&ttime));
+               LM_DBG("no message for <%.*s>!\n", 24, t_buf);
                goto done;
        }
-
-       LM_DBG("dumping [%d] messages for <%.*s>!!!\n", RES_ROW_N(db_res), 24,
-                       ctime((const time_t*)&ttime));
+       LM_DBG("dumping [%d] messages for <%.*s>!!!\n", RES_ROW_N(db_res), 24, t_buf);
 
        for(i = 0; i < RES_ROW_N(db_res); i++)
        {
index 0390173..9764c09 100644 (file)
@@ -421,6 +421,7 @@ static void msrp_cmap_rpc_list(rpc_t* rpc, void* ctx)
        msrp_citem_t *it;
        int i;
        int n;
+       char t_buf[26] = {0};
        str edate;
 
        if(_msrp_cmap_head==NULL)
@@ -457,7 +458,8 @@ static void msrp_cmap_rpc_list(rpc_t* rpc, void* ctx)
                                lock_release(&_msrp_cmap_head->cslots[i].lock);
                                return;
                        }
-                       edate.s = ctime(&it->expires);
+                       ctime_r(&it->expires, t_buf);
+                       edate.s = t_buf;
                        edate.len = 24;
                        if(rpc->struct_add(vh, "dSSSSSdd",
                                                "CITEMID", it->citemid,
index 44460aa..5ad063f 100644 (file)
@@ -408,8 +408,11 @@ redisc_server_t *redisc_get_server(str *name)
  */
 int redisc_reconnect_server(redisc_server_t *rsrv)
 {
-       char addr[256], pass[256], unix_sock_path[256];
-       unsigned int port, db, sock = 0, haspass = 0;
+       char addr[256], pass[256], unix_sock_path[256], sentinel_group[256];
+       unsigned int port, db, sock = 0, haspass = 0, sentinel_master = 1;
+       char sentinels[MAXIMUM_SENTINELS][256];
+       uint8_t sentinels_count = 0;
+       int i, row;
        param_t *pit = NULL;
        struct timeval tv_conn;
        struct timeval tv_cmd;
@@ -442,6 +445,84 @@ int redisc_reconnect_server(redisc_server_t *rsrv)
                } else if(pit->name.len==4 && strncmp(pit->name.s, "pass", 4)==0) {
                        snprintf(pass, sizeof(pass)-1, "%.*s", pit->body.len, pit->body.s);
                        haspass = 1;
+               } else if(pit->name.len==14 && strncmp(pit->name.s,
+                                       "sentinel_group", 14)==0) {
+                       snprintf(sentinel_group, sizeof(sentinel_group)-1, "%.*s",
+                                       pit->body.len, pit->body.s);
+               } else if(pit->name.len==15 && strncmp(pit->name.s,
+                                       "sentinel_master", 15)==0) {
+                       if(str2int(&pit->body, &sentinel_master) < 0)
+                               sentinel_master = 1;
+               } else if(pit->name.len==8 && strncmp(pit->name.s,
+                                       "sentinel", 8)==0) {
+                       if( sentinels_count < MAXIMUM_SENTINELS ){
+                               snprintf(sentinels[sentinels_count],
+                                               sizeof(sentinels[sentinels_count])-1, "%.*s",
+                                               pit->body.len, pit->body.s);
+                               sentinels_count++;
+                       }
+                       else {
+                               LM_ERR("too many sentinels, maximum %d supported.\n",
+                                               MAXIMUM_SENTINELS);
+                               return -1;
+                       }
+               }
+       }
+
+       // if sentinels are provided, we need to connect to them and retrieve the redis server
+       // address / port
+       if(sentinels_count > 0) {
+               for(i= 0; i< sentinels_count; i++) {
+                       char *sentinelAddr = sentinels[i];
+                       char *pos;
+                       redisContext *redis;
+                       redisReply *res, *res2;
+
+                       port = 6379;
+                       if( (pos = strchr(sentinelAddr, ':')) != NULL ) {
+                               port = atoi(pos+1);
+                               pos[i] = '\0';
+                       }
+
+                       redis = redisConnectWithTimeout(sentinelAddr, port, tv_conn);
+                       if( redis ) {
+                               if(sentinel_master != 0) {
+                                       res = redisCommand(redis,
+                                                       "SENTINEL get-master-addr-by-name %s",
+                                                       sentinel_group);
+                                       if( res && (res->type == REDIS_REPLY_ARRAY)
+                                                       && (res->elements == 2) ) {
+                                               strncpy(addr, res->element[0]->str,
+                                                               res->element[0]->len + 1);
+                                               port = atoi(res->element[1]->str);
+                                               LM_DBG("sentinel replied: %s:%d\n", addr, port);
+                                       }
+                               }
+                               else {
+                                       res = redisCommand(redis, "SENTINEL slaves %s",
+                                                       sentinel_group);
+                                       if( res && (res->type == REDIS_REPLY_ARRAY) ) {
+                                               for(row = 0; row< res->elements; row++){
+                                                       res2 = res->element[row];
+                                                       for(i= 0; i< res2->elements; i+= 2) {
+                                                               if( strncmp(res2->element[i]->str,
+                                                                                       "ip", 2) == 0 ) {
+                                                                       strncpy(addr, res2->element[i+1]->str,
+                                                                                       res2->element[i+1]->len);
+                                                                       addr[res2->element[i+1]->len] = '\0';
+                                                               }
+                                                               else if( strncmp(res2->element[i]->str,
+                                                                                       "port", 4) == 0) {
+                                                                       port = atoi(res2->element[i+1]->str);
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                               LM_DBG("slave for %s: %s:%d\n", sentinel_group,
+                                                               addr, port);
+                                       }
+                               }
+                       }
                }
        }
 
index 6e65e44..ae2b3b3 100644 (file)
@@ -30,7 +30,7 @@
 #include "../../core/str.h"
 #include "../../core/sr_module.h"
 
-typedef int (*encode_flow_token_t)(str *, struct receive_info);
+typedef int (*encode_flow_token_t)(str *, struct receive_info *);
 typedef int (*decode_flow_token_t)(struct sip_msg *, struct receive_info **, str);
 typedef int (*use_outbound_t)(struct sip_msg *);
 
index 7883765..82d18a3 100644 (file)
@@ -156,7 +156,7 @@ static void destroy(void)
 static unsigned char unenc_flow_token[UNENC_FLOW_TOKEN_MAX_LENGTH];
 static unsigned char hmac_sha1[EVP_MAX_MD_SIZE];
 
-int encode_flow_token(str *flow_token, struct receive_info rcv)
+int encode_flow_token(str *flow_token, struct receive_info *rcv)
 {
        int pos = FLOW_TOKEN_START_POS, i;
 
@@ -168,19 +168,19 @@ int encode_flow_token(str *flow_token, struct receive_info rcv)
 
        /* Encode protocol information */
        unenc_flow_token[pos++] =
-               (rcv.dst_ip.af == AF_INET6 ? 0x80 : 0x00) | rcv.proto;
+               (rcv->dst_ip.af == AF_INET6 ? 0x80 : 0x00) | rcv->proto;
 
        /* Encode destination address */
-       for (i = 0; i < (rcv.dst_ip.af == AF_INET6 ? 16 : 4); i++)
-               unenc_flow_token[pos++] = rcv.dst_ip.u.addr[i];
-       unenc_flow_token[pos++] = (rcv.dst_port >> 8) & 0xff;
-       unenc_flow_token[pos++] =  rcv.dst_port       & 0xff;
+       for (i = 0; i < (rcv->dst_ip.af == AF_INET6 ? 16 : 4); i++)
+               unenc_flow_token[pos++] = rcv->dst_ip.u.addr[i];
+       unenc_flow_token[pos++] = (rcv->dst_port >> 8) & 0xff;
+       unenc_flow_token[pos++] =  rcv->dst_port       & 0xff;
 
        /* Encode source address */
-       for (i = 0; i < (rcv.src_ip.af == AF_INET6 ? 16 : 4); i++)
-               unenc_flow_token[pos++] = rcv.src_ip.u.addr[i];
-       unenc_flow_token[pos++] = (rcv.src_port >> 8) & 0xff;
-       unenc_flow_token[pos++] =  rcv.src_port       & 0xff;
+       for (i = 0; i < (rcv->src_ip.af == AF_INET6 ? 16 : 4); i++)
+               unenc_flow_token[pos++] = rcv->src_ip.u.addr[i];
+       unenc_flow_token[pos++] = (rcv->src_port >> 8) & 0xff;
+       unenc_flow_token[pos++] =  rcv->src_port       & 0xff;
 
        /* HMAC-SHA1 the calculated flow-token, truncate to 80 bits, and
           prepend onto the flow-token */
index 55cd859..137c73b 100644 (file)
@@ -80,7 +80,7 @@ static int handleOutbound(sip_msg_t* _m, str *user, path_param_t *param)
        if (path_obb.use_outbound != NULL && path_obb.use_outbound(_m)) {
                struct via_body *via;
 
-               if (path_obb.encode_flow_token(user, _m->rcv) != 0) {
+               if (path_obb.encode_flow_token(user, &_m->rcv) != 0) {
                        LM_ERR("encoding outbound flow-token\n");
                        return -1;
                }
index 9c81b7b..c313b01 100644 (file)
@@ -1296,7 +1296,9 @@ ps_presentity_t *ps_ptable_search(ps_presentity_t *ptm, int mmode, int rmode)
                                        ptl->prev = NULL;
                                }
                                ptd->next = pte;
-                               pte->prev = ptd;
+                               if(pte) {
+                                       pte->prev = ptd;
+                               }
                                pte = ptd;
                        } else {
                                if(ptd->prev) {
@@ -1307,7 +1309,9 @@ ps_presentity_t *ps_ptable_search(ps_presentity_t *ptm, int mmode, int rmode)
                                }
                                ptd->next = pte;
                                ptd->prev = NULL;
-                               pte->prev = ptd;
+                               if(pte) {
+                                       pte->prev = ptd;
+                               }
                                pte = ptd;
                        }
                }
@@ -1394,4 +1398,4 @@ ps_presentity_t *ps_ptable_get_expired(int eval)
        }
 
        return ptl;
-}
\ No newline at end of file
+}
index f8a5548..f128680 100644 (file)
@@ -16,8 +16,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
@@ -57,7 +57,7 @@ void pua_reginfo_update_self_op(int v)
 }
 
 str* build_reginfo_full(urecord_t * record, str uri, ucontact_t* c, int type) {
-       xmlDocPtr  doc = NULL; 
+       xmlDocPtr  doc = NULL;
        xmlNodePtr root_node = NULL;
        xmlNodePtr registration_node = NULL;
        xmlNodePtr contact_node = NULL;
@@ -78,11 +78,12 @@ str* build_reginfo_full(urecord_t * record, str uri, ucontact_t* c, int type) {
        root_node = xmlNewNode(NULL, BAD_CAST "reginfo");
        if(root_node==0) {
                LM_ERR("Unable to create reginfo-XML-Element\n");
+               xmlFreeDoc(doc);
                return NULL;
        }
        /* This is our Root-Element: */
-       xmlDocSetRootElement(doc, root_node);
-       
+       xmlDocSetRootElement(doc, root_node);
+
        xmlNewProp(root_node, BAD_CAST "xmlns", BAD_CAST "urn:ietf:params:xml:ns:reginfo");
 
        /* we set the version to 0 but it should be set to the correct value in the pua module */
@@ -163,7 +164,7 @@ str* build_reginfo_full(urecord_t * record, str uri, ucontact_t* c, int type) {
                        memset(buf, 0, sizeof(buf));
                        snprintf(buf, sizeof(buf), "%.*s", ptr->received.len, ptr->received.s);
                        xmlNewProp(contact_node, BAD_CAST "received", BAD_CAST buf);
-                       
+
                        /* path Attribute */
                        memset(buf, 0, sizeof(buf));
                        snprintf(buf, sizeof(buf), "%.*s", ptr->path.len, ptr->path.s);
@@ -216,7 +217,7 @@ error:
        }
        if(doc) xmlFreeDoc(doc);
        return NULL;
-}      
+}
 
 void reginfo_usrloc_cb(ucontact_t* c, int type, void* param) {
        str* body= NULL;
@@ -240,7 +241,7 @@ void reginfo_usrloc_cb(ucontact_t* c, int type, void* param) {
 
        content_type.s = "application/reginfo+xml";
        content_type.len = 23;
-       
+
        /* Debug Output: */
        LM_DBG("AOR: %.*s (%.*s)\n", c->aor->len, c->aor->s, c->domain->len, c->domain->s);
        if(type & UL_CONTACT_INSERT) LM_DBG("type= UL_CONTACT_INSERT\n");
@@ -292,7 +293,7 @@ void reginfo_usrloc_cb(ucontact_t* c, int type, void* param) {
                }
                uri.len = snprintf(uri.s, uri.len, "sip:%.*s", record->aor.len, record->aor.s);
        }
-       
+
        /* Build the XML-Body: */
        body = build_reginfo_full(record, uri, c, type);
 
@@ -315,8 +316,8 @@ void reginfo_usrloc_cb(ucontact_t* c, int type, void* param) {
        publ.id.len = id_buf_len;
        publ.content_type = content_type;
        publ.expires = 3600;
-       
-       /* make UPDATE_TYPE, as if this "publish dialog" is not found 
+
+       /* make UPDATE_TYPE, as if this "publish dialog" is not found
           by pua it will fallback to INSERT_TYPE anyway */
        publ.flag|= UPDATE_TYPE;
        publ.source_flag |= REGINFO_PUBLISH;
@@ -328,7 +329,7 @@ void reginfo_usrloc_cb(ucontact_t* c, int type, void* param) {
 
        if(pua.send_publish(&publ) < 0) {
                LM_ERR("Error while sending publish\n");
-       }       
+       }
 error:
        if (uri.s) pkg_free(uri.s);
        if(body) {
@@ -338,4 +339,4 @@ error:
        if(record) ul.release_urecord(record);
 
        return;
-}      
+}
index f3baccf..87b62b7 100644 (file)
@@ -246,10 +246,12 @@ int pv_get_timenowf(struct sip_msg *msg, pv_param_t *param,
                pv_value_t *res)
 {
        str s;
+       char t_buf[26] = {0};
        time_t t;
 
        t = time(NULL);
-       s.s = ctime(&t);
+
+       s.s = ctime_r(&t, t_buf);
        s.len = strlen(s.s)-1;
        return pv_get_strintval(msg, param, res, &s, (int)t);
 }
@@ -269,13 +271,14 @@ int pv_get_timef(struct sip_msg *msg, pv_param_t *param,
                pv_value_t *res)
 {
        str s;
+       char t_buf[26] = {0};
 
        if(msg==NULL)
                return -1;
 
        msg_set_time(msg);
 
-       s.s = ctime(&msg->tval.tv_sec);
+       s.s = ctime_r(&msg->tval.tv_sec, t_buf);
        s.len = strlen(s.s)-1;
        return pv_get_strintval(msg, param, res, &s, (int)msg->tval.tv_sec);
 }
index 880e192..475c354 100644 (file)
@@ -275,7 +275,7 @@ static int load_pcres(int action)
        /* Read the file and extract the patterns */
        memset(line, 0, FILE_MAX_LINE);
        i = -1;
-       while (fgets(line, FILE_MAX_LINE, f) != NULL) {
+       while (fgets(line, FILE_MAX_LINE-4, f) != NULL) {
 
                /* Ignore comments and lines starting by space, tab, CR, LF */
                if(isspace(line[0]) || line[0]=='#') {
@@ -306,7 +306,7 @@ static int load_pcres(int action)
                }
 
                /* Check if the patter size is too big (aprox) */
-               if (strlen(patterns[i]) + strlen(line) >= group_max_size - 2) {
+               if (strlen(patterns[i]) + strlen(line) >= group_max_size - 4) {
                        LM_ERR("pattern max file exceeded\n");
                        fclose(f);
                        goto err;
index 54da64c..0b74356 100644 (file)
@@ -398,7 +398,7 @@ int record_route(struct sip_msg* _m, str *params)
                        }
                }
        } else if (use_ob == 1) {
-               if (rr_obb.encode_flow_token(&user, _m->rcv) != 0) {
+               if (rr_obb.encode_flow_token(&user, &_m->rcv) != 0) {
                        LM_ERR("encoding outbound flow-token\n");
                        return -1;
                }
@@ -529,7 +529,7 @@ int record_route_preset(struct sip_msg* _m, str* _data)
                        return -1;
                }
        } else if (use_ob == 1) {
-               if (rr_obb.encode_flow_token(&user, _m->rcv) != 0) {
+               if (rr_obb.encode_flow_token(&user, &_m->rcv) != 0) {
                        LM_ERR("encoding outbound flow-token\n");
                        return -1;
                }
@@ -781,7 +781,7 @@ int record_route_advertised_address(struct sip_msg* _m, str* _data)
                        return -1;
                }
        } else if (use_ob == 1) {
-               if (rr_obb.encode_flow_token(&user, _m->rcv) != 0) {
+               if (rr_obb.encode_flow_token(&user, &_m->rcv) != 0) {
                        LM_ERR("encoding outbound flow-token\n");
                        return -1;
                }
index 3a6998f..00e3746 100644 (file)
@@ -426,14 +426,13 @@ Chapter 1. Admin Guide
    of nodes. There is no locking when setting the nodes enabled/disabled
    (to keep the memory access as fast as possible). Thus, problems related
    to node state might appear for concurrent processes that might set the
-   nodes enabled/disabled(e.g. by fifo command). This robustness problems
+   nodes enabled/disabled(e.g. by fifo command). These robustness problems
    are overcome as follows.
 
    If the current process sees the selected node as disabled, the node is
-   force tested before the current process actually takes the disabled
-   decision. If the test succeeds, the process will set the node as
-   enabled (but other concurrent process might still see it as disabled).
-   .
+   force tested before the current process actually accepts the disabled
+   state. If the test succeeds, the process will set the node as enabled
+   (but other concurrent process might still see it as disabled).
 
    If the current process sees the selected node as enabled, it does no
    additional checks and sends the command which will fail in case the
@@ -583,7 +582,7 @@ modparam("rtpengine", "rtpengine_disable_tout", 20)
    to all rtpengines, else no rtpengine will be queried until its
    rtpengine_disable_tout timeout passes.
 
-   Default value is “1”.
+   Default value is “1” (enabled).
 
    Can be set at runtime, e.g.:
                         $ kamcmd cfg.set_now_int rtpengine aggressive_redetectio
@@ -612,10 +611,10 @@ modparam("rtpengine", "rtpengine_tout_ms", 2000)
 
 4.5. rtpengine_allow_op (integer)
 
-   Enable this to allow finishing the current sessions while denying new
-   sessions for the manually deactivated nodes via kamctl command i.e.
-   "disabled(permanent)" nodes. Probably the manually deactivated machine
-   is still running(did not crash).
+   Enable this setting to allow finishing the current sessions while
+   denying new sessions for the manually deactivated nodes via kamctl
+   command i.e. "disabled(permanent)" nodes. Probably the manually
+   deactivated machine is still running(did not crash).
 
    This is useful when deactivating a node for maintenance and reject new
    sessions but allow current ones to finish.
@@ -624,7 +623,8 @@ modparam("rtpengine", "rtpengine_tout_ms", 2000)
    node is deleted from the table and the table reloaded (see
    nh_reload_rtpp) the node actually is disabled(permanent) and hidden for
    display. Next time the same node will be added in the table, and the
-   content reloaded, it will be updated and re-displayed.
+   database content reloaded, the re-activated node will be updated and
+   re-displayed.
 
    Default value is “0” to keep the current behaviour.
 
@@ -764,7 +764,9 @@ modparam("rtpengine", "rtp_inst_pvar", "$avp(RTP_INSTANCE)")
 
 4.14. hash_table_size (integer)
 
-   Size of the hash table. Default value is 256.
+   To maintain information about a selected rtp machine node for a given
+   call, entries are added in a hashtable of (callid, node) pairs. This
+   parameter sets the size of the hash table. Default value is 256.
 
    NOTE: If configured size is less than 1, the size will be defaulted to
    1.
@@ -779,11 +781,11 @@ modparam("rtpengine", "hash_table_size", 123)
    Number of seconds after an rtpengine hash table entry is marked for
    deletion. By default, this parameter is set to 3600 (seconds).
 
-   To maintain information about a selected rtp machine node, for a given
+   To maintain information about a selected rtp machine node for a given
    call, entries are added in a hashtable of (callid, node) pairs. When
-   command comes, lookup callid. If found, return chosen node. If not
-   found, choose a new node, insert it in the hastable and return the
-   chosen node.
+   command comes the callid is looked up in this table. If found, the
+   chosen node is used. If not found, choose a new node, insert the callid
+   in the hashtable and return the chosen node.
 
    NOTE: In the current implementation, the actual deletion happens on the
    fly, while insert/remove/lookup the hastable, only for the entries in
@@ -799,10 +801,11 @@ modparam("rtpengine", "hash_table_tout", 300)
 
 4.16. db_url (string)
 
-   The rtpengine datablase url. If present and valid, it activates
-   database mode. Node information is read from database, not from config.
+   The rtpengine database url. If present and valid, it activates database
+   mode. In this mode the node information is read from database, not from
+   configuration modparam parameters.
 
-   By default, the datablase url is NULL (not set).
+   By default, the database url is NULL (not set).
 
    Example 1.16. Set db_url parameter
 ...
@@ -812,7 +815,7 @@ modparam("rtpengine", "db_url", "mysql://pass@localhost/db")
 4.17. table_name (string)
 
    The rtpengine table name. If database mode is activated (i.e. valid
-   db_url), set the name of rtpengine table, on startup.
+   db_url), sets the name of the rtpengine table, on startup.
 
    By default, the rtpengine table name is "rtpengine".
 
@@ -853,9 +856,10 @@ mysql> select * from version;
 
 4.18. setid_col (string)
 
-   Column name in the rtpengine table. If database mode is activated (i.e.
-   valid db_url), set the setid of rtp nodes according to this column, on
-   startup. The MySQL value for this column should be INT UNSIGNED.
+   Column name for the "setid" in the rtpengine table. If database mode is
+   activated (i.e. valid db_url), set the setid of rtp nodes according to
+   this column, on startup. The MySQL value for this column should be INT
+   UNSIGNED.
 
    By default, the column name is "setid".
 
@@ -866,9 +870,10 @@ modparam("rtpengine", "setid_col", "setid_column_name")
 
 4.19. url_col (string)
 
-   Column name in the rtpengine table. If database mode is activated (i.e.
-   valid db_url), set the url of rtp nodes according to this column, on
-   startup. The MySQL value for this column should be VARCHAR.
+   Column name for the url in the rtpengine table. If database mode is
+   activated (i.e. valid db_url), set the url of rtp nodes according to
+   this column, on startup. The MySQL value for this column should be
+   VARCHAR.
 
    By default, the column name is "url".
 
@@ -879,10 +884,10 @@ modparam("rtpengine", "url_col", "url_column_name")
 
 4.20. weight_col (string)
 
-   Column name in the rtpengine table. If database mode is activated (i.e.
-   valid db_url), set the weight of rtp nodes according to this column, on
-   startup. The column value has priority over the URL weight. The MySQL
-   value for this column should be INT UNSIGNED.
+   Column name for weight in the rtpengine table. If database mode is
+   activated (i.e. valid db_url), set the weight of rtp nodes according to
+   this column, on startup. The column value has priority over the URL
+   weight. The MySQL value for this column should be INT UNSIGNED.
 
    By default, the column name is "weight".
 
@@ -1799,12 +1804,12 @@ modparam("rtpengine", "control_cmd_tos", 144)
 4.72. hash_algo (integer)
 
    Hashing algorithm to be used in node selection algorithm. Now there are
-   2 possibilities: legacy alogrithm - 0(very basic hash over callid) or
+   2 possibilities: legacy algorithm - 0(very basic hash over callid) or
    SHA1 - 1(apply sha1 over the callid and calculate hash).
 
    Default value is 0, legacy algorithm.
 
-   The values not falling into the range “0-1” .
+   The values not falling into the range “0-1” are ignored.
 
    Example 1.73. Set control_cmd_tos parameter
 ...
@@ -2084,7 +2089,7 @@ rtpengine_offer();
             encoding can be added in this manner. More details about this
             are found in the rtpengine README.
           + codec-strip=... - strips given codec from sdp
-          + codec-offer=... - offer given codec from sdp.More details
+          + codec-offer=... - offer given codec from sdp. More details
             about this are found in the rtpengine README.
           + codec-mask=... - Similar to strip except that codecs listed
             here will still be accepted and used for transcoding on the
@@ -2166,7 +2171,7 @@ ranscode=PCMA"))
 5.4.  rtpengine_info([flags])
 
    Send an updated offer to rtpengine. This is meant to be used when
-   processing Tricke ICE SDP Fragments that are carried in SIP INFO
+   processing Trickle ICE SDP Fragments that are carried in SIP INFO
    messages and are proxied to endpoints that do not support ICE. With a
    matching content type, the SDP fragment is used to update rtpengine's
    list of ICE candidates. No new SDP is returned and so the SIP INFO
@@ -2184,7 +2189,7 @@ rtpengine_info();
 
 5.5.  rtpengine_delete([flags])
 
-   Tears down the RTPProxy session for the current call. This populates
+   Tears down the RTP proxy session for the current call. This populates
    the statistics pseudovariables (such “mos_min_pv” etc).
 
    See rtpengine_offer() function description above for the meaning of the
@@ -2436,7 +2441,7 @@ stop_media("from-tag=5yqaeriguhxcikxj");
    “volume” is specified in absolute decibels, with a default of -8 db.
 
    Multiple consecutive DTMF events can be queued up by calling this
-   function multiple times consecutively. Rtpengine will play out the DTMF
+   function multiple times consecutively. RTPengine will play out the DTMF
    events in sequence, separated by a default pause of 100 ms. An
    alternative pause length can be given through the “pause” option,
    between 100 and 5000 ms.
@@ -2506,11 +2511,11 @@ $ kamcmd rtpengine.reload
    recheck_ticks are grater than 0, the proxy is considered disabled
    temporary, and it is not taken into consideration for sending data.
    When the recheck_ticks are 0, the proxy is retested when trying to send
-   data(not automatically retested), and data can be send to it on
+   data (not automatically retested), and data can be send to it on
    success.
 
-   NOTE: When specify the IPv6 RTP proxy url one must prefix it with :: to
-   escape the :: from the IPv6 address. See the example below.
+   NOTE: If you specify an IPv6 RTP, the proxy url must be prefixed with
+   :: to escape the :: from the IPv6 address. See the example below.
 
    Example 1.94.  rtpengine.enable usage
 ...
index 8e91da5..362fa58 100644 (file)
                There is no locking when setting the nodes enabled/disabled (to keep the
                memory access as fast as possible). Thus, problems related to node state
                might appear for concurrent processes that might set the nodes
-               enabled/disabled(e.g. by fifo command). This robustness problems are overcome as follows.
+               enabled/disabled(e.g. by fifo command). These robustness problems are overcome as follows.
        </para>
 
        <para>
                If the current process sees the selected node as disabled, the node is
                <emphasis>force tested</emphasis> before the current process actually
-               takes the disabled decision. If the test succeeds, the process will set
+               accepts the disabled state. If the test succeeds, the process will set
                the node as enabled (but other concurrent process might still see it as disabled).
-.
        </para>
 
        <para>
@@ -206,7 +205,7 @@ modparam("rtpengine", "rtpengine_disable_tout", 20)
                </para>
                <para>
                <emphasis>
-                       Default value is <quote>1</quote>.
+                       Default value is <quote>1</quote> (enabled).
                </emphasis>
                </para>
                <para>
@@ -252,17 +251,20 @@ modparam("rtpengine", "rtpengine_tout_ms", 2000)
        <section id="rtpengine.p.rtpengine_allow_op">
                <title><varname>rtpengine_allow_op</varname> (integer)</title>
                <para>
-               Enable this to allow finishing the current sessions while denying new sessions for the
+               Enable this setting to allow finishing the current sessions while denying new sessions for the
                <emphasis>manually deactivated nodes </emphasis> via kamctl command i.e. "disabled(permanent)" nodes.
                Probably the manually deactivated machine is still running(did not crash).
                </para>
                <para>
-               This is <emphasis>useful</emphasis> when deactivating a node for maintenance and reject new sessions but allow current ones to finish.
+               This is <emphasis>useful</emphasis> when deactivating a node for maintenance and
+               reject new sessions but allow current ones to finish.
                </para>
                <para>
                The behaviour is the same for a rtpengine deleted table node.
-               When the node is deleted from the table and the table reloaded (see nh_reload_rtpp) the node actually is disabled(permanent) and hidden for display.
-               Next time the same node will be added in the table, and the content reloaded, it will be updated and re-displayed.
+               When the node is deleted from the table and the table reloaded (see nh_reload_rtpp)
+               the node actually is disabled(permanent) and hidden for display.
+               Next time the same node will be added in the table, and the database content
+               reloaded, the re-activated node will be updated and re-displayed.
                </para>
                <para>
                <emphasis>
@@ -427,9 +429,9 @@ route {
                <title><varname>write_sdp_pv</varname> (string)</title>
                <para>
                        If this parameter is set to a valid AVP or script var specifier, the
-            SDP returned by rtpengine in the offer/answer operations
-            is returned in the specified variable instead of the
-            message body.
+                       SDP returned by rtpengine in the offer/answer operations
+                       is returned in the specified variable instead of the
+                       message body.
                </para>
                <para>
                        There is no default value.
@@ -471,7 +473,8 @@ modparam("rtpengine", "rtp_inst_pvar", "$avp(RTP_INSTANCE)")
        <section id="rtpengine.p.hash_table_size">
                <title><varname>hash_table_size</varname> (integer)</title>
                <para>
-                       Size of the hash table. Default value is 256.
+                       To maintain information about a selected rtp machine node for a given call, entries are added in a hashtable of (callid, node) pairs.
+                       This parameter sets the size of the hash table. Default value is 256.
                </para>
                <para>
                        NOTE: If configured size is <emphasis>less than</emphasis> 1, the size will be defaulted to 1.
@@ -493,15 +496,20 @@ modparam("rtpengine", "hash_table_size", 123)
                        By default, this parameter is set to 3600 (seconds).
                </para>
                <para>
-                       To maintain information about a selected rtp machine node, for a given call, entries are added in a hashtable of (callid, node) pairs.
-                       When command comes, lookup callid. If found, return chosen node. If not found, choose a new node, insert it in the hastable and return the chosen node.
+                       To maintain information about a selected rtp machine node for a given call,
+                       entries are added in a hashtable of (callid, node) pairs.
+                       When command comes the callid is looked up in this table. If found, the
+                       chosen node is used. If not found, choose a new node, insert the callid in
+                       the hashtable and return the chosen node.
                </para>
                <para>
                        NOTE: In the current implementation, the actual deletion happens <emphasis>on the fly</emphasis>,
-                       while insert/remove/lookup the hastable, <emphasis>only</emphasis> for the entries in the insert/remove/lookup path.
+                       while insert/remove/lookup the hastable, <emphasis>only</emphasis>
+                       for the entries in the insert/remove/lookup path.
                </para>
                <para>
-                       NOTE: When configuring this parameter, one should consider maximum call time VS share memory for unfinished calls.
+                       NOTE: When configuring this parameter, one should consider maximum call time
+                       VS share memory for unfinished calls.
                </para>
                <example>
                <title>Set <varname>hash_table_tout</varname> parameter</title>
@@ -519,11 +527,11 @@ modparam("rtpengine", "hash_table_tout", 300)
        <section id="rtpengine.p.db_url">
                <title><varname>db_url</varname> (string)</title>
                <para>
-                       The rtpengine datablase url. If present and valid, it activates database mode.
-                       Node information is read from database, not from config.
+                       The rtpengine database url. If present and valid, it activates database mode.
+                       In this mode the node information is read from database, not from configuration modparam parameters.
                </para>
                <para>
-                       By default, the datablase url is NULL (not set).
+                       By default, the database url is NULL (not set).
                </para>
                <example>
                <title>Set <varname>db_url</varname> parameter</title>
@@ -540,7 +548,7 @@ modparam("rtpengine", "db_url", "mysql://pass@localhost/db")
                <title><varname>table_name</varname> (string)</title>
                <para>
                        The rtpengine table name. If database mode is activated (i.e. valid db_url),
-                       set the name of rtpengine table, on startup.
+                       sets the name of the rtpengine table, on startup.
                </para>
                <para>
                        By default, the rtpengine table name is "rtpengine".
@@ -594,7 +602,8 @@ mysql> select * from version;
        <section id="rtpengine.p.setid_col">
                <title><varname>setid_col</varname> (string)</title>
                <para>
-                       Column name in the rtpengine table. If database mode is activated (i.e. valid db_url),
+                       Column name for the "setid" in the rtpengine table.
+                       If database mode is activated (i.e. valid db_url),
                        set the setid of rtp nodes according to this column, on startup.
                        The MySQL value for this column should be INT UNSIGNED.
                </para>
@@ -615,7 +624,7 @@ modparam("rtpengine", "setid_col", "setid_column_name")
        <section id="rtpengine.p.url_col">
                <title><varname>url_col</varname> (string)</title>
                <para>
-                       Column name in the rtpengine table. If database mode is activated (i.e. valid db_url),
+                       Column name for the url in the rtpengine table. If database mode is activated (i.e. valid db_url),
                        set the url of rtp nodes according to this column, on startup.
                        The MySQL value for this column should be VARCHAR.
                </para>
@@ -636,7 +645,7 @@ modparam("rtpengine", "url_col", "url_column_name")
        <section id="rtpengine.p.weight_col">
                <title><varname>weight_col</varname> (string)</title>
                <para>
-                       Column name in the rtpengine table. If database mode is activated (i.e. valid db_url),
+                       Column name for weight in the rtpengine table. If database mode is activated (i.e. valid db_url),
                        set the weight of rtp nodes according to this column, on startup. The column value has
                        priority over the URL weight.
                        The MySQL value for this column should be INT UNSIGNED.
@@ -1990,7 +1999,8 @@ modparam("rtpengine", "mos_average_samples_B_pv", "$avp(mos_average_samples_B)")
        <section id="rtpengine.p.control_cmd_tos">
                <title><varname>control_cmd_tos</varname> (integer)</title>
                <para>
-                       The parameter is used to set the value of <quote>type of service (tos)</quote> for the control commands (such as rtpengine_offer(), rtpengine_answer() etc).
+                       The parameter is used to set the value of <quote>type of service (tos)</quote> for the
+                       control commands (such as rtpengine_offer(), rtpengine_answer() etc).
                </para>
                <para>
                        There is no default value. By default this feature is not used.
@@ -2012,13 +2022,13 @@ modparam("rtpengine", "control_cmd_tos", 144)
                <title><varname>hash_algo</varname> (integer)</title>
                <para>
                        Hashing algorithm to be used in node selection algorithm. Now there are 2 possibilities: legacy
-                       alogrithm - 0(very basic hash over callid) or SHA1 - 1(apply sha1 over the callid and calculate hash).
+                       algorithm - 0(very basic hash over callid) or SHA1 - 1(apply sha1 over the callid and calculate hash).
                </para>
                <para>
                        Default value is 0, legacy algorithm.
                </para>
                <para>
-                       The values not falling into the range <quote>0-1</quote> .
+                       The values not falling into the range <quote>0-1</quote> are ignored.
                </para>
                <example>
                <title>Set <varname>control_cmd_tos</varname> parameter</title>
@@ -2076,24 +2086,24 @@ rtpengine_offer();
 </programlisting>
                </example>
        </section>
-        <section id="rtpengine.f.rtpengine_offer">
-                <title>
-                <function moreinfo="none">rtpengine_offer([flags])</function>
-                </title>
-                <para>
-                Rewrites &sdp; body to ensure that media is passed through
-                an &rtp; proxy. To be invoked
+       <section id="rtpengine.f.rtpengine_offer">
+               <title>
+               <function moreinfo="none">rtpengine_offer([flags])</function>
+               </title>
+               <para>
+               Rewrites &sdp; body to ensure that media is passed through
+               an &rtp; proxy. To be invoked
                on INVITE for the cases the &sdp; bodies are in INVITE and 200 OK and on 200 OK
                when &sdp; bodies are in 200 OK and ACK.
-                </para>
-                <para>
+               </para>
+               <para>
                The function will return true on success and false (-1) on various failures,
                like using rtp_engine_offer() on a SIP MESSAGE request or communication with
                rtpengine fails.
-                </para>
+               </para>
                <para>Meaning of the parameters is as follows:</para>
                <itemizedlist>
-               <listitem>
+                       <listitem>
                        <para>
                        <emphasis>flags</emphasis> - flags to turn on some features.
                        </para>
@@ -2387,7 +2397,8 @@ rtpengine_offer();
                                </para></listitem>
 
                                <listitem><para>
-                               <emphasis>codec-offer=...</emphasis> - offer given codec from sdp.More details about this are found in the rtpengine README.
+                               <emphasis>codec-offer=...</emphasis> - offer given codec from sdp.
+                               More details about this are found in the rtpengine README.
                                </para></listitem>
 
                                <listitem><para>
@@ -2421,7 +2432,7 @@ rtpengine_offer();
                </itemizedlist>
                <para>
                This function can be used from ANY_ROUTE.
-                </para>
+               </para>
                <example>
                <title><function>rtpengine_offer</function> usage</title>
                <programlisting format="linespecific">
@@ -2465,10 +2476,10 @@ if (has_body("application/sdp")) {
 </programlisting>
                 </example>
        </section>
-        <section id="rtpengine.f.rtpengine_answer">
-                <title>
-                <function moreinfo="none">rtpengine_answer([flags])</function>
-                </title>
+       <section id="rtpengine.f.rtpengine_answer">
+               <title>
+                       <function moreinfo="none">rtpengine_answer([flags])</function>
+               </title>
                <para>
                Rewrites &sdp; body to ensure that media is passed through
                an &rtp; proxy. To be invoked
@@ -2484,19 +2495,19 @@ if (has_body("application/sdp")) {
                FAILURE_ROUTE, BRANCH_ROUTE.
                </para>
                <example>
-                <title><function>rtpengine_answer</function> usage</title>
+               <title><function>rtpengine_answer</function> usage</title>
                <para>
                See rtpengine_offer() function example above for example.
                </para>
                </example>
-        </section>
+       </section>
        <section id="rtpengine.f.rtpengine_info">
                <title>
                <function moreinfo="none">rtpengine_info([flags])</function>
                </title>
                <para>
                Send an updated offer to rtpengine. This is meant to be used when processing
-               Tricke ICE &sdp; Fragments that are carried in &sip; INFO messages
+               Trickle ICE &sdp; Fragments that are carried in &sip; INFO messages
                and are proxied to endpoints that do not support ICE. With a matching
                content type, the &sdp; fragment is used to update rtpengine's list of ICE
                candidates. No new &sdp; is returned and so the &sip; INFO message should
@@ -2523,7 +2534,7 @@ rtpengine_info();
                <function moreinfo="none">rtpengine_delete([flags])</function>
                </title>
                <para>
-               Tears down the RTPProxy session for the current call.
+               Tears down the RTP proxy session for the current call.
                This populates the statistics pseudovariables (such <quote>mos_min_pv</quote> etc).
                </para>
                <para>
@@ -2567,10 +2578,10 @@ rtpengine_query();
                </example>
        </section>
 
-    <section id="rtpengine.f.rtpengine_manage">
-        <title>
-        <function moreinfo="none">rtpengine_manage([flags])</function>
-        </title>
+       <section id="rtpengine.f.rtpengine_manage">
+       <title>
+               <function moreinfo="none">rtpengine_manage([flags])</function>
+       </title>
                <para>
                Manage the RTPEngine session - it combines the functionality of
                rtpengine_offer(), rtpengine_answer() and rtpengine_delete(), detecting
@@ -2931,7 +2942,7 @@ stop_media("from-tag=5yqaeriguhxcikxj");
                </para>
                <para>
                Multiple consecutive DTMF events can be queued up by calling this function multiple
-               times consecutively. Rtpengine will play out the DTMF events in sequence, separated
+               times consecutively. RTPengine will play out the DTMF events in sequence, separated
                by a default pause of 100 ms. An alternative pause length can be given through the
                <quote>pause</quote> option, between 100 and 5000 ms.
                </para>
@@ -2974,7 +2985,7 @@ play_dtmf("code=1 volume=5 duration=300 pause=150");
        <section>
                <title>RPC Commands</title>
 
-           <section id="rtpengine.r.reload">
+       <section id="rtpengine.r.reload">
                        <title>rtpengine.reload</title>
                        <para>
                                Reloads the database node table content <emphasis>if configured</emphasis>.
@@ -3005,22 +3016,24 @@ $ &kamcmd; rtpengine.reload
                        The second parameter value must be a number in decimal.
                        </para>
                        <para>
-            When try to enable the &rtp; proxy, an application ping command is sent to it.
-            If it fails, the proxy is not enabled.
-            Displays <emphasis>success</emphasis> or <emphasis>fail</emphasis> when try to enable/disable.
+                               When try to enable the &rtp; proxy, an application ping command is sent to it.
+                               If it fails, the proxy is not enabled.
+                               Displays <emphasis>success</emphasis> or <emphasis>fail</emphasis> when try to enable/disable.
                        </para>
                        <para>
                        NOTE: If a &rtp; proxy is defined multiple times (in the same or diferent sets), all of its instances will be enabled/disabled.
                        </para>
                        <para>
                        NOTE: If a &rtp; proxy is in the disabled permanent state and one tries to enable it, even if the ping fails,
-            it is moved to a disabled temporary state and a recheck_ticks are given to it.
-            While the recheck_ticks are grater than 0, the proxy is considered disabled temporary, and it is not taken into consideration for sending data.
-            When the recheck_ticks are 0, the proxy is retested <emphasis>when trying to send data</emphasis>(not automatically retested), and data can be send to it on success.
+                       it is moved to a disabled temporary state and a recheck_ticks are given to it.
+                       While the recheck_ticks are grater than 0, the proxy is considered disabled temporary,
+                       and it is not taken into consideration for sending data.
+                       When the recheck_ticks are 0, the proxy is retested <emphasis>when trying to send data</emphasis>
+                       (not automatically retested), and data can be send to it on success.
                        </para>
                        <para>
-                       NOTE: When specify the IPv6 &rtp; proxy url one must prefix it with <emphasis>::</emphasis>
-            to escape the :: from the IPv6 address. See the example below.
+                       NOTE: If you specify an IPv6 &rtp;, the proxy url must be prefixed  with <emphasis>::</emphasis>
+                       to escape the :: from the IPv6 address. See the example below.
                        </para>
                        <example>
                        <title>
@@ -3035,23 +3048,23 @@ $ &kamcmd; rtpengine.enable all 1
                        </example>
                </section>
 
-           <section id="rtpengine.r.show">
+               <section id="rtpengine.r.show">
                        <title><function moreinfo="none">rtpengine.show proxy_url/all</function></title>
                        <para>
                        Displays all the &rtp; proxies and their information: set and
                        status (disabled or not, weight and recheck_ticks). If a &rtp; proxy has been disabled by
-            nh_enable_rtpp mi command a "(permanent)" quote will appear when printing the disabled status.
-            This is to differentiate from a temporary disable due to the proxy being not found responsive
-            by kamailio. In addition, when disabled permanent, recheck_ticks have no meaning and "N\A"
-            is printed instead of the value.
+                       nh_enable_rtpp mi command a "(permanent)" quote will appear when printing the disabled status.
+                       This is to differentiate from a temporary disable due to the proxy being not found responsive
+                       by kamailio. In addition, when disabled permanent, recheck_ticks have no meaning and "N\A"
+                       is printed instead of the value.
                        </para>
                        <para>
-            It takes either a specific &rtp; proxy url (exactly as defined in
+                       It takes either a specific &rtp; proxy url (exactly as defined in
                        the config file) or the keyword <emphasis>all</emphasis> as a parameter.
                        </para>
                        <para>
                        NOTE: When specify the IPv6 &rtp; proxy url one must prefix it with <emphasis>::</emphasis>
-            to escape the :: from the IPv6 address. See the example below.
+                       to escape the :: from the IPv6 address. See the example below.
                        </para>
                        <example>
                        <title>
@@ -3066,21 +3079,21 @@ $ &kamcmd; rtpengine.show all
                        </example>
                </section>
 
-           <section id="rtpengine.m.ping">
+               <section id="rtpengine.m.ping">
                        <title><function moreinfo="none">rtpengine.ping proxy_url/all</function></title>
                        <para>
-            Sends an application ping command to the &rtp; proxy. If the proxy does not respond,
-            it will be disabled, but not permanent. If the proxy responds, no action is taken.
-            Displays the ping result, i.e.
-            <emphasis>success</emphasis> or <emphasis>fail</emphasis> when try to ping.
+                       Sends an application ping command to the &rtp; proxy. If the proxy does not respond,
+                       it will be disabled, but not permanent. If the proxy responds, no action is taken.
+                       Displays the ping result, i.e.
+                       <emphasis>success</emphasis> or <emphasis>fail</emphasis> when try to ping.
                        </para>
                        <para>
-            It takes either a specific &rtp; proxy url (exactly as defined in
+                       It takes either a specific &rtp; proxy url (exactly as defined in
                        the config file) or the keyword <emphasis>all</emphasis> as a parameter.
                        </para>
                        <para>
                        NOTE: When specify the IPv6 &rtp; proxy url one must prefix it with <emphasis>::</emphasis>
-            to escape the :: from the IPv6 address. See the example below.
+                       to escape the :: from the IPv6 address. See the example below.
                        </para>
                        <example>
                        <title>
index ad867ff..a986846 100644 (file)
@@ -204,10 +204,11 @@ typedef struct sipdump_info {
 int sipdump_buffer_write(sipdump_info_t *sdi, str *obuf)
 {
        struct timeval tv;
-       struct tm *ti;
+       struct tm ti;
+       char t_buf[26] = {0};
 
        gettimeofday(&tv, NULL);
-       ti = localtime(&tv.tv_sec);
+       localtime_r(&tv.tv_sec, &ti);
        obuf->len = snprintf(_sipdump_wbuf, SIPDUMP_WBUF_SIZE,
                "====================\n"
                "tag: %.*s\n"
@@ -227,7 +228,7 @@ int sipdump_buffer_write(sipdump_info_t *sdi, str *obuf)
                my_pid(),
                process_no,
                (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec,
-               asctime(ti),
+               asctime_r(&ti, t_buf),
                sdi->proto.len, sdi->proto.s, sdi->af.len, sdi->af.s,
                sdi->src_ip.len, sdi->src_ip.s, sdi->src_port,
                sdi->dst_ip.len, sdi->dst_ip.s, sdi->dst_port,
@@ -433,8 +434,14 @@ int sipdump_msg_sent(sr_event_param_t *evp)
        sdi.tag.s = "snd";
        sdi.tag.len = 3;
 
-       sdi.src_ip = evp->dst->send_sock->address_str;
-       sdi.src_port = (int)evp->dst->send_sock->port_no;
+       if(evp->dst->send_sock==NULL || evp->dst->send_sock->address_str.s==NULL) {
+               sdi.src_ip.len = 7;
+               sdi.src_ip.s = "0.0.0.0";
+               sdi.src_port = 0;
+       } else {
+               sdi.src_ip = evp->dst->send_sock->address_str;
+               sdi.src_port = (int)evp->dst->send_sock->port_no;
+       }
        su2ip_addr(&ip, &evp->dst->to);
        sdi.dst_ip.len = ip_addr2sbufz(&ip, dstip_buf, IP_ADDR_MAX_STRZ_SIZE);
        sdi.dst_ip.s = dstip_buf;
index 03ed711..29face9 100644 (file)
@@ -137,7 +137,8 @@ static int sipdump_write_meta(char *fpath)
        int len;
        int i;
        FILE *mfile = NULL;
-       struct tm *ti;
+       struct tm ti;
+       char t_buf[26] = {0};
 
        len = strlen(fpath);
        if(len>=SIPDUMP_FPATH_SIZE-1) {
@@ -156,14 +157,14 @@ static int sipdump_write_meta(char *fpath)
                LM_ERR("failed to open meta file %s\n", mpath);
                return -1;
        }
-       ti = localtime(&up_since);
+       localtime_r(&up_since, &ti);
        fprintf(mfile,
                        "v: 1.0\n"
                        "version: %s %s\n"
                        "start: %s"
                        "nrprocs: %d\n",
                        ver_name, ver_version,
-                       asctime(ti),
+                       asctime_r(&ti, t_buf),
                        *process_count
                );
        for (i=0; i<*process_count; i++) {
@@ -182,7 +183,7 @@ static int sipdump_write_meta(char *fpath)
 static int sipdump_rotate_file(void)
 {
        time_t tv;
-       struct tm *ti = NULL;
+       struct tm ti;
        int n;
 
        tv = time(NULL);
@@ -197,12 +198,12 @@ static int sipdump_rotate_file(void)
        if(_sipdump_file != NULL) {
                fclose(_sipdump_file);
        }
-       ti = localtime(&tv);
+       localtime_r(&tv, &ti);
        n = snprintf(_sipdump_fpath+_sipdump_fpath_prefix.len,
                        SIPDUMP_FPATH_SIZE-_sipdump_fpath_prefix.len,
                        "%d-%02d-%02d--%02d-%02d-%02d.data",
-                       1900+ti->tm_year, ti->tm_mon, ti->tm_mday,
-                       ti->tm_hour, ti->tm_min, ti->tm_sec);
+                       1900+ti.tm_year, ti.tm_mon, ti.tm_mday,
+                       ti.tm_hour, ti.tm_min, ti.tm_sec);
        LM_DBG("writing to file: %s (%d)\n", _sipdump_fpath, n);
        _sipdump_file = fopen( _sipdump_fpath, "w" );
        if(_sipdump_file==NULL) {
index 5271444..b284d83 100644 (file)
@@ -370,24 +370,24 @@ static int DecodePhoneNumber(char* buffer, int len, str phone) {
 // Generate a 7 Byte Long Time
 static void EncodeTime(char * buffer) {
        time_t ts;
-       struct tm now;
+       struct tm now;
        int i = 0;
 
        time(&ts);
        /* Get GMT time */
-       now = gmtime(&ts);
+       gmtime_r(&ts, &now);
 
-       i = now->tm_year % 100;
+       i = now.tm_year % 100;
        buffer[0] = (unsigned char)((((i % 10) << 4) | (i / 10)) & 0xff);
-       i = now->tm_mon + 1;
+       i = now.tm_mon + 1;
        buffer[1] = (unsigned char)((((i % 10) << 4) | (i / 10)) & 0xff);
-       i = now->tm_mday;
+       i = now.tm_mday;
        buffer[2] = (unsigned char)((((i % 10) << 4) | (i / 10)) & 0xff);
-       i = now->tm_hour;
+       i = now.tm_hour;
        buffer[3] = (unsigned char)((((i % 10) << 4) | (i / 10)) & 0xff);
-       i = now->tm_min;
+       i = now.tm_min;
        buffer[4] = (unsigned char)((((i % 10) << 4) | (i / 10)) & 0xff);
-       i = now->tm_sec;
+       i = now.tm_sec;
        buffer[5] = (unsigned char)((((i % 10) << 4) | (i / 10)) & 0xff);
        buffer[6] = 0; // Timezone, we use no time offset.
 }
index e288474..fb1c08e 100644 (file)
@@ -1950,17 +1950,15 @@ static int append_time_f(struct sip_msg* msg, char* p1, char *p2)
        size_t len;
        char time_str[MAX_TIME];
        time_t now;
-       struct tm *bd_time;
+       struct tm bd_time;
 
        now=time(0);
-
-       bd_time=gmtime(&now);
-       if (bd_time==NULL) {
+       if (gmtime_r(&now, &bd_time)==NULL) {
                LM_ERR("gmtime failed\n");
                return -1;
        }
 
-       len=strftime(time_str, MAX_TIME, TIME_FORMAT, bd_time);
+       len=strftime(time_str, MAX_TIME, TIME_FORMAT, &bd_time);
        if (len>MAX_TIME-2 || len==0) {
                LM_ERR("unexpected time length\n");
                return -1;
@@ -1983,14 +1981,12 @@ static int append_time_request_f(struct sip_msg* msg, char* p1, char *p2)
 {
        str time_str = {0, 0};
        time_t now;
-       struct tm *bd_time;
+       struct tm bd_time;
        struct hdr_field *hf = msg->headers;
        struct lump *anchor = anchor_lump(msg, hf->name.s + hf->len - msg->buf, 0, 0);
 
        now=time(0);
-
-       bd_time=gmtime(&now);
-       if (bd_time==NULL) {
+       if (gmtime_r(&now, &bd_time)==NULL) {
                LM_ERR("gmtime failed\n");
                goto error;
        }
@@ -2000,7 +1996,7 @@ static int append_time_request_f(struct sip_msg* msg, char* p1, char *p2)
                LM_ERR("no more pkg memory\n");
                goto error;
        }
-       time_str.len=strftime(time_str.s, MAX_TIME, TIME_FORMAT, bd_time);
+       time_str.len=strftime(time_str.s, MAX_TIME, TIME_FORMAT, &bd_time);
        if (time_str.len>MAX_TIME-2 || time_str.len==0) {
                LM_ERR("unexpected time length\n");
                goto error;
index 0450339..81eb475 100644 (file)
@@ -638,7 +638,7 @@ Place holder
        use SSLv3 for anything which should be secure.
      * SSLv2 - only SSLv2 connections, for old clients. Note: you
        shouldn't use SSLv2 for anything which should be secure. Newer
-       versions of libssl don't include support for it anymore.
+       versions of OpenSSL libraries don't include support for it anymore.
      * SSLv23 - any of the SSLv2, SSLv3 and TLSv1 or newer methods will be
        accepted.
        From the OpenSSL manual: "A TLS/SSL connection established with
@@ -649,9 +649,9 @@ Place holder
        TLSv1.2 and permits a fallback to SSLv3. A server will support
        SSLv3, TLSv1, TLSv1.1 and TLSv1.2 protocols. This is the best
        choice when compatibility is a concern."
-       Note: For older libssl version, this option allows SSLv2, with
-       hello messages done over SSLv2. You shouldn't use SSLv2 or SSLv3
-       for anything which should be secure.
+       Note: For older OpenSSL library versions, this option allows SSLv2,
+       with hello messages done over SSLv2. You shouldn't use SSLv2 or
+       SSLv3 for anything which should be secure.
 
    If RFC 3261 conformance is desired, at least TLSv1 must be used. For
    compatibility with older clients SSLv23 is the option, but again, be
@@ -1220,7 +1220,7 @@ modparam("tls", "session_cache", 1)
    The value for session ID context, making sense when session caching is
    enabled.
 
-   By default TLS session_id is "sip-router-tls-3.1".
+   By default TLS session_id is "kamailio-tls-5.x.y".
 
    Example 1.38. Set session_id parameter
 ...
@@ -1477,7 +1477,7 @@ modparam("tls", "private_key", "/engine:my_HSM_key_label")
 modparam("tls", "engine", "pkcs11")
 modparam("tls", "private_key", "/engine:pkcs11:token=MYTOKEN;object=MYKEYLABEL")
 
-modparam("tls", "engine_conf", "/usr/local/etc/kamailio/openssl.cnf")
+modparam("tls", "engine_config", "/usr/local/etc/kamailio/openssl.cnf")
 modparam("tls", "engine_algorithms", "ALL")
 ...
 
index eb78ac3..f23aa92 100644 (file)
@@ -65,7 +65,7 @@
                                <para>
                                <emphasis>SSLv2</emphasis> - only SSLv2 connections, for old clients.
                                Note: you shouldn't use SSLv2 for anything which should be secure.
-                               Newer versions of libssl don't include support for it anymore.
+                               Newer versions of OpenSSL libraries don't include support for it anymore.
                                </para>
                        </listitem>
                        <listitem>
@@ -84,7 +84,7 @@
                                is a concern."
                                </para>
                                <para>
-                               Note: For older libssl version, this option allows SSLv2, with hello
+                               Note: For older OpenSSL library versions, this option allows SSLv2, with hello
                                messages done over SSLv2. You shouldn't use SSLv2 or SSLv3 for anything
                                which should be secure.
                                </para>
@@ -982,7 +982,7 @@ modparam("tls", "session_cache", 1)
                The value for session ID context, making sense when session caching is enabled.
        </para>
        <para>
-               By default TLS session_id is "sip-router-tls-3.1".
+               By default TLS session_id is "kamailio-tls-5.x.y".
        </para>
        <example>
                <title>Set <varname>session_id</varname> parameter</title>
@@ -1310,7 +1310,7 @@ modparam("tls", "private_key", "/engine:my_HSM_key_label")
 modparam("tls", "engine", "pkcs11")
 modparam("tls", "private_key", "/engine:pkcs11:token=MYTOKEN;object=MYKEYLABEL")
 
-modparam("tls", "engine_conf", "/usr/local/etc/kamailio/openssl.cnf")
+modparam("tls", "engine_config", "/usr/local/etc/kamailio/openssl.cnf")
 modparam("tls", "engine_algorithms", "ALL")
 ...
                 </programlisting>
index 39f9831..69fdb9f 100644 (file)
@@ -293,8 +293,12 @@ int cancel_branch( struct cell *t, int branch,
                                                                , reason
                                                                );
        }
-       if (!cancel) {
+       if (!cancel || len<=0) {
                LM_ERR("attempt to build a CANCEL failed\n");
+               if(cancel) {
+                       shm_free(cancel);
+                       cancel = NULL;
+               }
                /* remove BUSY_BUFFER -- mark cancel buffer as not used */
                pcbuf=&crb->buffer; /* workaround for type punning warnings */
                atomic_set_long(pcbuf, 0);
@@ -500,8 +504,12 @@ unsigned int t_uac_cancel( str *headers, str *body,
        cancel->dst.proto           = invite->dst.proto;
        //cancel->dst.proto_reserved1 = invite->dst.proto_reserved1;
 
-       if(!(buf = build_uac_cancel(headers,body,t_invite,0,&len,
-                                       &(cancel->dst)))){
+       buf = build_uac_cancel(headers, body, t_invite, 0, &len, &(cancel->dst));
+       if(!buf || len<=0) {
+               if(buf) {
+                       shm_free(buf);
+                       buf = NULL;
+               }
                ret=0;
                LM_ERR("attempt to build a CANCEL failed\n");
                goto error1;
index 1c662a4..e76e12c 100644 (file)
@@ -474,8 +474,12 @@ static int prepare_new_uac( struct cell *t, struct sip_msg *i_req,
        }
        /* ... and build it now */
        shbuf=build_req_buf_from_sip_req( i_req, &len, dst, BUILD_IN_SHM);
-       if (!shbuf) {
+       if (!shbuf || len<=0) {
                LM_ERR("could not build request\n");
+               if(shbuf) {
+                       shm_free(shbuf);
+                       shbuf = NULL;
+               }
                ret=E_OUT_OF_MEM;
                goto error01;
        }
@@ -883,7 +887,11 @@ static int add_uac_from_buf( struct cell *t, struct sip_msg *request,
        shbuf=print_uac_request_from_buf( t, request, branch, uri,
                        &len, &t->uac[branch].request.dst,
                        buf, buf_len);
-       if (!shbuf) {
+       if (!shbuf || len<=0) {
+               if(shbuf) {
+                       shm_free(shbuf);
+                       shbuf = NULL;
+               }
                ret=ser_error=E_OUT_OF_MEM;
                goto error;
        }
@@ -1109,7 +1117,11 @@ int e2e_cancel_branch( struct sip_msg *cancel_msg, struct cell *t_cancel,
                                CANCEL_LEN, &t_invite->to
                                , 0
                                );
-               if (unlikely(!shbuf)) {
+               if (unlikely(!shbuf) || len<=0) {
+                       if(shbuf) {
+                               shm_free(shbuf);
+                               shbuf = NULL;
+                       }
                        LM_ERR("printing e2e cancel failed\n");
                        ret=ser_error=E_OUT_OF_MEM;
                        goto error;
index 75f0ab7..bd99524 100644 (file)
@@ -252,7 +252,7 @@ error:
  *
  * Can not be used to build other type of requests!
  */
-char *build_local_reparse(struct cell *Trans,unsigned int branch,
+char *build_local_reparse(tm_cell_t *Trans,unsigned int branch,
        unsigned int *len, char *method, int method_len, str *to
        , struct cancel_reason *reason
        )
@@ -272,7 +272,7 @@ char *build_local_reparse(struct cell *Trans,unsigned int branch,
        invite_buf = Trans->uac[branch].request.buffer;
        invite_len = Trans->uac[branch].request.buffer_len;
 
-       if (!invite_buf || !invite_len) {
+       if (!invite_buf || invite_len<=0) {
                LM_ERR("INVITE is missing\n");
                goto error;
        }
index ece23bb..b645f3c 100644 (file)
@@ -488,12 +488,16 @@ static int _reply_light( struct cell *trans, char* buf, unsigned int len,
        rb->rbtype=code;
 
        trans->uas.status = code;
+       if(len<=0) {
+               LM_ERR("invalid new buffer len\n");
+               goto error3;
+       }
        buf_len = rb->buffer ? len : len + REPLY_OVERBUFFER_LEN;
        rb->buffer = (char*)shm_resize( rb->buffer, buf_len );
        /* puts the reply's buffer to uas.response */
        if (! rb->buffer ) {
-                       LM_ERR("cannot allocate shmem buffer\n");
-                       goto error3;
+               LM_ERR("cannot allocate shmem buffer\n");
+               goto error3;
        }
        update_local_tags(trans, bm, rb->buffer, buf);
 
@@ -2024,6 +2028,10 @@ enum rps relay_reply( struct cell *t, struct sip_msg *p_msg, int branch,
                 *   larger messages are likely to follow and we will be
                 *   able to reuse the memory frag
                */
+               if (res_len<=0) {
+                       LM_ERR("invalid new buffer len\n");
+                       goto error03;
+               }
                uas_rb->buffer = (char*)shm_resize( uas_rb->buffer, res_len +
                        (msg_status<200 ?  REPLY_OVERBUFFER_LEN : 0));
                if (!uas_rb->buffer) {
index faa7e0d..ec250a8 100644 (file)
@@ -522,7 +522,7 @@ static inline int t_uac_prepare(uac_req_t *uac_r,
 
        buf = build_uac_req(uac_r->method, uac_r->headers, uac_r->body, uac_r->dialog, 0, new_cell,
                &buf_len, &dst);
-       if (!buf) {
+       if (!buf || buf_len<=0) {
                LM_ERR("Error while building message\n");
                ret=E_OUT_OF_MEM;
                goto error1;
@@ -782,19 +782,23 @@ struct retr_buf *local_ack_rb(sip_msg_t *rpl_2xx, struct cell *trans,
        struct dest_info dst;
 
        buf_len = (unsigned)sizeof(struct retr_buf);
-       if (! (buffer = build_dlg_ack(rpl_2xx, trans, branch, hdrs, body,
-                       &buf_len, &dst))) {
+       buffer = build_dlg_ack(rpl_2xx, trans, branch, hdrs, body,
+                       &buf_len, &dst);
+       if (!buffer || buf_len<=0) {
+               if(buffer) {
+                       shm_free(buffer);
+               }
                return 0;
-       } else {
-               /* 'buffer' now points into a contiguous chunk of memory with enough
-                * room to hold both the retr. buffer and the string raw buffer: it
-                * points to the begining of the string buffer; we iterate back to get
-                * the begining of the space for the retr. buffer. */
-               lack = &((struct retr_buf *)buffer)[-1];
-               lack->buffer = buffer;
-               lack->buffer_len = buf_len;
-               lack->dst = dst;
        }
+       /* 'buffer' now points into a contiguous chunk of memory with enough
+        * room to hold both the retr. buffer and the string raw buffer: it
+        * points to the begining of the string buffer; we iterate back to get
+        * the begining of the space for the retr. buffer. */
+       lack = &((struct retr_buf *)buffer)[-1];
+       lack->buffer = buffer;
+       lack->buffer_len = buf_len;
+       lack->dst = dst;
+
 
        /* TODO: need next 2? */
        lack->rbtype = TYPE_LOCAL_ACK;
index 4bf21f9..cc97cc9 100644 (file)
@@ -128,9 +128,9 @@ static void mod_destroy(void)
 static int w_is_leap_year(struct sip_msg* msg, char* t, char* str2)
 {
        time_t tv;
-       struct tm *tb;
+       struct tm tb;
        int y;
-       
+
        if(msg==NULL)
                return -1;
 
@@ -143,8 +143,8 @@ static int w_is_leap_year(struct sip_msg* msg, char* t, char* str2)
                }
        } else {
                tv = time(NULL);
-               tb = localtime(&tv);
-               y = 1900 + tb->tm_year;
+               localtime_r(&tv, &tb);
+               y = 1900 + tb.tm_year;
        }
 
        if(tr_is_leap_year(y))
@@ -155,12 +155,12 @@ static int w_is_leap_year(struct sip_msg* msg, char* t, char* str2)
 static int ki_is_leap_year_now(sip_msg_t* msg)
 {
        time_t tv;
-       struct tm *tb;
+       struct tm tb;
        int y;
 
        tv = time(NULL);
-       tb = localtime(&tv);
-       y = 1900 + tb->tm_year;
+       localtime_r(&tv, &tb);
+       y = 1900 + tb.tm_year;
 
        if(tr_is_leap_year(y))
                return 1;
index e4848ec..aa72a2a 100644 (file)
@@ -27,8 +27,8 @@
  */
 
 
-#ifndef URIDB_MOD_H
-#define URIDB_MOD_H
+#ifndef _UID_URI_DB_MOD_H_
+#define _UID_URI_DB_MOD_H_
 
 #include "../../lib/srdb2/db.h"
 #include "../../core/str.h"
index a78f0af..cba8ec4 100644 (file)
@@ -101,8 +101,8 @@ int ul_ka_db_records(int partidx)
        int proto = 0;
        str host = STR_NULL;
        char *p = NULL;
-#define ULKA_AURBUF_SIZE 1024
-       char aorbuf[ULKA_AURBUF_SIZE];
+#define ULKA_AORBUF_SIZE 1024
+       char aorbuf[ULKA_AORBUF_SIZE];
        int i = 0;
 
        /* select fields */
@@ -231,12 +231,12 @@ int ul_ka_db_records(int partidx)
 
                        /* user */
                        p  = (char*)VAL_STRING(ROW_VALUES(row) + 6);
-                       if (VAL_NULL(ROW_VALUES(row)+1) || p==0 || p[0]==0) {
+                       if (VAL_NULL(ROW_VALUES(row)+6) || p==0 || p[0]==0) {
                                LM_ERR("empty username -> skipping\n");
                                continue;
                        }
                        ur.aor.len = strlen(p);
-                       if(ur.aor.len >= ULKA_AURBUF_SIZE) {
+                       if(ur.aor.len >= ULKA_AORBUF_SIZE) {
                                LM_DBG("long username ->skipping\n");
                                continue;
                        }
@@ -244,8 +244,8 @@ int ul_ka_db_records(int partidx)
 
                        /* domain */
                        p  = (char*)VAL_STRING(ROW_VALUES(row) + 7);
-                       if (!(VAL_NULL(ROW_VALUES(row)+1) || p==0 || p[0]==0)) {
-                               if(ur.aor.len + strlen(p) >= ULKA_AURBUF_SIZE - 1) {
+                       if (!(VAL_NULL(ROW_VALUES(row)+7) || p==0 || p[0]==0)) {
+                               if(ur.aor.len + strlen(p) >= ULKA_AORBUF_SIZE - 2) {
                                        LM_DBG("long aor ->skipping\n");
                                        continue;
                                }
index 87cf4e3..5cef5d6 100644 (file)
@@ -210,8 +210,8 @@ static int mod_init(void)
        }
 
        if(ws_ping_application_data.len < 1 || ws_ping_application_data.len > 125) {
-               ws_ping_application_data.s = DEFAULT_PING_APPLICATION_DATA + 8;
-               ws_ping_application_data.len = DEFAULT_PING_APPLICATION_DATA_LEN - 8;
+               ws_ping_application_data.s = DEFAULT_PING_APPLICATION_DATA;
+               ws_ping_application_data.len = DEFAULT_PING_APPLICATION_DATA_LEN;
        }
 
        if(ws_keepalive_mechanism != KEEPALIVE_MECHANISM_NONE) {
index a4442ae..8570afa 100644 (file)
@@ -184,14 +184,14 @@ void wsconn_destroy(void)
        }
 }
 
-int wsconn_add(struct receive_info rcv, unsigned int sub_protocol)
+int wsconn_add(struct receive_info *rcv, unsigned int sub_protocol)
 {
        int cur_cons, max_cons;
-       int id = rcv.proto_reserved1;
+       int id = rcv->proto_reserved1;
        int id_hash = tcp_id_hash(id);
        ws_connection_t *wsc;
 
-       LM_DBG("wsconn_add id [%d]\n", id);
+       LM_DBG("connection id [%d]\n", id);
 
        /* Allocate and fill in new WebSocket connection */
        wsc = shm_malloc(sizeof(ws_connection_t) + BUF_SIZE + 1);
@@ -203,13 +203,13 @@ int wsconn_add(struct receive_info rcv, unsigned int sub_protocol)
        wsc->id = id;
        wsc->id_hash = id_hash;
        wsc->state = WS_S_OPEN;
-       wsc->rcv = rcv;
+       wsc->rcv = *rcv;
        wsc->sub_protocol = sub_protocol;
        wsc->run_event = 0;
        wsc->frag_buf.s = ((char *)wsc) + sizeof(ws_connection_t);
        atomic_set(&wsc->refcnt, 0);
 
-       LM_DBG("wsconn_add new wsc => [%p], ref => [%d]\n", wsc,
+       LM_DBG("new wsc => [%p], ref => [%d]\n", wsc,
                        atomic_get(&wsc->refcnt));
 
        WSCONN_LOCK;
@@ -229,7 +229,7 @@ int wsconn_add(struct receive_info rcv, unsigned int sub_protocol)
 
        WSCONN_UNLOCK;
 
-       LM_DBG("wsconn_add added to conn_table wsc => [%p], ref => [%d]\n", wsc,
+       LM_DBG("added to conn_table wsc => [%p], ref => [%d]\n", wsc,
                        atomic_get(&wsc->refcnt));
 
        /* Update connection statistics */
index 9319238..f8aa935 100644 (file)
@@ -95,7 +95,7 @@ extern stat_var *ws_msrp_max_concurrent_connections;
 
 int wsconn_init(void);
 void wsconn_destroy(void);
-int wsconn_add(struct receive_info rcv, unsigned int sub_protocol);
+int wsconn_add(struct receive_info *rcv, unsigned int sub_protocol);
 int wsconn_rm(ws_connection_t *wsc, ws_conn_eventroute_t run_event_route);
 int wsconn_update(ws_connection_t *wsc);
 void wsconn_close_now(ws_connection_t *wsc);
index d0f8d84..51a62e0 100644 (file)
@@ -49,8 +49,8 @@ extern int ws_keepalive_mechanism;
 #define DEFAULT_KEEPALIVE_TIMEOUT 180 /* seconds */
 
 extern str ws_ping_application_data;
-#define DEFAULT_PING_APPLICATION_DATA SERVER_HDR
-#define DEFAULT_PING_APPLICATION_DATA_LEN SERVER_HDR_LEN
+#define DEFAULT_PING_APPLICATION_DATA SRVAPP_SIGNATURE
+#define DEFAULT_PING_APPLICATION_DATA_LEN SRVAPP_SIGNATURE_LEN
 
 extern stat_var *ws_failed_connections;
 extern stat_var *ws_local_closed_connections;
index 58e6077..878c483 100644 (file)
@@ -310,7 +310,7 @@ int ws_handle_handshake(struct sip_msg *msg)
                        (unsigned char *)reply_key.s, base64_enc_len(SHA_DIGEST_LENGTH));
 
        /* Add the connection to the WebSocket connection table */
-       wsconn_add(msg->rcv, sub_protocol);
+       wsconn_add(&msg->rcv, sub_protocol);
 
        /* Make sure Kamailio core sends future messages on this connection
           directly to this module */
index e51ff83..b9269c2 100644 (file)
@@ -283,7 +283,7 @@ static int print_value(rpc_ctx_t* ctx, char fmt, va_list* ap, str *id)
        str *sp;
        char buf[PRINT_VALUE_BUF_LEN];
        time_t dt;
-       struct tm* t;
+       struct tm t;
 
        switch(fmt) {
        case 'd':
@@ -306,9 +306,9 @@ static int print_value(rpc_ctx_t* ctx, char fmt, va_list* ap, str *id)
                body.s = buf;
                body.len = sizeof("19980717T14:08:55") - 1;
                dt = va_arg(*ap, time_t);
-               t = gmtime(&dt);
+               gmtime_r(&dt, &t);
                if (strftime(buf, PRINT_VALUE_BUF_LEN,
-                               "%Y%m%dT%H:%M:%S", t) == 0) {
+                               "%Y%m%dT%H:%M:%S", &t) == 0) {
                        LM_ERR("Error while converting time\n");
                        return -1;
                }
index bbe2cea..5771b77 100644 (file)
@@ -164,7 +164,7 @@ static int xl_get_times(struct sip_msg *msg, str *res, str *hp, int hi, int hf)
 }
 static int xl_get_timef(struct sip_msg *msg, str *res, str *hp, int hi, int hf)
 {
-       char *ch = NULL;
+       char ch[26] = {0};
 
        if(msg==NULL || res==NULL)
                return -1;
@@ -174,7 +174,7 @@ static int xl_get_timef(struct sip_msg *msg, str *res, str *hp, int hi, int hf)
                msg_id = msg->id;
        }
 
-       ch = ctime(&msg_tm);
+       ctime_r(&msg_tm, ch);
 
        res->s = ch;
        res->len = strlen(ch)-1;