Module Name: src
Committed By: mrg
Date: Thu Jun 17 19:43:31 UTC 2010
Modified Files:
src/libexec/httpd: CHANGES bozohttpd.8 bozohttpd.c bozohttpd.h
cgi-bozo.c daemon-bozo.c tilde-luzah-bozo.c
Log Message:
merge bozohttpd 20100617.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/libexec/httpd/CHANGES \
src/libexec/httpd/tilde-luzah-bozo.c
cvs rdiff -u -r1.19 -r1.20 src/libexec/httpd/bozohttpd.8 \
src/libexec/httpd/bozohttpd.c
cvs rdiff -u -r1.13 -r1.14 src/libexec/httpd/bozohttpd.h
cvs rdiff -u -r1.16 -r1.17 src/libexec/httpd/cgi-bozo.c
cvs rdiff -u -r1.9 -r1.10 src/libexec/httpd/daemon-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/CHANGES
diff -u src/libexec/httpd/CHANGES:1.7 src/libexec/httpd/CHANGES:1.8
--- src/libexec/httpd/CHANGES:1.7 Sat May 15 06:48:27 2010
+++ src/libexec/httpd/CHANGES Thu Jun 17 19:43:30 2010
@@ -1,8 +1,13 @@
-$eterna: CHANGES,v 1.71 2010/05/13 04:19:04 mrg Exp $
+$eterna: CHANGES,v 1.75 2010/06/17 19:26:54 mrg Exp $
changes since bozohttpd 20100509:
o fix some compile issues
- o fix SSL mode. from rtr.
+ o fix SSL mode. from rtr
+ o fix some cgi-bin issues, as seen with cvsweb
+ o disable multi-file daemon mode for now, it breaks
+ o return 404's instead of 403's when chdir of ~user dirs fail
+ o remove "noreturn" attribute from bozo_http_error() that was
+ causing incorrect runtime behaviour
changes since bozohttpd 20090522:
o major rework and clean up of internal interfaces. move the main
Index: src/libexec/httpd/tilde-luzah-bozo.c
diff -u src/libexec/httpd/tilde-luzah-bozo.c:1.7 src/libexec/httpd/tilde-luzah-bozo.c:1.8
--- src/libexec/httpd/tilde-luzah-bozo.c:1.7 Mon May 10 14:44:19 2010
+++ src/libexec/httpd/tilde-luzah-bozo.c Thu Jun 17 19:43:30 2010
@@ -1,6 +1,6 @@
-/* $NetBSD: tilde-luzah-bozo.c,v 1.7 2010/05/10 14:44:19 mrg Exp $ */
+/* $NetBSD: tilde-luzah-bozo.c,v 1.8 2010/06/17 19:43:30 mrg Exp $ */
-/* $eterna: tilde-luzah-bozo.c,v 1.14 2010/05/10 14:36:37 mrg Exp $ */
+/* $eterna: tilde-luzah-bozo.c,v 1.15 2010/06/15 21:43:40 mrg Exp $ */
/*
* Copyright (c) 1997-2010 Matthew R. Green
@@ -80,20 +80,21 @@
return 0;
}
- debug((httpd, DEBUG_OBESE, "user %s home dir %s uid %d gid %d",
- pw->pw_name, pw->pw_dir, pw->pw_uid, pw->pw_gid));
+ debug((httpd, DEBUG_OBESE, "user %s dir %s/%s uid %d gid %d",
+ pw->pw_name, pw->pw_dir, httpd->public_html,
+ pw->pw_uid, pw->pw_gid));
if (chdir(pw->pw_dir) < 0) {
bozo_warn(httpd, "chdir1 error: %s: %s", pw->pw_dir,
strerror(errno));
- (void)bozo_http_error(httpd, 403, request,
+ (void)bozo_http_error(httpd, 404, request,
"can't chdir to homedir");
return 0;
}
if (chdir(httpd->public_html) < 0) {
bozo_warn(httpd, "chdir2 error: %s: %s", httpd->public_html,
strerror(errno));
- (void)bozo_http_error(httpd, 403, request,
+ (void)bozo_http_error(httpd, 404, request,
"can't chdir to public_html");
return 0;
}
Index: src/libexec/httpd/bozohttpd.8
diff -u src/libexec/httpd/bozohttpd.8:1.19 src/libexec/httpd/bozohttpd.8:1.20
--- src/libexec/httpd/bozohttpd.8:1.19 Sat May 15 06:48:27 2010
+++ src/libexec/httpd/bozohttpd.8 Thu Jun 17 19:43:30 2010
@@ -1,6 +1,6 @@
-.\" $NetBSD: bozohttpd.8,v 1.19 2010/05/15 06:48:27 mrg Exp $
+.\" $NetBSD: bozohttpd.8,v 1.20 2010/06/17 19:43:30 mrg Exp $
.\"
-.\" $eterna: bozohttpd.8,v 1.95 2010/05/13 04:17:58 mrg Exp $
+.\" $eterna: bozohttpd.8,v 1.96 2010/06/17 19:27:32 mrg Exp $
.\"
.\" Copyright (c) 1997-2010 Matthew R. Green
.\" All rights reserved.
@@ -26,8 +26,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd May 22, 2009
-.Dd May 10, 2010
+.Dd June 17, 2010
.Dt HTTPD 8
.Os
.Sh NAME
@@ -459,7 +458,7 @@
and regular code audits.
This manual documents
.Nm
-version 20100512.
+version 20100617.
.Sh AUTHORS
.Nm
was written by Matthew R. Green
Index: src/libexec/httpd/bozohttpd.c
diff -u src/libexec/httpd/bozohttpd.c:1.19 src/libexec/httpd/bozohttpd.c:1.20
--- src/libexec/httpd/bozohttpd.c:1.19 Sat May 15 06:48:27 2010
+++ src/libexec/httpd/bozohttpd.c Thu Jun 17 19:43:30 2010
@@ -1,6 +1,6 @@
-/* $NetBSD: bozohttpd.c,v 1.19 2010/05/15 06:48:27 mrg Exp $ */
+/* $NetBSD: bozohttpd.c,v 1.20 2010/06/17 19:43:30 mrg Exp $ */
-/* $eterna: bozohttpd.c,v 1.169 2010/05/13 04:17:58 mrg Exp $ */
+/* $eterna: bozohttpd.c,v 1.172 2010/06/17 19:27:32 mrg Exp $ */
/*
* Copyright (c) 1997-2010 Matthew R. Green
@@ -109,7 +109,7 @@
#define INDEX_HTML "index.html"
#endif
#ifndef SERVER_SOFTWARE
-#define SERVER_SOFTWARE "bozohttpd/20100512"
+#define SERVER_SOFTWARE "bozohttpd/20100617"
#endif
#ifndef DIRECT_ACCESS_FILE
#define DIRECT_ACCESS_FILE ".bzdirect"
@@ -339,6 +339,7 @@
MF(hr_remoteaddr);
MF(hr_serverport);
MF(hr_file);
+ MF(hr_oldfile);
MF(hr_query);
#undef MF
bozo_auth_cleanup(request);
@@ -521,10 +522,14 @@
bozo_httpreq_t *request;
/*
- * if we're in daemon mode, bozo_daemon_fork() will return here once
- * for each child, then we can setup SSL.
+ * if we're in daemon mode, bozo_daemon_fork() will return here twice
+ * for each call. once in the child, returning 0, and once in the
+ * parent, returning 1. for each child, then we can setup SSL, and
+ * the parent can signal the caller there was no request to process
+ * and it will wait for another.
*/
- bozo_daemon_fork(httpd);
+ if (bozo_daemon_fork(httpd))
+ return NULL;
bozo_ssl_accept(httpd);
request = bozomalloc(httpd, sizeof(*request));
@@ -536,6 +541,7 @@
request->hr_last_byte_pos = -1;
request->hr_if_modified_since = NULL;
request->hr_file = NULL;
+ request->hr_oldfile = NULL;
slen = sizeof(ss);
if (getpeername(0, (struct sockaddr *)(void *)&ss, &slen) < 0)
@@ -1310,7 +1316,7 @@
goto bad_done;
if (strlen(newfile)) {
- free(request->hr_file);
+ request->hr_oldfile = request->hr_file;
request->hr_file = newfile;
}
@@ -2004,6 +2010,9 @@
strcmp(cp, "true") == 0) {
httpd->dir_indexing = 1;
}
+ if ((cp = bozo_get_pref(prefs, "public_html")) != NULL) {
+ httpd->public_html = strdup(cp);
+ }
httpd->server_software =
strdup(bozo_get_pref(prefs, "server software"));
httpd->index_html = strdup(bozo_get_pref(prefs, "index.html"));
Index: src/libexec/httpd/bozohttpd.h
diff -u src/libexec/httpd/bozohttpd.h:1.13 src/libexec/httpd/bozohttpd.h:1.14
--- src/libexec/httpd/bozohttpd.h:1.13 Mon May 10 14:44:19 2010
+++ src/libexec/httpd/bozohttpd.h Thu Jun 17 19:43:30 2010
@@ -1,6 +1,6 @@
-/* $NetBSD: bozohttpd.h,v 1.13 2010/05/10 14:44:19 mrg Exp $ */
+/* $NetBSD: bozohttpd.h,v 1.14 2010/06/17 19:43:30 mrg Exp $ */
-/* $eterna: bozohttpd.h,v 1.31 2010/05/10 14:36:37 mrg Exp $ */
+/* $eterna: bozohttpd.h,v 1.35 2010/06/17 00:49:30 mrg Exp $ */
/*
* Copyright (c) 1997-2010 Matthew R. Green
@@ -118,6 +118,7 @@
#define HTTP_CONNECT 0x08 /* not supported */
const char *hr_methodstr;
char *hr_file;
+ char *hr_oldfile; /* if we added an index_html */
char *hr_query;
const char *hr_proto;
const char *hr_content_type;
@@ -175,8 +176,7 @@
void bozo_err(bozohttpd_t *, int, const char *, ...)
__attribute__((__format__(__printf__, 3, 4)))
__attribute__((__noreturn__));
-int bozo_http_error(bozohttpd_t *, int, bozo_httpreq_t *, const char *)
- __attribute__((__noreturn__));
+int bozo_http_error(bozohttpd_t *, int, bozo_httpreq_t *, const char *);
int bozo_check_special_files(bozo_httpreq_t *, const char *);
char *bozo_http_date(char *, size_t);
@@ -196,59 +196,59 @@
#define bozo_ssl_accept(x) /* nothing */
#define bozo_ssl_destroy(x) /* nothing */
#else
-extern void bozo_ssl_set_opts(bozohttpd_t *, const char *, const char *);
-extern void bozo_ssl_init(bozohttpd_t *);
-extern void bozo_ssl_accept(bozohttpd_t *);
-extern void bozo_ssl_destroy(bozohttpd_t *);
+void bozo_ssl_set_opts(bozohttpd_t *, const char *, const char *);
+void bozo_ssl_init(bozohttpd_t *);
+void bozo_ssl_accept(bozohttpd_t *);
+void bozo_ssl_destroy(bozohttpd_t *);
#endif
/* auth-bozo.c */
#ifdef DO_HTPASSWD
-extern int bozo_auth_check(bozo_httpreq_t *, const char *);
-extern void bozo_auth_cleanup(bozo_httpreq_t *);
-extern int bozo_auth_check_headers(bozo_httpreq_t *, char *, char *, ssize_t);
-extern int bozo_auth_check_special_files(bozo_httpreq_t *, const char *);
-extern void bozo_auth_check_401(bozo_httpreq_t *, int);
-extern void bozo_auth_cgi_setenv(bozo_httpreq_t *, char ***);
-extern int bozo_auth_cgi_count(bozo_httpreq_t *);
+int bozo_auth_check(bozo_httpreq_t *, const char *);
+void bozo_auth_cleanup(bozo_httpreq_t *);
+int bozo_auth_check_headers(bozo_httpreq_t *, char *, char *, ssize_t);
+int bozo_auth_check_special_files(bozo_httpreq_t *, const char *);
+void bozo_auth_check_401(bozo_httpreq_t *, int);
+void bozo_auth_cgi_setenv(bozo_httpreq_t *, char ***);
+int bozo_auth_cgi_count(bozo_httpreq_t *);
#else
-#define bozo_auth_check(x, y) 0
-#define bozo_auth_cleanup(x) /* nothing */
-#define bozo_auth_check_headers(y, z, a, b) 0
-#define bozo_auth_check_special_files(x, y) 0
-#define bozo_auth_check_401(x, y) /* nothing */
-#define bozo_auth_cgi_setenv(x, y) /* nothing */
-#define bozo_auth_cgi_count(x) 0
+#define bozo_auth_check(x, y) 0
+#define bozo_auth_cleanup(x) /* nothing */
+#define bozo_auth_check_headers(y, z, a, b) 0
+#define bozo_auth_check_special_files(x, y) 0
+#define bozo_auth_check_401(x, y) /* nothing */
+#define bozo_auth_cgi_setenv(x, y) /* nothing */
+#define bozo_auth_cgi_count(x) 0
#endif /* DO_HTPASSWD */
/* cgi-bozo.c */
#ifdef NO_CGIBIN_SUPPORT
-#define bozo_process_cgi(h, r) 0
+#define bozo_process_cgi(h) 0
#else
-extern void bozo_cgi_setbin(bozohttpd_t *, const char *);
-extern void bozo_setenv(bozohttpd_t *, const char *, const char *, char **);
-extern int bozo_process_cgi(bozo_httpreq_t *);
-extern void bozo_add_content_map_cgi(bozohttpd_t *, const char *, const char *);
+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 *);
#endif /* NO_CGIBIN_SUPPORT */
/* daemon-bozo.c */
#ifdef NO_DAEMON_MODE
#define bozo_daemon_init(x) /* nothing */
-#define bozo_daemon_fork(x) /* nothing */
-#define bozo_daemon_closefds() /* nothing */
+#define bozo_daemon_fork(x) 0
+#define bozo_daemon_closefds() /* nothing */
#else
-extern void bozo_daemon_init(bozohttpd_t *);
-extern void bozo_daemon_fork(bozohttpd_t *);
-extern void bozo_daemon_closefds(bozohttpd_t *);
+void bozo_daemon_init(bozohttpd_t *);
+int bozo_daemon_fork(bozohttpd_t *);
+void bozo_daemon_closefds(bozohttpd_t *);
#endif /* NO_DAEMON_MODE */
/* tilde-luzah-bozo.c */
#ifdef NO_USER_SUPPORT
-#define bozo_user_transform(a, b, c) 0
+#define bozo_user_transform(a, c) 0
#else
int bozo_user_transform(bozo_httpreq_t *, int *);
#endif /* NO_USER_SUPPORT */
@@ -263,10 +263,10 @@
/* content-bozo.c */
-extern const char *bozo_content_type(bozo_httpreq_t *, const char *);
-extern const char *bozo_content_encoding(bozo_httpreq_t *, const char *);
-extern bozo_content_map_t *bozo_match_content_map(bozohttpd_t *, const char *, int);
-extern bozo_content_map_t *bozo_get_content_map(bozohttpd_t *, const char *);
+const char *bozo_content_type(bozo_httpreq_t *, const char *);
+const char *bozo_content_encoding(bozo_httpreq_t *, const char *);
+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 *);
#ifndef NO_DYNAMIC_CONTENT
void bozo_add_content_map_mime(bozohttpd_t *, const char *, const char *, const char *, const char *);
#endif
Index: src/libexec/httpd/cgi-bozo.c
diff -u src/libexec/httpd/cgi-bozo.c:1.16 src/libexec/httpd/cgi-bozo.c:1.17
--- src/libexec/httpd/cgi-bozo.c:1.16 Mon May 10 14:44:19 2010
+++ src/libexec/httpd/cgi-bozo.c Thu Jun 17 19:43:30 2010
@@ -1,6 +1,6 @@
-/* $NetBSD: cgi-bozo.c,v 1.16 2010/05/10 14:44:19 mrg Exp $ */
+/* $NetBSD: cgi-bozo.c,v 1.17 2010/06/17 19:43:30 mrg Exp $ */
-/* $eterna: cgi-bozo.c,v 1.36 2010/05/10 14:36:37 mrg Exp $ */
+/* $eterna: cgi-bozo.c,v 1.37 2010/06/09 07:54:16 mrg Exp $ */
/*
* Copyright (c) 1997-2010 Matthew R. Green
@@ -249,6 +249,7 @@
const char *type, *clen, *info, *cgihandler;
char *query, *s, *t, *path, *env, *command, *file, *url;
char **envp, **curenvp, *argv[4];
+ char *uri;
size_t len;
ssize_t rbytes;
pid_t pid;
@@ -258,9 +259,14 @@
if (!httpd->cgibin && !httpd->process_cgi)
return 0;
- asprintf(&file, "/%s", request->hr_file);
+ uri = request->hr_oldfile ? request->hr_oldfile : request->hr_file;
+ if (uri[0] == '/')
+ file = bozostrdup(httpd, uri);
+ else
+ asprintf(&file, "/%s", uri);
if (file == NULL)
return 0;
+
if (request->hr_query && strlen(request->hr_query))
query = bozostrdup(httpd, request->hr_query);
else
@@ -382,7 +388,7 @@
bozo_setenv(httpd, "SCRIPT_FILENAME", file + 1, curenvp++);
bozo_setenv(httpd, "SERVER_SOFTWARE", httpd->server_software,
curenvp++);
- bozo_setenv(httpd, "REQUEST_URI", request->hr_file, curenvp++);
+ bozo_setenv(httpd, "REQUEST_URI", uri, curenvp++);
bozo_setenv(httpd, "DATE_GMT", bozo_http_date(date, sizeof(date)),
curenvp++);
if (query && *query)
Index: src/libexec/httpd/daemon-bozo.c
diff -u src/libexec/httpd/daemon-bozo.c:1.9 src/libexec/httpd/daemon-bozo.c:1.10
--- src/libexec/httpd/daemon-bozo.c:1.9 Mon May 10 14:44:19 2010
+++ src/libexec/httpd/daemon-bozo.c Thu Jun 17 19:43:30 2010
@@ -1,6 +1,6 @@
-/* $NetBSD: daemon-bozo.c,v 1.9 2010/05/10 14:44:19 mrg Exp $ */
+/* $NetBSD: daemon-bozo.c,v 1.10 2010/06/17 19:43:30 mrg Exp $ */
-/* $eterna: daemon-bozo.c,v 1.20 2010/05/10 04:39:00 mrg Exp $ */
+/* $eterna: daemon-bozo.c,v 1.21 2010/06/07 21:48:51 mrg Exp $ */
/*
* Copyright (c) 1997-2010 Matthew R. Green
@@ -176,7 +176,7 @@
* the parent never returns from this function, only children that
* are ready to run... XXXMRG - still true in fork-lesser bozo?
*/
-void
+int
bozo_daemon_fork(bozohttpd_t *httpd)
{
int i;
@@ -241,10 +241,16 @@
continue;
}
+#if 0
+ /*
+ * This code doesn't work. It interacts very poorly
+ * with ~user translation and needs to be fixed.
+ */
if (httpd->request_times > 0) {
daemon_runchild(httpd, fd);
- return;
+ return 0;
}
+#endif
switch (fork()) {
case -1: /* eep, failure */
@@ -256,7 +262,7 @@
case 0: /* child */
daemon_runchild(httpd, fd);
- return;
+ return 0;
default: /* parent */
close(fd);
@@ -264,6 +270,7 @@
}
}
}
+ return 0;
}
#endif /* NO_DAEMON_MODE */