call*cgi, python: Added symmetrical {SERVER,REMOTE}_{ADDR,PORT} parameters.
[ashd.git] / src / callcgi.c
index 3add3ed..11fb213 100644 (file)
@@ -24,6 +24,7 @@
 #include <ctype.h>
 #include <signal.h>
 #include <sys/poll.h>
+#include <sys/wait.h>
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -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);
 }