tcpudp: shrink per-host rate-limiting code

function                                             old     new   delta
tcpudpsvd_main                                      1775    1780      +5
ipsvd_perhost_add                                    108     107      -1
cclen                                                  4       -      -4
cc                                                     4       -      -4
ipsvd_perhost_init                                    30      25      -5
ipsvd_perhost_remove                                  80      44     -36
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/3 up/down: 5/-50)             Total: -45 bytes
   text	   data	    bss	    dec	    hex	filename
 933358	    473	   6852	 940683	  e5a8b	busybox_old
 933326	    473	   6844	 940643	  e5a63	busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/networking/tcpudp_perhost.c b/networking/tcpudp_perhost.c
index 1054108..2643f8d 100644
--- a/networking/tcpudp_perhost.c
+++ b/networking/tcpudp_perhost.c
@@ -10,25 +10,21 @@
 #include "libbb.h"
 #include "tcpudp_perhost.h"
 
-static struct hcc *cc;
-static unsigned cclen;
-
-/* to be optimized */
-
-void ipsvd_perhost_init(unsigned c)
+struct hcc* FAST_FUNC ipsvd_perhost_init(unsigned c)
 {
 //	free(cc);
-	cc = xzalloc(c * sizeof(*cc));
-	cclen = c;
+	struct hcc *cc = xzalloc((c + 1) * sizeof(*cc));
+	cc[c].pid = -1; /* "end" marker */
+	return cc;
 }
 
-unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp)
+unsigned FAST_FUNC ipsvd_perhost_add(struct hcc *cc, char *ip, unsigned maxconn, struct hcc **hccpp)
 {
 	unsigned i;
 	unsigned conn = 1;
 	int freepos = -1;
 
-	for (i = 0; i < cclen; ++i) {
+	for (i = 0; cc[i].pid >= 0; ++i) {
 		if (!cc[i].ip) {
 			freepos = i;
 			continue;
@@ -46,10 +42,10 @@
 	return conn;
 }
 
-void ipsvd_perhost_remove(int pid)
+void FAST_FUNC ipsvd_perhost_remove(struct hcc *cc, int pid)
 {
 	unsigned i;
-	for (i = 0; i < cclen; ++i) {
+	for (i = 0; cc[i].pid >= 0; ++i) {
 		if (cc[i].pid == pid) {
 			free(cc[i].ip);
 			cc[i].ip = NULL;
@@ -59,7 +55,7 @@
 	}
 }
 
-//void ipsvd_perhost_free(void)
+//void ipsvd_perhost_free(struct hcc *cc)
 //{
 //	free(cc);
 //}