iAdd nocgi flag support. - 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 41351723302568be16bae736faecf9135fb612c3 /scm/geomyidae/commit/41351723302568be16bae736faecf9135fb612c3.gph bitreich.org 70 1parent ce4493bfe5e03be7d7366962600933b1178ebbfd /scm/geomyidae/commit/ce4493bfe5e03be7d7366962600933b1178ebbfd.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Fri, 22 Jun 2018 17:09:40 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdd nocgi flag support. Err bitreich.org 70 i Err bitreich.org 70 i* Fix naming of error messages. Err bitreich.org 70 i* Add better error, if some file is not found. Err bitreich.org 70 i* Add hint for further handler implementations. Err bitreich.org 70 i Err bitreich.org 70 iThanks Solene, for the suggestion! Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M geomyidae.8 | 4 ++++ Err bitreich.org 70 i M ind.c | 5 +++++ Err bitreich.org 70 i M main.c | 32 +++++++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 33 insertions(+), 8 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@@ -15,6 +15,7 @@ Err bitreich.org 70 i .Op Fl 6 Err bitreich.org 70 i .Op Fl c Err bitreich.org 70 i .Op Fl d Err bitreich.org 70 i+.Op Fl e Err bitreich.org 70 i .Op Fl n Err bitreich.org 70 i .Op Fl l Ar logfile Err bitreich.org 70 i .Op Fl v Ar loglevel Err bitreich.org 70 i@@ -99,6 +100,9 @@ directory (by default off). Err bitreich.org 70 i Don't fork into background. If no log file is given, this implies logging to Err bitreich.org 70 i the standard output. Err bitreich.org 70 i . Err bitreich.org 70 i+.It Fl e Err bitreich.org 70 i+Disable execution of any CGI or DCGI script. Err bitreich.org 70 i+. Err bitreich.org 70 i .It Fl n Err bitreich.org 70 i Don't perform reverse lookups. 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@@ -30,6 +30,11 @@ 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+/* Err bitreich.org 70 i+ * Be careful, to look at handlerequest(), in case you add any executing Err bitreich.org 70 i+ * handler, so nocgi will be valuable. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i filetype type[] = { Err bitreich.org 70 i {"default", "9", handlebin}, Err bitreich.org 70 i {"gph", "1", handlegph}, Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -47,8 +47,11 @@ char *argv0; Err bitreich.org 70 i char *stdbase = "/var/gopher"; Err bitreich.org 70 i char *stdport = "70"; Err bitreich.org 70 i char *indexf[] = {"/index.gph", "/index.cgi", "/index.dcgi", "/index.bin"}; Err bitreich.org 70 i-char *err = "3Sorry, but the requested token '%s' could not be found.\tErr" Err bitreich.org 70 i- "\tlocalhost\t70\r\n.\r\n\r\n"; Err bitreich.org 70 i+char *nocgierr = "3Sorry, execution of the token '%s' was requested, but this " Err bitreich.org 70 i+ "is disabled in the server configuration.\tErr" Err bitreich.org 70 i+ "\tlocalhost\t70\r\n"; Err bitreich.org 70 i+char *notfounderr = "3Sorry, but the requested token '%s' could not be found.\tErr" Err bitreich.org 70 i+ "\tlocalhost\t70\r\n"; Err bitreich.org 70 i char *htredir = "\n" Err bitreich.org 70 i "\n" Err bitreich.org 70 i@@ -110,7 +113,7 @@ logentry(char *host, char *port, char *qry, char *status) Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i- char *clientp) Err bitreich.org 70 i+ char *clientp, int nocgi) 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@@ -203,6 +206,7 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i } else { Err bitreich.org 70 i fd = open(path, O_RDONLY); Err bitreich.org 70 i if (fd < 0) { Err bitreich.org 70 i+ dprintf(sock, notfounderr, recvc); Err bitreich.org 70 i if (loglvl & ERRORS) Err bitreich.org 70 i logentry(clienth, clientp, recvc, strerror(errno)); Err bitreich.org 70 i return; Err bitreich.org 70 i@@ -218,7 +222,14 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i if (c == nil) Err bitreich.org 70 i c = path; Err bitreich.org 70 i type = gettype(c); Err bitreich.org 70 i- type->f(sock, path, port, base, args, sear, ohost, clienth); Err bitreich.org 70 i+ if (nocgi && (type->f == handledcgi || type->f == handlecgi)) { Err bitreich.org 70 i+ dprintf(sock, nocgierr, recvc); Err bitreich.org 70 i+ if (loglvl & ERRORS) Err bitreich.org 70 i+ logentry(clienth, clientp, recvc, "nocgi error"); Err bitreich.org 70 i+ } else { Err bitreich.org 70 i+ type->f(sock, path, port, base, args, sear, ohost, Err bitreich.org 70 i+ clienth); Err bitreich.org 70 i+ } Err bitreich.org 70 i } else { Err bitreich.org 70 i if (S_ISDIR(dir.st_mode)) { Err bitreich.org 70 i handledir(sock, path, port, base, args, sear, ohost, Err bitreich.org 70 i@@ -230,7 +241,7 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i return; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- dprintf(sock, err, recvc); Err bitreich.org 70 i+ dprintf(sock, notfounderr, recvc); Err bitreich.org 70 i if (loglvl & ERRORS) Err bitreich.org 70 i logentry(clienth, clientp, recvc, "not found"); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -334,7 +345,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port) Err bitreich.org 70 i void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- dprintf(2, "usage: %s [-4] [-6] [-c] [-d] [-n] [-l logfile] " Err bitreich.org 70 i+ dprintf(2, "usage: %s [-46cden] [-l logfile] " Err bitreich.org 70 i "[-v loglvl] [-b base] [-p port] [-o sport] " Err bitreich.org 70 i "[-u user] [-g group] [-h host] [-i IP]\n", Err bitreich.org 70 i argv0); Err bitreich.org 70 i@@ -347,7 +358,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i struct addrinfo hints; Err bitreich.org 70 i struct sockaddr_storage clt; Err bitreich.org 70 i socklen_t cltlen; Err bitreich.org 70 i- int sock, dofork, v4, v6, usechroot = 0; Err bitreich.org 70 i+ int sock, dofork, v4, v6, usechroot, nocgi; Err bitreich.org 70 i char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV]; Err bitreich.org 70 i char *user, *group, *bindip, *ohost, *sport; Err bitreich.org 70 i struct passwd *us; Err bitreich.org 70 i@@ -365,6 +376,8 @@ main(int argc, char *argv[]) Err bitreich.org 70 i sport = port; Err bitreich.org 70 i v4 = 1; Err bitreich.org 70 i v6 = 1; Err bitreich.org 70 i+ usechroot = 0; Err bitreich.org 70 i+ nocgi = 0; Err bitreich.org 70 i Err bitreich.org 70 i ARGBEGIN { Err bitreich.org 70 i case '4': Err bitreich.org 70 i@@ -388,6 +401,9 @@ main(int argc, char *argv[]) Err bitreich.org 70 i case 'd': Err bitreich.org 70 i dofork = 0; Err bitreich.org 70 i break; Err bitreich.org 70 i+ case 'e': Err bitreich.org 70 i+ nocgi = 1; Err bitreich.org 70 i+ break; Err bitreich.org 70 i case 'v': Err bitreich.org 70 i loglvl = atoi(EARGF(usage())); Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -560,7 +576,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i signal(SIGALRM, SIG_DFL); 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+ clientp, nocgi); Err bitreich.org 70 i Err bitreich.org 70 i waitforpendingbytes(sock); Err bitreich.org 70 i Err bitreich.org 70 .