summaryrefslogtreecommitdiff
path: root/src/conn-tools/s6-connlimit.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2014-12-15 23:08:59 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2014-12-15 23:08:59 +0000
commite0fc82203d677a6f1e808e9a1a46176c109d89be (patch)
treee9609209b755e3f7a8480aea86601ffe9d4ca540 /src/conn-tools/s6-connlimit.c
downloads6-networking-e0fc82203d677a6f1e808e9a1a46176c109d89be.tar.xz
Initial commit
Diffstat (limited to 'src/conn-tools/s6-connlimit.c')
-rw-r--r--src/conn-tools/s6-connlimit.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/conn-tools/s6-connlimit.c b/src/conn-tools/s6-connlimit.c
new file mode 100644
index 0000000..19f4a2d
--- /dev/null
+++ b/src/conn-tools/s6-connlimit.c
@@ -0,0 +1,39 @@
+/* ISC license. */
+
+#include <skalibs/uint.h>
+#include <skalibs/bytestr.h>
+#include <skalibs/strerr2.h>
+#include <skalibs/env.h>
+#include <skalibs/djbunix.h>
+
+int main (int argc, char const *const *argv, char const *const *envp)
+{
+ char const *x ;
+ unsigned int protolen ;
+ PROG = "s6-connlimit" ;
+ x = env_get2(envp, "PROTO") ;
+ if (!x) strerr_dienotset(100, "PROTO") ;
+ protolen = str_len(x) ;
+ if (!protolen) strerr_dief1x(100, "empty PROTO") ;
+ {
+ unsigned int num ;
+ char s[protolen + 8] ;
+ byte_copy(s, protolen, x) ;
+ byte_copy(s + protolen, 8, "CONNNUM") ;
+ x = env_get2(envp, s) ;
+ if (!x) strerr_dienotset(100, s) ;
+ if (!uint0_scan(x, &num)) strerr_dief2x(100, "invalid ", s) ;
+ byte_copy(s + protolen + 4, 4, "MAX") ;
+ x = env_get2(envp, s) ;
+ if (x)
+ {
+ unsigned int max ;
+ if (!uint0_scan(x, &max)) strerr_dief2x(100, "invalid ", s) ;
+ if (num > max)
+ strerr_dief2x(1, "number of connections from this client limited to ", x) ;
+ }
+ }
+ pathexec0_run(argv+1, envp) ;
+ (void)argc ;
+ strerr_dieexec(111, argv[1]) ;
+}