iAdd SERVER_LISTEN_NAME feature. - geomyidae - A small C-based gopherd. Err bitreich.org 70 hgit clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ URL:git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ bitreich.org 70 1Log /scm/geomyidae/log.gph bitreich.org 70 1Files /scm/geomyidae/files.gph bitreich.org 70 1Refs /scm/geomyidae/refs.gph bitreich.org 70 1Tags /scm/geomyidae/tag bitreich.org 70 1README /scm/geomyidae/file/README.gph bitreich.org 70 1LICENSE /scm/geomyidae/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 9ffef532d812330c00bd1043c884f9e685787018 /scm/geomyidae/commit/9ffef532d812330c00bd1043c884f9e685787018.gph bitreich.org 70 1parent 8b9629bd2a0dae917cbe7e7db44417afc28064f6 /scm/geomyidae/commit/8b9629bd2a0dae917cbe7e7db44417afc28064f6.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Wed, 26 Oct 2022 19:03:26 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdd SERVER_LISTEN_NAME feature. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M geomyidae.8 | 1 + Err bitreich.org 70 i M handlr.c | 17 ++++++++++------- Err bitreich.org 70 i M handlr.h | 19 +++++++++++++------ Err bitreich.org 70 i M ind.c | 3 ++- Err bitreich.org 70 i M ind.h | 4 ++-- Err bitreich.org 70 i M main.c | 27 +++++++++++++++++++-------- Err bitreich.org 70 i Err bitreich.org 70 i6 files changed, 47 insertions(+), 24 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/geomyidae.8 b/geomyidae.8 /scm/geomyidae/file/geomyidae.8.gph bitreich.org 70 i@@ -381,6 +381,7 @@ Additionally to the above arguments several environment variables are set. Err bitreich.org 70 i .Dl SCRIPT_NAME = script which is executed Err bitreich.org 70 i .Dl SERVER_NAME = server's hostname Err bitreich.org 70 i .Dl SERVER_PORT = server's port Err bitreich.org 70 i+.Dl SERVER_LISTEN_NAME = ip the server received the connection on Err bitreich.org 70 i .Dl SERVER_PROTOCOL = `gopher/1.0' Err bitreich.org 70 i .Dl SERVER_SOFTWARE = `geomyidae' Err bitreich.org 70 i .Dl X_GOPHER_SEARCH = search (See above.) Err bitreich.org 70 1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70 i@@ -23,7 +23,7 @@ Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i char *pa, *file, *e, *par, *b; Err bitreich.org 70 i struct dirent **dirent; Err bitreich.org 70 i@@ -33,6 +33,7 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i USED(args); Err bitreich.org 70 i USED(sear); Err bitreich.org 70 i+ USED(bhost); Err bitreich.org 70 i Err bitreich.org 70 i pa = xstrdup(path); Err bitreich.org 70 i e = pa + strlen(pa) - 1; Err bitreich.org 70 i@@ -85,13 +86,14 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i Indexs *act; Err bitreich.org 70 i int i, ret = 0; Err bitreich.org 70 i Err bitreich.org 70 i USED(args); Err bitreich.org 70 i USED(sear); Err bitreich.org 70 i+ USED(bhost); Err bitreich.org 70 i Err bitreich.org 70 i act = scanfile(file); Err bitreich.org 70 i if (act != NULL) { Err bitreich.org 70 i@@ -108,7 +110,7 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i int fd; Err bitreich.org 70 i Err bitreich.org 70 i@@ -117,6 +119,7 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i USED(args); Err bitreich.org 70 i USED(sear); Err bitreich.org 70 i USED(ohost); Err bitreich.org 70 i+ USED(bhost); Err bitreich.org 70 i Err bitreich.org 70 i fd = open(file, O_RDONLY); Err bitreich.org 70 i if (fd >= 0) { Err bitreich.org 70 i@@ -128,7 +131,7 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i char *p, *path; Err bitreich.org 70 i Err bitreich.org 70 i@@ -164,7 +167,7 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i setcgienviron(p, file, port, base, args, sear, ohost, chost, Err bitreich.org 70 i- istls); Err bitreich.org 70 i+ bhost, istls); Err bitreich.org 70 i Err bitreich.org 70 i if (execl(file, p, sear, args, ohost, port, Err bitreich.org 70 i (char *)NULL) == -1) { Err bitreich.org 70 i@@ -183,7 +186,7 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i FILE *fp; Err bitreich.org 70 i char *p, *path, *ln = NULL; Err bitreich.org 70 i@@ -225,7 +228,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i setcgienviron(p, file, port, base, args, sear, ohost, chost, Err bitreich.org 70 i- istls); Err bitreich.org 70 i+ bhost, istls); Err bitreich.org 70 i Err bitreich.org 70 i if (execl(file, p, sear, args, ohost, port, Err bitreich.org 70 i (char *)NULL) == -1) { Err bitreich.org 70 1diff --git a/handlr.h b/handlr.h /scm/geomyidae/file/handlr.h.gph bitreich.org 70 i@@ -17,20 +17,27 @@ Err bitreich.org 70 i * sear .... search part of request (»selector\tsearch\r\n«) Err bitreich.org 70 i * ohost ... host of geomiydae (See -h in geomyidae(8)) Err bitreich.org 70 i * chost ... IP of the client sending a request Err bitreich.org 70 i+ * bhost ... server IP the server received the connection to Err bitreich.org 70 i * istls ... set to 1, if TLS was used for thr request Err bitreich.org 70 i */ Err bitreich.org 70 i Err bitreich.org 70 i void handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70 i+ int istls); Err bitreich.org 70 i void handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70 i+ int istls); Err bitreich.org 70 i void handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70 i+ int istls); Err bitreich.org 70 i void handletxt(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70 i+ int istls); Err bitreich.org 70 i void handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70 i+ int istls); Err bitreich.org 70 i void handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, Err bitreich.org 70 i+ int istls); Err bitreich.org 70 i Err bitreich.org 70 i #endif Err bitreich.org 70 1diff --git a/ind.c b/ind.c /scm/geomyidae/file/ind.c.gph bitreich.org 70 i@@ -531,7 +531,7 @@ reverselookup(char *host) Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i setcgienviron(char *file, char *path, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear, char *ohost, char *chost, int istls) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost, char *bhost, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i /* Err bitreich.org 70 i * TODO: Clean environment from possible unsafe environment variables. Err bitreich.org 70 i@@ -569,6 +569,7 @@ setcgienviron(char *file, char *path, char *port, char *base, char *args, Err bitreich.org 70 i setenv("SCRIPT_NAME", file, 1); Err bitreich.org 70 i setenv("SERVER_NAME", ohost, 1); Err bitreich.org 70 i setenv("SERVER_PORT", port, 1); Err bitreich.org 70 i+ setenv("SERVER_LISTEN_NAME", bhost, 1); Err bitreich.org 70 i setenv("SERVER_PROTOCOL", "gopher/1.0", 1); Err bitreich.org 70 i setenv("SERVER_SOFTWARE", "geomyidae", 1); Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/ind.h b/ind.h /scm/geomyidae/file/ind.h.gph bitreich.org 70 i@@ -27,7 +27,7 @@ struct filetype { Err bitreich.org 70 i char *end; Err bitreich.org 70 i char *type; Err bitreich.org 70 i void (* f)(int, char *, char *, char *, char *, char *, char *, Err bitreich.org 70 i- char *, int); Err bitreich.org 70 i+ char *, char *, int); Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i filetype *gettype(char *filename); Err bitreich.org 70 i@@ -49,7 +49,7 @@ char *smprintf(char *fmt, ...); Err bitreich.org 70 i char *reverselookup(char *host); Err bitreich.org 70 i void setcgienviron(char *file, char *path, char *port, char *base, Err bitreich.org 70 i char *args, char *sear, char *ohost, char *chost, Err bitreich.org 70 i- int istls); Err bitreich.org 70 i+ char *bhost, int istls); Err bitreich.org 70 i char *humansize(off_t n); Err bitreich.org 70 i char *humantime(const time_t *clock); Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -133,8 +133,8 @@ logentry(char *host, char *port, char *qry, char *status) Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i- char *port, char *clienth, char *clientp, int nocgi, Err bitreich.org 70 i- int istls) Err bitreich.org 70 i+ char *port, char *clienth, char *clientp, char *serverh, Err bitreich.org 70 i+ char *serverp, int nocgi, int istls) Err bitreich.org 70 i { Err bitreich.org 70 i struct stat dir; Err bitreich.org 70 i char recvc[1025], recvb[1025], path[1025], args[1025], argsc[1025], Err bitreich.org 70 i@@ -367,7 +367,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i logentry(clienth, clientp, recvc, "nocgi error"); Err bitreich.org 70 i } else { Err bitreich.org 70 i type->f(sock, path, port, base, args, sear, ohost, Err bitreich.org 70 i- clienth, istls); Err bitreich.org 70 i+ clienth, serverh, istls); Err bitreich.org 70 i } Err bitreich.org 70 i } else { Err bitreich.org 70 i /* Err bitreich.org 70 i@@ -376,7 +376,7 @@ handlerequest(int sock, char *req, int rlen, char *base, char *ohost, Err bitreich.org 70 i */ Err bitreich.org 70 i if (!pathfallthrough && S_ISDIR(dir.st_mode)) { Err bitreich.org 70 i handledir(sock, path, port, base, args, sear, ohost, Err bitreich.org 70 i- clienth, istls); Err bitreich.org 70 i+ clienth, serverh, istls); Err bitreich.org 70 i if (loglvl & DIRS) { Err bitreich.org 70 i logentry(clienth, clientp, recvc, Err bitreich.org 70 i "dir listing"); Err bitreich.org 70 i@@ -540,9 +540,9 @@ int Err bitreich.org 70 i main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i struct addrinfo hints; Err bitreich.org 70 i- struct sockaddr_storage clt; Err bitreich.org 70 i+ struct sockaddr_storage clt, slt; Err bitreich.org 70 i struct linger lingerie; Err bitreich.org 70 i- socklen_t cltlen; Err bitreich.org 70 i+ socklen_t cltlen, sltlen; Err bitreich.org 70 i int sock, dofork = 1, inetf = AF_UNSPEC, usechroot = 0, Err bitreich.org 70 i nocgi = 0, errno_save, nbindips = 0, i, j, Err bitreich.org 70 i nlfdret, *lfdret, listfd, maxlfd, istls = 0, Err bitreich.org 70 i@@ -560,7 +560,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i *certfile = NULL, *keyfile = NULL, Err bitreich.org 70 i #endif /* ENABLE_TLS */ Err bitreich.org 70 i- byte0, recvb[1025]; Err bitreich.org 70 i+ byte0, recvb[1025], serverh[NI_MAXHOST], serverp[NI_MAXSERV]; Err bitreich.org 70 i struct passwd *us = NULL; Err bitreich.org 70 i struct group *gr = NULL; Err bitreich.org 70 i #ifdef ENABLE_TLS Err bitreich.org 70 i@@ -858,6 +858,16 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ sltlen = sizeof(slt); Err bitreich.org 70 i+ serverh[0] = serverp[0] = '\0'; Err bitreich.org 70 i+ if (getsockname(sock, (struct sockaddr *)&slt, &sltlen) == 0) { Err bitreich.org 70 i+ getnameinfo((struct sockaddr *)&slt, sltlen, serverh, Err bitreich.org 70 i+ sizeof(serverh), serverp, sizeof(serverp), Err bitreich.org 70 i+ NI_NUMERICHOST|NI_NUMERICSERV); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (!strncmp(serverh, "::ffff:", 7)) Err bitreich.org 70 i+ memmove(serverh, serverh+7, strlen(serverh)-6); Err bitreich.org 70 i+ Err bitreich.org 70 i if (getnameinfo((struct sockaddr *)&clt, cltlen, clienth, Err bitreich.org 70 i sizeof(clienth), clientp, sizeof(clientp), Err bitreich.org 70 i NI_NUMERICHOST|NI_NUMERICSERV)) { Err bitreich.org 70 i@@ -996,7 +1006,8 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i handlerequest(sock, recvb, rlen, base, Err bitreich.org 70 i ohost, sport, clienth, Err bitreich.org 70 i- clientp, nocgi, istls); Err bitreich.org 70 i+ clientp, serverh, serverp, Err bitreich.org 70 i+ nocgi, istls); Err bitreich.org 70 i Err bitreich.org 70 i if (!istls) { Err bitreich.org 70 i /* Err bitreich.org 70 .