Annotation of embedaddon/lighttpd/src/base.h, revision 1.1
1.1 ! misho 1: #ifndef _BASE_H_
! 2: #define _BASE_H_
! 3:
! 4: #ifdef HAVE_CONFIG_H
! 5: # include "config.h"
! 6: #endif
! 7: #include "settings.h"
! 8:
! 9: #include <sys/types.h>
! 10: #include <sys/time.h>
! 11: #include <sys/stat.h>
! 12:
! 13: #include <limits.h>
! 14:
! 15: #ifdef HAVE_STDINT_H
! 16: # include <stdint.h>
! 17: #endif
! 18:
! 19: #ifdef HAVE_INTTYPES_H
! 20: # include <inttypes.h>
! 21: #endif
! 22:
! 23: #include "buffer.h"
! 24: #include "array.h"
! 25: #include "chunk.h"
! 26: #include "keyvalue.h"
! 27: #include "fdevent.h"
! 28: #include "sys-socket.h"
! 29: #include "splaytree.h"
! 30: #include "etag.h"
! 31:
! 32:
! 33: #if defined HAVE_LIBSSL && defined HAVE_OPENSSL_SSL_H
! 34: # define USE_OPENSSL
! 35: # include <openssl/ssl.h>
! 36: # if ! defined OPENSSL_NO_TLSEXT && ! defined SSL_CTRL_SET_TLSEXT_HOSTNAME
! 37: # define OPENSSL_NO_TLSEXT
! 38: # endif
! 39: #endif
! 40:
! 41: #ifdef HAVE_FAM_H
! 42: # include <fam.h>
! 43: #endif
! 44:
! 45: #ifndef O_BINARY
! 46: # define O_BINARY 0
! 47: #endif
! 48:
! 49: #ifndef O_LARGEFILE
! 50: # define O_LARGEFILE 0
! 51: #endif
! 52:
! 53: #ifndef SIZE_MAX
! 54: # ifdef SIZE_T_MAX
! 55: # define SIZE_MAX SIZE_T_MAX
! 56: # else
! 57: # define SIZE_MAX ((size_t)~0)
! 58: # endif
! 59: #endif
! 60:
! 61: #ifndef SSIZE_MAX
! 62: # define SSIZE_MAX ((size_t)~0 >> 1)
! 63: #endif
! 64:
! 65: #ifdef __APPLE__
! 66: #include <crt_externs.h>
! 67: #define environ (* _NSGetEnviron())
! 68: #else
! 69: extern char **environ;
! 70: #endif
! 71:
! 72: /* for solaris 2.5 and NetBSD 1.3.x */
! 73: #ifndef HAVE_SOCKLEN_T
! 74: typedef int socklen_t;
! 75: #endif
! 76:
! 77: /* solaris and NetBSD 1.3.x again */
! 78: #if (!defined(HAVE_STDINT_H)) && (!defined(HAVE_INTTYPES_H)) && (!defined(uint32_t))
! 79: # define uint32_t u_int32_t
! 80: #endif
! 81:
! 82:
! 83: #ifndef SHUT_WR
! 84: # define SHUT_WR 1
! 85: #endif
! 86:
! 87: typedef enum { T_CONFIG_UNSET,
! 88: T_CONFIG_STRING,
! 89: T_CONFIG_SHORT,
! 90: T_CONFIG_INT,
! 91: T_CONFIG_BOOLEAN,
! 92: T_CONFIG_ARRAY,
! 93: T_CONFIG_LOCAL,
! 94: T_CONFIG_DEPRECATED,
! 95: T_CONFIG_UNSUPPORTED
! 96: } config_values_type_t;
! 97:
! 98: typedef enum { T_CONFIG_SCOPE_UNSET,
! 99: T_CONFIG_SCOPE_SERVER,
! 100: T_CONFIG_SCOPE_CONNECTION
! 101: } config_scope_type_t;
! 102:
! 103: typedef struct {
! 104: const char *key;
! 105: void *destination;
! 106:
! 107: config_values_type_t type;
! 108: config_scope_type_t scope;
! 109: } config_values_t;
! 110:
! 111: typedef enum { DIRECT, EXTERNAL } connection_type;
! 112:
! 113: typedef struct {
! 114: char *key;
! 115: connection_type type;
! 116: char *value;
! 117: } request_handler;
! 118:
! 119: typedef struct {
! 120: char *key;
! 121: char *host;
! 122: unsigned short port;
! 123: int used;
! 124: short factor;
! 125: } fcgi_connections;
! 126:
! 127:
! 128: typedef union {
! 129: #ifdef HAVE_IPV6
! 130: struct sockaddr_in6 ipv6;
! 131: #endif
! 132: struct sockaddr_in ipv4;
! 133: #ifdef HAVE_SYS_UN_H
! 134: struct sockaddr_un un;
! 135: #endif
! 136: struct sockaddr plain;
! 137: } sock_addr;
! 138:
! 139: /* fcgi_response_header contains ... */
! 140: #define HTTP_STATUS BV(0)
! 141: #define HTTP_CONNECTION BV(1)
! 142: #define HTTP_CONTENT_LENGTH BV(2)
! 143: #define HTTP_DATE BV(3)
! 144: #define HTTP_LOCATION BV(4)
! 145:
! 146: typedef struct {
! 147: /** HEADER */
! 148: /* the request-line */
! 149: buffer *request;
! 150: buffer *uri;
! 151:
! 152: buffer *orig_uri;
! 153:
! 154: http_method_t http_method;
! 155: http_version_t http_version;
! 156:
! 157: buffer *request_line;
! 158:
! 159: /* strings to the header */
! 160: buffer *http_host; /* not alloced */
! 161: const char *http_range;
! 162: const char *http_content_type;
! 163: const char *http_if_modified_since;
! 164: const char *http_if_none_match;
! 165:
! 166: array *headers;
! 167:
! 168: /* CONTENT */
! 169: size_t content_length; /* returned by strtoul() */
! 170:
! 171: /* internal representation */
! 172: int accept_encoding;
! 173:
! 174: /* internal */
! 175: buffer *pathinfo;
! 176: } request;
! 177:
! 178: typedef struct {
! 179: off_t content_length;
! 180: int keep_alive; /* used by the subrequests in proxy, cgi and fcgi to say the subrequest was keep-alive or not */
! 181:
! 182: array *headers;
! 183:
! 184: enum {
! 185: HTTP_TRANSFER_ENCODING_IDENTITY, HTTP_TRANSFER_ENCODING_CHUNKED
! 186: } transfer_encoding;
! 187: } response;
! 188:
! 189: typedef struct {
! 190: buffer *scheme; /* scheme without colon or slashes ( "http" or "https" ) */
! 191:
! 192: /* authority with optional portnumber ("site.name" or "site.name:8080" ) NOTE: without "username:password@" */
! 193: buffer *authority;
! 194:
! 195: /* path including leading slash ("/" or "/index.html") - urldecoded, and sanitized ( buffer_path_simplify() && buffer_urldecode_path() ) */
! 196: buffer *path;
! 197: buffer *path_raw; /* raw path, as sent from client. no urldecoding or path simplifying */
! 198: buffer *query; /* querystring ( everything after "?", ie: in "/index.php?foo=1", query is "foo=1" ) */
! 199: } request_uri;
! 200:
! 201: typedef struct {
! 202: buffer *path;
! 203: buffer *basedir; /* path = "(basedir)(.*)" */
! 204:
! 205: buffer *doc_root; /* path = doc_root + rel_path */
! 206: buffer *rel_path;
! 207:
! 208: buffer *etag;
! 209: } physical;
! 210:
! 211: typedef struct {
! 212: buffer *name;
! 213: buffer *etag;
! 214:
! 215: struct stat st;
! 216:
! 217: time_t stat_ts;
! 218:
! 219: #ifdef HAVE_LSTAT
! 220: char is_symlink;
! 221: #endif
! 222:
! 223: #ifdef HAVE_FAM_H
! 224: int dir_version;
! 225: int dir_ndx;
! 226: #endif
! 227:
! 228: buffer *content_type;
! 229: } stat_cache_entry;
! 230:
! 231: typedef struct {
! 232: splay_tree *files; /* the nodes of the tree are stat_cache_entry's */
! 233:
! 234: buffer *dir_name; /* for building the dirname from the filename */
! 235: #ifdef HAVE_FAM_H
! 236: splay_tree *dirs; /* the nodes of the tree are fam_dir_entry */
! 237:
! 238: FAMConnection *fam;
! 239: int fam_fcce_ndx;
! 240: #endif
! 241: buffer *hash_key; /* temp-store for the hash-key */
! 242: } stat_cache;
! 243:
! 244: typedef struct {
! 245: array *mimetypes;
! 246:
! 247: /* virtual-servers */
! 248: buffer *document_root;
! 249: buffer *server_name;
! 250: buffer *error_handler;
! 251: buffer *server_tag;
! 252: buffer *dirlist_encoding;
! 253: buffer *errorfile_prefix;
! 254:
! 255: unsigned short max_keep_alive_requests;
! 256: unsigned short max_keep_alive_idle;
! 257: unsigned short max_read_idle;
! 258: unsigned short max_write_idle;
! 259: unsigned short use_xattr;
! 260: unsigned short follow_symlink;
! 261: unsigned short range_requests;
! 262:
! 263: /* debug */
! 264:
! 265: unsigned short log_file_not_found;
! 266: unsigned short log_request_header;
! 267: unsigned short log_request_handling;
! 268: unsigned short log_response_header;
! 269: unsigned short log_condition_handling;
! 270: unsigned short log_ssl_noise;
! 271: unsigned short log_timeouts;
! 272:
! 273:
! 274: /* server wide */
! 275: buffer *ssl_pemfile;
! 276: buffer *ssl_ca_file;
! 277: buffer *ssl_cipher_list;
! 278: buffer *ssl_dh_file;
! 279: buffer *ssl_ec_curve;
! 280: unsigned short ssl_honor_cipher_order; /* determine SSL cipher in server-preferred order, not client-order */
! 281: unsigned short ssl_empty_fragments; /* whether to not set SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS */
! 282: unsigned short ssl_use_sslv2;
! 283: unsigned short ssl_use_sslv3;
! 284: unsigned short ssl_verifyclient;
! 285: unsigned short ssl_verifyclient_enforce;
! 286: unsigned short ssl_verifyclient_depth;
! 287: buffer *ssl_verifyclient_username;
! 288: unsigned short ssl_verifyclient_export_cert;
! 289: unsigned short ssl_disable_client_renegotiation;
! 290:
! 291: unsigned short use_ipv6, set_v6only; /* set_v6only is only a temporary option */
! 292: unsigned short defer_accept;
! 293: unsigned short ssl_enabled; /* only interesting for setting up listening sockets. don't use at runtime */
! 294: unsigned short allow_http11;
! 295: unsigned short etag_use_inode;
! 296: unsigned short etag_use_mtime;
! 297: unsigned short etag_use_size;
! 298: unsigned short force_lowercase_filenames; /* if the FS is case-insensitive, force all files to lower-case */
! 299: unsigned int max_request_size;
! 300:
! 301: unsigned short kbytes_per_second; /* connection kb/s limit */
! 302:
! 303: /* configside */
! 304: unsigned short global_kbytes_per_second; /* */
! 305:
! 306: off_t global_bytes_per_second_cnt;
! 307: /* server-wide traffic-shaper
! 308: *
! 309: * each context has the counter which is inited once
! 310: * a second by the global_kbytes_per_second config-var
! 311: *
! 312: * as soon as global_kbytes_per_second gets below 0
! 313: * the connected conns are "offline" a little bit
! 314: *
! 315: * the problem:
! 316: * we somehow have to loose our "we are writable" signal
! 317: * on the way.
! 318: *
! 319: */
! 320: off_t *global_bytes_per_second_cnt_ptr; /* */
! 321:
! 322: #ifdef USE_OPENSSL
! 323: SSL_CTX *ssl_ctx;
! 324: #endif
! 325: } specific_config;
! 326:
! 327: /* the order of the items should be the same as they are processed
! 328: * read before write as we use this later */
! 329: typedef enum {
! 330: CON_STATE_CONNECT,
! 331: CON_STATE_REQUEST_START,
! 332: CON_STATE_READ,
! 333: CON_STATE_REQUEST_END,
! 334: CON_STATE_READ_POST,
! 335: CON_STATE_HANDLE_REQUEST,
! 336: CON_STATE_RESPONSE_START,
! 337: CON_STATE_WRITE,
! 338: CON_STATE_RESPONSE_END,
! 339: CON_STATE_ERROR,
! 340: CON_STATE_CLOSE
! 341: } connection_state_t;
! 342:
! 343: typedef enum { COND_RESULT_UNSET, COND_RESULT_FALSE, COND_RESULT_TRUE } cond_result_t;
! 344: typedef struct {
! 345: cond_result_t result;
! 346: int patterncount;
! 347: int matches[3 * 10];
! 348: buffer *comp_value; /* just a pointer */
! 349:
! 350: comp_key_t comp_type;
! 351: } cond_cache_t;
! 352:
! 353: typedef struct {
! 354: connection_state_t state;
! 355:
! 356: /* timestamps */
! 357: time_t read_idle_ts;
! 358: time_t close_timeout_ts;
! 359: time_t write_request_ts;
! 360:
! 361: time_t connection_start;
! 362: time_t request_start;
! 363:
! 364: struct timeval start_tv;
! 365:
! 366: size_t request_count; /* number of requests handled in this connection */
! 367: size_t loops_per_request; /* to catch endless loops in a single request
! 368: *
! 369: * used by mod_rewrite, mod_fastcgi, ... and others
! 370: * this is self-protection
! 371: */
! 372:
! 373: int fd; /* the FD for this connection */
! 374: int fde_ndx; /* index for the fdevent-handler */
! 375: int ndx; /* reverse mapping to server->connection[ndx] */
! 376:
! 377: /* fd states */
! 378: int is_readable;
! 379: int is_writable;
! 380:
! 381: int keep_alive; /* only request.c can enable it, all other just disable */
! 382: int keep_alive_idle; /* remember max_keep_alive_idle from config */
! 383:
! 384: int file_started;
! 385: int file_finished;
! 386:
! 387: chunkqueue *write_queue; /* a large queue for low-level write ( HTTP response ) [ file, mem ] */
! 388: chunkqueue *read_queue; /* a small queue for low-level read ( HTTP request ) [ mem ] */
! 389: chunkqueue *request_content_queue; /* takes request-content into tempfile if necessary [ tempfile, mem ]*/
! 390:
! 391: int traffic_limit_reached;
! 392:
! 393: off_t bytes_written; /* used by mod_accesslog, mod_rrd */
! 394: off_t bytes_written_cur_second; /* used by mod_accesslog, mod_rrd */
! 395: off_t bytes_read; /* used by mod_accesslog, mod_rrd */
! 396: off_t bytes_header;
! 397:
! 398: int http_status;
! 399:
! 400: sock_addr dst_addr;
! 401: buffer *dst_addr_buf;
! 402:
! 403: /* request */
! 404: buffer *parse_request;
! 405: unsigned int parsed_response; /* bitfield which contains the important header-fields of the parsed response header */
! 406:
! 407: request request;
! 408: request_uri uri;
! 409: physical physical;
! 410: response response;
! 411:
! 412: size_t header_len;
! 413:
! 414: array *environment; /* used to pass lighttpd internal stuff to the FastCGI/CGI apps, setenv does that */
! 415:
! 416: /* response */
! 417: int got_response;
! 418:
! 419: int in_joblist;
! 420:
! 421: connection_type mode;
! 422:
! 423: void **plugin_ctx; /* plugin connection specific config */
! 424:
! 425: specific_config conf; /* global connection specific config */
! 426: cond_cache_t *cond_cache;
! 427:
! 428: buffer *server_name;
! 429:
! 430: /* error-handler */
! 431: buffer *error_handler;
! 432: int error_handler_saved_status;
! 433: int in_error_handler;
! 434:
! 435: struct server_socket *srv_socket; /* reference to the server-socket */
! 436:
! 437: #ifdef USE_OPENSSL
! 438: SSL *ssl;
! 439: # ifndef OPENSSL_NO_TLSEXT
! 440: buffer *tlsext_server_name;
! 441: # endif
! 442: unsigned int renegotiations; /* count of SSL_CB_HANDSHAKE_START */
! 443: #endif
! 444: /* etag handling */
! 445: etag_flags_t etag_flags;
! 446:
! 447: int conditional_is_valid[COMP_LAST_ELEMENT];
! 448: } connection;
! 449:
! 450: typedef struct {
! 451: connection **ptr;
! 452: size_t size;
! 453: size_t used;
! 454: } connections;
! 455:
! 456:
! 457: #ifdef HAVE_IPV6
! 458: typedef struct {
! 459: int family;
! 460: union {
! 461: struct in6_addr ipv6;
! 462: struct in_addr ipv4;
! 463: } addr;
! 464: char b2[INET6_ADDRSTRLEN + 1];
! 465: time_t ts;
! 466: } inet_ntop_cache_type;
! 467: #endif
! 468:
! 469:
! 470: typedef struct {
! 471: buffer *uri;
! 472: time_t mtime;
! 473: int http_status;
! 474: } realpath_cache_type;
! 475:
! 476: typedef struct {
! 477: time_t mtime; /* the key */
! 478: buffer *str; /* a buffer for the string represenation */
! 479: } mtime_cache_type;
! 480:
! 481: typedef struct {
! 482: void *ptr;
! 483: size_t used;
! 484: size_t size;
! 485: } buffer_plugin;
! 486:
! 487: typedef struct {
! 488: unsigned short port;
! 489: buffer *bindhost;
! 490:
! 491: buffer *errorlog_file;
! 492: unsigned short errorlog_use_syslog;
! 493: buffer *breakagelog_file;
! 494:
! 495: unsigned short dont_daemonize;
! 496: buffer *changeroot;
! 497: buffer *username;
! 498: buffer *groupname;
! 499:
! 500: buffer *pid_file;
! 501:
! 502: buffer *event_handler;
! 503:
! 504: buffer *modules_dir;
! 505: buffer *network_backend;
! 506: array *modules;
! 507: array *upload_tempdirs;
! 508:
! 509: unsigned short max_worker;
! 510: unsigned short max_fds;
! 511: unsigned short max_conns;
! 512: unsigned int max_request_size;
! 513:
! 514: unsigned short log_request_header_on_error;
! 515: unsigned short log_state_handling;
! 516:
! 517: enum { STAT_CACHE_ENGINE_UNSET,
! 518: STAT_CACHE_ENGINE_NONE,
! 519: STAT_CACHE_ENGINE_SIMPLE
! 520: #ifdef HAVE_FAM_H
! 521: , STAT_CACHE_ENGINE_FAM
! 522: #endif
! 523: } stat_cache_engine;
! 524: unsigned short enable_cores;
! 525: unsigned short reject_expect_100_with_417;
! 526: } server_config;
! 527:
! 528: typedef struct server_socket {
! 529: sock_addr addr;
! 530: int fd;
! 531: int fde_ndx;
! 532:
! 533: buffer *ssl_pemfile;
! 534: buffer *ssl_ca_file;
! 535: buffer *ssl_cipher_list;
! 536: buffer *ssl_dh_file;
! 537: buffer *ssl_ec_curve;
! 538: unsigned short ssl_use_sslv2;
! 539: unsigned short ssl_use_sslv3;
! 540: unsigned short use_ipv6;
! 541: unsigned short is_ssl;
! 542:
! 543: buffer *srv_token;
! 544:
! 545: #ifdef USE_OPENSSL
! 546: SSL_CTX *ssl_ctx;
! 547: #endif
! 548: } server_socket;
! 549:
! 550: typedef struct {
! 551: server_socket **ptr;
! 552:
! 553: size_t size;
! 554: size_t used;
! 555: } server_socket_array;
! 556:
! 557: typedef struct server {
! 558: server_socket_array srv_sockets;
! 559:
! 560: /* the errorlog */
! 561: int errorlog_fd;
! 562: enum { ERRORLOG_FILE, ERRORLOG_FD, ERRORLOG_SYSLOG, ERRORLOG_PIPE } errorlog_mode;
! 563: buffer *errorlog_buf;
! 564:
! 565: fdevents *ev, *ev_ins;
! 566:
! 567: buffer_plugin plugins;
! 568: void *plugin_slots;
! 569:
! 570: /* counters */
! 571: int con_opened;
! 572: int con_read;
! 573: int con_written;
! 574: int con_closed;
! 575:
! 576: int ssl_is_init;
! 577:
! 578: int max_fds; /* max possible fds */
! 579: int cur_fds; /* currently used fds */
! 580: int want_fds; /* waiting fds */
! 581: int sockets_disabled;
! 582:
! 583: size_t max_conns;
! 584:
! 585: /* buffers */
! 586: buffer *parse_full_path;
! 587: buffer *response_header;
! 588: buffer *response_range;
! 589: buffer *tmp_buf;
! 590:
! 591: buffer *tmp_chunk_len;
! 592:
! 593: buffer *empty_string; /* is necessary for cond_match */
! 594:
! 595: buffer *cond_check_buf;
! 596:
! 597: /* caches */
! 598: #ifdef HAVE_IPV6
! 599: inet_ntop_cache_type inet_ntop_cache[INET_NTOP_CACHE_MAX];
! 600: #endif
! 601: mtime_cache_type mtime_cache[FILE_CACHE_MAX];
! 602:
! 603: array *split_vals;
! 604:
! 605: /* Timestamps */
! 606: time_t cur_ts;
! 607: time_t last_generated_date_ts;
! 608: time_t last_generated_debug_ts;
! 609: time_t startup_ts;
! 610:
! 611: char entropy[8]; /* from /dev/[u]random if possible, otherwise rand() */
! 612: char is_real_entropy; /* whether entropy is from /dev/[u]random */
! 613:
! 614: buffer *ts_debug_str;
! 615: buffer *ts_date_str;
! 616:
! 617: /* config-file */
! 618: array *config;
! 619: array *config_touched;
! 620:
! 621: array *config_context;
! 622: specific_config **config_storage;
! 623:
! 624: server_config srvconf;
! 625:
! 626: short int config_deprecated;
! 627: short int config_unsupported;
! 628:
! 629: connections *conns;
! 630: connections *joblist;
! 631: connections *fdwaitqueue;
! 632:
! 633: stat_cache *stat_cache;
! 634:
! 635: /**
! 636: * The status array can carry all the status information you want
! 637: * the key to the array is <module-prefix>.<name>
! 638: * and the values are counters
! 639: *
! 640: * example:
! 641: * fastcgi.backends = 10
! 642: * fastcgi.active-backends = 6
! 643: * fastcgi.backend.<key>.load = 24
! 644: * fastcgi.backend.<key>....
! 645: *
! 646: * fastcgi.backend.<key>.disconnects = ...
! 647: */
! 648: array *status;
! 649:
! 650: fdevent_handler_t event_handler;
! 651:
! 652: int (* network_backend_write)(struct server *srv, connection *con, int fd, chunkqueue *cq, off_t max_bytes);
! 653: #ifdef USE_OPENSSL
! 654: int (* network_ssl_backend_write)(struct server *srv, connection *con, SSL *ssl, chunkqueue *cq, off_t max_bytes);
! 655: #endif
! 656:
! 657: uid_t uid;
! 658: gid_t gid;
! 659: } server;
! 660:
! 661:
! 662: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>