xref: /openbsd-src/usr.sbin/httpd/httpd.h (revision 505ee9ea3b177e2387d907a91ca7da069f3f14d8)
1 /*	$OpenBSD: httpd.h,v 1.146 2020/02/09 09:44:04 florian Exp $	*/
2 
3 /*
4  * Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
5  * Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
6  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 #ifndef _HTTPD_H
22 #define _HTTPD_H
23 
24 #include <sys/types.h>
25 #include <sys/socket.h>
26 #include <sys/queue.h>
27 #include <sys/tree.h>
28 #include <sys/time.h>
29 
30 #include <net/if.h>
31 #include <netinet/in.h>
32 
33 #include <stdarg.h>
34 #include <limits.h>
35 #include <event.h>
36 #include <imsg.h>
37 #include <tls.h>
38 #include <vis.h>
39 
40 #include "patterns.h"
41 
42 #ifndef nitems
43 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
44 #endif
45 
46 #define CONF_FILE		"/etc/httpd.conf"
47 #define HTTPD_SOCKET		"/var/run/httpd.sock"
48 #define HTTPD_USER		"www"
49 #define HTTPD_SERVERNAME	"OpenBSD httpd"
50 #define HTTPD_DOCROOT		"/htdocs"
51 #define HTTPD_INDEX		"index.html"
52 #define HTTPD_FCGI_SOCKET	"/run/slowcgi.sock"
53 #define HTTPD_LOGROOT		"/logs"
54 #define HTTPD_ACCESS_LOG	"access.log"
55 #define HTTPD_ERROR_LOG		"error.log"
56 #define HTTPD_MAX_ALIAS_IP	16
57 #define HTTPD_REALM_MAX		255
58 #define HTTPD_LOCATION_MAX	255
59 #define HTTPD_DEFAULT_TYPE	{ "bin", "application", "octet-stream", NULL }
60 #define HTTPD_LOGVIS		VIS_NL|VIS_TAB|VIS_CSTYLE
61 #define HTTPD_TLS_CERT		"/etc/ssl/server.crt"
62 #define HTTPD_TLS_KEY		"/etc/ssl/private/server.key"
63 #define HTTPD_TLS_CONFIG_MAX	511
64 #define HTTPD_TLS_CIPHERS	"compat"
65 #define HTTPD_TLS_DHE_PARAMS	"none"
66 #define HTTPD_TLS_ECDHE_CURVES	"default"
67 #define HTTPD_FCGI_NAME_MAX	511
68 #define HTTPD_FCGI_VAL_MAX	511
69 #define FD_RESERVE		5
70 
71 #define SERVER_MAX_CLIENTS	1024
72 #define SERVER_TIMEOUT		600
73 #define SERVER_REQUESTTIMEOUT	60
74 #define SERVER_CACHESIZE	-1	/* use default size */
75 #define SERVER_NUMPROC		3
76 #define SERVER_MAXHEADERLENGTH	8192
77 #define SERVER_MAXREQUESTS	100	/* max requests per connection */
78 #define SERVER_MAXREQUESTBODY	1048576	/* 1M */
79 #define SERVER_BACKLOG		10
80 #define SERVER_OUTOF_FD_RETRIES	5
81 #define SERVER_MAX_PREFETCH	256
82 #define SERVER_MIN_PREFETCHED	32
83 #define SERVER_HSTS_DEFAULT_AGE	31536000
84 #define SERVER_MAX_RANGES	4
85 #define SERVER_DEF_TLS_LIFETIME	(2 * 3600)
86 #define SERVER_MIN_TLS_LIFETIME	(60)
87 #define SERVER_MAX_TLS_LIFETIME	(24 * 3600)
88 
89 #define MEDIATYPE_NAMEMAX	128	/* file name extension */
90 #define MEDIATYPE_TYPEMAX	64	/* length of type/subtype */
91 
92 #define CONFIG_RELOAD		0x00
93 #define CONFIG_MEDIA		0x01
94 #define CONFIG_SERVERS		0x02
95 #define CONFIG_AUTH		0x04
96 #define CONFIG_ALL		0xff
97 
98 #define FCGI_CONTENT_SIZE	65535
99 
100 #define PROC_PARENT_SOCK_FILENO	3
101 #define PROC_MAX_INSTANCES	32
102 
103 enum httpchunk {
104 	TOREAD_UNLIMITED		= -1,
105 	TOREAD_HTTP_HEADER		= -2,
106 	TOREAD_HTTP_CHUNK_LENGTH	= -3,
107 	TOREAD_HTTP_CHUNK_TRAILER	= -4,
108 	TOREAD_HTTP_NONE		= -5,
109 	TOREAD_HTTP_RANGE		= TOREAD_HTTP_CHUNK_LENGTH
110 };
111 
112 #if DEBUG
113 #define DPRINTF		log_debug
114 #else
115 #define DPRINTF(x...)	do {} while(0)
116 #endif
117 
118 struct ctl_flags {
119 	uint8_t		 cf_opts;
120 	uint32_t	 cf_flags;
121 	uint8_t		 cf_tls_sid[TLS_MAX_SESSION_ID_LENGTH];
122 };
123 
124 enum key_type {
125 	KEY_TYPE_NONE		= 0,
126 	KEY_TYPE_COOKIE,
127 	KEY_TYPE_HEADER,
128 	KEY_TYPE_PATH,
129 	KEY_TYPE_QUERY,
130 	KEY_TYPE_URL,
131 	KEY_TYPE_MAX
132 };
133 
134 TAILQ_HEAD(kvlist, kv);
135 RB_HEAD(kvtree, kv);
136 
137 struct kv {
138 	char			*kv_key;
139 	char			*kv_value;
140 
141 	enum key_type		 kv_type;
142 
143 #define KV_FLAG_INVALID		 0x01
144 #define KV_FLAG_GLOBBING	 0x02
145 	uint8_t			 kv_flags;
146 
147 	struct kvlist		 kv_children;
148 	struct kv		*kv_parent;
149 	TAILQ_ENTRY(kv)		 kv_entry;
150 
151 	RB_ENTRY(kv)		 kv_node;
152 };
153 
154 struct portrange {
155 	in_port_t		 val[2];
156 	uint8_t			 op;
157 };
158 
159 struct address {
160 	struct sockaddr_storage	 ss;
161 	int			 ipproto;
162 	int			 prefixlen;
163 	struct portrange	 port;
164 	char			 ifname[IFNAMSIZ];
165 	TAILQ_ENTRY(address)	 entry;
166 };
167 TAILQ_HEAD(addresslist, address);
168 
169 /* initially control.h */
170 struct control_sock {
171 	const char	*cs_name;
172 	struct event	 cs_ev;
173 	struct event	 cs_evt;
174 	int		 cs_fd;
175 	int		 cs_restricted;
176 	void		*cs_env;
177 
178 	TAILQ_ENTRY(control_sock) cs_entry;
179 };
180 TAILQ_HEAD(control_socks, control_sock);
181 
182 struct {
183 	struct event	 ev;
184 	int		 fd;
185 } control_state;
186 
187 struct imsgev {
188 	struct imsgbuf		 ibuf;
189 	void			(*handler)(int, short, void *);
190 	struct event		 ev;
191 	struct privsep_proc	*proc;
192 	void			*data;
193 	short			 events;
194 };
195 
196 #define IMSG_SIZE_CHECK(imsg, p) do {				\
197 	if (IMSG_DATA_SIZE(imsg) < sizeof(*p))			\
198 		fatalx("bad length imsg received");		\
199 } while (0)
200 #define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
201 #define MAX_IMSG_DATA_SIZE	(MAX_IMSGSIZE - IMSG_HEADER_SIZE)
202 
203 struct ctl_conn {
204 	TAILQ_ENTRY(ctl_conn)	 entry;
205 	uint8_t			 flags;
206 	unsigned int		 waiting;
207 #define CTL_CONN_NOTIFY		 0x01
208 	struct imsgev		 iev;
209 
210 };
211 TAILQ_HEAD(ctl_connlist, ctl_conn);
212 
213 enum imsg_type {
214 	IMSG_NONE,
215 	IMSG_CTL_OK,
216 	IMSG_CTL_FAIL,
217 	IMSG_CTL_VERBOSE,
218 	IMSG_CTL_PROCFD,
219 	IMSG_CTL_RESET,
220 	IMSG_CTL_SHUTDOWN,
221 	IMSG_CTL_RELOAD,
222 	IMSG_CTL_NOTIFY,
223 	IMSG_CTL_END,
224 	IMSG_CTL_START,
225 	IMSG_CTL_REOPEN,
226 	IMSG_CFG_SERVER,
227 	IMSG_CFG_TLS,
228 	IMSG_CFG_MEDIA,
229 	IMSG_CFG_AUTH,
230 	IMSG_CFG_FCGI,
231 	IMSG_CFG_DONE,
232 	IMSG_LOG_ACCESS,
233 	IMSG_LOG_ERROR,
234 	IMSG_LOG_OPEN,
235 	IMSG_TLSTICKET_REKEY
236 };
237 
238 enum privsep_procid {
239 	PROC_ALL	= -1,
240 	PROC_PARENT	= 0,
241 	PROC_SERVER,
242 	PROC_LOGGER,
243 	PROC_MAX
244 } privsep_process;
245 
246 /* Attach the control socket to the following process */
247 #define PROC_CONTROL	PROC_LOGGER
248 
249 struct privsep_pipes {
250 	int				*pp_pipes[PROC_MAX];
251 };
252 
253 struct privsep {
254 	struct privsep_pipes		*ps_pipes[PROC_MAX];
255 	struct privsep_pipes		*ps_pp;
256 
257 	struct imsgev			*ps_ievs[PROC_MAX];
258 	const char			*ps_title[PROC_MAX];
259 	uint8_t				 ps_what[PROC_MAX];
260 
261 	unsigned int			 ps_instances[PROC_MAX];
262 	unsigned int			 ps_instance;
263 
264 	struct control_sock		 ps_csock;
265 	struct control_socks		 ps_rcsocks;
266 
267 	/* Event and signal handlers */
268 	struct event			 ps_evsigint;
269 	struct event			 ps_evsigterm;
270 	struct event			 ps_evsigchld;
271 	struct event			 ps_evsighup;
272 	struct event			 ps_evsigpipe;
273 	struct event			 ps_evsigusr1;
274 
275 	int				 ps_noaction;
276 	struct passwd			*ps_pw;
277 	struct httpd			*ps_env;
278 };
279 
280 struct privsep_proc {
281 	const char		*p_title;
282 	enum privsep_procid	 p_id;
283 	int			(*p_cb)(int, struct privsep_proc *,
284 				    struct imsg *);
285 	void			(*p_init)(struct privsep *,
286 				    struct privsep_proc *);
287 	const char		*p_chroot;
288 	struct privsep		*p_ps;
289 	void			(*p_shutdown)(void);
290 	struct passwd		*p_pw;
291 };
292 
293 struct privsep_fd {
294 	enum privsep_procid		 pf_procid;
295 	unsigned int			 pf_instance;
296 };
297 
298 enum fcgistate {
299 	FCGI_READ_HEADER,
300 	FCGI_READ_CONTENT,
301 	FCGI_READ_PADDING
302 };
303 
304 struct fcgi_data {
305 	enum fcgistate		 state;
306 	int			 toread;
307 	int			 padding_len;
308 	int			 type;
309 	int			 chunked;
310 	int			 end;
311 	int			 status;
312 	int			 headersdone;
313 };
314 
315 struct range {
316 	off_t	start;
317 	off_t	end;
318 };
319 
320 struct range_data {
321 	struct range		 range[SERVER_MAX_RANGES];
322 	int			 range_count;
323 	int			 range_index;
324 	off_t			 range_toread;
325 
326 	/* For the Content headers in each part */
327 	struct media_type	*range_media;
328 	size_t			 range_total;
329 };
330 
331 struct client {
332 	uint32_t		 clt_id;
333 	pid_t			 clt_pid;
334 	void			*clt_srv;
335 	void			*clt_srv_conf;
336 	uint32_t		 clt_srv_id;
337 	struct sockaddr_storage	 clt_srv_ss;
338 	struct str_match	 clt_srv_match;
339 
340 	int			 clt_s;
341 	in_port_t		 clt_port;
342 	struct sockaddr_storage	 clt_ss;
343 	struct bufferevent	*clt_bev;
344 	struct evbuffer		*clt_output;
345 	struct event		 clt_ev;
346 	void			*clt_descreq;
347 	void			*clt_descresp;
348 	int			 clt_sndbufsiz;
349 	uint64_t		 clt_boundary;
350 
351 	int			 clt_fd;
352 	struct tls		*clt_tls_ctx;
353 	struct bufferevent	*clt_srvbev;
354 	int			 clt_srvbev_throttled;
355 
356 	off_t			 clt_toread;
357 	size_t			 clt_headerlen;
358 	int			 clt_headersdone;
359 	unsigned int		 clt_persist;
360 	unsigned int		 clt_pipelining;
361 	int			 clt_line;
362 	int			 clt_done;
363 	int			 clt_chunk;
364 	int			 clt_inflight;
365 	struct range_data	 clt_ranges;
366 	struct fcgi_data	 clt_fcgi;
367 	char			*clt_remote_user;
368 	struct evbuffer		*clt_srvevb;
369 
370 	struct evbuffer		*clt_log;
371 	struct timeval		 clt_timeout;
372 	struct timeval		 clt_tv_start;
373 	struct timeval		 clt_tv_last;
374 	struct event		 clt_inflightevt;
375 
376 	SPLAY_ENTRY(client)	 clt_nodes;
377 };
378 SPLAY_HEAD(client_tree, client);
379 
380 #define SRVFLAG_INDEX		0x00000001
381 #define SRVFLAG_NO_INDEX	0x00000002
382 #define SRVFLAG_AUTO_INDEX	0x00000004
383 #define SRVFLAG_NO_AUTO_INDEX	0x00000008
384 #define SRVFLAG_ROOT		0x00000010
385 #define SRVFLAG_LOCATION	0x00000020
386 #define SRVFLAG_FCGI		0x00000040
387 #define SRVFLAG_NO_FCGI		0x00000080
388 #define SRVFLAG_LOG		0x00000100
389 #define SRVFLAG_NO_LOG		0x00000200
390 #define SRVFLAG_SOCKET		0x00000400
391 #define SRVFLAG_SYSLOG		0x00000800
392 #define SRVFLAG_NO_SYSLOG	0x00001000
393 #define SRVFLAG_TLS		0x00002000
394 #define SRVFLAG_ACCESS_LOG	0x00004000
395 #define SRVFLAG_ERROR_LOG	0x00008000
396 #define SRVFLAG_AUTH		0x00010000
397 #define SRVFLAG_NO_AUTH		0x00020000
398 #define SRVFLAG_BLOCK		0x00040000
399 #define SRVFLAG_NO_BLOCK	0x00080000
400 #define SRVFLAG_LOCATION_MATCH	0x00100000
401 #define SRVFLAG_SERVER_MATCH	0x00200000
402 #define SRVFLAG_SERVER_HSTS	0x00400000
403 #define SRVFLAG_DEFAULT_TYPE	0x00800000
404 #define SRVFLAG_PATH_REWRITE	0x01000000
405 #define SRVFLAG_NO_PATH_REWRITE	0x02000000
406 
407 #define SRVFLAG_BITS							\
408 	"\10\01INDEX\02NO_INDEX\03AUTO_INDEX\04NO_AUTO_INDEX"		\
409 	"\05ROOT\06LOCATION\07FCGI\10NO_FCGI\11LOG\12NO_LOG\13SOCKET"	\
410 	"\14SYSLOG\15NO_SYSLOG\16TLS\17ACCESS_LOG\20ERROR_LOG"		\
411 	"\21AUTH\22NO_AUTH\23BLOCK\24NO_BLOCK\25LOCATION_MATCH"		\
412 	"\26SERVER_MATCH\27SERVER_HSTS\30DEFAULT_TYPE\31PATH\32NO_PATH"
413 
414 #define TCPFLAG_NODELAY		0x01
415 #define TCPFLAG_NNODELAY	0x02
416 #define TCPFLAG_SACK		0x04
417 #define TCPFLAG_NSACK		0x08
418 #define TCPFLAG_BUFSIZ		0x10
419 #define TCPFLAG_IPTTL		0x20
420 #define TCPFLAG_IPMINTTL	0x40
421 #define TCPFLAG_NSPLICE		0x80
422 #define TCPFLAG_DEFAULT		0x00
423 
424 #define TCPFLAG_BITS						\
425 	"\10\01NODELAY\02NO_NODELAY\03SACK\04NO_SACK"		\
426 	"\05SOCKET_BUFFER_SIZE\06IP_TTL\07IP_MINTTL\10NO_SPLICE"
427 
428 #define HSTSFLAG_SUBDOMAINS	0x01
429 #define HSTSFLAG_PRELOAD	0x02
430 #define HSTSFLAG_BITS		"\10\01SUBDOMAINS\02PRELOAD"
431 
432 #define TLSFLAG_CA		0x01
433 #define TLSFLAG_CRL		0x02
434 #define TLSFLAG_OPTIONAL	0x04
435 #define TLSFLAG_BITS		"\10\01CA\02CRL\03OPTIONAL"
436 
437 enum log_format {
438 	LOG_FORMAT_COMMON,
439 	LOG_FORMAT_COMBINED,
440 	LOG_FORMAT_CONNECTION,
441 	LOG_FORMAT_FORWARDED
442 };
443 
444 struct log_file {
445 	char			log_name[PATH_MAX];
446 	int			log_fd;
447 	uint32_t		log_id;
448 	TAILQ_ENTRY(log_file)	log_entry;
449 };
450 TAILQ_HEAD(log_files, log_file) log_files;
451 
452 struct media_type {
453 	char			 media_name[MEDIATYPE_NAMEMAX];
454 	char			 media_type[MEDIATYPE_TYPEMAX];
455 	char			 media_subtype[MEDIATYPE_TYPEMAX];
456 	char			*media_encoding;
457 	RB_ENTRY(media_type)	 media_entry;
458 };
459 RB_HEAD(mediatypes, media_type);
460 
461 struct auth {
462 	char			 auth_htpasswd[PATH_MAX];
463 	uint32_t		 auth_id;
464 	TAILQ_ENTRY(auth)	 auth_entry;
465 };
466 TAILQ_HEAD(serverauth, auth);
467 
468 struct server_tls_ticket {
469 	uint32_t	tt_id;
470 	uint32_t	tt_keyrev;
471 	unsigned char	tt_key[TLS_TICKET_KEY_SIZE];
472 };
473 
474 struct fastcgi_param {
475 	char			name[HTTPD_FCGI_NAME_MAX];
476 	char			value[HTTPD_FCGI_VAL_MAX];
477 
478 	TAILQ_ENTRY(fastcgi_param) entry;
479 };
480 TAILQ_HEAD(server_fcgiparams, fastcgi_param);
481 
482 struct server_config {
483 	uint32_t		 id;
484 	uint32_t		 parent_id;
485 	char			 name[HOST_NAME_MAX+1];
486 	char			 location[HTTPD_LOCATION_MAX];
487 	char			 root[PATH_MAX];
488 	char			 path[PATH_MAX];
489 	char			 index[PATH_MAX];
490 	char			 socket[PATH_MAX];
491 	char			 accesslog[PATH_MAX];
492 	char			 errorlog[PATH_MAX];
493 	struct media_type	 default_type;
494 
495 	in_port_t		 port;
496 	struct sockaddr_storage	 ss;
497 	int			 prefixlen;
498 	struct timeval		 timeout;
499 	struct timeval		 requesttimeout;
500 	uint32_t		 maxrequests;
501 	size_t			 maxrequestbody;
502 
503 	uint8_t			*tls_ca;
504 	char			*tls_ca_file;
505 	size_t			 tls_ca_len;
506 	uint8_t			*tls_cert;
507 	size_t			 tls_cert_len;
508 	char			*tls_cert_file;
509 	char			 tls_ciphers[HTTPD_TLS_CONFIG_MAX];
510 	uint8_t			*tls_crl;
511 	char			*tls_crl_file;
512 	size_t			 tls_crl_len;
513 	char			 tls_dhe_params[HTTPD_TLS_CONFIG_MAX];
514 	char			 tls_ecdhe_curves[HTTPD_TLS_CONFIG_MAX];
515 	uint8_t			 tls_flags;
516 	uint8_t			*tls_key;
517 	size_t			 tls_key_len;
518 	char			*tls_key_file;
519 	uint32_t		 tls_protocols;
520 	uint8_t			*tls_ocsp_staple;
521 	size_t			 tls_ocsp_staple_len;
522 	char			*tls_ocsp_staple_file;
523 	struct server_tls_ticket tls_ticket_key;
524 	int			 tls_ticket_lifetime;
525 
526 	uint32_t		 flags;
527 	int			 strip;
528 	uint8_t			 tcpflags;
529 	int			 tcpbufsiz;
530 	int			 tcpbacklog;
531 	uint8_t			 tcpipttl;
532 	uint8_t			 tcpipminttl;
533 
534 	enum log_format		 logformat;
535 	struct log_file		*logaccess;
536 	struct log_file		*logerror;
537 
538 	char			 auth_realm[HTTPD_REALM_MAX];
539 	uint32_t		 auth_id;
540 	const struct auth	*auth;
541 
542 	int			 return_code;
543 	char			*return_uri;
544 	off_t			 return_uri_len;
545 
546 	int			 hsts_max_age;
547 	uint8_t			 hsts_flags;
548 
549 	struct server_fcgiparams fcgiparams;
550 	int			 fcgistrip;
551 
552 	TAILQ_ENTRY(server_config) entry;
553 };
554 TAILQ_HEAD(serverhosts, server_config);
555 
556 enum tls_config_type {
557 	TLS_CFG_CA,
558 	TLS_CFG_CERT,
559 	TLS_CFG_CRL,
560 	TLS_CFG_KEY,
561 	TLS_CFG_OCSP_STAPLE,
562 };
563 
564 struct tls_config {
565 	uint32_t		 id;
566 
567 	enum tls_config_type	 tls_type;
568 	size_t			 tls_len;
569 	size_t			 tls_chunk_len;
570 	size_t			 tls_chunk_offset;
571 };
572 
573 struct server {
574 	TAILQ_ENTRY(server)	 srv_entry;
575 	struct server_config	 srv_conf;
576 	struct serverhosts	 srv_hosts;
577 
578 	int			 srv_s;
579 	struct event		 srv_ev;
580 	struct event		 srv_evt;
581 
582 	struct tls		 *srv_tls_ctx;
583 	struct tls_config	 *srv_tls_config;
584 
585 	struct client_tree	 srv_clients;
586 };
587 TAILQ_HEAD(serverlist, server);
588 
589 struct httpd {
590 	uint8_t			 sc_opts;
591 	uint32_t		 sc_flags;
592 	const char		*sc_conffile;
593 	struct event		 sc_ev;
594 	uint16_t		 sc_prefork_server;
595 	uint16_t		 sc_id;
596 	int			 sc_paused;
597 	char			*sc_chroot;
598 	char			*sc_logdir;
599 
600 	uint8_t			 sc_tls_sid[TLS_MAX_SESSION_ID_LENGTH];
601 
602 	struct serverlist	*sc_servers;
603 	struct mediatypes	*sc_mediatypes;
604 	struct media_type	 sc_default_type;
605 	struct serverauth	*sc_auth;
606 
607 	struct privsep		*sc_ps;
608 	int			 sc_reload;
609 };
610 
611 #define HTTPD_OPT_VERBOSE		0x01
612 #define HTTPD_OPT_NOACTION		0x04
613 
614 /* control.c */
615 int	 control_init(struct privsep *, struct control_sock *);
616 int	 control_listen(struct control_sock *);
617 void	 control_cleanup(struct control_sock *);
618 void	 control_dispatch_imsg(int, short, void *);
619 void	 control_imsg_forward(struct privsep *, struct imsg *);
620 struct ctl_conn	*
621 	 control_connbyfd(int);
622 
623 extern  struct ctl_connlist ctl_conns;
624 
625 /* parse.y */
626 int	 parse_config(const char *, struct httpd *);
627 int	 load_config(const char *, struct httpd *);
628 int	 cmdline_symset(char *);
629 
630 /* server.c */
631 void	 server(struct privsep *, struct privsep_proc *);
632 int	 server_tls_cmp(struct server *, struct server *, int);
633 int	 server_tls_load_ca(struct server *);
634 int	 server_tls_load_crl(struct server *);
635 int	 server_tls_load_keypair(struct server *);
636 int	 server_tls_load_ocsp(struct server *);
637 void	 server_generate_ticket_key(struct server_config *);
638 int	 server_privinit(struct server *);
639 void	 server_purge(struct server *);
640 void	 serverconfig_free(struct server_config *);
641 void	 serverconfig_reset(struct server_config *);
642 int	 server_socket_af(struct sockaddr_storage *, in_port_t);
643 in_port_t
644 	 server_socket_getport(struct sockaddr_storage *);
645 int	 server_socket_connect(struct sockaddr_storage *, in_port_t,
646 	    struct server_config *);
647 void	 server_write(struct bufferevent *, void *);
648 void	 server_read(struct bufferevent *, void *);
649 void	 server_error(struct bufferevent *, short, void *);
650 void	 server_log(struct client *, const char *);
651 void	 server_sendlog(struct server_config *, int, const char *, ...)
652 	    __attribute__((__format__ (printf, 3, 4)));
653 void	 server_close(struct client *, const char *);
654 void	 server_dump(struct client *, const void *, size_t);
655 int	 server_client_cmp(struct client *, struct client *);
656 int	 server_bufferevent_printf(struct client *, const char *, ...)
657 	    __attribute__((__format__ (printf, 2, 3)));
658 int	 server_bufferevent_print(struct client *, const char *);
659 int	 server_bufferevent_write_buffer(struct client *,
660 	    struct evbuffer *);
661 int	 server_bufferevent_write_chunk(struct client *,
662 	    struct evbuffer *, size_t);
663 int	 server_bufferevent_add(struct event *, int);
664 int	 server_bufferevent_write(struct client *, void *, size_t);
665 struct server *
666 	 server_byaddr(struct sockaddr *, in_port_t);
667 struct server_config *
668 	 serverconfig_byid(uint32_t);
669 int	 server_foreach(int (*)(struct server *,
670 	    struct server_config *, void *), void *);
671 struct server *
672 	 server_match(struct server *, int);
673 
674 SPLAY_PROTOTYPE(client_tree, client, clt_nodes, server_client_cmp);
675 
676 /* server_http.c */
677 void	 server_http_init(struct server *);
678 void	 server_http(void);
679 int	 server_httpdesc_init(struct client *);
680 void	 server_read_http(struct bufferevent *, void *);
681 void	 server_abort_http(struct client *, unsigned int, const char *);
682 unsigned int
683 	 server_httpmethod_byname(const char *);
684 const char
685 	*server_httpmethod_byid(unsigned int);
686 const char
687 	*server_httperror_byid(unsigned int);
688 void	 server_read_httpcontent(struct bufferevent *, void *);
689 void	 server_read_httpchunks(struct bufferevent *, void *);
690 void	 server_read_httprange(struct bufferevent *, void *);
691 int	 server_writeheader_http(struct client *clt, struct kv *, void *);
692 int	 server_headers(struct client *, void *,
693 	    int (*)(struct client *, struct kv *, void *), void *);
694 int	 server_writeresponse_http(struct client *);
695 int	 server_response_http(struct client *, unsigned int,
696 	    struct media_type *, off_t, time_t);
697 void	 server_reset_http(struct client *);
698 void	 server_close_http(struct client *);
699 int	 server_response(struct httpd *, struct client *);
700 const char *
701 	 server_root_strip(const char *, int);
702 struct server_config *
703 	 server_getlocation(struct client *, const char *);
704 const char *
705 	 server_http_host(struct sockaddr_storage *, char *, size_t);
706 char	*server_http_parsehost(char *, char *, size_t, int *);
707 ssize_t	 server_http_time(time_t, char *, size_t);
708 int	 server_log_http(struct client *, unsigned int, size_t);
709 
710 /* server_file.c */
711 int	 server_file(struct httpd *, struct client *);
712 void	 server_file_error(struct bufferevent *, short, void *);
713 
714 /* server_fcgi.c */
715 int	 server_fcgi(struct httpd *, struct client *);
716 int	 fcgi_add_stdin(struct client *, struct evbuffer *);
717 
718 /* httpd.c */
719 void		 event_again(struct event *, int, short,
720 		    void (*)(int, short, void *),
721 		    struct timeval *, struct timeval *, void *);
722 int		 expand_string(char *, size_t, const char *, const char *);
723 const char	*url_decode(char *);
724 char		*url_encode(const char *);
725 const char	*canonicalize_host(const char *, char *, size_t);
726 const char	*canonicalize_path(const char *, char *, size_t);
727 size_t		 path_info(char *);
728 char		*escape_html(const char *);
729 void		 socket_rlimit(int);
730 char		*evbuffer_getline(struct evbuffer *);
731 char		*get_string(uint8_t *, size_t);
732 void		*get_data(uint8_t *, size_t);
733 int		 sockaddr_cmp(struct sockaddr *, struct sockaddr *, int);
734 struct in6_addr *prefixlen2mask6(uint8_t, uint32_t *);
735 uint32_t	 prefixlen2mask(uint8_t);
736 int		 accept_reserve(int, struct sockaddr *, socklen_t *, int,
737 		    volatile int *);
738 struct kv	*kv_add(struct kvtree *, char *, char *);
739 int		 kv_set(struct kv *, char *, ...)
740 		    __attribute__((__format__ (printf, 2, 3)));
741 int		 kv_setkey(struct kv *, char *, ...)
742 		    __attribute__((__format__ (printf, 2, 3)));
743 void		 kv_delete(struct kvtree *, struct kv *);
744 struct kv	*kv_extend(struct kvtree *, struct kv *, char *);
745 void		 kv_purge(struct kvtree *);
746 void		 kv_free(struct kv *);
747 struct kv	*kv_inherit(struct kv *, struct kv *);
748 int		 kv_log(struct evbuffer *, struct kv *);
749 struct kv	*kv_find(struct kvtree *, struct kv *);
750 int		 kv_cmp(struct kv *, struct kv *);
751 struct media_type
752 		*media_add(struct mediatypes *, struct media_type *);
753 void		 media_delete(struct mediatypes *, struct media_type *);
754 void		 media_purge(struct mediatypes *);
755 struct media_type *
756 		 media_find(struct mediatypes *, const char *);
757 struct media_type *
758 		 media_find_config(struct httpd *, struct server_config *,
759 		    const char *);
760 int		 media_cmp(struct media_type *, struct media_type *);
761 RB_PROTOTYPE(kvtree, kv, kv_node, kv_cmp);
762 RB_PROTOTYPE(mediatypes, media_type, media_entry, media_cmp);
763 struct auth	*auth_add(struct serverauth *, struct auth *);
764 struct auth	*auth_byid(struct serverauth *, uint32_t);
765 void		 auth_free(struct serverauth *, struct auth *);
766 const char	*print_host(struct sockaddr_storage *, char *, size_t);
767 const char	*print_time(struct timeval *, struct timeval *, char *, size_t);
768 const char	*printb_flags(const uint32_t, const char *);
769 void		 getmonotime(struct timeval *);
770 
771 extern struct httpd *httpd_env;
772 
773 /* log.c */
774 void	log_init(int, int);
775 void	log_procinit(const char *);
776 void	log_setverbose(int);
777 int	log_getverbose(void);
778 void	log_warn(const char *, ...)
779 	    __attribute__((__format__ (printf, 1, 2)));
780 void	log_warnx(const char *, ...)
781 	    __attribute__((__format__ (printf, 1, 2)));
782 void	log_info(const char *, ...)
783 	    __attribute__((__format__ (printf, 1, 2)));
784 void	log_debug(const char *, ...)
785 	    __attribute__((__format__ (printf, 1, 2)));
786 void	logit(int, const char *, ...)
787 	    __attribute__((__format__ (printf, 2, 3)));
788 void	vlog(int, const char *, va_list)
789 	    __attribute__((__format__ (printf, 2, 0)));
790 __dead void fatal(const char *, ...)
791 	    __attribute__((__format__ (printf, 1, 2)));
792 __dead void fatalx(const char *, ...)
793 	    __attribute__((__format__ (printf, 1, 2)));
794 
795 /* proc.c */
796 enum privsep_procid
797 	    proc_getid(struct privsep_proc *, unsigned int, const char *);
798 void	 proc_init(struct privsep *, struct privsep_proc *, unsigned int, int,
799 	    int, char **, enum privsep_procid);
800 void	 proc_kill(struct privsep *);
801 void	 proc_connect(struct privsep *);
802 void	 proc_dispatch(int, short event, void *);
803 void	 proc_run(struct privsep *, struct privsep_proc *,
804 	    struct privsep_proc *, unsigned int,
805 	    void (*)(struct privsep *, struct privsep_proc *, void *), void *);
806 void	 proc_range(struct privsep *, enum privsep_procid, int *, int *);
807 int	 proc_compose_imsg(struct privsep *, enum privsep_procid, int,
808 	    u_int16_t, u_int32_t, int, void *, u_int16_t);
809 int	 proc_compose(struct privsep *, enum privsep_procid,
810 	    uint16_t, void *, uint16_t);
811 int	 proc_composev_imsg(struct privsep *, enum privsep_procid, int,
812 	    u_int16_t, u_int32_t, int, const struct iovec *, int);
813 int	 proc_composev(struct privsep *, enum privsep_procid,
814 	    uint16_t, const struct iovec *, int);
815 int	 proc_forward_imsg(struct privsep *, struct imsg *,
816 	    enum privsep_procid, int);
817 struct imsgbuf *
818 	 proc_ibuf(struct privsep *, enum privsep_procid, int);
819 struct imsgev *
820 	 proc_iev(struct privsep *, enum privsep_procid, int);
821 int	 proc_flush_imsg(struct privsep *, enum privsep_procid, int);
822 void	 imsg_event_add(struct imsgev *);
823 int	 imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
824 	    pid_t, int, void *, uint16_t);
825 int	 imsg_composev_event(struct imsgev *, uint16_t, uint32_t,
826 	    pid_t, int, const struct iovec *, int);
827 
828 /* config.c */
829 int	 config_init(struct httpd *);
830 void	 config_purge(struct httpd *, unsigned int);
831 int	 config_setreset(struct httpd *, unsigned int);
832 int	 config_getreset(struct httpd *, struct imsg *);
833 int	 config_getcfg(struct httpd *, struct imsg *);
834 int	 config_setserver(struct httpd *, struct server *);
835 int	 config_setserver_tls(struct httpd *, struct server *);
836 int	 config_setserver_fcgiparams(struct httpd *, struct server *);
837 int	 config_getserver(struct httpd *, struct imsg *);
838 int	 config_getserver_tls(struct httpd *, struct imsg *);
839 int	 config_getserver_fcgiparams(struct httpd *, struct imsg *);
840 int	 config_setmedia(struct httpd *, struct media_type *);
841 int	 config_getmedia(struct httpd *, struct imsg *);
842 int	 config_setauth(struct httpd *, struct auth *);
843 int	 config_getauth(struct httpd *, struct imsg *);
844 
845 /* logger.c */
846 void	 logger(struct privsep *, struct privsep_proc *);
847 int	 logger_open_priv(struct imsg *);
848 
849 #endif /* _HTTPD_H */
850