tcpudp: shrink per-host rate-limiting code
No binary (build failed)
—
(log yok)
| @@ -127,6 +127,7 @@ struct globals { | |
| unsigned cur_per_host; | |
| unsigned cnum; | |
| unsigned cmax; | |
| + | struct hcc *cc; |
| char **env_cur; | |
| char *env_var[1]; /* actually bigger */ | |
| } FIX_ALIASING; | |
| @@ -229,7 +230,7 @@ static void sig_child_handler(int sig UNUSED_PARAM) | |
| while ((pid = wait_any_nohang(&wstat)) > 0) { | |
| if (max_per_host) | |
| - | ipsvd_perhost_remove(pid); |
| + | ipsvd_perhost_remove(G.cc, pid); |
| if (cnum) | |
| cnum--; | |
| if (verbose) | |
| @@ -347,7 +348,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv) | |
| signal(SIGPIPE, SIG_IGN); | |
| if (max_per_host) | |
| - | ipsvd_perhost_init(cmax); |
| + | G.cc = ipsvd_perhost_init(cmax); |
| local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0); | |
| lsa = xhost2sockaddr(argv[0], local_port); | |
| @@ -422,7 +423,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv) | |
| /* Drop connection immediately if cur_per_host > max_per_host | |
| * (minimizing load under SYN flood) */ | |
| remote_addr = xmalloc_sockaddr2dotted_noport(&remote.u.sa); | |
| - | cur_per_host = ipsvd_perhost_add(remote_addr, max_per_host, &hccp); |
| + | cur_per_host = ipsvd_perhost_add(G.cc, remote_addr, max_per_host, &hccp); |
| if (cur_per_host > max_per_host) { | |
| /* ipsvd_perhost_add detected that max is exceeded | |
| * (and did not store ip in connection table) */ | |
| @@ -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 @@ unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp) | |
| 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_remove(int pid) | |
| } | |
| } | |
| - | //void ipsvd_perhost_free(void) |
| + | //void ipsvd_perhost_free(struct hcc *cc) |
| //{ | |
| // free(cc); | |
| //} | |
| @@ -14,7 +14,7 @@ struct hcc { | |
| int pid; | |
| }; | |
| - | void ipsvd_perhost_init(unsigned); |
| + | struct hcc* FAST_FUNC ipsvd_perhost_init(unsigned); |
| /* Returns number of already opened connects to this ips, including this one. | |
| * ip should be a malloc'ed ptr. | |
| @@ -22,12 +22,12 @@ void ipsvd_perhost_init(unsigned); | |
| * and pointer to table entry if stored in *hccpp | |
| * (useful for storing pid later). | |
| * Else ip is NOT inserted (you must take care of it - free() etc) */ | |
| - | 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); |
| /* Finds and frees element with pid */ | |
| - | void ipsvd_perhost_remove(int pid); |
| + | void FAST_FUNC ipsvd_perhost_remove(struct hcc *cc, int pid); |
| //unsigned ipsvd_perhost_setpid(int pid); | |
| - | //void ipsvd_perhost_free(void); |
| + | //void ipsvd_perhost_free(struct hcc *cc); |
| POP_SAVED_FUNCTION_VISIBILITY | |