X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=lib%2Fproc.c;h=957cfce7becb6d100b42bc807df759db10fda925;hp=efd276731b32cd9d2381d57e37cb25b4287f004b;hb=992ce9ef8adb25fdcc47264187450a3edb287167;hpb=af34331c8aae9bacdae3655546b2fb6eb2fbe23f diff --git a/lib/proc.c b/lib/proc.c index efd2767..957cfce 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -21,6 +21,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -28,6 +29,7 @@ #include #include #include +#include int stdmkchild(char **argv) { @@ -121,3 +123,46 @@ int recvfd(int sock, char **data, size_t *datalen) *datalen = ret; return(fd); } + +pid_t stdforkserve(char **argv, struct hthead *req, int fd) +{ + int i; + char *ebuf, *p; + pid_t pid; + struct charvbuf args; + + if((pid = fork()) < 0) + return(-1); + if(pid == 0) { + dup2(fd, 0); + dup2(fd, 1); + for(i = 3; i < FD_SETSIZE; i++) + close(i); + + bufinit(args); + for(i = 0; argv[i]; i++) + bufadd(args, argv[i]); + bufadd(args, req->method); + bufadd(args, req->url); + bufadd(args, req->rest); + bufadd(args, NULL); + + for(i = 0; i < req->noheaders; i++) { + ebuf = sstrdup(req->headers[i][0]); + for(p = ebuf; *p; p++) { + if(isalnum(*p)) + *p = toupper(*p); + else + *p = '_'; + } + putenv(sprintf2("REQ_%s=%s", ebuf, req->headers[i][1])); + } + putenv(sprintf2("HTTP_VERSION=%s", req->ver)); + + execvp(args.b[0], args.b); + flog(LOG_WARNING, "could not exec child program %s: %s", argv[0], strerror(errno)); + exit(127); + } + close(fd); + return(pid); +}