1 /* $OpenBSD: httpd.h,v 1.158 2021/10/24 16:01:04 ian 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 __OpenBSD__ 43 #include <unistd.h> 44 #define HOST_NAME_MAX _SC_HOST_NAME_MAX 45 #endif 46 #ifndef nitems 47 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 48 #endif 49 50 #define CONF_FILE "/usr/local/etc/obhttpd.conf" 51 #define HTTPD_SOCKET "/var/run/httpd.sock" 52 #define HTTPD_USER "www" 53 #define HTTPD_SERVERNAME "OpenBSD httpd" 54 #define HTTPD_DOCROOT "/htdocs" 55 #define HTTPD_ERRDOCTEMPLATE "err" /* 3-char name */ 56 #define HTTPD_ERRDOCROOT_MAX (PATH_MAX - sizeof("000.html")) 57 #define HTTPD_INDEX "index.html" 58 #define HTTPD_FCGI_SOCKET "/run/slowcgi.sock" 59 #define HTTPD_LOGROOT "/logs" 60 #define HTTPD_ACCESS_LOG "access.log" 61 #define HTTPD_ERROR_LOG "error.log" 62 #define HTTPD_MAX_ALIAS_IP 16 63 #define HTTPD_REALM_MAX 255 64 #define HTTPD_LOCATION_MAX 255 65 #define HTTPD_DEFAULT_TYPE { "bin", "application", "octet-stream", NULL } 66 #define HTTPD_LOGVIS VIS_NL|VIS_TAB|VIS_CSTYLE 67 #define HTTPD_TLS_CERT "/etc/ssl/server.crt" 68 #define HTTPD_TLS_KEY "/etc/ssl/private/server.key" 69 #define HTTPD_TLS_CONFIG_MAX 511 70 #define HTTPD_TLS_CIPHERS "compat" 71 #define HTTPD_TLS_DHE_PARAMS "none" 72 #define HTTPD_TLS_ECDHE_CURVES "default" 73 #define HTTPD_FCGI_NAME_MAX 511 74 #define HTTPD_FCGI_VAL_MAX 511 75 #define FD_RESERVE 5 76 77 #define SERVER_MAX_CLIENTS 1024 78 #define SERVER_TIMEOUT 600 79 #define SERVER_REQUESTTIMEOUT 60 80 #define SERVER_CACHESIZE -1 /* use default size */ 81 #define SERVER_NUMPROC 3 82 #define SERVER_MAXHEADERLENGTH 8192 83 #define SERVER_MAXREQUESTS 100 /* max requests per connection */ 84 #define SERVER_MAXREQUESTBODY 1048576 /* 1M */ 85 #define SERVER_BACKLOG 10 86 #define SERVER_OUTOF_FD_RETRIES 5 87 #define SERVER_MAX_PREFETCH 256 88 #define SERVER_MIN_PREFETCHED 32 89 #define SERVER_HSTS_DEFAULT_AGE 31536000 90 #define SERVER_MAX_RANGES 4 91 #define SERVER_DEF_TLS_LIFETIME (2 * 3600) 92 #define SERVER_MIN_TLS_LIFETIME (60) 93 #define SERVER_MAX_TLS_LIFETIME (24 * 3600) 94 95 #define MEDIATYPE_NAMEMAX 128 /* file name extension */ 96 #define MEDIATYPE_TYPEMAX 64 /* length of type/subtype */ 97 98 #define CONFIG_RELOAD 0x00 99 #define CONFIG_MEDIA 0x01 100 #define CONFIG_SERVERS 0x02 101 #define CONFIG_AUTH 0x04 102 #define CONFIG_ALL 0xff 103 104 #define FCGI_CONTENT_SIZE 65535 105 #define FCGI_DEFAULT_PORT "9000" 106 107 #define PROC_PARENT_SOCK_FILENO 3 108 #define PROC_MAX_INSTANCES 32 109 110 enum httpchunk { 111 TOREAD_UNLIMITED = -1, 112 TOREAD_HTTP_HEADER = -2, 113 TOREAD_HTTP_CHUNK_LENGTH = -3, 114 TOREAD_HTTP_CHUNK_TRAILER = -4, 115 TOREAD_HTTP_NONE = -5, 116 TOREAD_HTTP_RANGE = TOREAD_HTTP_CHUNK_LENGTH 117 }; 118 119 #if DEBUG 120 #define DPRINTF log_debug 121 #else 122 #define DPRINTF(x...) do {} while(0) 123 #endif 124 125 struct ctl_flags { 126 uint8_t cf_opts; 127 uint32_t cf_flags; 128 uint8_t cf_tls_sid[TLS_MAX_SESSION_ID_LENGTH]; 129 }; 130 131 TAILQ_HEAD(kvlist, kv); 132 RB_HEAD(kvtree, kv); 133 134 struct kv { 135 char *kv_key; 136 char *kv_value; 137 138 #define KV_FLAG_INVALID 0x01 139 #define KV_FLAG_GLOBBING 0x02 140 uint8_t kv_flags; 141 142 struct kvlist kv_children; 143 struct kv *kv_parent; 144 TAILQ_ENTRY(kv) kv_entry; 145 146 RB_ENTRY(kv) kv_node; 147 }; 148 149 struct portrange { 150 in_port_t val[2]; 151 uint8_t op; 152 }; 153 154 struct address { 155 struct sockaddr_storage ss; 156 int ipproto; 157 int prefixlen; 158 struct portrange port; 159 char ifname[IFNAMSIZ]; 160 TAILQ_ENTRY(address) entry; 161 }; 162 TAILQ_HEAD(addresslist, address); 163 164 /* initially control.h */ 165 struct control_sock { 166 const char *cs_name; 167 struct event cs_ev; 168 struct event cs_evt; 169 int cs_fd; 170 int cs_restricted; 171 void *cs_env; 172 173 TAILQ_ENTRY(control_sock) cs_entry; 174 }; 175 TAILQ_HEAD(control_socks, control_sock); 176 177 extern struct { 178 struct event ev; 179 int fd; 180 } control_state; 181 182 struct imsgev { 183 struct imsgbuf ibuf; 184 void (*handler)(int, short, void *); 185 struct event ev; 186 struct privsep_proc *proc; 187 void *data; 188 short events; 189 }; 190 191 #define IMSG_SIZE_CHECK(imsg, p) do { \ 192 if (IMSG_DATA_SIZE(imsg) < sizeof(*p)) \ 193 fatalx("bad length imsg received"); \ 194 } while (0) 195 #define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) 196 #define MAX_IMSG_DATA_SIZE (MAX_IMSGSIZE - IMSG_HEADER_SIZE) 197 198 struct ctl_conn { 199 TAILQ_ENTRY(ctl_conn) entry; 200 uint8_t flags; 201 unsigned int waiting; 202 #define CTL_CONN_NOTIFY 0x01 203 struct imsgev iev; 204 205 }; 206 TAILQ_HEAD(ctl_connlist, ctl_conn); 207 208 enum imsg_type { 209 IMSG_NONE, 210 IMSG_CTL_OK, 211 IMSG_CTL_FAIL, 212 IMSG_CTL_VERBOSE, 213 IMSG_CTL_PROCFD, 214 IMSG_CTL_RESET, 215 IMSG_CTL_SHUTDOWN, 216 IMSG_CTL_RELOAD, 217 IMSG_CTL_NOTIFY, 218 IMSG_CTL_END, 219 IMSG_CTL_START, 220 IMSG_CTL_REOPEN, 221 IMSG_CFG_SERVER, 222 IMSG_CFG_TLS, 223 IMSG_CFG_MEDIA, 224 IMSG_CFG_AUTH, 225 IMSG_CFG_FCGI, 226 IMSG_CFG_DONE, 227 IMSG_LOG_ACCESS, 228 IMSG_LOG_ERROR, 229 IMSG_LOG_OPEN, 230 IMSG_TLSTICKET_REKEY 231 }; 232 233 enum privsep_procid { 234 PROC_ALL = -1, 235 PROC_PARENT = 0, 236 PROC_SERVER, 237 PROC_LOGGER, 238 PROC_MAX 239 }; 240 extern enum privsep_procid privsep_process; 241 242 /* Attach the control socket to the following process */ 243 #define PROC_CONTROL PROC_LOGGER 244 245 struct privsep_pipes { 246 int *pp_pipes[PROC_MAX]; 247 }; 248 249 struct privsep { 250 struct privsep_pipes *ps_pipes[PROC_MAX]; 251 struct privsep_pipes *ps_pp; 252 253 struct imsgev *ps_ievs[PROC_MAX]; 254 const char *ps_title[PROC_MAX]; 255 uint8_t ps_what[PROC_MAX]; 256 257 unsigned int ps_instances[PROC_MAX]; 258 unsigned int ps_instance; 259 260 struct control_sock ps_csock; 261 struct control_socks ps_rcsocks; 262 263 /* Event and signal handlers */ 264 struct event ps_evsigint; 265 struct event ps_evsigterm; 266 struct event ps_evsigchld; 267 struct event ps_evsighup; 268 struct event ps_evsigpipe; 269 struct event ps_evsigusr1; 270 271 int ps_noaction; 272 struct passwd *ps_pw; 273 struct httpd *ps_env; 274 }; 275 276 struct privsep_proc { 277 const char *p_title; 278 enum privsep_procid p_id; 279 int (*p_cb)(int, struct privsep_proc *, 280 struct imsg *); 281 void (*p_init)(struct privsep *, 282 struct privsep_proc *); 283 const char *p_chroot; 284 struct privsep *p_ps; 285 void (*p_shutdown)(void); 286 struct passwd *p_pw; 287 }; 288 289 struct privsep_fd { 290 enum privsep_procid pf_procid; 291 unsigned int pf_instance; 292 }; 293 294 enum fcgistate { 295 FCGI_READ_HEADER, 296 FCGI_READ_CONTENT, 297 FCGI_READ_PADDING 298 }; 299 300 struct fcgi_data { 301 enum fcgistate state; 302 int toread; 303 int padding_len; 304 int type; 305 int chunked; 306 int end; 307 int status; 308 int headersdone; 309 int headerssent; 310 }; 311 312 struct range { 313 off_t start; 314 off_t end; 315 }; 316 317 struct range_data { 318 struct range range[SERVER_MAX_RANGES]; 319 int range_count; 320 int range_index; 321 off_t range_toread; 322 323 /* For the Content headers in each part */ 324 struct media_type *range_media; 325 size_t range_total; 326 }; 327 328 struct client { 329 uint32_t clt_id; 330 pid_t clt_pid; 331 void *clt_srv; 332 void *clt_srv_conf; 333 uint32_t clt_srv_id; 334 struct sockaddr_storage clt_srv_ss; 335 struct str_match clt_srv_match; 336 337 int clt_s; 338 in_port_t clt_port; 339 struct sockaddr_storage clt_ss; 340 struct bufferevent *clt_bev; 341 struct evbuffer *clt_output; 342 struct event clt_ev; 343 void *clt_descreq; 344 void *clt_descresp; 345 int clt_sndbufsiz; 346 uint64_t clt_boundary; 347 348 int clt_fd; 349 struct tls *clt_tls_ctx; 350 struct bufferevent *clt_srvbev; 351 int clt_srvbev_throttled; 352 353 off_t clt_toread; 354 size_t clt_headerlen; 355 int clt_headersdone; 356 unsigned int clt_persist; 357 unsigned int clt_pipelining; 358 int clt_line; 359 int clt_done; 360 int clt_chunk; 361 int clt_inflight; 362 struct range_data clt_ranges; 363 struct fcgi_data clt_fcgi; 364 char *clt_remote_user; 365 struct evbuffer *clt_srvevb; 366 367 struct evbuffer *clt_log; 368 struct timeval clt_timeout; 369 struct timeval clt_tv_start; 370 struct timeval clt_tv_last; 371 struct event clt_inflightevt; 372 373 SPLAY_ENTRY(client) clt_nodes; 374 }; 375 SPLAY_HEAD(client_tree, client); 376 377 #define SRVFLAG_INDEX 0x00000001 378 #define SRVFLAG_NO_INDEX 0x00000002 379 #define SRVFLAG_AUTO_INDEX 0x00000004 380 #define SRVFLAG_NO_AUTO_INDEX 0x00000008 381 #define SRVFLAG_ROOT 0x00000010 382 #define SRVFLAG_LOCATION 0x00000020 383 #define SRVFLAG_FCGI 0x00000040 384 #define SRVFLAG_NO_FCGI 0x00000080 385 #define SRVFLAG_LOG 0x00000100 386 #define SRVFLAG_NO_LOG 0x00000200 387 #define SRVFLAG_ERRDOCS 0x00000400 388 #define SRVFLAG_SYSLOG 0x00000800 389 #define SRVFLAG_NO_SYSLOG 0x00001000 390 #define SRVFLAG_TLS 0x00002000 391 #define SRVFLAG_ACCESS_LOG 0x00004000 392 #define SRVFLAG_ERROR_LOG 0x00008000 393 #define SRVFLAG_AUTH 0x00010000 394 #define SRVFLAG_NO_AUTH 0x00020000 395 #define SRVFLAG_BLOCK 0x00040000 396 #define SRVFLAG_NO_BLOCK 0x00080000 397 #define SRVFLAG_LOCATION_MATCH 0x00100000 398 #define SRVFLAG_SERVER_MATCH 0x00200000 399 #define SRVFLAG_SERVER_HSTS 0x00400000 400 #define SRVFLAG_DEFAULT_TYPE 0x00800000 401 #define SRVFLAG_PATH_REWRITE 0x01000000 402 #define SRVFLAG_NO_PATH_REWRITE 0x02000000 403 #define SRVFLAG_LOCATION_FOUND 0x40000000 404 #define SRVFLAG_LOCATION_NOT_FOUND 0x80000000 405 406 #define SRVFLAG_BITS \ 407 "\10\01INDEX\02NO_INDEX\03AUTO_INDEX\04NO_AUTO_INDEX" \ 408 "\05ROOT\06LOCATION\07FCGI\10NO_FCGI\11LOG\12NO_LOG\13ERRDOCS" \ 409 "\14SYSLOG\15NO_SYSLOG\16TLS\17ACCESS_LOG\20ERROR_LOG" \ 410 "\21AUTH\22NO_AUTH\23BLOCK\24NO_BLOCK\25LOCATION_MATCH" \ 411 "\26SERVER_MATCH\27SERVER_HSTS\30DEFAULT_TYPE\31PATH\32NO_PATH" \ 412 "\37LOCATION_FOUND\40LOCATION_NOT_FOUND" 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 extern 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 accesslog[PATH_MAX]; 491 char errorlog[PATH_MAX]; 492 struct media_type default_type; 493 494 struct sockaddr_storage fastcgi_ss; 495 496 in_port_t port; 497 struct sockaddr_storage ss; 498 int prefixlen; 499 struct timeval timeout; 500 struct timeval requesttimeout; 501 uint32_t maxrequests; 502 size_t maxrequestbody; 503 504 uint8_t *tls_ca; 505 char *tls_ca_file; 506 size_t tls_ca_len; 507 uint8_t *tls_cert; 508 size_t tls_cert_len; 509 char *tls_cert_file; 510 char tls_ciphers[HTTPD_TLS_CONFIG_MAX]; 511 uint8_t *tls_crl; 512 char *tls_crl_file; 513 size_t tls_crl_len; 514 char tls_dhe_params[HTTPD_TLS_CONFIG_MAX]; 515 char tls_ecdhe_curves[HTTPD_TLS_CONFIG_MAX]; 516 uint8_t tls_flags; 517 uint8_t *tls_key; 518 size_t tls_key_len; 519 char *tls_key_file; 520 uint32_t tls_protocols; 521 uint8_t *tls_ocsp_staple; 522 size_t tls_ocsp_staple_len; 523 char *tls_ocsp_staple_file; 524 struct server_tls_ticket tls_ticket_key; 525 int tls_ticket_lifetime; 526 527 uint32_t flags; 528 int strip; 529 uint8_t tcpflags; 530 int tcpbufsiz; 531 int tcpbacklog; 532 uint8_t tcpipttl; 533 uint8_t tcpipminttl; 534 535 enum log_format logformat; 536 struct log_file *logaccess; 537 struct log_file *logerror; 538 539 char auth_realm[HTTPD_REALM_MAX]; 540 uint32_t auth_id; 541 const struct auth *auth; 542 543 int return_code; 544 char *return_uri; 545 off_t return_uri_len; 546 547 int hsts_max_age; 548 uint8_t hsts_flags; 549 550 struct server_fcgiparams fcgiparams; 551 int fcgistrip; 552 char errdocroot[HTTPD_ERRDOCROOT_MAX]; 553 554 TAILQ_ENTRY(server_config) entry; 555 }; 556 TAILQ_HEAD(serverhosts, server_config); 557 558 enum tls_config_type { 559 TLS_CFG_CA, 560 TLS_CFG_CERT, 561 TLS_CFG_CRL, 562 TLS_CFG_KEY, 563 TLS_CFG_OCSP_STAPLE, 564 }; 565 566 struct tls_config { 567 uint32_t id; 568 569 enum tls_config_type tls_type; 570 size_t tls_len; 571 size_t tls_chunk_len; 572 size_t tls_chunk_offset; 573 }; 574 575 struct server { 576 TAILQ_ENTRY(server) srv_entry; 577 struct server_config srv_conf; 578 struct serverhosts srv_hosts; 579 580 int srv_s; 581 struct event srv_ev; 582 struct event srv_evt; 583 584 struct tls *srv_tls_ctx; 585 struct tls_config *srv_tls_config; 586 587 struct client_tree srv_clients; 588 }; 589 TAILQ_HEAD(serverlist, server); 590 591 struct httpd { 592 uint8_t sc_opts; 593 uint32_t sc_flags; 594 const char *sc_conffile; 595 struct event sc_ev; 596 uint16_t sc_prefork_server; 597 uint16_t sc_id; 598 int sc_paused; 599 char *sc_chroot; 600 char *sc_logdir; 601 602 uint8_t sc_tls_sid[TLS_MAX_SESSION_ID_LENGTH]; 603 604 struct serverlist *sc_servers; 605 struct mediatypes *sc_mediatypes; 606 struct media_type sc_default_type; 607 struct serverauth *sc_auth; 608 609 struct privsep *sc_ps; 610 int sc_reload; 611 612 int sc_custom_errdocs; 613 char sc_errdocroot[HTTPD_ERRDOCROOT_MAX]; 614 }; 615 616 #define HTTPD_OPT_VERBOSE 0x01 617 #define HTTPD_OPT_NOACTION 0x04 618 619 /* control.c */ 620 int control_init(struct privsep *, struct control_sock *); 621 int control_listen(struct control_sock *); 622 void control_cleanup(struct control_sock *); 623 void control_dispatch_imsg(int, short, void *); 624 void control_imsg_forward(struct privsep *, struct imsg *); 625 struct ctl_conn * 626 control_connbyfd(int); 627 628 /* parse.y */ 629 int parse_config(const char *, struct httpd *); 630 int load_config(const char *, struct httpd *); 631 int cmdline_symset(char *); 632 633 /* server.c */ 634 void server(struct privsep *, struct privsep_proc *); 635 int server_tls_cmp(struct server *, struct server *); 636 int server_tls_load_ca(struct server *); 637 int server_tls_load_crl(struct server *); 638 int server_tls_load_keypair(struct server *); 639 int server_tls_load_ocsp(struct server *); 640 void server_generate_ticket_key(struct server_config *); 641 int server_privinit(struct server *); 642 void server_purge(struct server *); 643 void serverconfig_free(struct server_config *); 644 void serverconfig_reset(struct server_config *); 645 int server_socket_af(struct sockaddr_storage *, in_port_t); 646 in_port_t 647 server_socket_getport(struct sockaddr_storage *); 648 int server_socket_connect(struct sockaddr_storage *, in_port_t, 649 struct server_config *); 650 void server_write(struct bufferevent *, void *); 651 void server_read(struct bufferevent *, void *); 652 void server_error(struct bufferevent *, short, void *); 653 void server_log(struct client *, const char *); 654 void server_sendlog(struct server_config *, int, const char *, ...) 655 __attribute__((__format__ (printf, 3, 4))); 656 void server_close(struct client *, const char *); 657 void server_dump(struct client *, const void *, size_t); 658 int server_client_cmp(struct client *, struct client *); 659 int server_bufferevent_printf(struct client *, const char *, ...) 660 __attribute__((__format__ (printf, 2, 3))); 661 int server_bufferevent_print(struct client *, const char *); 662 int server_bufferevent_write_buffer(struct client *, 663 struct evbuffer *); 664 int server_bufferevent_write_chunk(struct client *, 665 struct evbuffer *, size_t); 666 int server_bufferevent_add(struct event *, int); 667 int server_bufferevent_write(struct client *, void *, size_t); 668 struct server * 669 server_byaddr(struct sockaddr *, in_port_t); 670 struct server_config * 671 serverconfig_byid(uint32_t); 672 int server_foreach(int (*)(struct server *, 673 struct server_config *, void *), void *); 674 struct server * 675 server_match(struct server *, int); 676 677 SPLAY_PROTOTYPE(client_tree, client, clt_nodes, server_client_cmp); 678 679 /* server_http.c */ 680 void server_http_init(struct server *); 681 void server_http(void); 682 int server_httpdesc_init(struct client *); 683 void server_read_http(struct bufferevent *, void *); 684 void server_abort_http(struct client *, unsigned int, const char *); 685 unsigned int 686 server_httpmethod_byname(const char *); 687 const char 688 *server_httpmethod_byid(unsigned int); 689 const char 690 *server_httperror_byid(unsigned int); 691 void server_read_httpcontent(struct bufferevent *, void *); 692 void server_read_httpchunks(struct bufferevent *, void *); 693 void server_read_httprange(struct bufferevent *, void *); 694 int server_writeheader_http(struct client *clt, struct kv *, void *); 695 int server_headers(struct client *, void *, 696 int (*)(struct client *, struct kv *, void *), void *); 697 int server_writeresponse_http(struct client *); 698 int server_response_http(struct client *, unsigned int, 699 struct media_type *, off_t, time_t); 700 void server_reset_http(struct client *); 701 void server_close_http(struct client *); 702 int server_response(struct httpd *, struct client *); 703 const char * 704 server_root_strip(const char *, int); 705 struct server_config * 706 server_getlocation(struct client *, const char *); 707 int server_locationaccesstest(struct server_config *, const char *); 708 const char * 709 server_http_host(struct sockaddr_storage *, char *, size_t); 710 char *server_http_parsehost(char *, char *, size_t, int *); 711 ssize_t server_http_time(time_t, char *, size_t); 712 int server_log_http(struct client *, unsigned int, size_t); 713 714 /* server_file.c */ 715 int server_file(struct httpd *, struct client *); 716 void server_file_error(struct bufferevent *, short, void *); 717 718 /* server_fcgi.c */ 719 int server_fcgi(struct httpd *, struct client *); 720 int fcgi_add_stdin(struct client *, struct evbuffer *); 721 722 /* httpd.c */ 723 void event_again(struct event *, int, short, 724 void (*)(int, short, void *), 725 struct timeval *, struct timeval *, void *); 726 int expand_string(char *, size_t, const char *, const char *); 727 const char *url_decode(char *); 728 char *url_encode(const char *); 729 const char *canonicalize_path(const char *, char *, size_t); 730 size_t path_info(char *); 731 char *escape_html(const char *); 732 void socket_rlimit(int); 733 char *evbuffer_getline(struct evbuffer *); 734 char *get_string(uint8_t *, size_t); 735 void *get_data(uint8_t *, size_t); 736 int sockaddr_cmp(struct sockaddr *, struct sockaddr *, int); 737 struct in6_addr *prefixlen2mask6(uint8_t, uint32_t *); 738 uint32_t prefixlen2mask(uint8_t); 739 int accept_reserve(int, struct sockaddr *, socklen_t *, int, 740 volatile int *); 741 struct kv *kv_add(struct kvtree *, char *, char *); 742 int kv_set(struct kv *, char *, ...) 743 __attribute__((__format__ (printf, 2, 3))); 744 int kv_setkey(struct kv *, char *, ...) 745 __attribute__((__format__ (printf, 2, 3))); 746 void kv_delete(struct kvtree *, struct kv *); 747 struct kv *kv_extend(struct kvtree *, struct kv *, char *); 748 void kv_purge(struct kvtree *); 749 void kv_free(struct kv *); 750 struct kv *kv_find(struct kvtree *, struct kv *); 751 int kv_cmp(struct kv *, struct kv *); 752 struct media_type 753 *media_add(struct mediatypes *, struct media_type *); 754 void media_delete(struct mediatypes *, struct media_type *); 755 void media_purge(struct mediatypes *); 756 struct media_type * 757 media_find(struct mediatypes *, const char *); 758 struct media_type * 759 media_find_config(struct httpd *, struct server_config *, 760 const char *); 761 int media_cmp(struct media_type *, struct media_type *); 762 RB_PROTOTYPE(kvtree, kv, kv_node, kv_cmp); 763 RB_PROTOTYPE(mediatypes, media_type, media_entry, media_cmp); 764 struct auth *auth_add(struct serverauth *, struct auth *); 765 struct auth *auth_byid(struct serverauth *, uint32_t); 766 void auth_free(struct serverauth *, struct auth *); 767 const char *print_host(struct sockaddr_storage *, 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