Slightly modified patch from James Beal: add --no-eof (or --noeof) as
[sgt/agedu] / httpd.c
diff --git a/httpd.c b/httpd.c
index fcdd68e..dd7aa23 100644 (file)
--- a/httpd.c
+++ b/httpd.c
@@ -90,7 +90,7 @@ char *got_data(struct connctx *ctx, char *data, int length,
               const struct html_config *cfg)
 {
     char *line, *p, *q, *r, *z1, *z2, c1, c2;
-    int auth_provided = 0, auth_correct = 0;
+    int auth_correct = 0;
     unsigned long index;
     char *document, *ret;
 
@@ -235,7 +235,6 @@ char *got_data(struct connctx *ctx, char *data, int length,
                    p = q;
            }
            if (p < q) {
-               auth_provided = 1;
                while (p < q && isspace((unsigned char)*p))
                    p++;
                r = p;
@@ -277,7 +276,7 @@ char *got_data(struct connctx *ctx, char *data, int length,
                ret = http_error("404", "Not Found", NULL,
                                 "This is not a valid pathname index.");
            } else {
-               document = html_query(ctx->t, index, cfg);
+               document = html_query(ctx->t, index, cfg, 1);
                if (document) {
                    ret = http_success("text/html", 1, document);
                    sfree(document);
@@ -414,8 +413,6 @@ void run_httpd(const void *t, int authmask, const struct httpd_config *dcfg,
     int fd, ret;
     int authtype;
     char *authstring = NULL;
-    unsigned long ipaddr;
-    struct fd *f;
     struct sockaddr_in addr;
     socklen_t addrlen;
     struct html_config cfg = *incfg;
@@ -431,22 +428,28 @@ void run_httpd(const void *t, int authmask, const struct httpd_config *dcfg,
        fprintf(stderr, "socket(PF_INET): %s\n", strerror(errno));
        exit(1);
     }
+    memset(&addr, 0, sizeof(addr));
     addr.sin_family = AF_INET;
     if (!dcfg->address) {
+#ifdef RANDOM_LOCALHOST
+       unsigned long ipaddr;
        srand(0L);
        ipaddr = 0x7f000000;
        ipaddr += (1 + rand() % 255) << 16;
        ipaddr += (1 + rand() % 255) << 8;
        ipaddr += (1 + rand() % 255);
        addr.sin_addr.s_addr = htonl(ipaddr);
+#else
+       addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+#endif
        addr.sin_port = htons(0);
-       
     } else {
        addr.sin_addr.s_addr = inet_addr(dcfg->address);
        addr.sin_port = dcfg->port ? htons(dcfg->port) : 0;
     }
     addrlen = sizeof(addr);
     ret = bind(fd, (const struct sockaddr *)&addr, addrlen);
+#ifdef RANDOM_LOCALHOST
     if (ret < 0 && errno == EADDRNOTAVAIL && !dcfg->address) {
        /*
         * Some systems don't like us binding to random weird
@@ -457,6 +460,7 @@ void run_httpd(const void *t, int authmask, const struct httpd_config *dcfg,
        addr.sin_port = htons(0);
        ret = bind(fd, (const struct sockaddr *)&addr, addrlen);
     }
+#endif
     if (ret < 0) {
        fprintf(stderr, "bind: %s\n", strerror(errno));
        exit(1);
@@ -565,17 +569,20 @@ void run_httpd(const void *t, int authmask, const struct httpd_config *dcfg,
        printf("URL: http://%s:%d/\n",
               inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
     }
+    fflush(stdout);
 
     /*
      * Now construct an fd structure to hold it.
      */
-    f = new_fdstruct(fd, FD_LISTENER);
-
-    /*
-     * Read from standard input, and treat EOF as a notification
-     * to exit.
-     */
-    new_fdstruct(0, FD_CLIENT);
+    new_fdstruct(fd, FD_LISTENER);
+
+    if (dcfg->closeoneof) {
+        /*
+         * Read from standard input, and treat EOF as a notification
+         * to exit.
+         */
+       new_fdstruct(0, FD_CLIENT);
+    }
 
     /*
      * Now we're ready to run our main loop. Keep looping round on