Add lingerie to all socks. - geomyidae - a small C-based gopherd (mirror) | |
git clone git://git.codemadness.org/geomyidae | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 89ed3ff980bfd8b1a6405be67565b1de3b393ac3 | |
parent 41aaba3aa82bbe810c1008246b2b226e7395fe1e | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sun, 23 Jul 2023 14:23:26 +0200 | |
Add lingerie to all socks. | |
* fix TLS connection shutdown | |
Diffstat: | |
M ind.c | 28 ++++++++++++++++++++++++++++ | |
M ind.h | 1 + | |
M main.c | 34 +++--------------------------… | |
3 files changed, 32 insertions(+), 31 deletions(-) | |
--- | |
diff --git a/ind.c b/ind.c | |
@@ -630,3 +630,31 @@ humantime(const time_t *clock) | |
return buf; | |
} | |
+void | |
+lingersock(int sock) | |
+{ | |
+ struct linger lingerie; | |
+ int j; | |
+ | |
+ /* | |
+ * On close only wait for at maximum 60 seconds for all data to be | |
+ * transmitted before forcefully closing the connection. | |
+ */ | |
+ lingerie.l_onoff = 1; | |
+ lingerie.l_linger = 60; | |
+ setsockopt(sock, SOL_SOCKET, SO_LINGER, | |
+ &lingerie, sizeof(lingerie)); | |
+ | |
+ /* | |
+ * Force explicit flush of buffers using TCP_NODELAY. | |
+ */ | |
+ j = 1; | |
+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &j, sizeof(int)); | |
+ waitforpendingbytes(sock); | |
+ j = 0; | |
+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &j, sizeof(int)); | |
+ shutdown(sock, SHUT_RDWR); | |
+ | |
+ return; | |
+} | |
+ | |
diff --git a/ind.h b/ind.h | |
@@ -54,6 +54,7 @@ void setcgienviron(char *file, char *path, char *port, char *… | |
char *bhost, int istls, char *sel, char *traverse); | |
char *humansize(off_t n); | |
char *humantime(const time_t *clock); | |
+void lingersock(int sock); | |
#endif | |
diff --git a/main.c b/main.c | |
@@ -589,7 +589,6 @@ main(int argc, char *argv[]) | |
{ | |
struct addrinfo hints; | |
struct sockaddr_storage clt, slt; | |
- struct linger lingerie; | |
socklen_t cltlen, sltlen; | |
int sock, dofork = 1, inetf = AF_UNSPEC, usechroot = 0, | |
nocgi = 0, errno_save, nbindips = 0, i, j, | |
@@ -1147,15 +1146,11 @@ read_selector_again: | |
tls_free(tlsclientctx); | |
} | |
+ lingersock(tlssocks[tlsclientreader? 0… | |
close(tlssocks[tlsclientreader? 0 : 1]… | |
if (tlsclientreader) { | |
- /* | |
- * Only one process needs | |
- * to do this. | |
- */ | |
- waitforpendingbytes(sock); | |
- shutdown(sock, SHUT_RDWR); | |
+ lingersock(sock); | |
close(sock); | |
} | |
return 0; | |
@@ -1169,30 +1164,7 @@ read_selector_again: | |
clienth, clientp, serverh, serverp, | |
nocgi, istls); | |
- if (!istls) { | |
- /* | |
- * On close only wait for at maximum 60 | |
- * seconds for all data to be transmitted | |
- * before forcefully closing the | |
- * connection. | |
- */ | |
- lingerie.l_onoff = 1; | |
- lingerie.l_linger = 60; | |
- setsockopt(sock, SOL_SOCKET, SO_LINGER, | |
- &lingerie, sizeof(lingerie)); | |
- /* | |
- * Force explict flush of buffers using | |
- * TCP_NODELAY. | |
- */ | |
- j = 1; | |
- setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, | |
- &j, sizeof(int)); | |
- waitforpendingbytes(sock); | |
- j = 0; | |
- setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, | |
- &j, sizeof(int)); | |
- shutdown(sock, SHUT_RDWR); | |
- } | |
+ lingersock(sock); | |
close(sock); | |
if (loglvl & CONN) { |