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