iAdding dynamic CGI support. - 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 6f4cbad45b4f91422cc14d1b843c754b234ffffe /scm/geomyidae/commit/6f4cbad45b4f91422cc14d1b843c754b234ffffe.gph bitreich.org 70 1parent 72fa3a9a1750ffa0b5fc2f4fb33f7daafe57a368 /scm/geomyidae/commit/72fa3a9a1750ffa0b5fc2f4fb33f7daafe57a368.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sat, 12 Mar 2011 20:19:25 +0100 Err bitreich.org 70 i Err bitreich.org 70 iAdding dynamic CGI support. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M handlr.c | 77 ++++++++++++++++++++++++------- Err bitreich.org 70 i M handlr.h | 4 ++-- Err bitreich.org 70 i M ind.c | 34 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i M ind.h | 2 ++ Err bitreich.org 70 i Err bitreich.org 70 i4 files changed, 95 insertions(+), 22 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@@ -113,21 +113,8 @@ handlegph(int sock, char *file, char *port, char *base, char *args, 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- Err bitreich.org 70 i for(i = 0; i < act->num; i++) { Err bitreich.org 70 i- if(!strncmp(act->n[i]->e[3], "server", 6)) { Err bitreich.org 70 i- free(act->n[i]->e[3]); Err bitreich.org 70 i- act->n[i]->e[3] = gstrdup(addr); Err bitreich.org 70 i- } Err bitreich.org 70 i- if(!strncmp(act->n[i]->e[4], "port", 4)) { Err bitreich.org 70 i- free(act->n[i]->e[4]); Err bitreich.org 70 i- act->n[i]->e[4] = gstrdup(port); Err bitreich.org 70 i- } Err bitreich.org 70 i- tprintf(sock, "%.1s%s\t%s\t%s\t%s\r\n", Err bitreich.org 70 i- act->n[i]->e[0], act->n[i]->e[1], Err bitreich.org 70 i- act->n[i]->e[2], act->n[i]->e[3], Err bitreich.org 70 i- act->n[i]->e[4]); Err bitreich.org 70 i- Err bitreich.org 70 i+ printelem(sock, act->n[i], addr, 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@@ -164,30 +151,86 @@ handlecgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i { Err bitreich.org 70 i char *p; Err bitreich.org 70 i Err bitreich.org 70 i- USED(port); Err bitreich.org 70 i USED(base); Err bitreich.org 70 i+ USED(port); Err bitreich.org 70 i Err bitreich.org 70 i p = strrchr(file, '/'); 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- dup2(sock, 1); Err bitreich.org 70 i+ if(sear == nil) Err bitreich.org 70 i+ sear = ""; 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 dup2(sock, 2); Err bitreich.org 70 i+ switch(fork()) { Err bitreich.org 70 i+ case 0: Err bitreich.org 70 i+ execl(file, p, sear, args, (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+ wait(NULL); Err bitreich.org 70 i+ shutdown(sock, SHUT_RDWR); Err bitreich.org 70 i+ close(sock); 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 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+{ Err bitreich.org 70 i+ char *p, *ln, addr[512]; 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+ USED(base); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(pipe(outpipe) < 0) Err bitreich.org 70 i+ return; Err bitreich.org 70 i+ Err bitreich.org 70 i+ p = strrchr(file, '/'); 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 Err bitreich.org 70 i+ dup2(sock, 0); Err bitreich.org 70 i+ dup2(sock, 2); Err bitreich.org 70 i switch(fork()) { Err bitreich.org 70 i case 0: Err bitreich.org 70 i+ dup2(outpipe[1], 1); Err bitreich.org 70 i+ close(outpipe[0]); Err bitreich.org 70 i execl(file, p, sear, args, (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+ dup2(sock, 1); Err bitreich.org 70 i+ close(outpipe[1]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ while((ln = readln(outpipe[0])) != nil) { Err bitreich.org 70 i+ el = getadv(ln); 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+ 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+ Err bitreich.org 70 i wait(NULL); Err bitreich.org 70 i shutdown(sock, SHUT_RDWR); Err bitreich.org 70 i close(sock); 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@@ -6,8 +6,6 @@ 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-#define nil NULL 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 void handlegph(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i@@ -16,5 +14,7 @@ void handlebin(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i char *sear); 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+void handledcgi(int sock, char *file, char *port, char *base, char *args, Err bitreich.org 70 i+ char *sear); 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@@ -22,6 +22,7 @@ filetype type[] = { Err bitreich.org 70 i {"default", "0", handlebin}, Err bitreich.org 70 i {"gph", "1", handlegph}, Err bitreich.org 70 i {"cgi", "0", handlecgi}, Err bitreich.org 70 i+ {"dcgi", "1", handledcgi}, Err bitreich.org 70 i {"bin", "9", handlebin}, Err bitreich.org 70 i {"tgz", "9", handlebin}, Err bitreich.org 70 i {"gz", "9", handlebin}, Err bitreich.org 70 i@@ -195,6 +196,17 @@ getadv(char *str) Err bitreich.org 70 i return ret; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+void Err bitreich.org 70 i+addindexs(Indexs *idx, Elems *el) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ idx->num++; Err bitreich.org 70 i+ idx->n = realloc(idx->n, sizeof(Elems) * idx->num); Err bitreich.org 70 i+ idx->n[idx->num - 1] = el; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i Indexs * Err bitreich.org 70 i scanfile(char *fname) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -215,9 +227,7 @@ scanfile(char *fname) Err bitreich.org 70 i if(el == nil) Err bitreich.org 70 i continue; Err bitreich.org 70 i Err bitreich.org 70 i- ret->num++; Err bitreich.org 70 i- ret->n = realloc(ret->n, sizeof(Elems) * ret->num); Err bitreich.org 70 i- ret->n[ret->num - 1] = el; Err bitreich.org 70 i+ addindexs(ret, el); Err bitreich.org 70 i el = nil; Err bitreich.org 70 i } Err bitreich.org 70 i close(fd); Err bitreich.org 70 i@@ -231,6 +241,24 @@ scanfile(char *fname) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i+printelem(int fd, Elems *el, char *addr, char *port) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ Err bitreich.org 70 i+ if(!strncmp(el->e[3], "server", 6)) { Err bitreich.org 70 i+ free(el->e[3]); Err bitreich.org 70 i+ el->e[3] = gstrdup(addr); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if(!strncmp(el->e[4], "port", 4)) { Err bitreich.org 70 i+ free(el->e[4]); Err bitreich.org 70 i+ el->e[4] = gstrdup(port); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ tprintf(fd, "%.1s%s\t%s\t%s\t%s\r\n", el->e[0], el->e[1], el->e[2], Err bitreich.org 70 i+ el->e[3], el->e[4]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i tprintf(int fd, char *fmt, ...) Err bitreich.org 70 i { Err bitreich.org 70 i va_list fmtargs; Err bitreich.org 70 1diff --git a/ind.h b/ind.h /scm/geomyidae/file/ind.h.gph bitreich.org 70 i@@ -35,6 +35,8 @@ void *gmallocz(int l, int d); Err bitreich.org 70 i char *gstrdup(char *str); Err bitreich.org 70 i Indexs *scanfile(char *fname); Err bitreich.org 70 i Elems *getadv(char *str); Err bitreich.org 70 i+void printelem(int fd, Elems *el, char *addr, char *port); Err bitreich.org 70 i+void addindexs(Indexs *idx, Elems *el); Err bitreich.org 70 i void addelem(Elems *e, char *s); Err bitreich.org 70 i void freeindex(Indexs *i); Err bitreich.org 70 i void freeelem(Elems *e); Err bitreich.org 70 .