iAnother hack for SO_LINGER in Linux. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 1908f14b2d4df2a0530fc4c7ca308220c89871c0 /scm/geomyidae/commit/1908f14b2d4df2a0530fc4c7ca308220c89871c0.gph bitreich.org 70 1parent 2c95cfddd2b4d2aca43bdcad09cdadd3214a10c9 /scm/geomyidae/commit/2c95cfddd2b4d2aca43bdcad09cdadd3214a10c9.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sun, 18 Feb 2018 09:33:39 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAnother hack for SO_LINGER in Linux. Err bitreich.org 70 i Err bitreich.org 70 iIn case some connection stalled, wait 30 seconds until it is closed. Err bitreich.org 70 iDDoS is still possible, but that is not geomyidae's fault. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ind.c | 40 ++++++++++++++++++++++++++++---- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 36 insertions(+), 4 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -57,12 +57,22 @@ filetype type[] = { Err bitreich.org 70 i int Err bitreich.org 70 i pendingbytes(int sock) Err bitreich.org 70 i { Err bitreich.org 70 i- int pending; Err bitreich.org 70 i+ int pending, rval; Err bitreich.org 70 i Err bitreich.org 70 i pending = 0; Err bitreich.org 70 i+ rval = 0; Err bitreich.org 70 i #ifdef TIOCOUTQ Err bitreich.org 70 i- ioctl(sock, TIOCOUTQ, &pending); Err bitreich.org 70 i+ rval = ioctl(sock, TIOCOUTQ, &pending); Err bitreich.org 70 i+#else Err bitreich.org 70 i+#ifdef SIOCOUTQ Err bitreich.org 70 i+ rval = ioctl(sock, SIOCOUTQ, &pending); Err bitreich.org 70 i #endif Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (rval != 0) { Err bitreich.org 70 i+ printf("rval = %d\n", rval); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i return pending; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -70,8 +80,30 @@ pendingbytes(int sock) Err bitreich.org 70 i void Err bitreich.org 70 i waitforpendingbytes(int sock) Err bitreich.org 70 i { Err bitreich.org 70 i- while (pendingbytes(sock) > 0) Err bitreich.org 70 i- usleep(10); Err bitreich.org 70 i+ int npending, opending, tries; Err bitreich.org 70 i+ Err bitreich.org 70 i+ npending = opending = tries = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Wait until there is nothing pending or the connection stalled for Err bitreich.org 70 i+ * 30 seconds. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ while ((npending = pendingbytes(sock)) > 0 && tries < 30000000) { Err bitreich.org 70 i+ if (opending != 0) { Err bitreich.org 70 i+ if (opending != npending) { Err bitreich.org 70 i+ tries = 0; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ if (tries == 0) { Err bitreich.org 70 i+ tries = 1; Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ tries += tries; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ opending = npending; Err bitreich.org 70 i+ Err bitreich.org 70 i+ usleep(tries); Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 .