URI: 
       Add splice speedup for geomyidae. - 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 2d93b6f04f44d94cc38dd1ef666867c0ca95574f
   DIR parent 23ce04766e993ae515483debfc2c3be1c38b2d0b
  HTML Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sat, 30 Jul 2022 13:02:13 +0200
       
       Add splice speedup for geomyidae.
       
       Thank you parayd, Evil_Bob!
       
       Live from brcon2022.
       
       Diffstat:
         M ind.c                               |      49 +++++++++++++++++++++++++++++++
       
       1 file changed, 49 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/ind.c b/ind.c
       @@ -3,6 +3,10 @@
         * by 20h
         */
        
       +#ifdef __linux__
       +        #define _GNU_SOURCE
       +#endif
       +
        #include <unistd.h>
        #include <stdarg.h>
        #include <string.h>
       @@ -21,6 +25,10 @@
        #include <sys/ioctl.h>
        #include <limits.h>
        
       +#define PAGE_SHIFT 12
       +#define PAGE_SIZE (1UL << PAGE_SHIFT)
       +#define BLOCK_SIZE ((PAGE_SIZE * 16) - 1)
       +
        #include "arg.h"
        #include "ind.h"
        #include "handlr.h"
       @@ -92,6 +100,43 @@ waitforpendingbytes(int sock)
                }
        }
        
       +#ifdef __linux__
       +int
       +xsplice(int fd, int sock)
       +{
       +        int pipefd[2], ret = 0;
       +        ssize_t nread, nwritten;
       +        off_t in_offset = 0;
       +
       +        if (pipe(pipefd) < 0) {
       +                perror("pipe");
       +                _exit(1);
       +        }
       +
       +        do {
       +                nread = splice(fd, &in_offset, pipefd[1], NULL,
       +                        BLOCK_SIZE, SPLICE_F_MOVE | SPLICE_F_MORE);
       +
       +                if (nread <= 0) {
       +                        ret = nread < 0 ? 1 : 0;
       +                        goto out;
       +                }
       +
       +                nwritten  = splice(pipefd[0], NULL, sock, NULL, BLOCK_SIZE, SPLICE_F_MOVE | SPLICE_F_MORE);
       +                if (nwritten < 0) {
       +                        ret = 1;
       +                        goto out;
       +                }
       +        } while (nwritten > 0);
       +
       +out:
       +        close(pipefd[0]);
       +        close(pipefd[1]);
       +
       +        return ret;
       +}
       +#endif
       +
        int
        xsendfile(int fd, int sock)
        {
       @@ -100,6 +145,10 @@ xsendfile(int fd, int sock)
                size_t bufsiz = BUFSIZ;
                int len, sent, optval;
        
       +#ifdef splice
       +        return xsplice(fd, sock);
       +#endif
       +
                USED(optval);
        
                /*