Merge branch 'master' of ssh://r-36.net/srv/git/geomyidae - geomyidae - A small C-based gopherd.
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 70f62c4a95799dd02259f41f5c7890052699f9f7
 (DIR) parent a59102fbee661d642dceda1cf561f036b54ea65e
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sun, 27 Mar 2011 22:25:52 +0200
       
       Merge branch 'master' of ssh://r-36.net/srv/git/geomyidae
       
       Diffstat:
         CGI                                 |      14 +++++++++++---
         handlr.c                            |      77 +++++++++++++------------------
         handlr.h                            |      10 +++++-----
         ind.h                               |       2 +-
         main.c                              |      19 +++++++++++++++----
       
       5 files changed, 64 insertions(+), 58 deletions(-)
       ---
 (DIR) diff --git a/CGI b/CGI
       @@ -23,20 +23,24 @@ CALLING CONVENTION
        
        Geomyidae will call the script like this:
        
       -        % $gopherroot/test.cgi $search $arguments
       +        % $gopherroot/test.cgi $search $arguments $host $port
        
        When it is a plain request, the arguments will have these values:
        
                C: /test.cgi
       -        -> $search = server host 
       +        -> $search = "" 
                -> $arguments = "" 
       +        -> $host = server host
       +        -> $port = server port
        
        If the request is for a type 7 search element, then the entered string by
        tthe user will be seen as following:
        
                C: /test.cgi        searchterm                (There is a Tab inbetween)
                -> $search = »searchterm«
       -        -> $arguments = server host
       +        -> $arguments = ""
       +        -> $host = server host
       +        -> $port = server port 
        
        When you are trying to give your script some calling arguments, the syntax
        is:
       @@ -44,12 +48,16 @@ is:
                C: /test.cgi?hello
                -> $search = ""
                -> $arguments = »hello«
       +        -> $host = server host
       +        -> $port = server port
        
        If borth ways of input are combined, the variables are set as following:
        
                C: /test.cgi?hello=world        searchterm        (Beware! A Tab!)
                -> $search = »searchterm«
                -> $arguments = »hello=world«
       +        -> $host = server host
       +        -> $port = server port
        
        
        STANDARD CGI
 (DIR) diff --git a/handlr.c b/handlr.c
       @@ -21,46 +21,33 @@
        
        void
        handledir(int sock, char *path, char *port, char *base, char *args,
       -                char *sear)
       +                char *sear, char *ohost)
        {
       -        char *pa, *file, *e, *addr, *par, *b;
       +        char *pa, *file, *e, *par, *b;
                struct dirent **dirent;
                int ndir, i;
                struct stat st;
                filetype *type;
        
                USED(sear);
       -        addr = nil;
        
                pa = gstrdup(path);
                e = strrchr(pa, '/');
                if(e != nil) {
                        *e = '\0';
        
       -                if(args == nil) {
       -                        addr = gmallocz(512, 2);
       -                        if(gethostname(addr, 512) == -1) {
       -                                perror("gethostname");
       -                                free(addr);
       -                                free(pa);
       -                                return;
       -                        }
       -                } else
       -                        addr = gstrdup(args);
       -
                        par = gstrdup(pa);
                        b = strrchr(par + strlen(base), '/');
                        if(b != nil) {
                                *b = '\0';
                                tprintf(sock, "1..\t%s\t%s\t%s\r\n",
       -                                par + strlen(base), addr, port);
       +                                par + strlen(base), ohost, port);
                        }
                        free(par);
        
                        ndir = scandir(pa, &dirent, 0, alphasort);
                        if(ndir < 0) {
                                perror("scandir");
       -                        free(addr);
                                free(pa);
                                return;
                        } else {
       @@ -77,7 +64,7 @@ handledir(int sock, char *path, char *port, char *base, char *args,
                                                type = gettype("index.gph");
                                        e = file + strlen(base);
                                        tprintf(sock, "%c%s\t%s\t%s\t%s\r\n", *type->type,
       -                                        dirent[i]->d_name, e, addr, port);
       +                                        dirent[i]->d_name, e, ohost, port);
                                        free(file);
                                        free(dirent[i]);
                                }
       @@ -86,18 +73,15 @@ handledir(int sock, char *path, char *port, char *base, char *args,
                        tprintf(sock, "\r\n");
                }
        
       -        if(addr != nil)
       -                free(addr);
                free(pa);
        }
        
        void
        handlegph(int sock, char *file, char *port, char *base, char *args,
       -                char *sear)
       +                char *sear, char *ohost)
        {
                Indexs *act;
                int i;
       -        char addr[512];
        
                USED(base);
                USED(args);
       @@ -105,16 +89,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args,
        
                act = scanfile(file);
                if(act != nil) {
       -                if(args == nil) {
       -                        if(gethostname(addr, sizeof(addr)) == -1) {
       -                                perror("gethostname");
       -                                return;
       -                        }
       -                } else
       -                        snprintf(addr, sizeof(addr), "%s", args);
       -
                        for(i = 0; i < act->num; i++) {
       -                        printelem(sock, act->n[i], addr, port);
       +                        printelem(sock, act->n[i], ohost, port);
                                freeelem(act->n[i]);
                                act->n[i] = nil;
                        }
       @@ -126,7 +102,7 @@ handlegph(int sock, char *file, char *port, char *base, char *args,
        
        void
        handlebin(int sock, char *file, char *port, char *base, char *args,
       -                char *sear)
       +                char *sear, char *ohost)
        {
                char sendb[1024];
                int len, fd;
       @@ -136,6 +112,7 @@ handlebin(int sock, char *file, char *port, char *base, char *args,
                USED(base);
                USED(args);
                USED(sear);
       +        USED(ohost);
        
                fd = open(file, O_RDONLY);
                if(fd >= 0) {
       @@ -147,7 +124,7 @@ handlebin(int sock, char *file, char *port, char *base, char *args,
        
        void
        handlecgi(int sock, char *file, char *port, char *base, char *args,
       -                char *sear)
       +                char *sear, char *ohost)
        {
                char *p, *path;
        
       @@ -169,6 +146,8 @@ handlecgi(int sock, char *file, char *port, char *base, char *args,
        
                if(sear == nil)
                        sear = "";
       +        if(args == nil)
       +                args = "";
        
                dup2(sock, 0);
                dup2(sock, 1);
       @@ -177,7 +156,7 @@ handlecgi(int sock, char *file, char *port, char *base, char *args,
                case 0:
                        if (path != nil)
                                chdir(path);
       -                execl(file, p, sear, args, (char *)nil);
       +                execl(file, p, sear, args, ohost, port, (char *)nil);
                case -1:
                        break;
                default:
       @@ -192,9 +171,9 @@ handlecgi(int sock, char *file, char *port, char *base, char *args,
        
        void
        handledcgi(int sock, char *file, char *port, char *base, char *args,
       -                char *sear)
       +                char *sear, char *ohost)
        {
       -        char *p, *ln, addr[512];
       +        char *p, *path, *ln;
                int outpipe[2];
                Elems *el;
        
       @@ -203,20 +182,23 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                if(pipe(outpipe) < 0)
                        return;
        
       +        path = gstrdup(file);
       +        p = strrchr(path, '/');
       +        if (p != nil)
       +                p[1] = '\0';
       +        else {
       +                free(path);
       +                path = nil;
       +        }
       +
                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 = "";
       +        if(args == nil)
       +                args = "";
        
                dup2(sock, 0);
                dup2(sock, 2);
       @@ -224,7 +206,9 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                case 0:
                        dup2(outpipe[1], 1);
                        close(outpipe[0]);
       -                execl(file, p, sear, args, (char *)nil);
       +                if (path != nil)
       +                        chdir(path);
       +                execl(file, p, sear, args, ohost, port, (char *)nil);
                case -1:
                        break;
                default:
       @@ -236,14 +220,17 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                                if (el == nil)
                                        continue;
        
       -                        printelem(sock, el, addr, port);
       +                        printelem(sock, el, ohost, port);
                                freeelem(el);
                        }
                        tprintf(sock, "\r\n.\r\n\r\n");
        
                        wait(NULL);
       +                if (path != nil)
       +                        free(path);
                        shutdown(sock, SHUT_RDWR);
                        close(sock);
                        break;
                }
        }
       +
 (DIR) diff --git a/handlr.h b/handlr.h
       @@ -7,14 +7,14 @@
        #define HANDLR_H
        
        void handledir(int sock, char *path, char *port, char *base, char *args,
       -                        char *sear);
       +                        char *sear, char *ohost);
        void handlegph(int sock, char *file, char *port, char *base, char *args,
       -                        char *sear);
       +                        char *sear, char *ohost);
        void handlebin(int sock, char *file, char *port, char *base, char *args,
       -                        char *sear);
       +                        char *sear, char *ohost);
        void handlecgi(int sock, char *file, char *port, char *base, char *args,
       -                        char *sear);
       +                        char *sear, char *ohost);
        void handledcgi(int sock, char *file, char *port, char *base, char *args,
       -                        char *sear);
       +                        char *sear, char *ohost);
        
        #endif
 (DIR) diff --git a/ind.h b/ind.h
       @@ -27,7 +27,7 @@ typedef struct filetype filetype;
        struct filetype {
                char *end;
                char *type;
       -        void (* f)(int, char *, char *, char *, char *, char *);
       +        void (* f)(int, char *, char *, char *, char *, char *, char *);
        };
        
        filetype *gettype(char *filename);
 (DIR) diff --git a/main.c b/main.c
       @@ -137,6 +137,7 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth,
                bzero(&dir, sizeof(dir));
                bzero(recvb, sizeof(recvb));
                bzero(recvc, sizeof(recvc));
       +        args = nil;
        
                len = recv(sock, recvb, sizeof(recvb)-1, 0);
                if(len > 0) {
       @@ -164,8 +165,6 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth,
                args = strchr(recvb, '?');
                if(args != nil)
                        *args++ = '\0';
       -        else
       -                args = ohost;
        
                securepath(recvb, len - 2);
                snprintf(path, sizeof(path), "%s%s", base, recvb);
       @@ -182,10 +181,10 @@ 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);
       +                type->f(sock, path, port, base, args, sear, ohost);
                } else {
                        if(S_ISDIR(dir.st_mode)) {
       -                        handledir(sock, path, port, base, args, sear);
       +                        handledir(sock, path, port, base, args, sear, ohost);
                                if(loglvl & DIRS)
                                        logentry(clienth, clientp, recvc,
                                                                "dir listing");
       @@ -307,6 +306,16 @@ main(int argc, char *argv[])
                        usage();
                } ARGEND;
        
       +        if(ohost == nil) {
       +                ohost = gmallocz(513, 2);
       +                if(gethostname(ohost, 512) < 0) {
       +                        perror("gethostname");
       +                        free(ohost);
       +                        return 1;
       +                }
       +        } else
       +                ohost = gstrdup(ohost);
       +
                if(group != nil) {
                        if((gr = getgrnam(group)) == nil) {
                                perror("no such group");
       @@ -419,6 +428,8 @@ main(int argc, char *argv[])
                close(listfd);
                if(logfile != nil)
                        stoplogging(glfd);
       +        free(ohost);
       +
                return 0;
        }