X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/agedu/blobdiff_plain/14601b5d4222f2bee568e03eddf2f949b2a9d126..19199555f89d30bc913539850089ecafe64af043:/httpd.c diff --git a/httpd.c b/httpd.c index 2437cdd..dd7aa23 100644 --- 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; @@ -262,7 +261,7 @@ char *got_data(struct connctx *ctx, char *data, int length, if (!magic_access && !auth_correct) { if (auth_string) { ret = http_error("401", "Unauthorized", - "WWW-Authenticate: Basic realm=\""PNAME"\"\r", + "WWW-Authenticate: Basic realm=\""PNAME"\"\r\n", "\nYou must authenticate to view these pages."); } else { ret = http_error("403", "Forbidden", NULL, @@ -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