X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcallcgi.c;h=11fb213872d214a3c7af6eab72c637d85ce375f2;hb=1af656d2284a5f51631ae11ee9fa068af5c1ccc4;hp=3add3edbd0c7f0721c58b5fb8f9cbaac2fafd7b6;hpb=53d666cafb4af8f07bf74af9278702db82085d45;p=ashd.git diff --git a/src/callcgi.c b/src/callcgi.c index 3add3ed..11fb213 100644 --- a/src/callcgi.c +++ b/src/callcgi.c @@ -24,6 +24,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -85,7 +86,6 @@ static char *absolutify(char *file) static pid_t forkchild(int inpath, char *prog, char *file, char *method, char *url, char *rest, int *infd, int *outfd) { - int i; char *qp, **env, *name; int inp[2], outp[2]; pid_t pid; @@ -98,12 +98,12 @@ static pid_t forkchild(int inpath, char *prog, char *file, char *method, char *u exit(1); } if(pid == 0) { - close(inp[1]); - close(outp[0]); dup2(inp[0], 0); dup2(outp[1], 1); - for(i = 3; i < FD_SETSIZE; i++) - close(i); + close(inp[0]); + close(inp[1]); + close(outp[0]); + close(outp[1]); if((qp = strchr(url, '?')) != NULL) *(qp++) = 0; putenv(sprintf2("SERVER_SOFTWARE=ashd/%s", VERSION)); @@ -145,12 +145,16 @@ static pid_t forkchild(int inpath, char *prog, char *file, char *method, char *u putenv(sprintf2("QUERY_STRING=%s", qp?qp:"")); if(getenv("REQ_HOST")) putenv(sprintf2("SERVER_NAME=%s", getenv("REQ_HOST"))); + if(getenv("REQ_X_ASH_SERVER_ADDRESS")) + putenv(sprintf2("SERVER_ADDR=%s", getenv("REQ_X_ASH_SERVER_ADDRESS"))); if(getenv("REQ_X_ASH_SERVER_PORT")) putenv(sprintf2("SERVER_PORT=%s", getenv("REQ_X_ASH_SERVER_PORT"))); if(getenv("REQ_X_ASH_PROTOCOL") && !strcmp(getenv("REQ_X_ASH_PROTOCOL"), "https")) putenv("HTTPS=on"); if(getenv("REQ_X_ASH_ADDRESS")) putenv(sprintf2("REMOTE_ADDR=%s", getenv("REQ_X_ASH_ADDRESS"))); + if(getenv("REQ_X_ASH_PORT")) + putenv(sprintf2("REMOTE_PORT=%s", getenv("REQ_X_ASH_PORT"))); if(getenv("REQ_X_ASH_REMOTE_USER")) putenv(sprintf2("REMOTE_USER=%s", getenv("REQ_X_ASH_REMOTE_USER"))); if(getenv("REQ_CONTENT_TYPE")) @@ -343,6 +347,7 @@ int main(int argc, char **argv, char **envp) FILE *in, *out; char **headers; pid_t child; + int estat; environ = envp; signal(SIGPIPE, SIG_IGN); @@ -404,5 +409,14 @@ int main(int argc, char **argv, char **envp) printf("\n"); if(passdata(out, stdout)) kill(child, SIGINT); - return(0); + if(waitpid(child, &estat, 0) == child) { + if(WCOREDUMP(estat)) + flog(LOG_WARNING, "CGI handler `%s' dumped core", prog); + if(WIFEXITED(estat) && !WEXITSTATUS(estat)) + return(0); + else + return(1); + } + flog(LOG_WARNING, "could not wait for CGI handler: %s", strerror(errno)); + return(1); }