URI: 
       Adding dynamic CGI 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 6f4cbad45b4f91422cc14d1b843c754b234ffffe
   DIR parent 72fa3a9a1750ffa0b5fc2f4fb33f7daafe57a368
  HTML Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sat, 12 Mar 2011 20:19:25 +0100
       
       Adding dynamic CGI support.
       
       Diffstat:
         M handlr.c                            |      77 ++++++++++++++++++++++++-------
         M handlr.h                            |       4 ++--
         M ind.c                               |      34 ++++++++++++++++++++++++++++---
         M ind.h                               |       2 ++
       
       4 files changed, 95 insertions(+), 22 deletions(-)
       ---
   DIR diff --git a/handlr.c b/handlr.c
       @@ -113,21 +113,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args,
                        } else
                                snprintf(addr, sizeof(addr), "%s", args);
        
       -
                        for(i = 0; i < act->num; i++) {
       -                        if(!strncmp(act->n[i]->e[3], "server", 6)) {
       -                                free(act->n[i]->e[3]);
       -                                act->n[i]->e[3] = gstrdup(addr);
       -                        }
       -                        if(!strncmp(act->n[i]->e[4], "port", 4)) {
       -                                free(act->n[i]->e[4]);
       -                                act->n[i]->e[4] = gstrdup(port);
       -                        }
       -                        tprintf(sock, "%.1s%s\t%s\t%s\t%s\r\n",
       -                                act->n[i]->e[0], act->n[i]->e[1],
       -                                act->n[i]->e[2], act->n[i]->e[3],
       -                                act->n[i]->e[4]);
       -
       +                        printelem(sock, act->n[i], addr, port);
                                freeelem(act->n[i]);
                                act->n[i] = nil;
                        }
       @@ -164,30 +151,86 @@ handlecgi(int sock, char *file, char *port, char *base, char *args,
        {
                char *p;
        
       -        USED(port);
                USED(base);
       +        USED(port);
        
                p = strrchr(file, '/');
                if(p == nil)
                        p = file;
        
       -        dup2(sock, 1);
       +        if(sear == nil)
       +                sear = "";
       +
                dup2(sock, 0);
       +        dup2(sock, 1);
                dup2(sock, 2);
       +        switch(fork()) {
       +        case 0:
       +                execl(file, p, sear, args, (char *)nil);
       +        case -1:
       +                break;
       +        default:
       +                wait(NULL);
       +                shutdown(sock, SHUT_RDWR);
       +                close(sock);
       +                break;
       +        }
       +}
       +
       +void
       +handledcgi(int sock, char *file, char *port, char *base, char *args,
       +                char *sear)
       +{
       +        char *p, *ln, addr[512];
       +        int outpipe[2];
       +        Elems *el;
       +
       +        USED(base);
       +
       +        if(pipe(outpipe) < 0)
       +                return;
       +
       +        p = strrchr(file, '/');
       +        if(p == nil)
       +                p = file;
       +
       +        if(args == nil) {
       +                if(gethostname(addr, sizeof(addr)) == -1) {
       +                        perror("gethostname");
       +                        return;
       +                }
       +        } else
       +                snprintf(addr, sizeof(addr), "%s", args);
        
                if(sear == nil)
                        sear = "";
        
       +        dup2(sock, 0);
       +        dup2(sock, 2);
                switch(fork()) {
                case 0:
       +                dup2(outpipe[1], 1);
       +                close(outpipe[0]);
                        execl(file, p, sear, args, (char *)nil);
                case -1:
                        break;
                default:
       +                dup2(sock, 1);
       +                close(outpipe[1]);
       +
       +                while((ln = readln(outpipe[0])) != nil) {
       +                        el = getadv(ln);
       +                        if (el == nil)
       +                                continue;
       +
       +                        printelem(sock, el, addr, port);
       +                        freeelem(el);
       +                }
       +                tprintf(sock, "\r\n.\r\n\r\n");
       +
                        wait(NULL);
                        shutdown(sock, SHUT_RDWR);
                        close(sock);
                        break;
                }
        }
       -
   DIR diff --git a/handlr.h b/handlr.h
       @@ -6,8 +6,6 @@
        #ifndef HANDLR_H
        #define HANDLR_H
        
       -#define nil NULL
       -
        void handledir(int sock, char *path, char *port, char *base, char *args,
                                char *sear);
        void handlegph(int sock, char *file, char *port, char *base, char *args,
       @@ -16,5 +14,7 @@ void handlebin(int sock, char *file, char *port, char *base, char *args,
                                char *sear);
        void handlecgi(int sock, char *file, char *port, char *base, char *args,
                                char *sear);
       +void handledcgi(int sock, char *file, char *port, char *base, char *args,
       +                        char *sear);
        
        #endif
   DIR diff --git a/ind.c b/ind.c
       @@ -22,6 +22,7 @@ filetype type[] = {
                {"default", "0", handlebin},
                {"gph", "1", handlegph},
                {"cgi", "0", handlecgi},
       +        {"dcgi", "1", handledcgi},
                {"bin", "9", handlebin},
                {"tgz", "9", handlebin},
                {"gz", "9", handlebin},
       @@ -195,6 +196,17 @@ getadv(char *str)
                return ret;
        }
        
       +void
       +addindexs(Indexs *idx, Elems *el)
       +{
       +
       +        idx->num++;
       +        idx->n = realloc(idx->n, sizeof(Elems) * idx->num);
       +        idx->n[idx->num - 1] = el;
       +
       +        return;
       +}
       +
        Indexs *
        scanfile(char *fname)
        {
       @@ -215,9 +227,7 @@ scanfile(char *fname)
                        if(el == nil)
                                continue;
        
       -                ret->num++;
       -                ret->n = realloc(ret->n, sizeof(Elems) * ret->num);
       -                ret->n[ret->num - 1] = el;
       +                addindexs(ret, el);
                        el = nil;
                }
                close(fd);
       @@ -231,6 +241,24 @@ scanfile(char *fname)
        }
        
        void
       +printelem(int fd, Elems *el, char *addr, char *port)
       +{
       +
       +        if(!strncmp(el->e[3], "server", 6)) {
       +                free(el->e[3]);
       +                el->e[3] = gstrdup(addr);
       +        }
       +        if(!strncmp(el->e[4], "port", 4)) {
       +                free(el->e[4]);
       +                el->e[4] = gstrdup(port);
       +        }
       +        tprintf(fd, "%.1s%s\t%s\t%s\t%s\r\n", el->e[0], el->e[1], el->e[2],
       +                        el->e[3], el->e[4]);
       +
       +        return;
       +}
       +
       +void
        tprintf(int fd, char *fmt, ...)
        {
                va_list fmtargs;
   DIR diff --git a/ind.h b/ind.h
       @@ -35,6 +35,8 @@ void *gmallocz(int l, int d);
        char *gstrdup(char *str);
        Indexs *scanfile(char *fname);
        Elems *getadv(char *str);
       +void printelem(int fd, Elems *el, char *addr, char *port);
       +void addindexs(Indexs *idx, Elems *el);
        void addelem(Elems *e, char *s);
        void freeindex(Indexs *i);
        void freeelem(Elems *e);