xref: /openbsd/usr.sbin/httpd/httpd.h (revision cecf84d4)
1 /*	$OpenBSD: httpd.h,v 1.82 2015/03/15 22:08:45 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 
32 #include <stdarg.h>
33 #include <limits.h>
34 #include <event.h>
35 #include <imsg.h>
36 #include <tls.h>
37 
38 #define CONF_FILE		"/etc/httpd.conf"
39 #define HTTPD_SOCKET		"/var/run/httpd.sock"
40 #define HTTPD_USER		"www"
41 #define HTTPD_SERVERNAME	"OpenBSD httpd"
42 #define HTTPD_DOCROOT		"/htdocs"
43 #define HTTPD_INDEX		"index.html"
44 #define HTTPD_FCGI_SOCKET	"/run/slowcgi.sock"
45 #define HTTPD_LOGROOT		"/logs"
46 #define HTTPD_ACCESS_LOG	"access.log"
47 #define HTTPD_ERROR_LOG		"error.log"
48 #define HTTPD_TLS_CERT		"/etc/ssl/server.crt"
49 #define HTTPD_TLS_KEY		"/etc/ssl/private/server.key"
50 #define HTTPD_TLS_CIPHERS	"HIGH:!aNULL"
51 #define HTTPD_TLS_DHE_PARAMS	"none"
52 #define HTTPD_TLS_ECDHE_CURVE	"auto"
53 #define FD_RESERVE		5
54 
55 #define SERVER_MAX_CLIENTS	1024
56 #define SERVER_TIMEOUT		600
57 #define SERVER_CACHESIZE	-1	/* use default size */
58 #define SERVER_NUMPROC		3
59 #define SERVER_MAXPROC		32
60 #define SERVER_MAXHEADERLENGTH	8192
61 #define SERVER_MAXREQUESTS	100	/* max requests per connection */
62 #define SERVER_MAXREQUESTBODY	1048576	/* 1M */
63 #define SERVER_BACKLOG		10
64 #define SERVER_OUTOF_FD_RETRIES	5
65 
66 #define MEDIATYPE_NAMEMAX	128	/* file name extension */
67 #define MEDIATYPE_TYPEMAX	64	/* length of type/subtype */
68 
69 #define CONFIG_RELOAD		0x00
70 #define CONFIG_MEDIA		0x01
71 #define CONFIG_SERVERS		0x02
72 #define CONFIG_AUTH		0x04
73 #define CONFIG_ALL		0xff
74 
75 #define FCGI_CONTENT_SIZE	65535
76 
77 enum httpchunk {
78 	TOREAD_UNLIMITED		= -1,
79 	TOREAD_HTTP_HEADER		= -2,
80 	TOREAD_HTTP_CHUNK_LENGTH	= -3,
81 	TOREAD_HTTP_CHUNK_TRAILER	= -4,
82 	TOREAD_HTTP_NONE		= -5
83 };
84 
85 #if DEBUG
86 #define DPRINTF		log_debug
87 #else
88 #define DPRINTF(x...)	do {} while(0)
89 #endif
90 
91 struct ctl_flags {
92 	u_int8_t	 cf_opts;
93 	u_int32_t	 cf_flags;
94 };
95 
96 enum key_type {
97 	KEY_TYPE_NONE		= 0,
98 	KEY_TYPE_COOKIE,
99 	KEY_TYPE_HEADER,
100 	KEY_TYPE_PATH,
101 	KEY_TYPE_QUERY,
102 	KEY_TYPE_URL,
103 	KEY_TYPE_MAX
104 };
105 
106 TAILQ_HEAD(kvlist, kv);
107 RB_HEAD(kvtree, kv);
108 
109 struct kv {
110 	char			*kv_key;
111 	char			*kv_value;
112 
113 	enum key_type		 kv_type;
114 
115 #define KV_FLAG_INVALID		 0x01
116 #define KV_FLAG_GLOBBING	 0x02
117 	u_int8_t		 kv_flags;
118 
119 	struct kvlist		 kv_children;
120 	struct kv		*kv_parent;
121 	TAILQ_ENTRY(kv)		 kv_entry;
122 
123 	RB_ENTRY(kv)		 kv_node;
124 };
125 
126 struct portrange {
127 	in_port_t		 val[2];
128 	u_int8_t		 op;
129 };
130 
131 struct address {
132 	struct sockaddr_storage	 ss;
133 	int			 ipproto;
134 	int			 prefixlen;
135 	struct portrange	 port;
136 	char			 ifname[IFNAMSIZ];
137 	TAILQ_ENTRY(address)	 entry;
138 };
139 TAILQ_HEAD(addresslist, address);
140 
141 /* initially control.h */
142 struct control_sock {
143 	const char	*cs_name;
144 	struct event	 cs_ev;
145 	struct event	 cs_evt;
146 	int		 cs_fd;
147 	int		 cs_restricted;
148 	void		*cs_env;
149 
150 	TAILQ_ENTRY(control_sock) cs_entry;
151 };
152 TAILQ_HEAD(control_socks, control_sock);
153 
154 struct {
155 	struct event	 ev;
156 	int		 fd;
157 } control_state;
158 
159 enum blockmodes {
160 	BM_NORMAL,
161 	BM_NONBLOCK
162 };
163 
164 struct imsgev {
165 	struct imsgbuf		 ibuf;
166 	void			(*handler)(int, short, void *);
167 	struct event		 ev;
168 	struct privsep_proc	*proc;
169 	void			*data;
170 	short			 events;
171 };
172 
173 #define IMSG_SIZE_CHECK(imsg, p) do {				\
174 	if (IMSG_DATA_SIZE(imsg) < sizeof(*p))			\
175 		fatalx("bad length imsg received");		\
176 } while (0)
177 #define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
178 
179 struct ctl_conn {
180 	TAILQ_ENTRY(ctl_conn)	 entry;
181 	u_int8_t		 flags;
182 	u_int			 waiting;
183 #define CTL_CONN_NOTIFY		 0x01
184 	struct imsgev		 iev;
185 
186 };
187 TAILQ_HEAD(ctl_connlist, ctl_conn);
188 
189 enum imsg_type {
190 	IMSG_NONE,
191 	IMSG_CTL_OK,
192 	IMSG_CTL_FAIL,
193 	IMSG_CTL_VERBOSE,
194 	IMSG_CTL_RESET,
195 	IMSG_CTL_SHUTDOWN,
196 	IMSG_CTL_RELOAD,
197 	IMSG_CTL_NOTIFY,
198 	IMSG_CTL_END,
199 	IMSG_CTL_START,
200 	IMSG_CTL_REOPEN,
201 	IMSG_CFG_SERVER,
202 	IMSG_CFG_MEDIA,
203 	IMSG_CFG_AUTH,
204 	IMSG_CFG_DONE,
205 	IMSG_LOG_ACCESS,
206 	IMSG_LOG_ERROR,
207 	IMSG_LOG_OPEN
208 };
209 
210 enum privsep_procid {
211 	PROC_ALL	= -1,
212 	PROC_PARENT	= 0,
213 	PROC_SERVER,
214 	PROC_LOGGER,
215 	PROC_MAX
216 } privsep_process;
217 
218 /* Attach the control socket to the following process */
219 #define PROC_CONTROL	PROC_LOGGER
220 
221 struct privsep_pipes {
222 	int				*pp_pipes[PROC_MAX];
223 };
224 
225 struct privsep {
226 	struct privsep_pipes		*ps_pipes[PROC_MAX];
227 	struct privsep_pipes		*ps_pp;
228 
229 	struct imsgev			*ps_ievs[PROC_MAX];
230 	const char			*ps_title[PROC_MAX];
231 	pid_t				 ps_pid[PROC_MAX];
232 	u_int8_t			 ps_what[PROC_MAX];
233 
234 	u_int				 ps_instances[PROC_MAX];
235 	u_int				 ps_ninstances;
236 	u_int				 ps_instance;
237 
238 	struct control_sock		 ps_csock;
239 	struct control_socks		 ps_rcsocks;
240 
241 	/* Event and signal handlers */
242 	struct event			 ps_evsigint;
243 	struct event			 ps_evsigterm;
244 	struct event			 ps_evsigchld;
245 	struct event			 ps_evsighup;
246 	struct event			 ps_evsigpipe;
247 	struct event			 ps_evsigusr1;
248 
249 	int				 ps_noaction;
250 	struct passwd			*ps_pw;
251 	struct httpd			*ps_env;
252 };
253 
254 struct privsep_proc {
255 	const char		*p_title;
256 	enum privsep_procid	 p_id;
257 	int			(*p_cb)(int, struct privsep_proc *,
258 				    struct imsg *);
259 	pid_t			(*p_init)(struct privsep *,
260 				    struct privsep_proc *);
261 	void			(*p_shutdown)(void);
262 	u_int			 p_instance;
263 	const char		*p_chroot;
264 	struct privsep		*p_ps;
265 	struct httpd		*p_env;
266 };
267 
268 enum fcgistate {
269 	FCGI_READ_HEADER,
270 	FCGI_READ_CONTENT,
271 	FCGI_READ_PADDING
272 };
273 
274 struct client {
275 	u_int32_t		 clt_id;
276 	pid_t			 clt_pid;
277 	void			*clt_srv;
278 	void			*clt_srv_conf;
279 	u_int32_t		 clt_srv_id;
280 	struct sockaddr_storage	 clt_srv_ss;
281 
282 	int			 clt_s;
283 	in_port_t		 clt_port;
284 	struct sockaddr_storage	 clt_ss;
285 	struct bufferevent	*clt_bev;
286 	char			*clt_buf;
287 	size_t			 clt_buflen;
288 	struct evbuffer		*clt_output;
289 	struct event		 clt_ev;
290 	void			*clt_descreq;
291 	void			*clt_descresp;
292 	int			 clt_sndbufsiz;
293 
294 	int			 clt_fd;
295 	struct tls		*clt_tls_ctx;
296 	struct bufferevent	*clt_srvbev;
297 
298 	off_t			 clt_toread;
299 	size_t			 clt_headerlen;
300 	u_int			 clt_persist;
301 	int			 clt_line;
302 	int			 clt_done;
303 	int			 clt_chunk;
304 	int			 clt_inflight;
305 	enum fcgistate		 clt_fcgi_state;
306 	int			 clt_fcgi_toread;
307 	int			 clt_fcgi_padding_len;
308 	int			 clt_fcgi_type;
309 	int			 clt_fcgi_chunked;
310 	int			 clt_fcgi_end;
311 	char			*clt_remote_user;
312 	struct evbuffer		*clt_srvevb;
313 
314 	struct evbuffer		*clt_log;
315 	struct timeval		 clt_timeout;
316 	struct timeval		 clt_tv_start;
317 	struct timeval		 clt_tv_last;
318 	struct event		 clt_inflightevt;
319 
320 	SPLAY_ENTRY(client)	 clt_nodes;
321 };
322 SPLAY_HEAD(client_tree, client);
323 
324 #define SRVFLAG_INDEX		0x00000001
325 #define SRVFLAG_NO_INDEX	0x00000002
326 #define SRVFLAG_AUTO_INDEX	0x00000004
327 #define SRVFLAG_NO_AUTO_INDEX	0x00000008
328 #define SRVFLAG_ROOT		0x00000010
329 #define SRVFLAG_LOCATION	0x00000020
330 #define SRVFLAG_FCGI		0x00000040
331 #define SRVFLAG_NO_FCGI		0x00000080
332 #define SRVFLAG_LOG		0x00000100
333 #define SRVFLAG_NO_LOG		0x00000200
334 #define SRVFLAG_SOCKET		0x00000400
335 #define SRVFLAG_SYSLOG		0x00000800
336 #define SRVFLAG_NO_SYSLOG	0x00001000
337 #define SRVFLAG_TLS		0x00002000
338 #define SRVFLAG_ACCESS_LOG	0x00004000
339 #define SRVFLAG_ERROR_LOG	0x00008000
340 #define SRVFLAG_AUTH		0x00010000
341 #define SRVFLAG_NO_AUTH		0x00020000
342 #define SRVFLAG_BLOCK		0x00040000
343 #define SRVFLAG_NO_BLOCK	0x00080000
344 
345 #define SRVFLAG_BITS							\
346 	"\10\01INDEX\02NO_INDEX\03AUTO_INDEX\04NO_AUTO_INDEX"		\
347 	"\05ROOT\06LOCATION\07FCGI\10NO_FCGI\11LOG\12NO_LOG\13SOCKET"	\
348 	"\14SYSLOG\15NO_SYSLOG\16TLS\17ACCESS_LOG\20ERROR_LOG"		\
349 	"\21AUTH\22NO_AUTH\23BLOCK\24NO_BLOCK"
350 
351 #define TCPFLAG_NODELAY		0x01
352 #define TCPFLAG_NNODELAY	0x02
353 #define TCPFLAG_SACK		0x04
354 #define TCPFLAG_NSACK		0x08
355 #define TCPFLAG_BUFSIZ		0x10
356 #define TCPFLAG_IPTTL		0x20
357 #define TCPFLAG_IPMINTTL	0x40
358 #define TCPFLAG_NSPLICE		0x80
359 #define TCPFLAG_DEFAULT		0x00
360 
361 #define TCPFLAG_BITS						\
362 	"\10\01NODELAY\02NO_NODELAY\03SACK\04NO_SACK"		\
363 	"\05SOCKET_BUFFER_SIZE\06IP_TTL\07IP_MINTTL\10NO_SPLICE"
364 
365 enum log_format {
366 	LOG_FORMAT_COMMON,
367 	LOG_FORMAT_COMBINED,
368 	LOG_FORMAT_CONNECTION
369 };
370 
371 struct log_file {
372 	char			log_name[NAME_MAX];
373 	int			log_fd;
374 	u_int32_t		log_id;
375 	TAILQ_ENTRY(log_file)	log_entry;
376 };
377 TAILQ_HEAD(log_files, log_file) log_files;
378 
379 struct auth {
380 	char			 auth_htpasswd[PATH_MAX];
381 	u_int32_t		 auth_id;
382 	TAILQ_ENTRY(auth)	 auth_entry;
383 };
384 TAILQ_HEAD(serverauth, auth);
385 
386 struct server_config {
387 	u_int32_t		 id;
388 	u_int32_t		 parent_id;
389 	char			 name[HOST_NAME_MAX+1];
390 	char			 location[NAME_MAX];
391 	char			 index[NAME_MAX];
392 	char			 root[PATH_MAX];
393 	char			 socket[PATH_MAX];
394 	char			 accesslog[NAME_MAX];
395 	char			 errorlog[NAME_MAX];
396 
397 	in_port_t		 port;
398 	struct sockaddr_storage	 ss;
399 	int			 prefixlen;
400 	struct timeval		 timeout;
401 	u_int32_t		 maxrequests;
402 	size_t			 maxrequestbody;
403 
404 	u_int8_t		*tls_cert;
405 	size_t			 tls_cert_len;
406 	char			*tls_cert_file;
407 	char			 tls_ciphers[NAME_MAX];
408 	char			 tls_dhe_params[NAME_MAX];
409 	char			 tls_ecdhe_curve[NAME_MAX];
410 	u_int8_t		*tls_key;
411 	size_t			 tls_key_len;
412 	char			*tls_key_file;
413 	u_int32_t		 tls_protocols;
414 
415 	u_int32_t		 flags;
416 	int			 strip;
417 	u_int8_t		 tcpflags;
418 	int			 tcpbufsiz;
419 	int			 tcpbacklog;
420 	u_int8_t		 tcpipttl;
421 	u_int8_t		 tcpipminttl;
422 
423 	enum log_format		 logformat;
424 	struct log_file		*logaccess;
425 	struct log_file		*logerror;
426 
427 	char			 auth_realm[NAME_MAX];
428 	u_int32_t		 auth_id;
429 	struct auth		*auth;
430 
431 	int			 return_code;
432 	char			*return_uri;
433 	off_t			 return_uri_len;
434 
435 	TAILQ_ENTRY(server_config) entry;
436 };
437 TAILQ_HEAD(serverhosts, server_config);
438 
439 struct server {
440 	TAILQ_ENTRY(server)	 srv_entry;
441 	struct server_config	 srv_conf;
442 	struct serverhosts	 srv_hosts;
443 
444 	int			 srv_s;
445 	struct event		 srv_ev;
446 	struct event		 srv_evt;
447 
448 	struct tls		 *srv_tls_ctx;
449 	struct tls_config	 *srv_tls_config;
450 
451 	struct client_tree	 srv_clients;
452 };
453 TAILQ_HEAD(serverlist, server);
454 
455 struct media_type {
456 	char			 media_name[MEDIATYPE_NAMEMAX];
457 	char			 media_type[MEDIATYPE_TYPEMAX];
458 	char			 media_subtype[MEDIATYPE_TYPEMAX];
459 	char			*media_encoding;
460 	RB_ENTRY(media_type)	 media_entry;
461 };
462 RB_HEAD(mediatypes, media_type);
463 
464 struct httpd {
465 	u_int8_t		 sc_opts;
466 	u_int32_t		 sc_flags;
467 	const char		*sc_conffile;
468 	struct event		 sc_ev;
469 	u_int16_t		 sc_prefork_server;
470 	u_int16_t		 sc_id;
471 	int			 sc_paused;
472 	char			*sc_chroot;
473 	char			*sc_logdir;
474 
475 	struct serverlist	*sc_servers;
476 	struct mediatypes	*sc_mediatypes;
477 	struct serverauth	*sc_auth;
478 
479 	struct privsep		*sc_ps;
480 	int			 sc_reload;
481 };
482 
483 #define HTTPD_OPT_VERBOSE		0x01
484 #define HTTPD_OPT_NOACTION		0x04
485 
486 /* control.c */
487 int	 control_init(struct privsep *, struct control_sock *);
488 int	 control_listen(struct control_sock *);
489 void	 control_cleanup(struct control_sock *);
490 void	 control_dispatch_imsg(int, short, void *);
491 void	 control_imsg_forward(struct imsg *);
492 struct ctl_conn	*
493 	 control_connbyfd(int);
494 void	 socket_set_blockmode(int, enum blockmodes);
495 
496 extern  struct ctl_connlist ctl_conns;
497 
498 /* parse.y */
499 int	 parse_config(const char *, struct httpd *);
500 int	 load_config(const char *, struct httpd *);
501 int	 cmdline_symset(char *);
502 
503 /* server.c */
504 pid_t	 server(struct privsep *, struct privsep_proc *);
505 int	 server_tls_load_keypair(struct server *);
506 int	 server_privinit(struct server *);
507 void	 server_purge(struct server *);
508 void	 serverconfig_free(struct server_config *);
509 void	 serverconfig_reset(struct server_config *);
510 int	 server_socket_af(struct sockaddr_storage *, in_port_t);
511 in_port_t
512 	 server_socket_getport(struct sockaddr_storage *);
513 int	 server_socket_connect(struct sockaddr_storage *, in_port_t,
514 	    struct server_config *);
515 void	 server_write(struct bufferevent *, void *);
516 void	 server_read(struct bufferevent *, void *);
517 void	 server_error(struct bufferevent *, short, void *);
518 void	 server_log(struct client *, const char *);
519 void	 server_sendlog(struct server_config *, int, const char *, ...)
520 	    __attribute__((__format__ (printf, 3, 4)));
521 void	 server_close(struct client *, const char *);
522 void	 server_dump(struct client *, const void *, size_t);
523 int	 server_client_cmp(struct client *, struct client *);
524 int	 server_bufferevent_printf(struct client *, const char *, ...)
525 	    __attribute__((__format__ (printf, 2, 3)));
526 int	 server_bufferevent_print(struct client *, const char *);
527 int	 server_bufferevent_write_buffer(struct client *,
528 	    struct evbuffer *);
529 int	 server_bufferevent_write_chunk(struct client *,
530 	    struct evbuffer *, size_t);
531 int	 server_bufferevent_add(struct event *, int);
532 int	 server_bufferevent_write(struct client *, void *, size_t);
533 struct server *
534 	 server_byaddr(struct sockaddr *, in_port_t);
535 struct server_config *
536 	 serverconfig_byid(u_int32_t);
537 int	 server_foreach(int (*)(struct server *,
538 	    struct server_config *, void *), void *);
539 
540 SPLAY_PROTOTYPE(client_tree, client, clt_nodes, server_client_cmp);
541 
542 /* server_http.c */
543 void	 server_http_init(struct server *);
544 void	 server_http(struct httpd *);
545 int	 server_httpdesc_init(struct client *);
546 void	 server_read_http(struct bufferevent *, void *);
547 void	 server_abort_http(struct client *, u_int, const char *);
548 u_int	 server_httpmethod_byname(const char *);
549 const char
550 	*server_httpmethod_byid(u_int);
551 const char
552 	*server_httperror_byid(u_int);
553 void	 server_read_httpcontent(struct bufferevent *, void *);
554 void	 server_read_httpchunks(struct bufferevent *, void *);
555 int	 server_writeheader_http(struct client *clt, struct kv *, void *);
556 int	 server_headers(struct client *, void *,
557 	    int (*)(struct client *, struct kv *, void *), void *);
558 int	 server_writeresponse_http(struct client *);
559 int	 server_response_http(struct client *, u_int, struct media_type *,
560 	    size_t, time_t);
561 void	 server_reset_http(struct client *);
562 void	 server_close_http(struct client *);
563 int	 server_response(struct httpd *, struct client *);
564 const char *
565 	 server_root_strip(const char *, int);
566 struct server_config *
567 	 server_getlocation(struct client *, const char *);
568 const char *
569 	 server_http_host(struct sockaddr_storage *, char *, size_t);
570 char	*server_http_parsehost(char *, char *, size_t, int *);
571 ssize_t	 server_http_time(time_t, char *, size_t);
572 int	 server_log_http(struct client *, u_int, size_t);
573 
574 /* server_file.c */
575 int	 server_file(struct httpd *, struct client *);
576 void	 server_file_error(struct bufferevent *, short, void *);
577 
578 /* server_fcgi.c */
579 int	 server_fcgi(struct httpd *, struct client *);
580 int	 fcgi_add_stdin(struct client *, struct evbuffer *);
581 
582 /* httpd.c */
583 void		 event_again(struct event *, int, short,
584 		    void (*)(int, short, void *),
585 		    struct timeval *, struct timeval *, void *);
586 int		 expand_string(char *, size_t, const char *, const char *);
587 const char	*url_decode(char *);
588 char		*url_encode(const char *);
589 const char	*canonicalize_host(const char *, char *, size_t);
590 const char	*canonicalize_path(const char *, char *, size_t);
591 size_t		 path_info(char *);
592 char		*escape_html(const char *);
593 void		 imsg_event_add(struct imsgev *);
594 int		 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
595 		    pid_t, int, void *, u_int16_t);
596 void		 socket_rlimit(int);
597 char		*evbuffer_getline(struct evbuffer *);
598 char		*get_string(u_int8_t *, size_t);
599 void		*get_data(u_int8_t *, size_t);
600 int		 sockaddr_cmp(struct sockaddr *, struct sockaddr *, int);
601 struct in6_addr *prefixlen2mask6(u_int8_t, u_int32_t *);
602 u_int32_t	 prefixlen2mask(u_int8_t);
603 int		 accept_reserve(int, struct sockaddr *, socklen_t *, int,
604 		    volatile int *);
605 struct kv	*kv_add(struct kvtree *, char *, char *);
606 int		 kv_set(struct kv *, char *, ...);
607 int		 kv_setkey(struct kv *, char *, ...);
608 void		 kv_delete(struct kvtree *, struct kv *);
609 struct kv	*kv_extend(struct kvtree *, struct kv *, char *);
610 void		 kv_purge(struct kvtree *);
611 void		 kv_free(struct kv *);
612 struct kv	*kv_inherit(struct kv *, struct kv *);
613 int		 kv_log(struct evbuffer *, struct kv *);
614 struct kv	*kv_find(struct kvtree *, struct kv *);
615 int		 kv_cmp(struct kv *, struct kv *);
616 struct media_type
617 		*media_add(struct mediatypes *, struct media_type *);
618 void		 media_delete(struct mediatypes *, struct media_type *);
619 void		 media_purge(struct mediatypes *);
620 struct media_type *
621 		 media_find(struct mediatypes *, char *);
622 int		 media_cmp(struct media_type *, struct media_type *);
623 RB_PROTOTYPE(kvtree, kv, kv_node, kv_cmp);
624 RB_PROTOTYPE(mediatypes, media_type, media_entry, media_cmp);
625 struct auth	*auth_add(struct serverauth *, struct auth *);
626 struct auth	*auth_byid(struct serverauth *, u_int32_t);
627 void		 auth_free(struct serverauth *, struct auth *);
628 
629 /* log.c */
630 void	log_init(int);
631 void	log_verbose(int);
632 void	log_warn(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
633 void	log_warnx(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
634 void	log_info(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
635 void	log_debug(const char *, ...) __attribute__((__format__ (printf, 1, 2)));
636 void	logit(int, const char *, ...) __attribute__((__format__ (printf, 2, 3)));
637 void	vlog(int, const char *, va_list) __attribute__((__format__ (printf, 2, 0)));
638 __dead void fatal(const char *);
639 __dead void fatalx(const char *);
640 const char *print_host(struct sockaddr_storage *, char *, size_t);
641 const char *print_time(struct timeval *, struct timeval *, char *, size_t);
642 const char *printb_flags(const u_int32_t, const char *);
643 void	 getmonotime(struct timeval *);
644 
645 /* proc.c */
646 void	 proc_init(struct privsep *, struct privsep_proc *, u_int);
647 void	 proc_kill(struct privsep *);
648 void	 proc_listen(struct privsep *, struct privsep_proc *, size_t);
649 void	 proc_dispatch(int, short event, void *);
650 pid_t	 proc_run(struct privsep *, struct privsep_proc *,
651 	    struct privsep_proc *, u_int,
652 	    void (*)(struct privsep *, struct privsep_proc *, void *), void *);
653 void	 proc_range(struct privsep *, enum privsep_procid, int *, int *);
654 int	 proc_compose_imsg(struct privsep *, enum privsep_procid, int,
655 	    u_int16_t, int, void *, u_int16_t);
656 int	 proc_composev_imsg(struct privsep *, enum privsep_procid, int,
657 	    u_int16_t, int, const struct iovec *, int);
658 int	 proc_forward_imsg(struct privsep *, struct imsg *,
659 	    enum privsep_procid, int);
660 struct imsgbuf *
661 	 proc_ibuf(struct privsep *, enum privsep_procid, int);
662 struct imsgev *
663 	 proc_iev(struct privsep *, enum privsep_procid, int);
664 void	 imsg_event_add(struct imsgev *);
665 int	 imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
666 	    pid_t, int, void *, u_int16_t);
667 int	 imsg_composev_event(struct imsgev *, u_int16_t, u_int32_t,
668 	    pid_t, int, const struct iovec *, int);
669 
670 /* config.c */
671 int	 config_init(struct httpd *);
672 void	 config_purge(struct httpd *, u_int);
673 int	 config_setreset(struct httpd *, u_int);
674 int	 config_getreset(struct httpd *, struct imsg *);
675 int	 config_getcfg(struct httpd *, struct imsg *);
676 int	 config_setserver(struct httpd *, struct server *);
677 int	 config_getserver(struct httpd *, struct imsg *);
678 int	 config_setmedia(struct httpd *, struct media_type *);
679 int	 config_getmedia(struct httpd *, struct imsg *);
680 int	 config_setauth(struct httpd *, struct auth *);
681 int	 config_getauth(struct httpd *, struct imsg *);
682 
683 /* logger.c */
684 pid_t	 logger(struct privsep *, struct privsep_proc *);
685 int	 logger_open_priv(struct imsg *);
686 
687 #endif /* _HTTPD_H */
688