iFix recv and gopher+ redirects. Add gopher+ loglevel. - 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 4f4128c66e521eb364bd294f4ba82074b0587ff1 /scm/geomyidae/commit/4f4128c66e521eb364bd294f4ba82074b0587ff1.gph bitreich.org 70 1parent 66ca5bb6c50e73fa70c23fd831b021759a22aa06 /scm/geomyidae/commit/66ca5bb6c50e73fa70c23fd831b021759a22aa06.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Fri, 22 Nov 2019 13:54:11 +0100 Err bitreich.org 70 i Err bitreich.org 70 iFix recv and gopher+ redirects. Add gopher+ loglevel. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M geomyidae.8 | 7 ++++--- Err bitreich.org 70 i M main.c | 30 ++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 26 insertions(+), 11 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/geomyidae.8 b/geomyidae.8 /scm/geomyidae/file/geomyidae.8.gph bitreich.org 70 i@@ -111,7 +111,7 @@ Don't perform reverse lookups. Err bitreich.org 70 i Specify file where log output is written (no default) Err bitreich.org 70 i . Err bitreich.org 70 i .It Fl v Ar loglevel Err bitreich.org 70 i-Set the logging level (default: 15) Err bitreich.org 70 i+Set the logging level (default: 37) Err bitreich.org 70 i . Err bitreich.org 70 i .Bd -literal Err bitreich.org 70 i Loglevels: Err bitreich.org 70 i@@ -121,9 +121,10 @@ Loglevels: Err bitreich.org 70 i 4 - HTTP redirects Err bitreich.org 70 i 8 - errors (e.g., not found) Err bitreich.org 70 i 16 - client connections Err bitreich.org 70 i+ 32 - gopher+ redirects Err bitreich.org 70 i e.g.: Err bitreich.org 70 i- 1 + 2 + 4 + 8 = 15 Err bitreich.org 70 i- (files + directories + HTTP + errors) Err bitreich.org 70 i+ 1 + 2 + 4 + 8 + 32 = 37 Err bitreich.org 70 i+ (files + directories + HTTP + errors + gopher+) Err bitreich.org 70 i .Ed Err bitreich.org 70 i . Err bitreich.org 70 i .It Fl b Ar base Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -36,11 +36,12 @@ enum { Err bitreich.org 70 i DIRS = 2, Err bitreich.org 70 i HTTP = 4, Err bitreich.org 70 i ERRORS = 8, Err bitreich.org 70 i- CONN = 16 Err bitreich.org 70 i+ CONN = 16, Err bitreich.org 70 i+ GPLUS = 32 Err bitreich.org 70 i }; 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 loglvl = 37; Err bitreich.org 70 i int *listfds = NULL; Err bitreich.org 70 i int nlistfds = 0; Err bitreich.org 70 i int revlookup = 1; Err bitreich.org 70 i@@ -120,7 +121,7 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i { Err bitreich.org 70 i struct stat dir; Err bitreich.org 70 i char recvc[1025], recvb[1025], path[1025], *args, *sear, *c; Err bitreich.org 70 i- int len, fd, i; Err bitreich.org 70 i+ int len, fd, i, retl, maxrecv; Err bitreich.org 70 i filetype *type; Err bitreich.org 70 i Err bitreich.org 70 i memset(&dir, 0, sizeof(dir)); Err bitreich.org 70 i@@ -128,12 +129,23 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i memset(recvc, 0, sizeof(recvc)); Err bitreich.org 70 i args = NULL; 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- perror("recv"); Err bitreich.org 70 i+ len = 0; Err bitreich.org 70 i+ maxrecv = sizeof(recvb); Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Force at least one byte per packet. Limit, so the server Err bitreich.org 70 i+ * cannot be put into DoS via zero-length packets. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ do { Err bitreich.org 70 i+ retl = recv(sock, recvb+len, sizeof(recvb)-1-len, 0); Err bitreich.org 70 i+ if (retl <= 0) { Err bitreich.org 70 i+ if (retl < 0) Err bitreich.org 70 i+ perror("recv"); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ len += retl; Err bitreich.org 70 i+ } while (recvb[len-1] != '\n' && --maxrecv > 0); Err bitreich.org 70 i+ if (len <= 0) 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@@ -154,6 +166,8 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i * CRAP. Err bitreich.org 70 i */ Err bitreich.org 70 i if (*sear == '+' || *sear == '$' || *sear == '!' || *sear == '\0') { Err bitreich.org 70 i+ if (loglvl & GPLUS) Err bitreich.org 70 i+ logentry(clienth, clientp, recvb, "gopher+ redirect"); Err bitreich.org 70 i dprintf(sock, "+-2\r\n"); Err bitreich.org 70 i dprintf(sock, "+INFO: 1gopher+\t\t%s\t%s\r\n", Err bitreich.org 70 i ohost, port); Err bitreich.org 70 .