URI: 
       Add preliminary relative path support for gph files. - 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 4d89b560595076c8994896195fbcd196460987dc
   DIR parent a8e69abfa2b38ef12bad79516bf02da7701d549c
  HTML Author: Christoph Lohmann <20h@r-36.net>
       Date:   Thu, 30 Aug 2018 21:27:57 +0200
       
       Add preliminary relative path support for gph files.
       
       Diffstat:
         M handlr.c                            |       7 ++-----
         M ind.c                               |      24 +++++++++++++++++++++++-
         M ind.h                               |       2 +-
       
       3 files changed, 26 insertions(+), 7 deletions(-)
       ---
   DIR diff --git a/handlr.c b/handlr.c
       @@ -83,14 +83,13 @@ handlegph(int sock, char *file, char *port, char *base, char *args,
                Indexs *act;
                int i, ret = 0;
        
       -        USED(base);
                USED(args);
                USED(sear);
        
                act = scanfile(file);
                if (act != NULL) {
                        for (i = 0; i < act->num && ret >= 0; i++) {
       -                        ret = printelem(sock, act->n[i], ohost, port);
       +                        ret = printelem(sock, act->n[i], file, base, ohost, port);
                                freeelem(act->n[i]);
                                act->n[i] = NULL;
                        }
       @@ -185,8 +184,6 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                int outpipe[2], ret = 0;
                Elems *el;
        
       -        USED(base);
       -
                if (pipe(outpipe) < 0)
                        return;
        
       @@ -246,7 +243,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args,
                                if (el == NULL)
                                        continue;
        
       -                        ret = printelem(sock, el, ohost, port);
       +                        ret = printelem(sock, el, file, base, ohost, port);
                                freeelem(el);
                        }
                        if (ferror(fp))
   DIR diff --git a/ind.c b/ind.c
       @@ -17,6 +17,7 @@
        #include <netinet/tcp.h>
        #include <arpa/inet.h>
        #include <sys/ioctl.h>
       +#include <limits.h>
        
        /* for sendfile(2) */
        #ifdef __linux__
       @@ -413,8 +414,11 @@ scanfile(char *fname)
        }
        
        int
       -printelem(int fd, Elems *el, char *addr, char *port)
       +printelem(int fd, Elems *el, char *file, char *base, char *addr, char *port)
        {
       +        char *path, *p, buf[PATH_MAX+1];
       +        int len;
       +
                if (!strcmp(el->e[3], "server")) {
                        free(el->e[3]);
                        el->e[3] = xstrdup(addr);
       @@ -423,6 +427,24 @@ printelem(int fd, Elems *el, char *addr, char *port)
                        free(el->e[4]);
                        el->e[4] = xstrdup(port);
                }
       +        if (el->e[2][0] != '/' && !strncmp(el->e[2], "URL:", 4)) {
       +                path = file + strlen(base);
       +                if ((p = strrchr(path, '/')))
       +                        len = p - path;
       +                else
       +                        len = strlen(path);
       +                snprintf(buf, sizeof(buf), "%s%.*s/%s", base, len, path, el->e[2]);
       +
       +                if ((path = realpath(buf, NULL)) &&
       +                                !strncmp(base, path, strlen(base))) {
       +                        p = path + strlen(base);
       +                        free(el->e[2]);
       +                        el->e[2] = xstrdup(p[0]? p : "/");
       +                }
       +                if (path != NULL)
       +                        free(path);
       +        }
       +
                if (dprintf(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]) < 0) {
                        perror("printelem: dprintf");
   DIR diff --git a/ind.h b/ind.h
       @@ -40,7 +40,7 @@ Indexs *scanfile(char *fname);
        Elems *getadv(char *str);
        int pendingbytes(int sock);
        void waitforpendingbytes(int sock);
       -int printelem(int fd, Elems *el, char *addr, char *port);
       +int printelem(int fd, Elems *el, char *file, char *base, char *addr, char *port);
        void addindexs(Indexs *idx, Elems *el);
        void addelem(Elems *e, char *s);
        void freeindex(Indexs *i);