diff options
author | Denis Vlasenko | 2008-03-17 09:17:27 +0000 |
---|---|---|
committer | Denis Vlasenko | 2008-03-17 09:17:27 +0000 |
commit | 4866e905d7e1f11d86374fad4e46aa2bd669c2ba (patch) | |
tree | a6a8e9521de92d658903ba9f54cd01e94a34c262 /networking/tcpudp_perhost.c | |
parent | 4ee7cd4f6f9f85871c8814bb524d3e691a2992a9 (diff) | |
download | busybox-4866e905d7e1f11d86374fad4e46aa2bd669c2ba.zip busybox-4866e905d7e1f11d86374fad4e46aa2bd669c2ba.tar.gz |
svn add/svn rm to actually move tcp/udpsvd...
Diffstat (limited to 'networking/tcpudp_perhost.c')
-rw-r--r-- | networking/tcpudp_perhost.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/networking/tcpudp_perhost.c b/networking/tcpudp_perhost.c new file mode 100644 index 0000000..3005f12 --- /dev/null +++ b/networking/tcpudp_perhost.c @@ -0,0 +1,65 @@ +/* Based on ipsvd utilities written by Gerrit Pape <pape@smarden.org> + * which are released into public domain by the author. + * Homepage: http://smarden.sunsite.dk/ipsvd/ + * + * Copyright (C) 2007 Denys Vlasenko. + * + * Licensed under GPLv2, see file LICENSE in this tarball for details. + */ + +#include "libbb.h" +#include "tcpudp_perhost.h" + +static struct hcc *cc; +static unsigned cclen; + +/* to be optimized */ + +void ipsvd_perhost_init(unsigned c) +{ +// free(cc); + cc = xzalloc(c * sizeof(*cc)); + cclen = c; +} + +unsigned ipsvd_perhost_add(char *ip, unsigned maxconn, struct hcc **hccpp) +{ + unsigned i; + unsigned conn = 1; + int freepos = -1; + + for (i = 0; i < cclen; ++i) { + if (!cc[i].ip) { + freepos = i; + continue; + } + if (strcmp(cc[i].ip, ip) == 0) { + conn++; + continue; + } + } + if (freepos == -1) return 0; + if (conn <= maxconn) { + cc[freepos].ip = ip; + *hccpp = &cc[freepos]; + } + return conn; +} + +void ipsvd_perhost_remove(int pid) +{ + unsigned i; + for (i = 0; i < cclen; ++i) { + if (cc[i].pid == pid) { + free(cc[i].ip); + cc[i].ip = NULL; + cc[i].pid = 0; + return; + } + } +} + +//void ipsvd_perhost_free(void) +//{ +// free(cc); +//} |