URI: 
       Add lingerie to all socks. - geomyidae - A small C-based gopherd.
  HTML git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 89ed3ff980bfd8b1a6405be67565b1de3b393ac3
   DIR parent 41aaba3aa82bbe810c1008246b2b226e7395fe1e
  HTML Author: Christoph Lohmann <20h@r-36.net>
       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(-)
       ---
   DIR 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;
       +}
       +
   DIR diff --git a/ind.h b/ind.h
       @@ -54,6 +54,7 @@ void setcgienviron(char *file, char *path, char *port, char *base,
                        char *bhost, int istls, char *sel, char *traverse);
        char *humansize(off_t n);
        char *humantime(const time_t *clock);
       +void lingersock(int sock);
        
        #endif
        
   DIR 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 : 1]);
                                                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) {