Module Name: src
Committed By: mrg
Date: Thu Nov 22 08:54:08 UTC 2018
Modified Files:
src/libexec/httpd: auth-bozo.c bozohttpd.c bozohttpd.h cgi-bozo.c
daemon-bozo.c dir-index-bozo.c main.c ssl-bozo.c tilde-luzah-bozo.c
Log Message:
many clean ups:
- keep a list of special files and their human names
- remove (void) casts on bozo_http_error()
- fix a few more misuses of bozo_http_error()
- rename check_mapping() to check_remap() and perform some CSE
- switch away from ``%s'' to '%s'
- remove a bunch of #ifdef using new have_feature defines
To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/libexec/httpd/auth-bozo.c
cvs rdiff -u -r1.92 -r1.93 src/libexec/httpd/bozohttpd.c
cvs rdiff -u -r1.55 -r1.56 src/libexec/httpd/bozohttpd.h
cvs rdiff -u -r1.41 -r1.42 src/libexec/httpd/cgi-bozo.c
cvs rdiff -u -r1.18 -r1.19 src/libexec/httpd/daemon-bozo.c \
src/libexec/httpd/main.c
cvs rdiff -u -r1.27 -r1.28 src/libexec/httpd/dir-index-bozo.c
cvs rdiff -u -r1.24 -r1.25 src/libexec/httpd/ssl-bozo.c
cvs rdiff -u -r1.15 -r1.16 src/libexec/httpd/tilde-luzah-bozo.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/libexec/httpd/auth-bozo.c
diff -u src/libexec/httpd/auth-bozo.c:1.21 src/libexec/httpd/auth-bozo.c:1.22
--- src/libexec/httpd/auth-bozo.c:1.21 Wed Nov 21 09:37:02 2018
+++ src/libexec/httpd/auth-bozo.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: auth-bozo.c,v 1.21 2018/11/21 09:37:02 mrg Exp $ */
+/* $NetBSD: auth-bozo.c,v 1.22 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: auth-bozo.c,v 1.17 2011/11/18 09:21:15 mrg Exp $ */
@@ -117,6 +117,7 @@ bozo_auth_init(bozo_httpreq_t *request)
{
request->hr_authuser = NULL;
request->hr_authpass = NULL;
+ request->hr_authrealm = NULL;
}
void
Index: src/libexec/httpd/bozohttpd.c
diff -u src/libexec/httpd/bozohttpd.c:1.92 src/libexec/httpd/bozohttpd.c:1.93
--- src/libexec/httpd/bozohttpd.c:1.92 Wed Nov 21 17:39:19 2018
+++ src/libexec/httpd/bozohttpd.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: bozohttpd.c,v 1.92 2018/11/21 17:39:19 mrg Exp $ */
+/* $NetBSD: bozohttpd.c,v 1.93 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: bozohttpd.c,v 1.178 2011/11/18 09:21:15 mrg Exp $ */
@@ -109,7 +109,7 @@
#define INDEX_HTML "index.html"
#endif
#ifndef SERVER_SOFTWARE
-#define SERVER_SOFTWARE "bozohttpd/20181121"
+#define SERVER_SOFTWARE "bozohttpd/20181122"
#endif
#ifndef PUBLIC_HTML
@@ -169,6 +169,21 @@
#define LOG_FTP LOG_DAEMON
#endif
+/*
+ * List of special file that we should never serve.
+ */
+struct {
+ const char *file;
+ const char *name;
+} specials[] = {
+ { DIRECT_ACCESS_FILE, "rejected direct access request" },
+ { REDIRECT_FILE, "rejected redirect request" },
+ { ABSREDIRECT_FILE, "rejected absredirect request" },
+ { REMAP_FILE, "rejected remap request" },
+ { AUTH_FILE, "rejected authfile request" },
+ { NULL, NULL },
+};
+
volatile sig_atomic_t timeout_hit;
/*
@@ -680,8 +695,7 @@ bozo_read_request(bozohttpd_t *httpd)
sigaction(SIGALRM, &sa, NULL);
if (clock_gettime(CLOCK_MONOTONIC, &ots) != 0) {
- (void)bozo_http_error(httpd, 500, NULL,
- "clock_gettime failed");
+ bozo_http_error(httpd, 500, NULL, "clock_gettime failed");
goto cleanup;
}
@@ -690,8 +704,7 @@ bozo_read_request(bozohttpd_t *httpd)
alarm(0);
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
- (void)bozo_http_error(httpd, 500, NULL,
- "clock_gettime failed");
+ bozo_http_error(httpd, 500, NULL, "clock_gettime failed");
goto cleanup;
}
/*
@@ -711,16 +724,14 @@ bozo_read_request(bozohttpd_t *httpd)
timeout_hit = 1;
if (timeout_hit) {
- (void)bozo_http_error(httpd, 408, NULL,
- "request timed out");
+ bozo_http_error(httpd, 408, NULL, "request timed out");
goto cleanup;
}
line++;
if (line == 1) {
if (len < 1) {
- (void)bozo_http_error(httpd, 404, NULL,
- "null method");
+ bozo_http_error(httpd, 404, NULL, "null method");
goto cleanup;
}
bozowarn(httpd,
@@ -734,13 +745,11 @@ bozo_read_request(bozohttpd_t *httpd)
request->hr_file = file;
request->hr_query = query;
if (method == NULL) {
- (void)bozo_http_error(httpd, 404, NULL,
- "null method");
+ bozo_http_error(httpd, 404, NULL, "null method");
goto cleanup;
}
if (file == NULL) {
- (void)bozo_http_error(httpd, 404, NULL,
- "null file");
+ bozo_http_error(httpd, 404, NULL, "null file");
goto cleanup;
}
@@ -768,12 +777,10 @@ bozo_read_request(bozohttpd_t *httpd)
break;
val = bozostrnsep(&str, ":", &len);
- debug((httpd, DEBUG_EXPLODING,
- "read_req2: after bozostrnsep: str ``%s'' val ``%s''",
- str, val));
+ debug((httpd, DEBUG_EXPLODING, "read_req2: after "
+ "bozostrnsep: str `%s' val `%s'", str, val));
if (val == NULL || len == -1) {
- (void)bozo_http_error(httpd, 404, request,
- "no header");
+ bozo_http_error(httpd, 404, request, "no header");
goto cleanup;
}
while (*str == ' ' || *str == '\t')
@@ -796,7 +803,7 @@ bozo_read_request(bozohttpd_t *httpd)
else if (strcasecmp(hdr->h_header, "host") == 0) {
if (request->hr_host) {
/* RFC 7230 (HTTP/1.1): 5.4 */
- (void)bozo_http_error(httpd, 400, request,
+ bozo_http_error(httpd, 400, request,
"Only allow one Host: header");
goto cleanup;
}
@@ -805,7 +812,7 @@ bozo_read_request(bozohttpd_t *httpd)
}
/* RFC 2616 (HTTP/1.1): 14.20 */
else if (strcasecmp(hdr->h_header, "expect") == 0) {
- (void)bozo_http_error(httpd, 417, request,
+ bozo_http_error(httpd, 417, request,
"we don't support Expect:");
goto cleanup;
}
@@ -835,8 +842,7 @@ next_header:
/* RFC1945, 8.3 */
if (request->hr_method == HTTP_POST &&
request->hr_content_length == NULL) {
- (void)bozo_http_error(httpd, 400, request,
- "missing content length");
+ bozo_http_error(httpd, 400, request, "missing content length");
goto cleanup;
}
@@ -844,8 +850,7 @@ next_header:
if (request->hr_proto == httpd->consts.http_11 &&
/*(strncasecmp(request->hr_file, "http://", 7) != 0) &&*/
request->hr_host == NULL) {
- (void)bozo_http_error(httpd, 400, request,
- "missing Host header");
+ bozo_http_error(httpd, 400, request, "missing Host header");
goto cleanup;
}
@@ -1182,7 +1187,7 @@ esccmp(const char *s_plain, const char *
* \ to encode a path containig a : character.
*/
static void
-check_mapping(bozo_httpreq_t *request)
+check_remap(bozo_httpreq_t *request)
{
bozohttpd_t *httpd = request->hr_httpd;
char *file = request->hr_file, *newfile;
@@ -1200,16 +1205,14 @@ check_mapping(bozo_httpreq_t *request)
if (fstat(mapfile, &st) == -1) {
bozowarn(httpd, "could not stat " REMAP_FILE ", errno: %d",
errno);
- close(mapfile);
- return;
+ goto out;
}
fmap = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, mapfile, 0);
if (fmap == NULL) {
bozowarn(httpd, "could not mmap " REMAP_FILE ", error %d",
errno);
- close(mapfile);
- return;
+ goto out;
}
reqlen = strlen(file);
for (p = fmap, avail = st.st_size; avail; ) {
@@ -1287,13 +1290,14 @@ check_mapping(bozo_httpreq_t *request)
newfile = bozomalloc(httpd, strlen(file) + rlen - len + 1);
memcpy(newfile, map_to, rlen);
strcpy(newfile+rlen, file + len);
- debug((httpd, DEBUG_NORMAL, "remapping found ``%s'' ",
+ debug((httpd, DEBUG_NORMAL, "remapping found '%s'",
newfile));
free(request->hr_file);
request->hr_file = newfile;
}
munmap(fmap, st.st_size);
+out:
close(mapfile);
}
@@ -1314,8 +1318,8 @@ check_virtual(bozo_httpreq_t *request)
/*
* convert http://virtual.host/ to request->hr_host
*/
- debug((httpd, DEBUG_OBESE, "checking for http:// virtual host in ``%s''",
- file));
+ debug((httpd, DEBUG_OBESE,
+ "checking for http:// virtual host in '%s'", file));
if (strncasecmp(file, "http://", 7) == 0) {
/* we would do virtual hosting here? */
file += 7;
@@ -1327,7 +1331,7 @@ check_virtual(bozo_httpreq_t *request)
s = strchr(file, '/');
free(request->hr_file);
request->hr_file = bozostrdup(httpd, request, s ? s : "/");
- debug((httpd, DEBUG_OBESE, "got host ``%s'' file is now ``%s''",
+ debug((httpd, DEBUG_OBESE, "got host '%s' file is now '%s'",
request->hr_host, request->hr_file));
} else if (!request->hr_host)
goto use_slashdir;
@@ -1342,13 +1346,11 @@ check_virtual(bozo_httpreq_t *request)
}
if (!httpd->virtbase) {
-
/*
* if we don't use vhost support, then set virthostname if
* user supplied Host header. It will be used for possible
* redirections
*/
-
if (request->hr_host) {
s = strrchr(request->hr_host, ':');
if (s != NULL)
@@ -1360,7 +1362,6 @@ check_virtual(bozo_httpreq_t *request)
/* fix Host: again, if we truncated it */
*s = ':';
}
-
goto use_slashdir;
}
@@ -1375,7 +1376,7 @@ check_virtual(bozo_httpreq_t *request)
"for file `%s'",
request->hr_host, httpd->virtbase, request->hr_file));
if (strncasecmp(httpd->virthostname, request->hr_host, len) != 0) {
- s = 0;
+ s = NULL;
DIR *dirp;
struct dirent *d;
@@ -1385,7 +1386,7 @@ check_virtual(bozo_httpreq_t *request)
strcmp(d->d_name, "..") == 0) {
continue;
}
- debug((httpd, DEBUG_OBESE, "looking at dir``%s''",
+ debug((httpd, DEBUG_OBESE, "looking at dir '%s'",
d->d_name));
if (strcmp(d->d_name, request->hr_host) == 0) {
/* found it, punch it */
@@ -1424,7 +1425,7 @@ use_slashdir:
/*
* is there a mapping for this request?
*/
- check_mapping(request);
+ check_remap(request);
return 0;
}
@@ -1449,9 +1450,10 @@ check_bzredirect(bozo_httpreq_t *request
* use it as the directory to look for the redir file.
*/
if ((size_t)snprintf(dir, sizeof(dir), "%s", request->hr_file + 1) >=
- sizeof(dir))
- return bozo_http_error(httpd, 404, request,
- "file path too long");
+ sizeof(dir)) {
+ bozo_http_error(httpd, 404, request, "file path too long");
+ return -1;
+ }
debug((httpd, DEBUG_FAT, "check_bzredirect: dir %s", dir));
basename = strrchr(dir, '/');
@@ -1462,7 +1464,7 @@ check_bzredirect(bozo_httpreq_t *request
} else if (basename == NULL) {
strcpy(path, ".");
strcpy(dir, "");
- basename = request->hr_file + 1;
+ basename = dir;
} else {
*basename++ = '\0';
strcpy(path, dir);
@@ -1473,7 +1475,7 @@ check_bzredirect(bozo_httpreq_t *request
debug((httpd, DEBUG_FAT, "check_bzredirect: path %s", path));
if ((size_t)snprintf(redir, sizeof(redir), "%s/%s", path,
- REDIRECT_FILE) >= sizeof(redir)) {
+ REDIRECT_FILE) >= sizeof(redir)) {
return bozo_http_error(httpd, 404, request,
"redirectfile path too long");
return -1;
@@ -1483,10 +1485,11 @@ check_bzredirect(bozo_httpreq_t *request
return 0;
absolute = 0;
} else {
- if((size_t)snprintf(redir, sizeof(redir), "%s/%s", path,
- ABSREDIRECT_FILE) >= sizeof(redir)) {
- return bozo_http_error(httpd, 404, request,
- "redirectfile path too long");
+ if ((size_t)snprintf(redir, sizeof(redir), "%s/%s", path,
+ ABSREDIRECT_FILE) >= sizeof(redir)) {
+ bozo_http_error(httpd, 404, request,
+ "redirectfile path too long");
+ return -1;
}
if (lstat(redir, &sb) < 0 || !S_ISLNK(sb.st_mode))
return 0;
@@ -1510,8 +1513,9 @@ check_bzredirect(bozo_httpreq_t *request
if (!absolute && redirpath[0] != '/') {
if ((size_t)snprintf(finalredir = redir, sizeof(redir), "%s%s/%s",
(strlen(dir) > 0 ? "/" : ""), dir, redirpath) >= sizeof(redir)) {
- return bozo_http_error(httpd, 404, request,
- "redirect path too long");
+ bozo_http_error(httpd, 404, request,
+ "redirect path too long");
+ return -1;
}
} else
finalredir = redirpath;
@@ -1607,16 +1611,15 @@ transform_request(bozo_httpreq_t *reques
file = NULL;
*isindex = 0;
debug((httpd, DEBUG_FAT, "tf_req: file %s", request->hr_file));
- if (bozo_decode_url_percent(request, request->hr_file)) {
- goto bad_done;
- }
- if (check_virtual(request)) {
+
+ if (bozo_decode_url_percent(request, request->hr_file) ||
+ check_virtual(request))
goto bad_done;
- }
+
file = request->hr_file;
if (file[0] != '/') {
- (void)bozo_http_error(httpd, 404, request, "unknown URL");
+ bozo_http_error(httpd, 404, request, "unknown URL");
goto bad_done;
}
@@ -1633,12 +1636,13 @@ transform_request(bozo_httpreq_t *reques
/* first of all expand user path */
if (len > 1 && httpd->enable_users && file[1] == '~') {
if (file[2] == '\0') {
- (void)bozo_http_error(httpd, 404, request,
- "missing username");
+ bozo_http_error(httpd, 404, request,
+ "missing username");
goto bad_done;
}
if (strchr(file + 2, '/') == NULL) {
char *userredirecturl;
+
bozoasprintf(httpd, &userredirecturl, "%s/", file);
handle_redirect(request, userredirecturl, 0);
free(userredirecturl);
@@ -1680,13 +1684,12 @@ transform_request(bozo_httpreq_t *reques
newfile = bozostrdup(httpd, request, httpd->index_html);
*isindex = 1;
} else { /* len == 0 ? */
- (void)bozo_http_error(httpd, 500, request,
- "request->hr_file is nul?");
+ bozo_http_error(httpd, 500, request, "request->hr_file is nul");
goto bad_done;
}
if (newfile == NULL) {
- (void)bozo_http_error(httpd, 500, request, "internal failure");
+ bozo_http_error(httpd, 500, request, "internal failure");
goto bad_done;
}
@@ -1701,7 +1704,7 @@ transform_request(bozo_httpreq_t *reques
if (*newfile == '/' || strcmp(newfile, "..") == 0 ||
strstr(newfile, "/..") || strstr(newfile, "../")) {
- (void)bozo_http_error(httpd, 403, request, "illegal request");
+ bozo_http_error(httpd, 403, request, "illegal request");
goto bad_done;
}
@@ -1713,14 +1716,13 @@ transform_request(bozo_httpreq_t *reques
request->hr_file = newfile;
}
- if (bozo_process_cgi(request))
- return 0;
-
- if (bozo_process_lua(request))
+ if (bozo_process_cgi(request) ||
+ bozo_process_lua(request))
return 0;
debug((httpd, DEBUG_FAT, "transform_request set: %s", newfile));
return 1;
+
bad_done:
debug((httpd, DEBUG_FAT, "transform_request returning: 0"));
free(newfile);
@@ -1819,23 +1821,22 @@ bozo_process_request(bozo_httpreq_t *req
switch (errno) {
case EPERM:
case EACCES:
- (void)bozo_http_error(httpd, 403, request,
- "no permission to open file");
+ bozo_http_error(httpd, 403, request,
+ "no permission to open file");
break;
case ENAMETOOLONG:
/*FALLTHROUGH*/
case ENOENT:
if (!bozo_dir_index(request, file, isindex))
- (void)bozo_http_error(httpd, 404, request,
- "no file");
+ bozo_http_error(httpd, 404, request, "no file");
break;
default:
- (void)bozo_http_error(httpd, 500, request, "open file");
+ bozo_http_error(httpd, 500, request, "open file");
}
goto cleanup_nofd;
}
if (fstat(fd, &sb) < 0) {
- (void)bozo_http_error(httpd, 500, request, "can't fstat");
+ bozo_http_error(httpd, 500, request, "can't fstat");
goto cleanup;
}
if (S_ISDIR(sb.st_mode)) {
@@ -1925,22 +1926,10 @@ bozo_check_special_files(bozo_httpreq_t
{
bozohttpd_t *httpd = request->hr_httpd;
- /* ensure basename(name) != special files */
- if (strcmp(name, DIRECT_ACCESS_FILE) == 0)
- return bozo_http_error(httpd, 403, request,
- "no permission to open direct access file");
- if (strcmp(name, REDIRECT_FILE) == 0)
- return bozo_http_error(httpd, 403, request,
- "no permission to open redirect file");
- if (strcmp(name, ABSREDIRECT_FILE) == 0)
- return bozo_http_error(httpd, 403, request,
- "no permission to open redirect file");
- if (strcmp(name, REMAP_FILE) == 0)
- return bozo_http_error(httpd, 403, request,
- "no permission to open redirect file");
- if (strcmp(name, AUTH_FILE) == 0)
- return bozo_http_error(httpd, 403, request,
- "no permission to open authfile");
+ for (size_t i = 0; specials[i].file; i++)
+ if (strcmp(name, specials[i].file) == 0)
+ return bozo_http_error(httpd, 403, request,
+ specials[i].name);
return 0;
}
@@ -2377,7 +2366,7 @@ bozodgetln(bozohttpd_t *httpd, int fd, s
}
httpd->getln_buffer[len] = '\0';
- debug((httpd, DEBUG_OBESE, "bozodgetln returns: ``%s'' with len %zd",
+ debug((httpd, DEBUG_OBESE, "bozodgetln returns: '%s' with len %zd",
httpd->getln_buffer, len));
*lenp = len;
return httpd->getln_buffer;
@@ -2392,7 +2381,7 @@ bozorealloc(bozohttpd_t *httpd, void *pt
if (p)
return p;
- (void)bozo_http_error(httpd, 500, NULL, "memory allocation failure");
+ bozo_http_error(httpd, 500, NULL, "memory allocation failure");
exit(EXIT_FAILURE);
}
@@ -2405,7 +2394,7 @@ bozomalloc(bozohttpd_t *httpd, size_t si
if (p)
return p;
- (void)bozo_http_error(httpd, 500, NULL, "memory allocation failure");
+ bozo_http_error(httpd, 500, NULL, "memory allocation failure");
exit(EXIT_FAILURE);
}
@@ -2421,7 +2410,7 @@ bozostrdup(bozohttpd_t *httpd, bozo_http
if (!request)
bozoerr(httpd, EXIT_FAILURE, "strdup");
- (void)bozo_http_error(httpd, 500, request, "memory allocation failure");
+ bozo_http_error(httpd, 500, request, "memory allocation failure");
exit(EXIT_FAILURE);
}
@@ -2443,7 +2432,7 @@ bozo_init_httpd(bozohttpd_t *httpd)
/* error buffer for bozo_http_error() */
if ((httpd->errorbuf = malloc(BUFSIZ)) == NULL) {
- (void) fprintf(stderr,
+ fprintf(stderr,
"bozohttpd: memory_allocation failure\n");
return 0;
}
Index: src/libexec/httpd/bozohttpd.h
diff -u src/libexec/httpd/bozohttpd.h:1.55 src/libexec/httpd/bozohttpd.h:1.56
--- src/libexec/httpd/bozohttpd.h:1.55 Wed Nov 21 09:37:02 2018
+++ src/libexec/httpd/bozohttpd.h Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: bozohttpd.h,v 1.55 2018/11/21 09:37:02 mrg Exp $ */
+/* $NetBSD: bozohttpd.h,v 1.56 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: bozohttpd.h,v 1.39 2011/11/18 09:21:15 mrg Exp $ */
@@ -289,7 +289,7 @@ char *bozostrdup(bozohttpd_t *, bozo_htt
/* ssl-bozo.c */
#ifdef NO_SSL_SUPPORT
#define bozo_ssl_set_opts(w, x, y) bozo_noop
-#define bozo_ssl_set_ciphers(w, x, y) bozo_noop
+#define bozo_ssl_set_ciphers(w, x) bozo_noop
#define bozo_ssl_init(x) bozo_noop
#define bozo_ssl_accept(x) (0)
#define bozo_ssl_destroy(x) bozo_noop
@@ -326,13 +326,13 @@ int bozo_auth_cgi_count(bozo_httpreq_t *
/* cgi-bozo.c */
#ifdef NO_CGIBIN_SUPPORT
+#define bozo_cgi_setbin(h,s) bozo_noop
#define bozo_process_cgi(h) (0)
#define have_cgibin (0)
#else
void bozo_cgi_setbin(bozohttpd_t *, const char *);
void bozo_setenv(bozohttpd_t *, const char *, const char *, char **);
int bozo_process_cgi(bozo_httpreq_t *);
-void bozo_add_content_map_cgi(bozohttpd_t *, const char *, const char *);
#define have_cgibin (1)
#endif /* NO_CGIBIN_SUPPORT */
@@ -340,6 +340,7 @@ void bozo_add_content_map_cgi(bozohttpd_
/* lua-bozo.c */
#ifdef NO_LUA_SUPPORT
#define bozo_process_lua(h) (0)
+#define bozo_add_lua_map(h,s,t) bozo_noop
#define have_lua (0)
#else
void bozo_add_lua_map(bozohttpd_t *, const char *, const char *);
@@ -390,6 +391,7 @@ const char *bozo_content_encoding(bozo_h
bozo_content_map_t *bozo_match_content_map(bozohttpd_t *, const char *, int);
bozo_content_map_t *bozo_get_content_map(bozohttpd_t *, const char *);
#ifdef NO_DYNAMIC_CONTENT
+#define bozo_add_content_map_mime(h,s,t,u,v) bozo_noop
#define have_dynamic_content (0)
#else
void bozo_add_content_map_mime(bozohttpd_t *, const char *, const char *,
@@ -397,6 +399,13 @@ void bozo_add_content_map_mime(bozohttpd
#define have_dynamic_content (1)
#endif
+/* additional cgi-bozo.c */
+#if have_cgibin && have_dynamic_content
+void bozo_add_content_map_cgi(bozohttpd_t *, const char *, const char *);
+#else
+#define bozo_add_content_map_cgi(h,s,t)
+#endif
+
/* I/O */
int bozo_printf(bozohttpd_t *, const char *, ...) BOZO_PRINTFLIKE(2, 3);;
ssize_t bozo_read(bozohttpd_t *, int, void *, size_t);
Index: src/libexec/httpd/cgi-bozo.c
diff -u src/libexec/httpd/cgi-bozo.c:1.41 src/libexec/httpd/cgi-bozo.c:1.42
--- src/libexec/httpd/cgi-bozo.c:1.41 Tue Nov 20 01:06:46 2018
+++ src/libexec/httpd/cgi-bozo.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: cgi-bozo.c,v 1.41 2018/11/20 01:06:46 mrg Exp $ */
+/* $NetBSD: cgi-bozo.c,v 1.42 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: cgi-bozo.c,v 1.40 2011/11/18 09:21:15 mrg Exp $ */
@@ -62,7 +62,7 @@
*/
static const char *
content_cgihandler(bozohttpd_t *httpd, bozo_httpreq_t *request,
- const char *file)
+ const char *file)
{
bozo_content_map_t *map;
@@ -123,7 +123,6 @@ finish_cgi_output(bozohttpd_t *httpd, bo
/* much of this code is like bozo_read_request()'s header loop. */
SIMPLEQ_INIT(&headers);
write_header = nph == 0;
- /* was read(2) here - XXX - agc */
while (nph == 0 &&
(str = bozodgetln(httpd, in, &len, bozo_read)) != NULL) {
char *hdr_name, *hdr_value;
Index: src/libexec/httpd/daemon-bozo.c
diff -u src/libexec/httpd/daemon-bozo.c:1.18 src/libexec/httpd/daemon-bozo.c:1.19
--- src/libexec/httpd/daemon-bozo.c:1.18 Tue Nov 20 01:06:46 2018
+++ src/libexec/httpd/daemon-bozo.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: daemon-bozo.c,v 1.18 2018/11/20 01:06:46 mrg Exp $ */
+/* $NetBSD: daemon-bozo.c,v 1.19 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: daemon-bozo.c,v 1.24 2011/11/18 09:21:15 mrg Exp $ */
@@ -70,8 +70,9 @@ static pid_t pidfile_pid = 0;
static void
sigchild(int signo)
{
- while (waitpid(-1, NULL, WNOHANG) > 0) {
- }
+
+ while (waitpid(-1, NULL, WNOHANG) > 0)
+ /* nothing */;
}
/* Signal handler to exit in a controlled manner. This ensures that
Index: src/libexec/httpd/main.c
diff -u src/libexec/httpd/main.c:1.18 src/libexec/httpd/main.c:1.19
--- src/libexec/httpd/main.c:1.18 Tue Nov 20 01:15:50 2018
+++ src/libexec/httpd/main.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.18 2018/11/20 01:15:50 mrg Exp $ */
+/* $NetBSD: main.c,v 1.19 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: main.c,v 1.6 2011/11/18 09:21:15 mrg Exp $ */
/* from: eterna: bozohttpd.c,v 1.159 2009/05/23 02:14:30 mrg Exp */
@@ -140,9 +140,7 @@ main(int argc, char **argv)
bozohttpd_t httpd;
bozoprefs_t prefs;
char *progname;
-#ifndef NO_DAEMON_MODE
const char *val;
-#endif
int c;
(void) memset(&httpd, 0x0, sizeof(httpd));
@@ -166,24 +164,20 @@ main(int argc, char **argv)
switch (c) {
case 'L':
-#ifdef NO_LUA_SUPPORT
- bozoerr(&httpd, 1,
- "Lua support is not enabled");
- /* NOTREACHED */
-#else
+ if (!have_lua)
+ bozoerr(&httpd, 1, "Lua support not enabled");
+
/* make sure there's two argument */
if (argc - optind < 1)
usage(&httpd, progname);
bozo_add_lua_map(&httpd, optarg, argv[optind]);
optind++;
break;
-#endif /* NO_LUA_SUPPORT */
case 'M':
-#ifdef NO_DYNAMIC_CONTENT
- bozoerr(&httpd, 1,
- "dynamic mime content support is not enabled");
- /* NOTREACHED */
-#else
+ if (!have_dynamic_content)
+ bozoerr(&httpd, 1,
+ "dynamic mime content support not enabled");
+
/* make sure there're four arguments */
if (argc - optind < 3)
usage(&httpd, progname);
@@ -191,7 +185,6 @@ main(int argc, char **argv)
argv[optind+1], argv[optind+2]);
optind += 3;
break;
-#endif /* NO_DYNAMIC_CONTENT */
case 'n':
bozo_set_pref(&httpd, &prefs, "numeric", "true");
@@ -206,25 +199,22 @@ main(int argc, char **argv)
optarg);
break;
case 'Z':
-#ifdef NO_SSL_SUPPORT
- bozoerr(&httpd, 1, "ssl support is not enabled");
- /* NOT REACHED */
-#else
+ if (!have_ssl)
+ no_ssl:
+ bozoerr(&httpd, 1, "ssl support not enabled");
+
/* make sure there's two arguments */
if (argc - optind < 1)
usage(&httpd, progname);
bozo_ssl_set_opts(&httpd, optarg, argv[optind++]);
break;
-#endif /* NO_SSL_SUPPORT */
case 'z':
-#ifdef NO_SSL_SUPPORT
- bozoerr(&httpd, 1, "ssl support is not enabled");
- /* NOT REACHED */
-#else
+ if (!have_ssl)
+ goto no_ssl;
+
bozo_ssl_set_ciphers(&httpd, optarg);
break;
-#endif /* NO_SSL_SUPPORT */
case 'U':
bozo_set_pref(&httpd, &prefs, "username", optarg);
@@ -246,16 +236,11 @@ main(int argc, char **argv)
bozo_set_pref(&httpd, &prefs, "port number", optarg);
break;
-#ifdef NO_DAEMON_MODE
- case 'b':
- case 'e':
- case 'f':
- case 'i':
- case 'P':
- bozoerr(&httpd, 1, "Daemon mode is not enabled");
- /* NOTREACHED */
-#else
case 'b':
+ if (!have_daemon_mode)
+ no_daemon_mode:
+ bozoerr(&httpd, 1, "Daemon mode not enabled");
+
/*
* test suite support - undocumented
* background == 2 (aka, -b -b) means to
@@ -267,104 +252,104 @@ main(int argc, char **argv)
break;
case 'e':
+ if (!have_daemon_mode)
+ goto no_daemon_mode;
+
bozo_set_pref(&httpd, &prefs, "dirty environment",
"true");
break;
case 'f':
+ if (!have_daemon_mode)
+ goto no_daemon_mode;
+
bozo_set_pref(&httpd, &prefs, "foreground", "true");
break;
case 'i':
+ if (!have_daemon_mode)
+ goto no_daemon_mode;
+
bozo_set_pref(&httpd, &prefs, "bind address", optarg);
break;
case 'P':
+ if (!have_daemon_mode)
+ goto no_daemon_mode;
+
bozo_set_pref(&httpd, &prefs, "pid file", optarg);
break;
-#endif /* NO_DAEMON_MODE */
-#ifdef NO_CGIBIN_SUPPORT
- case 'c':
- case 'C':
- bozoerr(&httpd, 1, "CGI is not enabled");
- /* NOTREACHED */
-#else
case 'c':
+ if (!have_cgibin)
+ bozoerr(&httpd, 1, "CGI not enabled");
+
bozo_cgi_setbin(&httpd, optarg);
break;
case 'C':
-# ifdef NO_DYNAMIC_CONTENT
- bozoerr(&httpd, 1,
- "dynamic CGI handler support is not enabled");
- /* NOTREACHED */
-# else
+ if (!have_dynamic_content && !have_cgibin)
+ bozoerr(&httpd, 1,
+ "dynamic CGI handler support not enabled");
+
/* make sure there's two arguments */
if (argc - optind < 1)
usage(&httpd, progname);
bozo_add_content_map_cgi(&httpd, optarg,
argv[optind++]);
break;
-# endif /* NO_DYNAMIC_CONTENT */
-#endif /* NO_CGIBIN_SUPPORT */
case 'd':
+ if (!have_debug)
+ bozowarn(&httpd, "Debugging not enabled");
httpd.debug++;
-#ifdef NO_DEBUG
- if (httpd.debug == 1)
- bozowarn(&httpd, "Debugging is not enabled");
-#endif /* NO_DEBUG */
break;
case 't':
bozo_set_pref(&httpd, &prefs, "chroot dir", optarg);
break;
-#ifdef NO_USER_SUPPORT
- case 'p':
- case 'u':
- case 'E':
- bozoerr(&httpd, 1, "User support is not enabled");
- /* NOTREACHED */
-#else
case 'p':
+ if (!have_user)
+ no_user_support:
+ bozoerr(&httpd, 1, "User support not enabled");
+
bozo_set_pref(&httpd, &prefs, "public_html", optarg);
break;
case 'u':
+ if (!have_user)
+ goto no_user_support;
+
bozo_set_pref(&httpd, &prefs, "enable users", "true");
break;
-#ifndef NO_CGIBIN_SUPPORT
+
case 'E':
+ if (have_user &&
+ have_cgibin)
+ bozoerr(&httpd, 1, "CGI not enabled");
+
bozo_set_pref(&httpd, &prefs, "enable user cgibin",
"true");
break;
-#else
- case 'E':
- bozoerr(&httpd, 1, "CGI is not enabled");
- /* NOTREACHED */
-#endif /* NO_CGIBIN_SPPORT */
-#endif /* NO_USER_SUPPORT */
-#ifdef NO_DIRINDEX_SUPPORT
- case 'H':
- case 'X':
- bozoerr(&httpd, 1,
- "directory indexing is not enabled");
- /* NOTREACHED */
-#else
case 'H':
+ if (!have_dirindex)
+ no_dirindex_support:
+ bozoerr(&httpd, 1,
+ "directory indexing not enabled");
+
bozo_set_pref(&httpd, &prefs, "hide dots", "true");
break;
case 'X':
+ if (!have_dirindex)
+ goto no_dirindex_support;
+
bozo_set_pref(&httpd, &prefs, "directory indexing",
"true");
break;
-#endif /* NO_DIRINDEX_SUPPORT */
-
case 'G':
{
char version[128];
Index: src/libexec/httpd/dir-index-bozo.c
diff -u src/libexec/httpd/dir-index-bozo.c:1.27 src/libexec/httpd/dir-index-bozo.c:1.28
--- src/libexec/httpd/dir-index-bozo.c:1.27 Wed Nov 21 10:25:17 2018
+++ src/libexec/httpd/dir-index-bozo.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: dir-index-bozo.c,v 1.27 2018/11/21 10:25:17 mrg Exp $ */
+/* $NetBSD: dir-index-bozo.c,v 1.28 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: dir-index-bozo.c,v 1.20 2011/11/18 09:21:15 mrg Exp $ */
@@ -80,17 +80,16 @@ bozo_dir_index(bozo_httpreq_t *request,
file[strlen(file) - strlen(httpd->index_html)] = '\0';
dirpath = file;
}
- debug((httpd, DEBUG_FAT, "bozo_dir_index: dirpath ``%s''", dirpath));
+ debug((httpd, DEBUG_FAT, "bozo_dir_index: dirpath '%s'", dirpath));
if (stat(dirpath, &sb) < 0 ||
(dp = opendir(dirpath)) == NULL) {
if (errno == EPERM)
- (void)bozo_http_error(httpd, 403, request,
- "no permission to open directory");
+ bozo_http_error(httpd, 403, request,
+ "no permission to open directory");
else if (errno == ENOENT)
- (void)bozo_http_error(httpd, 404, request, "no file");
+ bozo_http_error(httpd, 404, request, "no file");
else
- (void)bozo_http_error(httpd, 500, request,
- "open directory");
+ bozo_http_error(httpd, 500, request, "open directory");
goto done;
/* NOTREACHED */
}
Index: src/libexec/httpd/ssl-bozo.c
diff -u src/libexec/httpd/ssl-bozo.c:1.24 src/libexec/httpd/ssl-bozo.c:1.25
--- src/libexec/httpd/ssl-bozo.c:1.24 Tue Nov 20 01:06:46 2018
+++ src/libexec/httpd/ssl-bozo.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ssl-bozo.c,v 1.24 2018/11/20 01:06:46 mrg Exp $ */
+/* $NetBSD: ssl-bozo.c,v 1.25 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: ssl-bozo.c,v 1.15 2011/11/18 09:21:15 mrg Exp $ */
@@ -323,6 +323,10 @@ bozo_ssl_set_ciphers(bozohttpd_t *httpd,
#endif /* NO_SSL_SUPPORT */
+/*
+ * These functions are always present, so that caller code can simply
+ * use bozo_*() for IO, regardless of SSL.
+ */
int
bozo_printf(bozohttpd_t *httpd, const char *fmt, ...)
{
Index: src/libexec/httpd/tilde-luzah-bozo.c
diff -u src/libexec/httpd/tilde-luzah-bozo.c:1.15 src/libexec/httpd/tilde-luzah-bozo.c:1.16
--- src/libexec/httpd/tilde-luzah-bozo.c:1.15 Tue Nov 20 01:06:46 2018
+++ src/libexec/httpd/tilde-luzah-bozo.c Thu Nov 22 08:54:08 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: tilde-luzah-bozo.c,v 1.15 2018/11/20 01:06:46 mrg Exp $ */
+/* $NetBSD: tilde-luzah-bozo.c,v 1.16 2018/11/22 08:54:08 mrg Exp $ */
/* $eterna: tilde-luzah-bozo.c,v 1.16 2011/11/18 09:21:15 mrg Exp $ */
@@ -53,7 +53,7 @@
* ala transform_request().
*
* transform_request() is supposed to check that we have user support
- * enabled.
+ * enabled. returns 0 if handled/error, 1 if continue.
*/
int
bozo_user_transform(bozo_httpreq_t *request)
@@ -90,7 +90,7 @@ bozo_user_transform(bozo_httpreq_t *requ
if (pw == NULL) {
free(request->hr_user);
request->hr_user = NULL;
- (void)bozo_http_error(httpd, 404, request, "no such user");
+ bozo_http_error(httpd, 404, request, "no such user");
return 0;
}
@@ -101,15 +101,14 @@ bozo_user_transform(bozo_httpreq_t *requ
if (chdir(pw->pw_dir) < 0) {
bozowarn(httpd, "chdir1 error: %s: %s", pw->pw_dir,
strerror(errno));
- (void)bozo_http_error(httpd, 404, request,
- "can't chdir to homedir");
+ bozo_http_error(httpd, 404, request, "can't chdir to homedir");
return 0;
}
if (chdir(httpd->public_html) < 0) {
bozowarn(httpd, "chdir2 error: %s: %s", httpd->public_html,
strerror(errno));
- (void)bozo_http_error(httpd, 404, request,
- "can't chdir to public_html");
+ bozo_http_error(httpd, 404, request,
+ "can't chdir to public_html");
return 0;
}
if (s == NULL || *s == '\0') {