Module: kamailio Branch: master Commit: a187d9ec0e465141ad2466d84dfac8e2a4338911 URL: https://github.com/kamailio/kamailio/commit/a187d9ec0e465141ad2466d84dfac8e2...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: GitHub noreply@github.com Date: 2016-08-29T11:20:59+02:00
Merge pull request #759 from kelchy/master
pike: fixed rpc array
---
Modified: modules/pike/pike_rpc.c Modified: modules/pike/pike_top.c Modified: modules/pike/pike_top.h
---
Diff: https://github.com/kamailio/kamailio/commit/a187d9ec0e465141ad2466d84dfac8e2... Patch: https://github.com/kamailio/kamailio/commit/a187d9ec0e465141ad2466d84dfac8e2...
---
diff --git a/modules/pike/pike_rpc.c b/modules/pike/pike_rpc.c index b8cc1f4..ef2d171 100644 --- a/modules/pike/pike_rpc.c +++ b/modules/pike/pike_rpc.c @@ -101,42 +101,15 @@ static void collect_data(int options) } }
-/* do not use static buffer with this function */ -static const char *concat_err = "ERROR while concatenating string"; -static char *concat(char *buff, size_t buffsize, const char *first, int second) -{ - int rv; - size_t size; - - while ( (rv = snprintf(buff, buffsize, "%s%d", first, second)) >= buffsize ) { - size = rv > 128 ? rv : 128; - buff = (char *)realloc(buff, size); - if ( buff == 0 ) - return (char*)concat_err; - buffsize = size; - DBG("pike:rpc:concat: new buffer size for %s: %d", first, - (int)buffsize); - } - return buff; -} - static void pike_top(rpc_t *rpc, void *c) { int i; void *handle; + void *list; + void *item; struct TopListItem_t *top_list_root; struct TopListItem_t *ti = 0; - char addr_buff[40]; - char *ip_addr = 0; - char *leaf_hits_prev = 0; - char *leaf_hits_curr = 0; - char *expires = 0; - char *status = 0; - size_t ip_addr_size = 0; - size_t leaf_hits_prev_size = 0; - size_t leaf_hits_curr_size = 0; - size_t expires_size = 0; - size_t status_size = 0; + char addr_buff[PIKE_BUFF_SIZE*sizeof(char)]; char *stropts; int options = 0;
@@ -170,7 +143,7 @@ static void pike_top(rpc_t *rpc, void *c) DBG("pike_top: top_list_root = %p", top_list_root);
rpc->add(c, "{", &handle); - rpc->struct_add(handle, "d", "max_hits", get_max_hits()); + rpc->struct_add(handle, "d[", "max_hits", get_max_hits(), "list", &list); i = 0; // it is passed as number of rows if ( top_list_root == 0 ) { DBG("pike_top: no data"); @@ -181,24 +154,17 @@ static void pike_top(rpc_t *rpc, void *c) DBG("pike:top: result[%d]: %s leaf_hits[%d,%d] hits[%d,%d] expires: %d status: 0x%02x", i, addr_buff, ti->leaf_hits[0], ti->leaf_hits[1], ti->hits[0], ti->hits[1], ti->expires, ti->status); - rpc->struct_add(handle, "sddds", - concat(ip_addr, ip_addr_size, "ip_addr", i), addr_buff, - concat(leaf_hits_prev, leaf_hits_prev_size, "leaf_hits_prev", i), ti->leaf_hits[0], - concat(leaf_hits_curr, leaf_hits_curr_size, "leaf_hits_curr", i), ti->leaf_hits[1], - concat(expires, expires_size, "expires", i), ti->expires, - concat(status, status_size, "status", i), node_status_array[ti->status]); + rpc->array_add(list, "{", &item); + rpc->struct_add(item, "sddds", + "ip_addr", addr_buff, + "leaf_hits_prev", ti->leaf_hits[0], + "leaf_hits_curr", ti->leaf_hits[1], + "expires", ti->expires, + "status", node_status_array[ti->status]); } } rpc->struct_add(handle, "d", "number_of_rows", i); - /* free buffers */ - free(ip_addr); - free(leaf_hits_prev); - free(leaf_hits_curr); - free(expires); - free(status); pike_top_list_clear(); - - rpc->send(c); }
/* ----- exported data structure with methods ----- */ diff --git a/modules/pike/pike_top.c b/modules/pike/pike_top.c index fbf5367..e187a0b 100644 --- a/modules/pike/pike_top.c +++ b/modules/pike/pike_top.c @@ -33,7 +33,6 @@ static struct TopListItem_t *top_list_root = 0; static struct TopListItem_t *top_list_iter = 0;
-#define PIKE_BUFF_SIZE 128 static char buff[PIKE_BUFF_SIZE];
struct TopListItem_t *pike_top_get_root() { return top_list_root; } diff --git a/modules/pike/pike_top.h b/modules/pike/pike_top.h index 805a825..74bb8e3 100644 --- a/modules/pike/pike_top.h +++ b/modules/pike/pike_top.h @@ -24,6 +24,8 @@ #include "ip_tree.h" #include "../../ip_addr.h"
+#define PIKE_BUFF_SIZE 128 + struct TopListItem_t { int addr_len; unsigned char ip_addr[45]; /*!< Make room for IPv6 */