iImplement some CGI variables for gopher. - 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 67eb195e1924b652b193e6332c1ce8f00fd1f2c9 /scm/geomyidae/commit/67eb195e1924b652b193e6332c1ce8f00fd1f2c9.gph bitreich.org 70 1parent f26ccad8ca8d0f79f7195f6871bb2ceac816ccfa /scm/geomyidae/commit/f26ccad8ca8d0f79f7195f6871bb2ceac816ccfa.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Fri, 26 Jan 2018 13:44:53 +0100 Err bitreich.org 70 i Err bitreich.org 70 iImplement some CGI variables for gopher. Err bitreich.org 70 i Err bitreich.org 70 iI need this for having a nice IP handler on bitreich.org. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M handlr.c | 20 +++++++++++++------- Err bitreich.org 70 i M handlr.h | 23 ++++++++++++++++++----- Err bitreich.org 70 i M ind.c | 40 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M ind.h | 5 ++++- Err bitreich.org 70 i M main.c | 5 +++-- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 78 insertions(+), 15 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70 i@@ -21,7 +21,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) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost) 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@@ -78,7 +78,7 @@ 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) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost) 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@@ -102,7 +102,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) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost) Err bitreich.org 70 i { Err bitreich.org 70 i int fd; Err bitreich.org 70 i Err bitreich.org 70 i@@ -122,7 +122,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) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost) Err bitreich.org 70 i { Err bitreich.org 70 i char *p, *path; Err bitreich.org 70 i Err bitreich.org 70 i@@ -157,7 +157,10 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (execl(file, p, sear, args, ohost, port, (char *)nil) == -1) { Err bitreich.org 70 i+ setcgienviron(p, file, port, base, args, sear, ohost, chost); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (execl(file, p, sear, args, ohost, port, Err bitreich.org 70 i+ (char *)nil) == -1) { Err bitreich.org 70 i perror("execl"); Err bitreich.org 70 i _exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -173,7 +176,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) Err bitreich.org 70 i+ char *sear, char *ohost, char *chost) Err bitreich.org 70 i { Err bitreich.org 70 i FILE *fp; Err bitreich.org 70 i char *p, *path, *ln = nil; Err bitreich.org 70 i@@ -216,7 +219,10 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (execl(file, p, sear, args, ohost, port, (char *)nil) == -1) { Err bitreich.org 70 i+ setcgienviron(p, file, port, base, args, sear, ohost, chost); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (execl(file, p, sear, args, ohost, port, Err bitreich.org 70 i+ (char *)nil) == -1) { Err bitreich.org 70 i perror("execl"); Err bitreich.org 70 i _exit(1); Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/handlr.h b/handlr.h /scm/geomyidae/file/handlr.h.gph bitreich.org 70 i@@ -6,15 +6,28 @@ Err bitreich.org 70 i #ifndef HANDLR_H Err bitreich.org 70 i #define HANDLR_H Err bitreich.org 70 i Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Handler API definition Err bitreich.org 70 i+ * Err bitreich.org 70 i+ * path .... path to the script relative from base Err bitreich.org 70 i+ * port .... port which the script should use when defining menu items Err bitreich.org 70 i+ * (See -o and -p in geomyidae(8)) Err bitreich.org 70 i+ * base .... base path of geomyidae ("" in case of chroot) Err bitreich.org 70 i+ * args .... query string parsed after »script?query« 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+ */ 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); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost); 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); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost); 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); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost); 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); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost); 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); Err bitreich.org 70 i+ char *sear, char *ohost, char *chost); 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@@ -419,3 +419,43 @@ reverselookup(char *host) Err bitreich.org 70 i return rethost; Err bitreich.org 70 i } 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) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *s; Err bitreich.org 70 i+ Err bitreich.org 70 i+ unsetenv("AUTH_TYPE"); Err bitreich.org 70 i+ unsetenv("CONTENT_LENGTH"); Err bitreich.org 70 i+ unsetenv("CONTENT_TYPE"); Err bitreich.org 70 i+ setenv("GATEWAY_INTERFACE", "CGI/1.1", 1); Err bitreich.org 70 i+ /* TODO: Separate, if run like rest.dcgi. */ Err bitreich.org 70 i+ setenv("PATH_INFO", path, 1); Err bitreich.org 70 i+ Err bitreich.org 70 i+ s = smprintf("%s/%s", base, path); Err bitreich.org 70 i+ setenv("PATH_TRANSLATED", s, 1); Err bitreich.org 70 i+ free(s); Err bitreich.org 70 i+ Err bitreich.org 70 i+ setenv("QUERY_STRING", args, 1); Err bitreich.org 70 i+ setenv("REMOTE_ADDR", chost, 1); Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Don't do a reverse lookup on every call. Only do when needed, in Err bitreich.org 70 i+ * the script. The RFC allows us to set the IP to the value. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ setenv("REMOTE_HOST", chost, 1); Err bitreich.org 70 i+ unsetenv("REMOTE_IDENT"); Err bitreich.org 70 i+ unsetenv("REMOTE_USER"); Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Only GET is possible in gopher. POST emulation would be really Err bitreich.org 70 i+ * ugly. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ setenv("REQUEST_METHOD", "GET", 1); 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_PROTOCOL", "gopher/1.0", 1); Err bitreich.org 70 i+ setenv("SERVER_SOFTWARE", "geomyidae", 1); Err bitreich.org 70 i+ Err bitreich.org 70 i+ setenv("X_GOPHER_SEARCH", sear, 1); Err bitreich.org 70 i+} 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,8 @@ typedef struct filetype filetype; Err bitreich.org 70 i 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+ void (* f)(int, char *, char *, char *, char *, char *, char *, Err bitreich.org 70 i+ char *); Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i filetype *gettype(char *filename); Err bitreich.org 70 i@@ -47,6 +48,8 @@ int initlogging(char *logf); Err bitreich.org 70 i void stoplogging(int fd); Err bitreich.org 70 i 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 Err bitreich.org 70 i #endif 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@@ -192,10 +192,11 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i if (c == nil) Err bitreich.org 70 i c = path; Err bitreich.org 70 i type = gettype(c); Err bitreich.org 70 i- type->f(sock, path, port, base, args, sear, ohost); Err bitreich.org 70 i+ type->f(sock, path, port, base, args, sear, ohost, clienth); Err bitreich.org 70 i } else { Err bitreich.org 70 i if (S_ISDIR(dir.st_mode)) { Err bitreich.org 70 i- handledir(sock, path, port, base, args, sear, ohost); Err bitreich.org 70 i+ handledir(sock, path, port, base, args, sear, ohost, Err bitreich.org 70 i+ clienth); 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 .