xref: /minix3/libexec/httpd/main.c (revision 340f5e56603e4275faeb89a9aacace41ba22d661)
1*340f5e56SDavid van Moolenbroek /*	$NetBSD: main.c,v 1.8 2014/07/16 07:41:43 mrg Exp $	*/
2*340f5e56SDavid van Moolenbroek 
3*340f5e56SDavid van Moolenbroek /*	$eterna: main.c,v 1.6 2011/11/18 09:21:15 mrg Exp $	*/
4*340f5e56SDavid van Moolenbroek /* from: eterna: bozohttpd.c,v 1.159 2009/05/23 02:14:30 mrg Exp 	*/
5*340f5e56SDavid van Moolenbroek 
6*340f5e56SDavid van Moolenbroek /*
7*340f5e56SDavid van Moolenbroek  * Copyright (c) 1997-2014 Matthew R. Green
8*340f5e56SDavid van Moolenbroek  * All rights reserved.
9*340f5e56SDavid van Moolenbroek  *
10*340f5e56SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
11*340f5e56SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
12*340f5e56SDavid van Moolenbroek  * are met:
13*340f5e56SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
14*340f5e56SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
15*340f5e56SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
16*340f5e56SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer and
17*340f5e56SDavid van Moolenbroek  *    dedication in the documentation and/or other materials provided
18*340f5e56SDavid van Moolenbroek  *    with the distribution.
19*340f5e56SDavid van Moolenbroek  *
20*340f5e56SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*340f5e56SDavid van Moolenbroek  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*340f5e56SDavid van Moolenbroek  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*340f5e56SDavid van Moolenbroek  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*340f5e56SDavid van Moolenbroek  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25*340f5e56SDavid van Moolenbroek  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26*340f5e56SDavid van Moolenbroek  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27*340f5e56SDavid van Moolenbroek  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28*340f5e56SDavid van Moolenbroek  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29*340f5e56SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30*340f5e56SDavid van Moolenbroek  * SUCH DAMAGE.
31*340f5e56SDavid van Moolenbroek  *
32*340f5e56SDavid van Moolenbroek  */
33*340f5e56SDavid van Moolenbroek 
34*340f5e56SDavid van Moolenbroek /* this program is dedicated to the Great God of Processed Cheese */
35*340f5e56SDavid van Moolenbroek 
36*340f5e56SDavid van Moolenbroek /*
37*340f5e56SDavid van Moolenbroek  * main.c:  C front end to bozohttpd
38*340f5e56SDavid van Moolenbroek  */
39*340f5e56SDavid van Moolenbroek 
40*340f5e56SDavid van Moolenbroek #include <sys/types.h>
41*340f5e56SDavid van Moolenbroek #include <sys/param.h>
42*340f5e56SDavid van Moolenbroek 
43*340f5e56SDavid van Moolenbroek #include <errno.h>
44*340f5e56SDavid van Moolenbroek #include <stdlib.h>
45*340f5e56SDavid van Moolenbroek #include <string.h>
46*340f5e56SDavid van Moolenbroek #include <syslog.h>
47*340f5e56SDavid van Moolenbroek #include <time.h>
48*340f5e56SDavid van Moolenbroek #include <unistd.h>
49*340f5e56SDavid van Moolenbroek 
50*340f5e56SDavid van Moolenbroek #include "bozohttpd.h"
51*340f5e56SDavid van Moolenbroek 
52*340f5e56SDavid van Moolenbroek /* variables and functions */
53*340f5e56SDavid van Moolenbroek #ifndef LOG_FTP
54*340f5e56SDavid van Moolenbroek #define LOG_FTP LOG_DAEMON
55*340f5e56SDavid van Moolenbroek #endif
56*340f5e56SDavid van Moolenbroek 
57*340f5e56SDavid van Moolenbroek /* print a usage message, and then exit */
58*340f5e56SDavid van Moolenbroek BOZO_DEAD static void
usage(bozohttpd_t * httpd,char * progname)59*340f5e56SDavid van Moolenbroek usage(bozohttpd_t *httpd, char *progname)
60*340f5e56SDavid van Moolenbroek {
61*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "usage: %s [options] slashdir [virtualhostname]",
62*340f5e56SDavid van Moolenbroek 			progname);
63*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "options:");
64*340f5e56SDavid van Moolenbroek #ifndef NO_DEBUG
65*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -d\t\t\tenable debug support");
66*340f5e56SDavid van Moolenbroek #endif
67*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -s\t\t\talways log to stderr");
68*340f5e56SDavid van Moolenbroek #ifndef NO_USER_SUPPORT
69*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -u\t\t\tenable ~user/public_html support");
70*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -p dir\t\tchange `public_html' directory name]");
71*340f5e56SDavid van Moolenbroek #endif
72*340f5e56SDavid van Moolenbroek #ifndef NO_DYNAMIC_CONTENT
73*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -M arg t c c11\tadd this mime extenstion");
74*340f5e56SDavid van Moolenbroek #endif
75*340f5e56SDavid van Moolenbroek #ifndef NO_CGIBIN_SUPPORT
76*340f5e56SDavid van Moolenbroek #ifndef NO_DYNAMIC_CONTENT
77*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -C arg prog\t\tadd this CGI handler");
78*340f5e56SDavid van Moolenbroek #endif
79*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
80*340f5e56SDavid van Moolenbroek 		"   -c cgibin\t\tenable cgi-bin support in this directory");
81*340f5e56SDavid van Moolenbroek #endif
82*340f5e56SDavid van Moolenbroek #ifndef NO_LUA_SUPPORT
83*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -L arg script\tadd this Lua script");
84*340f5e56SDavid van Moolenbroek #endif
85*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -I port\t\tbind or use on this port");
86*340f5e56SDavid van Moolenbroek #ifndef NO_DAEMON_MODE
87*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -b\t\t\tbackground and go into daemon mode");
88*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -f\t\t\tkeep daemon mode in the foreground");
89*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
90*340f5e56SDavid van Moolenbroek 		"   -i address\t\tbind on this address (daemon mode only)");
91*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -P pidfile\t\tpath to the pid file to create");
92*340f5e56SDavid van Moolenbroek #endif
93*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -S version\t\tset server version string");
94*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -t dir\t\tchroot to `dir'");
95*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd, "   -U username\t\tchange user to `user'");
96*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
97*340f5e56SDavid van Moolenbroek 		"   -e\t\t\tdon't clean the environment (-t and -U only)");
98*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
99*340f5e56SDavid van Moolenbroek 		"   -v virtualroot\tenable virtual host support "
100*340f5e56SDavid van Moolenbroek 		"in this directory");
101*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
102*340f5e56SDavid van Moolenbroek 		"   -r\t\t\tmake sure sub-pages come from "
103*340f5e56SDavid van Moolenbroek 		"this host via referrer");
104*340f5e56SDavid van Moolenbroek #ifndef NO_DIRINDEX_SUPPORT
105*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
106*340f5e56SDavid van Moolenbroek 		"   -X\t\t\tenable automatic directory index support");
107*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
108*340f5e56SDavid van Moolenbroek 		"   -H\t\t\thide files starting with a period (.)"
109*340f5e56SDavid van Moolenbroek 		" in index mode");
110*340f5e56SDavid van Moolenbroek #endif
111*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
112*340f5e56SDavid van Moolenbroek 		"   -x index\t\tchange default `index.html' file name");
113*340f5e56SDavid van Moolenbroek #ifndef NO_SSL_SUPPORT
114*340f5e56SDavid van Moolenbroek 	bozo_warn(httpd,
115*340f5e56SDavid van Moolenbroek 		"   -Z cert privkey\tspecify path to server certificate"
116*340f5e56SDavid van Moolenbroek 			" and private key file\n"
117*340f5e56SDavid van Moolenbroek 		"\t\t\tin pem format and enable bozohttpd in SSL mode");
118*340f5e56SDavid van Moolenbroek #endif /* NO_SSL_SUPPORT */
119*340f5e56SDavid van Moolenbroek 	bozo_err(httpd, 1, "%s failed to start", progname);
120*340f5e56SDavid van Moolenbroek }
121*340f5e56SDavid van Moolenbroek 
122*340f5e56SDavid van Moolenbroek int
main(int argc,char ** argv)123*340f5e56SDavid van Moolenbroek main(int argc, char **argv)
124*340f5e56SDavid van Moolenbroek {
125*340f5e56SDavid van Moolenbroek 	bozo_httpreq_t	*request;
126*340f5e56SDavid van Moolenbroek 	bozohttpd_t	 httpd;
127*340f5e56SDavid van Moolenbroek 	bozoprefs_t	 prefs;
128*340f5e56SDavid van Moolenbroek 	char		*progname;
129*340f5e56SDavid van Moolenbroek 	int		 c;
130*340f5e56SDavid van Moolenbroek 
131*340f5e56SDavid van Moolenbroek 	(void) memset(&httpd, 0x0, sizeof(httpd));
132*340f5e56SDavid van Moolenbroek 	(void) memset(&prefs, 0x0, sizeof(prefs));
133*340f5e56SDavid van Moolenbroek 
134*340f5e56SDavid van Moolenbroek 	if ((progname = strrchr(argv[0], '/')) == NULL)
135*340f5e56SDavid van Moolenbroek 		progname = argv[0];
136*340f5e56SDavid van Moolenbroek 	else
137*340f5e56SDavid van Moolenbroek 		progname++;
138*340f5e56SDavid van Moolenbroek 
139*340f5e56SDavid van Moolenbroek 	openlog(progname, LOG_PID|LOG_NDELAY, LOG_FTP);
140*340f5e56SDavid van Moolenbroek 
141*340f5e56SDavid van Moolenbroek 	bozo_set_defaults(&httpd, &prefs);
142*340f5e56SDavid van Moolenbroek 
143*340f5e56SDavid van Moolenbroek 	while ((c = getopt(argc, argv,
144*340f5e56SDavid van Moolenbroek 	    "C:HI:L:M:P:S:U:VXZ:bc:defhi:np:rst:uv:x:z:")) != -1) {
145*340f5e56SDavid van Moolenbroek 		switch(c) {
146*340f5e56SDavid van Moolenbroek 
147*340f5e56SDavid van Moolenbroek 		case 'L':
148*340f5e56SDavid van Moolenbroek #ifdef NO_LUA_SUPPORT
149*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1,
150*340f5e56SDavid van Moolenbroek 				"Lua support is not enabled");
151*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
152*340f5e56SDavid van Moolenbroek #else
153*340f5e56SDavid van Moolenbroek 			/* make sure there's two argument */
154*340f5e56SDavid van Moolenbroek 			if (argc - optind < 1)
155*340f5e56SDavid van Moolenbroek 				usage(&httpd, progname);
156*340f5e56SDavid van Moolenbroek 			bozo_add_lua_map(&httpd, optarg, argv[optind]);
157*340f5e56SDavid van Moolenbroek 			optind++;
158*340f5e56SDavid van Moolenbroek 			break;
159*340f5e56SDavid van Moolenbroek #endif /* NO_LUA_SUPPORT */
160*340f5e56SDavid van Moolenbroek 		case 'M':
161*340f5e56SDavid van Moolenbroek #ifdef NO_DYNAMIC_CONTENT
162*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1,
163*340f5e56SDavid van Moolenbroek 				"dynamic mime content support is not enabled");
164*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
165*340f5e56SDavid van Moolenbroek #else
166*340f5e56SDavid van Moolenbroek 			/* make sure there's four arguments */
167*340f5e56SDavid van Moolenbroek 			if (argc - optind < 3)
168*340f5e56SDavid van Moolenbroek 				usage(&httpd, progname);
169*340f5e56SDavid van Moolenbroek 			bozo_add_content_map_mime(&httpd, optarg, argv[optind],
170*340f5e56SDavid van Moolenbroek 			    argv[optind+1], argv[optind+2]);
171*340f5e56SDavid van Moolenbroek 			optind += 3;
172*340f5e56SDavid van Moolenbroek 			break;
173*340f5e56SDavid van Moolenbroek #endif /* NO_DYNAMIC_CONTENT */
174*340f5e56SDavid van Moolenbroek 
175*340f5e56SDavid van Moolenbroek 		case 'n':
176*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "numeric", "true");
177*340f5e56SDavid van Moolenbroek 			break;
178*340f5e56SDavid van Moolenbroek 
179*340f5e56SDavid van Moolenbroek 		case 'r':
180*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "trusted referal", "true");
181*340f5e56SDavid van Moolenbroek 			break;
182*340f5e56SDavid van Moolenbroek 
183*340f5e56SDavid van Moolenbroek 		case 's':
184*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "log to stderr", "true");
185*340f5e56SDavid van Moolenbroek 			break;
186*340f5e56SDavid van Moolenbroek 
187*340f5e56SDavid van Moolenbroek 		case 'S':
188*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "server software", optarg);
189*340f5e56SDavid van Moolenbroek 			break;
190*340f5e56SDavid van Moolenbroek 		case 'Z':
191*340f5e56SDavid van Moolenbroek #ifdef NO_SSL_SUPPORT
192*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1, "ssl support is not enabled");
193*340f5e56SDavid van Moolenbroek 			/* NOT REACHED */
194*340f5e56SDavid van Moolenbroek #else
195*340f5e56SDavid van Moolenbroek 			/* make sure there's two arguments */
196*340f5e56SDavid van Moolenbroek 			if (argc - optind < 1)
197*340f5e56SDavid van Moolenbroek 				usage(&httpd, progname);
198*340f5e56SDavid van Moolenbroek 			bozo_ssl_set_opts(&httpd, optarg, argv[optind++]);
199*340f5e56SDavid van Moolenbroek 			break;
200*340f5e56SDavid van Moolenbroek #endif /* NO_SSL_SUPPORT */
201*340f5e56SDavid van Moolenbroek 		case 'U':
202*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "username", optarg);
203*340f5e56SDavid van Moolenbroek 			break;
204*340f5e56SDavid van Moolenbroek 
205*340f5e56SDavid van Moolenbroek 		case 'V':
206*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "unknown slash", "true");
207*340f5e56SDavid van Moolenbroek 			break;
208*340f5e56SDavid van Moolenbroek 
209*340f5e56SDavid van Moolenbroek 		case 'v':
210*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "virtual base", optarg);
211*340f5e56SDavid van Moolenbroek 			break;
212*340f5e56SDavid van Moolenbroek 
213*340f5e56SDavid van Moolenbroek 		case 'x':
214*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "index.html", optarg);
215*340f5e56SDavid van Moolenbroek 			break;
216*340f5e56SDavid van Moolenbroek 
217*340f5e56SDavid van Moolenbroek 		case 'I':
218*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "port number", optarg);
219*340f5e56SDavid van Moolenbroek 			break;
220*340f5e56SDavid van Moolenbroek 
221*340f5e56SDavid van Moolenbroek #ifdef NO_DAEMON_MODE
222*340f5e56SDavid van Moolenbroek 		case 'b':
223*340f5e56SDavid van Moolenbroek 		case 'e':
224*340f5e56SDavid van Moolenbroek 		case 'f':
225*340f5e56SDavid van Moolenbroek 		case 'i':
226*340f5e56SDavid van Moolenbroek 		case 'P':
227*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1, "Daemon mode is not enabled");
228*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
229*340f5e56SDavid van Moolenbroek #else
230*340f5e56SDavid van Moolenbroek 		case 'b':
231*340f5e56SDavid van Moolenbroek 			/*
232*340f5e56SDavid van Moolenbroek 			 * test suite support - undocumented
233*340f5e56SDavid van Moolenbroek 			 * background == 2 (aka, -b -b) means to
234*340f5e56SDavid van Moolenbroek 			 * only process 1 per kid
235*340f5e56SDavid van Moolenbroek 			 */
236*340f5e56SDavid van Moolenbroek 			if (bozo_get_pref(&prefs, "background") == NULL) {
237*340f5e56SDavid van Moolenbroek 				bozo_set_pref(&prefs, "background", "1");
238*340f5e56SDavid van Moolenbroek 			} else {
239*340f5e56SDavid van Moolenbroek 				bozo_set_pref(&prefs, "background", "2");
240*340f5e56SDavid van Moolenbroek 			}
241*340f5e56SDavid van Moolenbroek 			break;
242*340f5e56SDavid van Moolenbroek 
243*340f5e56SDavid van Moolenbroek 		case 'e':
244*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "dirty environment", "true");
245*340f5e56SDavid van Moolenbroek 			break;
246*340f5e56SDavid van Moolenbroek 
247*340f5e56SDavid van Moolenbroek 		case 'f':
248*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "foreground", "true");
249*340f5e56SDavid van Moolenbroek 			break;
250*340f5e56SDavid van Moolenbroek 
251*340f5e56SDavid van Moolenbroek 		case 'i':
252*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "bind address", optarg);
253*340f5e56SDavid van Moolenbroek 			break;
254*340f5e56SDavid van Moolenbroek 
255*340f5e56SDavid van Moolenbroek 		case 'P':
256*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "pid file", optarg);
257*340f5e56SDavid van Moolenbroek 			break;
258*340f5e56SDavid van Moolenbroek #endif /* NO_DAEMON_MODE */
259*340f5e56SDavid van Moolenbroek 
260*340f5e56SDavid van Moolenbroek #ifdef NO_CGIBIN_SUPPORT
261*340f5e56SDavid van Moolenbroek 		case 'c':
262*340f5e56SDavid van Moolenbroek 		case 'C':
263*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1, "CGI is not enabled");
264*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
265*340f5e56SDavid van Moolenbroek #else
266*340f5e56SDavid van Moolenbroek 		case 'c':
267*340f5e56SDavid van Moolenbroek 			bozo_cgi_setbin(&httpd, optarg);
268*340f5e56SDavid van Moolenbroek 			break;
269*340f5e56SDavid van Moolenbroek 
270*340f5e56SDavid van Moolenbroek 		case 'C':
271*340f5e56SDavid van Moolenbroek #  ifdef NO_DYNAMIC_CONTENT
272*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1,
273*340f5e56SDavid van Moolenbroek 				"dynamic CGI handler support is not enabled");
274*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
275*340f5e56SDavid van Moolenbroek #  else
276*340f5e56SDavid van Moolenbroek 			/* make sure there's two arguments */
277*340f5e56SDavid van Moolenbroek 			if (argc - optind < 1)
278*340f5e56SDavid van Moolenbroek 				usage(&httpd, progname);
279*340f5e56SDavid van Moolenbroek 			bozo_add_content_map_cgi(&httpd, optarg,
280*340f5e56SDavid van Moolenbroek 					argv[optind++]);
281*340f5e56SDavid van Moolenbroek 			break;
282*340f5e56SDavid van Moolenbroek #  endif /* NO_DYNAMIC_CONTENT */
283*340f5e56SDavid van Moolenbroek #endif /* NO_CGIBIN_SUPPORT */
284*340f5e56SDavid van Moolenbroek 
285*340f5e56SDavid van Moolenbroek 		case 'd':
286*340f5e56SDavid van Moolenbroek 			httpd.debug++;
287*340f5e56SDavid van Moolenbroek #ifdef NO_DEBUG
288*340f5e56SDavid van Moolenbroek 			if (httpd.debug == 1)
289*340f5e56SDavid van Moolenbroek 				bozo_warn(&httpd, "Debugging is not enabled");
290*340f5e56SDavid van Moolenbroek #endif /* NO_DEBUG */
291*340f5e56SDavid van Moolenbroek 			break;
292*340f5e56SDavid van Moolenbroek 
293*340f5e56SDavid van Moolenbroek 		case 't':
294*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "chroot dir", optarg);
295*340f5e56SDavid van Moolenbroek 			break;
296*340f5e56SDavid van Moolenbroek 
297*340f5e56SDavid van Moolenbroek #ifdef NO_USER_SUPPORT
298*340f5e56SDavid van Moolenbroek 		case 'p':
299*340f5e56SDavid van Moolenbroek 		case 'u':
300*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1, "User support is not enabled");
301*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
302*340f5e56SDavid van Moolenbroek #else
303*340f5e56SDavid van Moolenbroek 		case 'p':
304*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "public_html", optarg);
305*340f5e56SDavid van Moolenbroek 			break;
306*340f5e56SDavid van Moolenbroek 
307*340f5e56SDavid van Moolenbroek 		case 'u':
308*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "enable users", "true");
309*340f5e56SDavid van Moolenbroek 			break;
310*340f5e56SDavid van Moolenbroek #endif /* NO_USER_SUPPORT */
311*340f5e56SDavid van Moolenbroek 
312*340f5e56SDavid van Moolenbroek #ifdef NO_DIRINDEX_SUPPORT
313*340f5e56SDavid van Moolenbroek 		case 'H':
314*340f5e56SDavid van Moolenbroek 		case 'X':
315*340f5e56SDavid van Moolenbroek 			bozo_err(&httpd, 1,
316*340f5e56SDavid van Moolenbroek 				"directory indexing is not enabled");
317*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
318*340f5e56SDavid van Moolenbroek #else
319*340f5e56SDavid van Moolenbroek 		case 'H':
320*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "hide dots", "true");
321*340f5e56SDavid van Moolenbroek 			break;
322*340f5e56SDavid van Moolenbroek 
323*340f5e56SDavid van Moolenbroek 		case 'X':
324*340f5e56SDavid van Moolenbroek 			bozo_set_pref(&prefs, "directory indexing", "true");
325*340f5e56SDavid van Moolenbroek 			break;
326*340f5e56SDavid van Moolenbroek 
327*340f5e56SDavid van Moolenbroek #endif /* NO_DIRINDEX_SUPPORT */
328*340f5e56SDavid van Moolenbroek 
329*340f5e56SDavid van Moolenbroek 		default:
330*340f5e56SDavid van Moolenbroek 			usage(&httpd, progname);
331*340f5e56SDavid van Moolenbroek 			/* NOTREACHED */
332*340f5e56SDavid van Moolenbroek 		}
333*340f5e56SDavid van Moolenbroek 	}
334*340f5e56SDavid van Moolenbroek 
335*340f5e56SDavid van Moolenbroek 	argc -= optind;
336*340f5e56SDavid van Moolenbroek 	argv += optind;
337*340f5e56SDavid van Moolenbroek 
338*340f5e56SDavid van Moolenbroek 	if (argc == 0 || argc > 2) {
339*340f5e56SDavid van Moolenbroek 		usage(&httpd, progname);
340*340f5e56SDavid van Moolenbroek 	}
341*340f5e56SDavid van Moolenbroek 
342*340f5e56SDavid van Moolenbroek 	/* virtual host, and root of tree to serve */
343*340f5e56SDavid van Moolenbroek 	bozo_setup(&httpd, &prefs, argv[1], argv[0]);
344*340f5e56SDavid van Moolenbroek 
345*340f5e56SDavid van Moolenbroek 	/*
346*340f5e56SDavid van Moolenbroek 	 * read and process the HTTP request.
347*340f5e56SDavid van Moolenbroek 	 */
348*340f5e56SDavid van Moolenbroek 	do {
349*340f5e56SDavid van Moolenbroek 		if ((request = bozo_read_request(&httpd)) != NULL) {
350*340f5e56SDavid van Moolenbroek 			bozo_process_request(request);
351*340f5e56SDavid van Moolenbroek 			bozo_clean_request(request);
352*340f5e56SDavid van Moolenbroek 		}
353*340f5e56SDavid van Moolenbroek 	} while (httpd.background);
354*340f5e56SDavid van Moolenbroek 
355*340f5e56SDavid van Moolenbroek 	return (0);
356*340f5e56SDavid van Moolenbroek }
357