Fixed a bug in callcgi.
[ashd.git] / src / callcgi.c
index dcd6819..42ac389 100644 (file)
@@ -52,6 +52,17 @@ static void passdata(FILE *in, FILE *out)
     free(buf);
 }
 
+static char *absolutify(char *file)
+{
+    char cwd[1024];
+    
+    if(*file != '/') {
+       getcwd(cwd, sizeof(cwd));
+       return(sprintf2("%s/%s", cwd, file));
+    }
+    return(sstrdup(file));
+}
+
 static void forkchild(int inpath, char *prog, char *file, char *method, char *url, char *rest, int *infd, int *outfd)
 {
     int i;
@@ -82,7 +93,7 @@ static void forkchild(int inpath, char *prog, char *file, char *method, char *ur
        putenv(sprintf2("SERVER_SOFTWARE=ashd/%s", VERSION));
        putenv("GATEWAY_INTERFACE=CGI/1.1");
        if(getenv("HTTP_VERSION"))
-           putenv(sprintf2("SERVER_PROTOCOL=HTTP/%s", getenv("HTTP_VERSION")));
+           putenv(sprintf2("SERVER_PROTOCOL=%s", getenv("HTTP_VERSION")));
        putenv(sprintf2("REQUEST_METHOD=%s", method));
        putenv(sprintf2("PATH_INFO=%s", rest));
        putenv(sprintf2("SCRIPT_NAME=%s", url));
@@ -103,7 +114,7 @@ static void forkchild(int inpath, char *prog, char *file, char *method, char *ur
         * This is (understandably) missing from the CGI
         * specification, but PHP seems to require it.
         */
-       putenv(sprintf2("SCRIPT_FILENAME=%s", file));
+       putenv(sprintf2("SCRIPT_FILENAME=%s", absolutify(file)));
        if(inpath)
            execlp(prog, prog, file, NULL);
        else
@@ -247,13 +258,13 @@ static void sendstatus(char **headers, FILE *out)
     }
     if(status) {
        if(strchr(status, ' '))
-           fprintf(out, "HTTP/1.1 %s\r\n", status);
+           fprintf(out, "HTTP/1.1 %s\n", status);
        else
-           fprintf(out, "HTTP/1.1 %i %s\r\n", atoi(status), defstatus(atoi(status)));
+           fprintf(out, "HTTP/1.1 %i %s\n", atoi(status), defstatus(atoi(status)));
     } else if(location) {
-       fprintf(out, "HTTP/1.1 303 See Other\r\n");
+       fprintf(out, "HTTP/1.1 303 See Other\n");
     } else {
-       fprintf(out, "HTTP/1.1 200 OK\r\n");
+       fprintf(out, "HTTP/1.1 200 OK\n");
     }
 }
 
@@ -261,7 +272,7 @@ static void sendheaders(char **headers, FILE *out)
 {
     while(*headers) {
        if(**headers)
-           fprintf(out, "%s: %s\r\n", headers[0], headers[1]);
+           fprintf(out, "%s: %s\n", headers[0], headers[1]);
        headers += 2;
     }
 }
@@ -318,7 +329,7 @@ int main(int argc, char **argv, char **envp)
     }
     sendstatus(headers, stdout);
     sendheaders(headers, stdout);
-    printf("\r\n");
+    printf("\n");
     passdata(out, stdout);
     return(0);
 }