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