iReworking the socket closing handling. - 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 ecf782f0557effe122f791f839a509ec428d236e /scm/geomyidae/commit/ecf782f0557effe122f791f839a509ec428d236e.gph bitreich.org 70 1parent f4cac1fea572c34eaf23baef928d7aa313ae9ccf /scm/geomyidae/commit/f4cac1fea572c34eaf23baef928d7aa313ae9ccf.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Wed, 7 Feb 2018 19:57:42 +0100 Err bitreich.org 70 i Err bitreich.org 70 iReworking the socket closing handling. Err bitreich.org 70 i Err bitreich.org 70 iThanks Evil_Bob for much input. Err bitreich.org 70 i Err bitreich.org 70 iGeomyidae now supports the ugly event code of curl. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M handlr.c | 1 - Err bitreich.org 70 i M ind.c | 29 ++++++++++++++++++++++++++--- Err bitreich.org 70 i M ind.h | 2 ++ Err bitreich.org 70 i M main.c | 30 ++++++++++++++++++++---------- Err bitreich.org 70 i Err bitreich.org 70 i4 files changed, 48 insertions(+), 14 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70 i@@ -116,7 +116,6 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i if (fd >= 0) { Err bitreich.org 70 i if (xsendfile(fd, sock) < 0) Err bitreich.org 70 i perror("sendfile"); Err bitreich.org 70 i- close(fd); Err bitreich.org 70 i } Err bitreich.org 70 i } 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@@ -16,15 +16,18 @@ 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 Err bitreich.org 70 i-/* for sendfile(2) */ Err bitreich.org 70 i+/* for sendfile(2) and SIOCOUTQ */ Err bitreich.org 70 i #ifdef __linux__ Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i #elif defined(__FreeBSD__) || defined(__DragonFly__) Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #endif Err bitreich.org 70 i Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i #include "ind.h" Err bitreich.org 70 i #include "handlr.h" Err bitreich.org 70 i Err bitreich.org 70 i@@ -53,6 +56,25 @@ filetype type[] = { Err bitreich.org 70 i }; Err bitreich.org 70 i 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+ Err bitreich.org 70 i+ pending = 0; Err bitreich.org 70 i+ ioctl(sock, SIOCOUTQ, &pending); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return pending; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+waitforpendingbytes(int sock) Err bitreich.org 70 i+{ 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+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i xsendfile(int fd, int sock) Err bitreich.org 70 i { Err bitreich.org 70 i struct stat st; Err bitreich.org 70 i@@ -60,6 +82,8 @@ xsendfile(int fd, int sock) Err bitreich.org 70 i size_t bufsiz = BUFSIZ, count = 0; Err bitreich.org 70 i int len, sent, optval; Err bitreich.org 70 i Err bitreich.org 70 i+ USED(optval); Err bitreich.org 70 i+ Err bitreich.org 70 i /* Tell the kernel to not send small packets on every write. */ Err bitreich.org 70 i #ifdef TCP_CORK Err bitreich.org 70 i optval = 1; Err bitreich.org 70 i@@ -94,12 +118,11 @@ xsendfile(int fd, int sock) Err bitreich.org 70 i count = 0; Err bitreich.org 70 i #endif Err bitreich.org 70 i Err bitreich.org 70 i- if (count == 0) { Err bitreich.org 70 i+ if (count > 0) { Err bitreich.org 70 i sendb = xmalloc(bufsiz); Err bitreich.org 70 i while ((len = read(fd, sendb, bufsiz)) > 0) { Err bitreich.org 70 i while (len > 0) { Err bitreich.org 70 i if ((sent = send(sock, sendb, len, 0)) < 0) { Err bitreich.org 70 i- close(fd); Err bitreich.org 70 i free(sendb); Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/ind.h b/ind.h /scm/geomyidae/file/ind.h.gph bitreich.org 70 i@@ -39,6 +39,8 @@ char *xstrdup(const char *str); Err bitreich.org 70 i int xsendfile(int, int); Err bitreich.org 70 i Indexs *scanfile(char *fname); Err bitreich.org 70 i Elems *getadv(char *str); Err bitreich.org 70 i+int pendingbytes(int sock); Err bitreich.org 70 i+void waitforpendingbytes(int sock); Err bitreich.org 70 i int printelem(int fd, Elems *el, char *addr, char *port); Err bitreich.org 70 i void addindexs(Indexs *idx, Elems *el); Err bitreich.org 70 i void addelem(Elems *e, char *s); 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,8 @@ 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 #include Err bitreich.org 70 i@@ -39,7 +41,6 @@ enum { Err bitreich.org 70 i Err bitreich.org 70 i int glfd = -1; Err bitreich.org 70 i int loglvl = 15; Err bitreich.org 70 i-int running = 1; Err bitreich.org 70 i int listfd = -1; Err bitreich.org 70 i int revlookup = 1; Err bitreich.org 70 i char *logfile = nil; Err bitreich.org 70 i@@ -121,8 +122,11 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i args = nil; Err bitreich.org 70 i Err bitreich.org 70 i len = recv(sock, recvb, sizeof(recvb)-1, 0); Err bitreich.org 70 i- if (len <= 0) Err bitreich.org 70 i+ if (len <= 0) { Err bitreich.org 70 i+ if (len < 0) Err bitreich.org 70 i+ perror("recv"); Err bitreich.org 70 i return; Err bitreich.org 70 i+ } Err bitreich.org 70 i Err bitreich.org 70 i c = strchr(recvb, '\r'); Err bitreich.org 70 i if (c) Err bitreich.org 70 i@@ -293,6 +297,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port) Err bitreich.org 70 i continue; Err bitreich.org 70 i if (setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, Err bitreich.org 70 i sizeof(on)) < 0) { Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -402,6 +407,9 @@ main(int argc, char *argv[]) Err bitreich.org 70 i usage(); Err bitreich.org 70 i } ARGEND; Err bitreich.org 70 i Err bitreich.org 70 i+ if (argc != 0) Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i if (ohost == nil) { Err bitreich.org 70 i ohost = xcalloc(1, 513); Err bitreich.org 70 i if (gethostname(ohost, 512) < 0) { Err bitreich.org 70 i@@ -507,17 +515,12 @@ main(int argc, char *argv[]) Err bitreich.org 70 i initsignals(); Err bitreich.org 70 i Err bitreich.org 70 i cltlen = sizeof(clt); Err bitreich.org 70 i- while (running) { Err bitreich.org 70 i+ while (1) { Err bitreich.org 70 i sock = accept(listfd, (struct sockaddr *)&clt, &cltlen); Err bitreich.org 70 i if (sock < 0) { Err bitreich.org 70 i switch (errno) { Err bitreich.org 70 i case ECONNABORTED: Err bitreich.org 70 i case EINTR: Err bitreich.org 70 i- if (!running) { Err bitreich.org 70 i- shutdown(listfd, SHUT_RDWR); Err bitreich.org 70 i- close(listfd); Err bitreich.org 70 i- return 0; Err bitreich.org 70 i- } Err bitreich.org 70 i continue; Err bitreich.org 70 i default: Err bitreich.org 70 i perror("accept"); Err bitreich.org 70 i@@ -542,6 +545,8 @@ main(int argc, char *argv[]) Err bitreich.org 70 i shutdown(sock, SHUT_RDWR); Err bitreich.org 70 i break; Err bitreich.org 70 i case 0: Err bitreich.org 70 i+ close(listfd); Err bitreich.org 70 i+ Err bitreich.org 70 i signal(SIGHUP, SIG_DFL); Err bitreich.org 70 i signal(SIGQUIT, SIG_DFL); Err bitreich.org 70 i signal(SIGINT, SIG_DFL); Err bitreich.org 70 i@@ -550,15 +555,20 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i handlerequest(sock, base, ohost, sport, clienth, Err bitreich.org 70 i clientp); Err bitreich.org 70 i+ Err bitreich.org 70 i+ waitforpendingbytes(sock); Err bitreich.org 70 i+ 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+ if (loglvl & CONN) Err bitreich.org 70 i+ logentry(clienth, clientp, "-", "disconnected"); Err bitreich.org 70 i+ Err bitreich.org 70 i return 0; Err bitreich.org 70 i default: Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i close(sock); Err bitreich.org 70 i- if (loglvl & CONN) Err bitreich.org 70 i- logentry(clienth, clientp, "-", "disconnected"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i shutdown(listfd, SHUT_RDWR); Err bitreich.org 70 .