| Merge branch 'master' of ssh://r-36.net/srv/git/geomyidae - geomyidae - A small… | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit 70f62c4a95799dd02259f41f5c7890052699f9f7 | |
| parent a59102fbee661d642dceda1cf561f036b54ea65e | |
| Author: Christoph Lohmann <[email protected]> | |
| Date: Sun, 27 Mar 2011 22:25:52 +0200 | |
| Merge branch 'master' of ssh://r-36.net/srv/git/geomyidae | |
| Diffstat: | |
| M CGI | 14 +++++++++++--- | |
| M handlr.c | 77 +++++++++++++----------------… | |
| M handlr.h | 10 +++++----- | |
| M ind.h | 2 +- | |
| M main.c | 19 +++++++++++++++---- | |
| 5 files changed, 64 insertions(+), 58 deletions(-) | |
| --- | |
| diff --git a/CGI b/CGI | |
| @@ -23,20 +23,24 @@ CALLING CONVENTION | |
| Geomyidae will call the script like this: | |
| - % $gopherroot/test.cgi $search $arguments | |
| + % $gopherroot/test.cgi $search $arguments $host $port | |
| When it is a plain request, the arguments will have these values: | |
| C: /test.cgi | |
| - -> $search = server host | |
| + -> $search = "" | |
| -> $arguments = "" | |
| + -> $host = server host | |
| + -> $port = server port | |
| If the request is for a type 7 search element, then the entered string by | |
| the user will be seen as following: | |
| C: /test.cgi searchterm (There is a Tab inbetwee… | |
| -> $search = »searchterm« | |
| - -> $arguments = server host | |
| + -> $arguments = "" | |
| + -> $host = server host | |
| + -> $port = server port | |
| When you are trying to give your script some calling arguments, the syntax | |
| is: | |
| @@ -44,12 +48,16 @@ is: | |
| C: /test.cgi?hello | |
| -> $search = "" | |
| -> $arguments = »hello« | |
| + -> $host = server host | |
| + -> $port = server port | |
| If borth ways of input are combined, the variables are set as following: | |
| C: /test.cgi?hello=world searchterm (Beware! A Tab!) | |
| -> $search = »searchterm« | |
| -> $arguments = »hello=world« | |
| + -> $host = server host | |
| + -> $port = server port | |
| STANDARD CGI | |
| diff --git a/handlr.c b/handlr.c | |
| @@ -21,46 +21,33 @@ | |
| void | |
| handledir(int sock, char *path, char *port, char *base, char *args, | |
| - char *sear) | |
| + char *sear, char *ohost) | |
| { | |
| - char *pa, *file, *e, *addr, *par, *b; | |
| + char *pa, *file, *e, *par, *b; | |
| struct dirent **dirent; | |
| int ndir, i; | |
| struct stat st; | |
| filetype *type; | |
| USED(sear); | |
| - addr = nil; | |
| pa = gstrdup(path); | |
| e = strrchr(pa, '/'); | |
| if(e != nil) { | |
| *e = '\0'; | |
| - if(args == nil) { | |
| - addr = gmallocz(512, 2); | |
| - if(gethostname(addr, 512) == -1) { | |
| - perror("gethostname"); | |
| - free(addr); | |
| - free(pa); | |
| - return; | |
| - } | |
| - } else | |
| - addr = gstrdup(args); | |
| - | |
| par = gstrdup(pa); | |
| b = strrchr(par + strlen(base), '/'); | |
| if(b != nil) { | |
| *b = '\0'; | |
| tprintf(sock, "1..\t%s\t%s\t%s\r\n", | |
| - par + strlen(base), addr, port); | |
| + par + strlen(base), ohost, port); | |
| } | |
| free(par); | |
| ndir = scandir(pa, &dirent, 0, alphasort); | |
| if(ndir < 0) { | |
| perror("scandir"); | |
| - free(addr); | |
| free(pa); | |
| return; | |
| } else { | |
| @@ -77,7 +64,7 @@ handledir(int sock, char *path, char *port, char *base, char … | |
| type = gettype("index.gph"); | |
| e = file + strlen(base); | |
| tprintf(sock, "%c%s\t%s\t%s\t%s\r\n", *type->t… | |
| - dirent[i]->d_name, e, addr, port); | |
| + dirent[i]->d_name, e, ohost, port); | |
| free(file); | |
| free(dirent[i]); | |
| } | |
| @@ -86,18 +73,15 @@ handledir(int sock, char *path, char *port, char *base, cha… | |
| tprintf(sock, "\r\n"); | |
| } | |
| - if(addr != nil) | |
| - free(addr); | |
| free(pa); | |
| } | |
| void | |
| handlegph(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear) | |
| + char *sear, char *ohost) | |
| { | |
| Indexs *act; | |
| int i; | |
| - char addr[512]; | |
| USED(base); | |
| USED(args); | |
| @@ -105,16 +89,8 @@ handlegph(int sock, char *file, char *port, char *base, cha… | |
| act = scanfile(file); | |
| if(act != nil) { | |
| - if(args == nil) { | |
| - if(gethostname(addr, sizeof(addr)) == -1) { | |
| - perror("gethostname"); | |
| - return; | |
| - } | |
| - } else | |
| - snprintf(addr, sizeof(addr), "%s", args); | |
| - | |
| for(i = 0; i < act->num; i++) { | |
| - printelem(sock, act->n[i], addr, port); | |
| + printelem(sock, act->n[i], ohost, port); | |
| freeelem(act->n[i]); | |
| act->n[i] = nil; | |
| } | |
| @@ -126,7 +102,7 @@ handlegph(int sock, char *file, char *port, char *base, cha… | |
| void | |
| handlebin(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear) | |
| + char *sear, char *ohost) | |
| { | |
| char sendb[1024]; | |
| int len, fd; | |
| @@ -136,6 +112,7 @@ handlebin(int sock, char *file, char *port, char *base, cha… | |
| USED(base); | |
| USED(args); | |
| USED(sear); | |
| + USED(ohost); | |
| fd = open(file, O_RDONLY); | |
| if(fd >= 0) { | |
| @@ -147,7 +124,7 @@ handlebin(int sock, char *file, char *port, char *base, cha… | |
| void | |
| handlecgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear) | |
| + char *sear, char *ohost) | |
| { | |
| char *p, *path; | |
| @@ -169,6 +146,8 @@ handlecgi(int sock, char *file, char *port, char *base, cha… | |
| if(sear == nil) | |
| sear = ""; | |
| + if(args == nil) | |
| + args = ""; | |
| dup2(sock, 0); | |
| dup2(sock, 1); | |
| @@ -177,7 +156,7 @@ handlecgi(int sock, char *file, char *port, char *base, cha… | |
| case 0: | |
| if (path != nil) | |
| chdir(path); | |
| - execl(file, p, sear, args, (char *)nil); | |
| + execl(file, p, sear, args, ohost, port, (char *)nil); | |
| case -1: | |
| break; | |
| default: | |
| @@ -192,9 +171,9 @@ handlecgi(int sock, char *file, char *port, char *base, cha… | |
| void | |
| handledcgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear) | |
| + char *sear, char *ohost) | |
| { | |
| - char *p, *ln, addr[512]; | |
| + char *p, *path, *ln; | |
| int outpipe[2]; | |
| Elems *el; | |
| @@ -203,20 +182,23 @@ handledcgi(int sock, char *file, char *port, char *base, … | |
| if(pipe(outpipe) < 0) | |
| return; | |
| + path = gstrdup(file); | |
| + p = strrchr(path, '/'); | |
| + if (p != nil) | |
| + p[1] = '\0'; | |
| + else { | |
| + free(path); | |
| + path = nil; | |
| + } | |
| + | |
| p = strrchr(file, '/'); | |
| if(p == nil) | |
| p = file; | |
| - if(args == nil) { | |
| - if(gethostname(addr, sizeof(addr)) == -1) { | |
| - perror("gethostname"); | |
| - return; | |
| - } | |
| - } else | |
| - snprintf(addr, sizeof(addr), "%s", args); | |
| - | |
| if(sear == nil) | |
| sear = ""; | |
| + if(args == nil) | |
| + args = ""; | |
| dup2(sock, 0); | |
| dup2(sock, 2); | |
| @@ -224,7 +206,9 @@ handledcgi(int sock, char *file, char *port, char *base, ch… | |
| case 0: | |
| dup2(outpipe[1], 1); | |
| close(outpipe[0]); | |
| - execl(file, p, sear, args, (char *)nil); | |
| + if (path != nil) | |
| + chdir(path); | |
| + execl(file, p, sear, args, ohost, port, (char *)nil); | |
| case -1: | |
| break; | |
| default: | |
| @@ -236,14 +220,17 @@ handledcgi(int sock, char *file, char *port, char *base, … | |
| if (el == nil) | |
| continue; | |
| - printelem(sock, el, addr, port); | |
| + printelem(sock, el, ohost, port); | |
| freeelem(el); | |
| } | |
| tprintf(sock, "\r\n.\r\n\r\n"); | |
| wait(NULL); | |
| + if (path != nil) | |
| + free(path); | |
| shutdown(sock, SHUT_RDWR); | |
| close(sock); | |
| break; | |
| } | |
| } | |
| + | |
| diff --git a/handlr.h b/handlr.h | |
| @@ -7,14 +7,14 @@ | |
| #define HANDLR_H | |
| void handledir(int sock, char *path, char *port, char *base, char *args, | |
| - char *sear); | |
| + char *sear, char *ohost); | |
| void handlegph(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear); | |
| + char *sear, char *ohost); | |
| void handlebin(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear); | |
| + char *sear, char *ohost); | |
| void handlecgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear); | |
| + char *sear, char *ohost); | |
| void handledcgi(int sock, char *file, char *port, char *base, char *args, | |
| - char *sear); | |
| + char *sear, char *ohost); | |
| #endif | |
| diff --git a/ind.h b/ind.h | |
| @@ -27,7 +27,7 @@ typedef struct filetype filetype; | |
| struct filetype { | |
| char *end; | |
| char *type; | |
| - void (* f)(int, char *, char *, char *, char *, char *); | |
| + void (* f)(int, char *, char *, char *, char *, char *, char *); | |
| }; | |
| filetype *gettype(char *filename); | |
| diff --git a/main.c b/main.c | |
| @@ -137,6 +137,7 @@ handlerequest(int sock, char *base, char *ohost, char *port… | |
| bzero(&dir, sizeof(dir)); | |
| bzero(recvb, sizeof(recvb)); | |
| bzero(recvc, sizeof(recvc)); | |
| + args = nil; | |
| len = recv(sock, recvb, sizeof(recvb)-1, 0); | |
| if(len > 0) { | |
| @@ -164,8 +165,6 @@ handlerequest(int sock, char *base, char *ohost, char *port… | |
| args = strchr(recvb, '?'); | |
| if(args != nil) | |
| *args++ = '\0'; | |
| - else | |
| - args = ohost; | |
| securepath(recvb, len - 2); | |
| snprintf(path, sizeof(path), "%s%s", base, recvb); | |
| @@ -182,10 +181,10 @@ handlerequest(int sock, char *base, char *ohost, char *po… | |
| if(c == nil) | |
| c = path; | |
| type = gettype(c); | |
| - type->f(sock, path, port, base, args, sear); | |
| + type->f(sock, path, port, base, args, sear, ohost); | |
| } else { | |
| if(S_ISDIR(dir.st_mode)) { | |
| - handledir(sock, path, port, base, args, sear); | |
| + handledir(sock, path, port, base, args, sear, ohost); | |
| if(loglvl & DIRS) | |
| logentry(clienth, clientp, recvc, | |
| "dir listing"); | |
| @@ -307,6 +306,16 @@ main(int argc, char *argv[]) | |
| usage(); | |
| } ARGEND; | |
| + if(ohost == nil) { | |
| + ohost = gmallocz(513, 2); | |
| + if(gethostname(ohost, 512) < 0) { | |
| + perror("gethostname"); | |
| + free(ohost); | |
| + return 1; | |
| + } | |
| + } else | |
| + ohost = gstrdup(ohost); | |
| + | |
| if(group != nil) { | |
| if((gr = getgrnam(group)) == nil) { | |
| perror("no such group"); | |
| @@ -419,6 +428,8 @@ main(int argc, char *argv[]) | |
| close(listfd); | |
| if(logfile != nil) | |
| stoplogging(glfd); | |
| + free(ohost); | |
| + | |
| return 0; | |
| } | |