1 #ifndef _BASE_H_ 2 #define _BASE_H_ 3 #include "first.h" 4 5 #include <sys/types.h> 6 #include <sys/time.h> 7 8 #if defined(__APPLE__) && defined(__MACH__) 9 #if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1050 10 #include <time.h> 11 #endif 12 #endif 13 14 #include "base_decls.h" 15 #include "buffer.h" 16 #include "array.h" 17 #include "chunk.h" 18 #include "http_kv.h" 19 #include "request.h" 20 #include "sock_addr.h" 21 22 struct fdevents; /* declaration */ 23 24 25 struct connection { 26 27 request_st request; 28 h2con *h2; 29 30 int fd; /* the FD for this connection */ 31 int ndx; /* reverse mapping to server->connection[ndx] */ 32 fdnode *fdn; /* fdevent (fdnode *) object */ 33 34 /* fd states */ 35 signed char is_readable; 36 signed char is_writable; 37 char is_ssl_sock; 38 char traffic_limit_reached; 39 40 chunkqueue *write_queue; /* a large queue for low-level write ( HTTP response ) [ file, mem ] */ 41 chunkqueue *read_queue; /* a small queue for low-level read ( HTTP request ) [ mem ] */ 42 43 off_t bytes_written; /* used by mod_accesslog, mod_rrd */ 44 off_t bytes_written_cur_second; /* used by mod_accesslog, mod_rrd */ 45 off_t bytes_read; /* used by mod_accesslog, mod_rrd */ 46 47 int (* network_write)(struct connection *con, chunkqueue *cq, off_t max_bytes); 48 int (* network_read)(struct connection *con, chunkqueue *cq, off_t max_bytes); 49 handler_t (* reqbody_read)(struct request_st *r); 50 51 server *srv; 52 void *plugin_slots; 53 void **plugin_ctx; /* plugin connection specific config */ 54 void *config_data_base; 55 56 sock_addr dst_addr; 57 buffer *dst_addr_buf; 58 struct server_socket *srv_socket; /* reference to the server-socket */ 59 60 /* timestamps */ 61 time_t read_idle_ts; 62 time_t close_timeout_ts; 63 time_t write_request_ts; 64 65 time_t connection_start; 66 uint32_t request_count; /* number of requests handled in this connection */ 67 int keep_alive_idle; /* remember max_keep_alive_idle from config */ 68 69 uint16_t proto_default_port; 70 }; 71 72 typedef struct { 73 connection **ptr; 74 uint32_t size; 75 uint32_t used; 76 } connections; 77 78 typedef struct { 79 void *ptr; 80 uint32_t used; 81 uint32_t size; 82 } buffer_plugin; 83 84 typedef struct { 85 /*(used sparsely, if at all, after config at startup)*/ 86 87 uint32_t max_request_field_size; 88 unsigned char log_state_handling; 89 unsigned char log_request_header_on_error; 90 unsigned char http_header_strict; 91 unsigned char http_host_strict; 92 unsigned char http_host_normalize; 93 unsigned char http_method_get_body; 94 unsigned char high_precision_timestamps; 95 unsigned char h2proto; 96 unsigned short http_url_normalize; 97 98 unsigned short max_worker; 99 unsigned short max_fds; 100 unsigned short max_conns; 101 unsigned short port; 102 103 unsigned int upload_temp_file_size; 104 array *upload_tempdirs; 105 106 unsigned char dont_daemonize; 107 unsigned char preflight_check; 108 unsigned char enable_cores; 109 unsigned char compat_module_load; 110 unsigned char config_deprecated; 111 unsigned char config_unsupported; 112 unsigned char systemd_socket_activation; 113 unsigned char errorlog_use_syslog; 114 const buffer *syslog_facility; 115 const buffer *bindhost; 116 const buffer *changeroot; 117 const buffer *username; 118 const buffer *groupname; 119 const buffer *network_backend; 120 const array *feature_flags; 121 const char *event_handler; 122 buffer *pid_file; 123 buffer *modules_dir; 124 array *modules; 125 array *config_touched; 126 array empty_array; 127 } server_config; 128 129 typedef struct server_socket { 130 sock_addr addr; 131 int fd; 132 133 unsigned short is_ssl; 134 unsigned short sidx; 135 136 fdnode *fdn; 137 server *srv; 138 buffer *srv_token; 139 } server_socket; 140 141 typedef struct { 142 server_socket **ptr; 143 144 uint32_t size; 145 uint32_t used; 146 } server_socket_array; 147 148 struct server { 149 void *plugin_slots; 150 array *config_context; 151 152 struct fdevents *ev; 153 int (* network_backend_write)(int fd, chunkqueue *cq, off_t max_bytes, log_error_st *errh); 154 handler_t (* request_env)(request_st *r); 155 156 /* buffers */ 157 buffer *tmp_buf; 158 159 connections conns; 160 connections *joblist; 161 connections joblist_A; 162 connections joblist_B; 163 connections fdwaitqueue; 164 165 /* counters */ 166 int con_opened; 167 int con_read; 168 int con_written; 169 int con_closed; 170 171 int max_fds; /* max possible fds */ 172 int max_fds_lowat;/* low watermark */ 173 int max_fds_hiwat;/* high watermark */ 174 int cur_fds; /* currently used fds */ 175 int sockets_disabled; 176 177 uint32_t max_conns; 178 179 log_error_st *errh; 180 181 time_t loadts; 182 double loadavg[3]; 183 184 /* members used at start-up or rarely used */ 185 186 server_config srvconf; 187 void *config_data_base; 188 189 server_socket_array srv_sockets; 190 server_socket_array srv_sockets_inherited; 191 buffer_plugin plugins; 192 193 time_t startup_ts; 194 195 uid_t uid; 196 gid_t gid; 197 pid_t pid; 198 int stdin_fd; 199 }; 200 201 202 #endif 203