httpd: add support for directory indexer (cgi-bin/index.cgi)
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 21 Nov 2006 00:08:39 +0000 (00:08 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 21 Nov 2006 00:08:39 +0000 (00:08 -0000)
networking/httpd.c

index 40f37ba075a4fc3b2ee70a3a32baac4789d71f1d..afcd089b0ca864821ca2036a06c1c133748195e7 100644 (file)
@@ -893,9 +893,8 @@ static int sendHeaders(HttpResponseNum responseNum)
                                responseNum, responseString,
                                responseNum, responseString, infoString);
        }
-#if DEBUG
-       fprintf(stderr, "headers: '%s'\n", buf);
-#endif
+       if (DEBUG)
+               fprintf(stderr, "headers: '%s'\n", buf);
        return full_write(config->accepted_socket, buf, len);
 }
 
@@ -984,7 +983,7 @@ static int sendCgi(const char *url,
                if (purl == NULL)
                        _exit(242);
 
-               inFd  = toCgi[0];
+               inFd = toCgi[0];
                outFd = fromCgi[1];
 
                dup2(inFd, 0);  // replace stdin with the pipe
@@ -1028,7 +1027,7 @@ static int sendCgi(const char *url,
                        setenv1("REQUEST_URI", purl);
                }
                if (script != NULL)
-                       *script = '\0';         /* reduce /PATH_INFO */
+                       *script = '\0';         /* cut off /PATH_INFO */
                 /* SCRIPT_FILENAME required by PHP in CGI mode */
                if (!realpath(purl + 1, realpath_buff))
                        goto error_execing_cgi;
@@ -1546,7 +1545,7 @@ static void handleIncoming(void)
                        *test = '/';
                }
                if (blank >= 0) {
-                       // read until blank line for HTTP version specified, else parse immediate
+                       /* read until blank line for HTTP version specified, else parse immediate */
                        while (1) {
                                alarm(TIMEOUT);
                                count = getLine();
@@ -1568,7 +1567,7 @@ static void handleIncoming(void)
                                                length = strtol(test, &test, 10);
                                                /* length is "ulong", but we need to pass it to int later */
                                                /* so we check for negative or too large values in one go: */
-                                               /* (long -> ulong conv will cause negatives to be seen as > INT_MAX) */
+                                               /* (long -> ulong conv caused negatives to be seen as > INT_MAX) */
                                                if (test[0] || errno || length > INT_MAX)
                                                        goto bail_out;
                                        }
@@ -1599,14 +1598,14 @@ static void handleIncoming(void)
 
                        } /* while extra header reading */
                }
-               (void) alarm(0);
+               alarm(0);
                if (config->alarm_signaled)
                        break;
 
                if (strcmp(strrchr(url, '/') + 1, httpd_conf) == 0 || ip_allowed == 0) {
                        /* protect listing [/path]/httpd_conf or IP deny */
 #if ENABLE_FEATURE_HTTPD_CGI
-FORBIDDEN:             /* protect listing /cgi-bin */
+ FORBIDDEN:            /* protect listing /cgi-bin */
 #endif
                        sendHeaders(HTTP_FORBIDDEN);
                        break;
@@ -1631,25 +1630,30 @@ FORBIDDEN:              /* protect listing /cgi-bin */
 #if ENABLE_FEATURE_HTTPD_CGI
                if (strncmp(test, "cgi-bin", 7) == 0) {
                        if (test[7] == '/' && test[8] == 0)
-                               goto FORBIDDEN;     // protect listing cgi-bin/
+                               goto FORBIDDEN;     /* protect listing cgi-bin/ */
                        sendCgi(url, prequest, length, cookie, content_type);
-               } else {
-                       if (prequest != request_GET)
-                               sendHeaders(HTTP_NOT_IMPLEMENTED);
-                       else {
-#endif  /* FEATURE_HTTPD_CGI */
-                               if (purl[-1] == '/')
-                                       strcpy(purl, "index.html");
-                               if (stat(test, &sb) == 0) {
-                                       config->ContentLength = sb.st_size;
-                                       config->last_mod = sb.st_mtime;
-                               }
-                               sendFile(test);
-                               config->ContentLength = -1;
-#if ENABLE_FEATURE_HTTPD_CGI
+                       break;
+               }
+               if (prequest != request_GET) {
+                       sendHeaders(HTTP_NOT_IMPLEMENTED);
+                       break;
+               }
+               if (purl[-1] == '/') {
+                       if (access("cgi-bin/index.cgi", X_OK) == 0) {
+                               config->query = url;
+                               sendCgi("/cgi-bin/index.cgi", prequest, length, cookie, content_type);
+                               break;
                        }
                }
-#endif
+#endif  /* FEATURE_HTTPD_CGI */
+               if (purl[-1] == '/')
+                       strcpy(purl, "index.html");
+               if (stat(test, &sb) == 0) {
+                       config->ContentLength = sb.st_size;
+                       config->last_mod = sb.st_mtime;
+               }
+               sendFile(test);
+               config->ContentLength = -1;
        } while (0);
 
  bail_out: