iSet SO_LINGER, flush using TCP_NODELAY and fix wait overflow. - 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 c99b01b00b1c6d0740e92d9e77ab8e0daa96c4bf /scm/geomyidae/commit/c99b01b00b1c6d0740e92d9e77ab8e0daa96c4bf.gph bitreich.org 70 1parent 1375ce4688358eca4db5bd1f0309863a574d250e /scm/geomyidae/commit/1375ce4688358eca4db5bd1f0309863a574d250e.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Wed, 22 Jul 2020 14:41:10 +0200 Err bitreich.org 70 i Err bitreich.org 70 iSet SO_LINGER, flush using TCP_NODELAY and fix wait overflow. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M ind.c | 3 ++- Err bitreich.org 70 i M main.c | 17 ++++++++++++++++- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 18 insertions(+), 2 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@@ -79,7 +79,8 @@ 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- int npending = 0, opending = 0, trytime = 10; Err bitreich.org 70 i+ int npending = 0, opending = 0; Err bitreich.org 70 i+ useconds_t trytime = 10; 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 Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -15,6 +15,7 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -416,6 +417,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i struct addrinfo hints; Err bitreich.org 70 i struct sockaddr_storage clt; Err bitreich.org 70 i+ struct linger lingerie; Err bitreich.org 70 i socklen_t cltlen; Err bitreich.org 70 i int sock, dofork = 1, inetf = AF_UNSPEC, usechroot = 0, Err bitreich.org 70 i nocgi = 0, errno_save, nbindips = 0, i, j, Err bitreich.org 70 i@@ -867,9 +869,22 @@ main(int argc, char *argv[]) Err bitreich.org 70 i clientp, nocgi, istls); Err bitreich.org 70 i Err bitreich.org 70 i if (!istls) { Err bitreich.org 70 i+ lingerie.l_onoff = 1; Err bitreich.org 70 i+ lingerie.l_linger = 60; Err bitreich.org 70 i+ setsockopt(sock, SOL_SOCKET, SO_LINGER, Err bitreich.org 70 i+ &lingerie, sizeof(lingerie)); Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Force explict flush of buffers using Err bitreich.org 70 i+ * TCP_NODELAY. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ j = 1; Err bitreich.org 70 i+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, Err bitreich.org 70 i+ &j, sizeof(int)); Err bitreich.org 70 i waitforpendingbytes(sock); Err bitreich.org 70 i+ j = 0; Err bitreich.org 70 i+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, Err bitreich.org 70 i+ &j, sizeof(int)); Err bitreich.org 70 i shutdown(sock, SHUT_RDWR); Err bitreich.org 70 i- close(sock); Err bitreich.org 70 i } Err bitreich.org 70 i close(sock); Err bitreich.org 70 i Err bitreich.org 70 .