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 */

Reply via email to