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