iMaking CGI more obvious to use. - 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 3912688b3929a44d7a43a99eca14178eb97ceff5 /scm/geomyidae/commit/3912688b3929a44d7a43a99eca14178eb97ceff5.gph bitreich.org 70 1parent 8df91710dfdf1f9091be9ed40a259933c7b62951 /scm/geomyidae/commit/8df91710dfdf1f9091be9ed40a259933c7b62951.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Mon, 21 Mar 2011 17:49:11 +0100 Err bitreich.org 70 i Err bitreich.org 70 iMaking CGI more obvious to use. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M CGI | 14 +++++++++++--- Err bitreich.org 70 i M handlr.c | 64 +++++++++---------------------- Err bitreich.org 70 i M handlr.h | 10 +++++----- Err bitreich.org 70 i M ind.h | 2 +- Err bitreich.org 70 i M main.c | 19 +++++++++++++++---- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 51 insertions(+), 58 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/CGI b/CGI /scm/geomyidae/file/CGI.gph bitreich.org 70 i@@ -23,20 +23,24 @@ CALLING CONVENTION Err bitreich.org 70 i Err bitreich.org 70 i Geomyidae will call the script like this: Err bitreich.org 70 i Err bitreich.org 70 i- % $gopherroot/test.cgi $search $arguments Err bitreich.org 70 i+ % $gopherroot/test.cgi $search $arguments $host $port Err bitreich.org 70 i Err bitreich.org 70 i When it is a plain request, the arguments will have these values: Err bitreich.org 70 i Err bitreich.org 70 i C: /test.cgi Err bitreich.org 70 i- -> $search = server host Err bitreich.org 70 i+ -> $search = "" Err bitreich.org 70 i -> $arguments = "" Err bitreich.org 70 i+ -> $host = server host Err bitreich.org 70 i+ -> $port = server port Err bitreich.org 70 i Err bitreich.org 70 i If the request is for a type 7 search element, then the entered string by Err bitreich.org 70 i the user will be seen as following: Err bitreich.org 70 i Err bitreich.org 70 i C: /test.cgi searchterm (There is a Tab inbetween) Err bitreich.org 70 i -> $search = »searchterm« Err bitreich.org 70 i- -> $arguments = server host Err bitreich.org 70 i+ -> $arguments = "" Err bitreich.org 70 i+ -> $host = server host Err bitreich.org 70 i+ -> $port = server port Err bitreich.org 70 i Err bitreich.org 70 i When you are trying to give your script some calling arguments, the syntax Err bitreich.org 70 i is: Err bitreich.org 70 i@@ -44,12 +48,16 @@ is: Err bitreich.org 70 i C: /test.cgi?hello Err bitreich.org 70 i -> $search = "" Err bitreich.org 70 i -> $arguments = »hello« Err bitreich.org 70 i+ -> $host = server host Err bitreich.org 70 i+ -> $port = server port Err bitreich.org 70 i Err bitreich.org 70 i If borth ways of input are combined, the variables are set as following: Err bitreich.org 70 i Err bitreich.org 70 i C: /test.cgi?hello=world searchterm (Beware! A Tab!) Err bitreich.org 70 i -> $search = »searchterm« Err bitreich.org 70 i -> $arguments = »hello=world« Err bitreich.org 70 i+ -> $host = server host Err bitreich.org 70 i+ -> $port = server port Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i STANDARD CGI Err bitreich.org 70 1diff --git a/handlr.c b/handlr.c /scm/geomyidae/file/handlr.c.gph bitreich.org 70 i@@ -21,46 +21,33 @@ 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) Err bitreich.org 70 i+ char *sear, char *ohost) Err bitreich.org 70 i { Err bitreich.org 70 i- char *pa, *file, *e, *addr, *par, *b; Err bitreich.org 70 i+ char *pa, *file, *e, *par, *b; Err bitreich.org 70 i struct dirent **dirent; Err bitreich.org 70 i int ndir, i; Err bitreich.org 70 i struct stat st; Err bitreich.org 70 i filetype *type; Err bitreich.org 70 i Err bitreich.org 70 i USED(sear); Err bitreich.org 70 i- addr = nil; Err bitreich.org 70 i Err bitreich.org 70 i pa = gstrdup(path); Err bitreich.org 70 i e = strrchr(pa, '/'); Err bitreich.org 70 i if(e != nil) { Err bitreich.org 70 i *e = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i- if(args == nil) { Err bitreich.org 70 i- addr = gmallocz(512, 2); Err bitreich.org 70 i- if(gethostname(addr, 512) == -1) { Err bitreich.org 70 i- perror("gethostname"); Err bitreich.org 70 i- free(addr); Err bitreich.org 70 i- free(pa); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i- } else Err bitreich.org 70 i- addr = gstrdup(args); Err bitreich.org 70 i- Err bitreich.org 70 i par = gstrdup(pa); Err bitreich.org 70 i b = strrchr(par + strlen(base), '/'); Err bitreich.org 70 i if(b != nil) { Err bitreich.org 70 i *b = '\0'; Err bitreich.org 70 i tprintf(sock, "1..\t%s\t%s\t%s\r\n", Err bitreich.org 70 i- par + strlen(base), addr, port); Err bitreich.org 70 i+ par + strlen(base), ohost, port); Err bitreich.org 70 i } Err bitreich.org 70 i free(par); Err bitreich.org 70 i Err bitreich.org 70 i ndir = scandir(pa, &dirent, 0, alphasort); Err bitreich.org 70 i if(ndir < 0) { Err bitreich.org 70 i perror("scandir"); Err bitreich.org 70 i- free(addr); Err bitreich.org 70 i free(pa); Err bitreich.org 70 i return; Err bitreich.org 70 i } else { Err bitreich.org 70 i@@ -77,7 +64,7 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i type = gettype("index.gph"); Err bitreich.org 70 i e = file + strlen(base); Err bitreich.org 70 i tprintf(sock, "%c%s\t%s\t%s\t%s\r\n", *type->type, Err bitreich.org 70 i- dirent[i]->d_name, e, addr, port); Err bitreich.org 70 i+ dirent[i]->d_name, e, ohost, port); Err bitreich.org 70 i free(file); Err bitreich.org 70 i free(dirent[i]); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -86,18 +73,15 @@ handledir(int sock, char *path, char *port, char *base, char *args, Err bitreich.org 70 i tprintf(sock, "\r\n"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if(addr != nil) Err bitreich.org 70 i- free(addr); Err bitreich.org 70 i free(pa); Err bitreich.org 70 i } 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) Err bitreich.org 70 i+ char *sear, char *ohost) Err bitreich.org 70 i { Err bitreich.org 70 i Indexs *act; Err bitreich.org 70 i int i; Err bitreich.org 70 i- char addr[512]; Err bitreich.org 70 i Err bitreich.org 70 i USED(base); Err bitreich.org 70 i USED(args); Err bitreich.org 70 i@@ -105,16 +89,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i act = scanfile(file); Err bitreich.org 70 i if(act != nil) { Err bitreich.org 70 i- if(args == nil) { Err bitreich.org 70 i- if(gethostname(addr, sizeof(addr)) == -1) { Err bitreich.org 70 i- perror("gethostname"); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i- } else Err bitreich.org 70 i- snprintf(addr, sizeof(addr), "%s", args); Err bitreich.org 70 i- Err bitreich.org 70 i for(i = 0; i < act->num; i++) { Err bitreich.org 70 i- printelem(sock, act->n[i], addr, port); Err bitreich.org 70 i+ printelem(sock, act->n[i], ohost, port); Err bitreich.org 70 i freeelem(act->n[i]); Err bitreich.org 70 i act->n[i] = nil; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -126,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) Err bitreich.org 70 i+ char *sear, char *ohost) Err bitreich.org 70 i { Err bitreich.org 70 i char sendb[1024]; Err bitreich.org 70 i int len, fd; Err bitreich.org 70 i@@ -136,6 +112,7 @@ handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i USED(base); 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 Err bitreich.org 70 i fd = open(file, O_RDONLY); Err bitreich.org 70 i if(fd >= 0) { Err bitreich.org 70 i@@ -147,7 +124,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) Err bitreich.org 70 i+ char *sear, char *ohost) Err bitreich.org 70 i { Err bitreich.org 70 i char *p, *path; Err bitreich.org 70 i Err bitreich.org 70 i@@ -169,6 +146,8 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i Err bitreich.org 70 i if(sear == nil) Err bitreich.org 70 i sear = ""; Err bitreich.org 70 i+ if(args == nil) Err bitreich.org 70 i+ args = ""; Err bitreich.org 70 i Err bitreich.org 70 i dup2(sock, 0); Err bitreich.org 70 i dup2(sock, 1); Err bitreich.org 70 i@@ -177,7 +156,7 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i case 0: Err bitreich.org 70 i if (path != nil) Err bitreich.org 70 i chdir(path); Err bitreich.org 70 i- execl(file, p, sear, args, (char *)nil); Err bitreich.org 70 i+ execl(file, p, sear, args, ohost, port, (char *)nil); Err bitreich.org 70 i case -1: Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i@@ -192,9 +171,9 @@ 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) Err bitreich.org 70 i+ char *sear, char *ohost) Err bitreich.org 70 i { Err bitreich.org 70 i- char *p, *path, *ln, addr[512]; Err bitreich.org 70 i+ char *p, *path, *ln; Err bitreich.org 70 i int outpipe[2]; Err bitreich.org 70 i Elems *el; Err bitreich.org 70 i Err bitreich.org 70 i@@ -216,16 +195,10 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i if(p == nil) Err bitreich.org 70 i p = file; Err bitreich.org 70 i Err bitreich.org 70 i- if(args == nil) { Err bitreich.org 70 i- if(gethostname(addr, sizeof(addr)) == -1) { Err bitreich.org 70 i- perror("gethostname"); Err bitreich.org 70 i- return; Err bitreich.org 70 i- } Err bitreich.org 70 i- } else Err bitreich.org 70 i- snprintf(addr, sizeof(addr), "%s", args); Err bitreich.org 70 i- Err bitreich.org 70 i if(sear == nil) Err bitreich.org 70 i sear = ""; Err bitreich.org 70 i+ if(args == nil) Err bitreich.org 70 i+ args = ""; Err bitreich.org 70 i Err bitreich.org 70 i dup2(sock, 0); Err bitreich.org 70 i dup2(sock, 2); Err bitreich.org 70 i@@ -235,7 +208,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i close(outpipe[0]); Err bitreich.org 70 i if (path != nil) Err bitreich.org 70 i chdir(path); Err bitreich.org 70 i- execl(file, p, sear, args, (char *)nil); Err bitreich.org 70 i+ execl(file, p, sear, args, ohost, port, (char *)nil); Err bitreich.org 70 i case -1: Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i@@ -247,7 +220,7 @@ handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i if (el == nil) Err bitreich.org 70 i continue; Err bitreich.org 70 i Err bitreich.org 70 i- printelem(sock, el, addr, port); Err bitreich.org 70 i+ printelem(sock, el, ohost, port); Err bitreich.org 70 i freeelem(el); Err bitreich.org 70 i } Err bitreich.org 70 i tprintf(sock, "\r\n.\r\n\r\n"); Err bitreich.org 70 i@@ -260,3 +233,4 @@ 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+ Err bitreich.org 70 1diff --git a/handlr.h b/handlr.h /scm/geomyidae/file/handlr.h.gph bitreich.org 70 i@@ -7,14 +7,14 @@ Err bitreich.org 70 i #define HANDLR_H 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); Err bitreich.org 70 i+ char *sear, char *ohost); Err bitreich.org 70 i void handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear); Err bitreich.org 70 i+ char *sear, char *ohost); Err bitreich.org 70 i void handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear); Err bitreich.org 70 i+ char *sear, char *ohost); Err bitreich.org 70 i void handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear); Err bitreich.org 70 i+ char *sear, char *ohost); Err bitreich.org 70 i void handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i- char *sear); Err bitreich.org 70 i+ char *sear, char *ohost); Err bitreich.org 70 i Err bitreich.org 70 i #endif 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 @@ 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 *); Err bitreich.org 70 i+ void (* f)(int, char *, char *, char *, char *, char *, char *); Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i filetype *gettype(char *filename); Err bitreich.org 70 1diff --git a/main.c b/main.c /scm/geomyidae/file/main.c.gph bitreich.org 70 i@@ -137,6 +137,7 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i bzero(&dir, sizeof(dir)); Err bitreich.org 70 i bzero(recvb, sizeof(recvb)); Err bitreich.org 70 i bzero(recvc, sizeof(recvc)); Err bitreich.org 70 i+ args = nil; Err bitreich.org 70 i Err bitreich.org 70 i len = recv(sock, recvb, sizeof(recvb)-1, 0); Err bitreich.org 70 i if(len > 0) { Err bitreich.org 70 i@@ -164,8 +165,6 @@ handlerequest(int sock, char *base, char *ohost, char *port, char *clienth, Err bitreich.org 70 i args = strchr(recvb, '?'); Err bitreich.org 70 i if(args != nil) Err bitreich.org 70 i *args++ = '\0'; Err bitreich.org 70 i- else Err bitreich.org 70 i- args = ohost; Err bitreich.org 70 i Err bitreich.org 70 i securepath(recvb, len - 2); Err bitreich.org 70 i snprintf(path, sizeof(path), "%s%s", base, recvb); Err bitreich.org 70 i@@ -182,10 +181,10 @@ 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); Err bitreich.org 70 i+ type->f(sock, path, port, base, args, sear, ohost); 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); Err bitreich.org 70 i+ handledir(sock, path, port, base, args, sear, ohost); 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@@ -307,6 +306,16 @@ main(int argc, char *argv[]) Err bitreich.org 70 i usage(); Err bitreich.org 70 i } ARGEND; Err bitreich.org 70 i Err bitreich.org 70 i+ if(ohost == nil) { Err bitreich.org 70 i+ ohost = gmallocz(513, 2); Err bitreich.org 70 i+ if(gethostname(ohost, 512) < 0) { Err bitreich.org 70 i+ perror("gethostname"); Err bitreich.org 70 i+ free(ohost); Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } else Err bitreich.org 70 i+ ohost = gstrdup(ohost); Err bitreich.org 70 i+ Err bitreich.org 70 i if(group != nil) { Err bitreich.org 70 i if((gr = getgrnam(group)) == nil) { Err bitreich.org 70 i perror("no such group"); Err bitreich.org 70 i@@ -419,6 +428,8 @@ main(int argc, char *argv[]) Err bitreich.org 70 i close(listfd); Err bitreich.org 70 i if(logfile != nil) Err bitreich.org 70 i stoplogging(glfd); Err bitreich.org 70 i+ free(ohost); Err bitreich.org 70 i+ Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 .