geomyidae

A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
git clone git://r-36.net/geomyidae
Log | Files | Refs | README | LICENSE

commit 4d89b560595076c8994896195fbcd196460987dc
parent a8e69abfa2b38ef12bad79516bf02da7701d549c
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:
handlr.c | 7++-----
ind.c | 24+++++++++++++++++++++++-
ind.h | 2+-
3 files changed, 26 insertions(+), 7 deletions(-)

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)) 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"); 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);