| Add preliminary relative path support for gph files. - geomyidae - A small C-ba… | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit 4d89b560595076c8994896195fbcd196460987dc | |
| parent a8e69abfa2b38ef12bad79516bf02da7701d549c | |
| Author: Christoph Lohmann <[email protected]> | |
| 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(-) | |
| --- | |
| diff --git a/handlr.c b/handlr.c | |
| @@ -83,14 +83,13 @@ handlegph(int sock, char *file, char *port, char *base, cha… | |
| 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, po… | |
| freeelem(act->n[i]); | |
| act->n[i] = NULL; | |
| } | |
| @@ -185,8 +184,6 @@ handledcgi(int sock, char *file, char *port, char *base, ch… | |
| 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, ch… | |
| 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… | |
| + | |
| + 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 *por… | |
| void addindexs(Indexs *idx, Elems *el); | |
| void addelem(Elems *e, char *s); | |
| void freeindex(Indexs *i); |