| 1 | /* Licensed to the Apache Software Foundation (ASF) under one or more |
| 2 | * contributor license agreements. See the NOTICE file distributed with |
| 3 | * this work for additional information regarding copyright ownership. |
| 4 | * The ASF licenses this file to You under the Apache License, Version 2.0 |
| 5 | * (the "License"); you may not use this file except in compliance with |
| 6 | * the License. You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | /** |
| 18 | * @file httpd.h |
| 19 | * @brief HTTP Daemon routines |
| 20 | * |
| 21 | * @defgroup APACHE Apache |
| 22 | * |
| 23 | * Top level group of which all other groups are a member |
| 24 | * @{ |
| 25 | * |
| 26 | * @defgroup APACHE_MODS Apache Modules |
| 27 | * Top level group for Apache Modules |
| 28 | * @defgroup APACHE_OS Operating System Specific |
| 29 | * @defgroup APACHE_CORE Apache Core |
| 30 | * @{ |
| 31 | * @defgroup APACHE_CORE_DAEMON HTTP Daemon Routine |
| 32 | * @{ |
| 33 | */ |
| 34 | |
| 35 | #ifndef APACHE_HTTPD_H |
| 36 | #define APACHE_HTTPD_H |
| 37 | |
| 38 | /* XXX - We need to push more stuff to other .h files, or even .c files, to |
| 39 | * make this file smaller |
| 40 | */ |
| 41 | |
| 42 | /* Headers in which EVERYONE has an interest... */ |
| 43 | #include "ap_config.h" |
| 44 | #include "ap_mmn.h" |
| 45 | |
| 46 | #include "ap_release.h" |
| 47 | |
| 48 | #include "apr.h" |
| 49 | #include "apr_general.h" |
| 50 | #include "apr_tables.h" |
| 51 | #include "apr_pools.h" |
| 52 | #include "apr_time.h" |
| 53 | #include "apr_network_io.h" |
| 54 | #include "apr_buckets.h" |
| 55 | #include "apr_poll.h" |
| 56 | |
| 57 | #include "os.h" |
| 58 | |
| 59 | #include "ap_regex.h" |
| 60 | |
| 61 | #if APR_HAVE_STDLIB_H |
| 62 | #include <stdlib.h> |
| 63 | #endif |
| 64 | |
| 65 | /* Note: apr_uri.h is also included, see below */ |
| 66 | |
| 67 | #ifdef __cplusplus |
| 68 | extern "C" { |
| 69 | #endif |
| 70 | |
| 71 | #ifdef CORE_PRIVATE |
| 72 | |
| 73 | /* ----------------------------- config dir ------------------------------ */ |
| 74 | |
| 75 | /** Define this to be the default server home dir. Most things later in this |
| 76 | * file with a relative pathname will have this added. |
| 77 | */ |
| 78 | #ifndef HTTPD_ROOT |
| 79 | #ifdef OS2 |
| 80 | /** Set default for OS/2 file system */ |
| 81 | #define HTTPD_ROOT "/os2httpd" |
| 82 | #elif defined(WIN32) |
| 83 | /** Set default for Windows file system */ |
| 84 | #define HTTPD_ROOT "/apache" |
| 85 | #elif defined (BEOS) |
| 86 | /** Set the default for BeOS */ |
| 87 | #define HTTPD_ROOT "/boot/home/apache" |
| 88 | #elif defined (NETWARE) |
| 89 | /** Set the default for NetWare */ |
| 90 | #define HTTPD_ROOT "/apache" |
| 91 | #else |
| 92 | /** Set for all other OSs */ |
| 93 | #define HTTPD_ROOT "/usr/local/apache" |
| 94 | #endif |
| 95 | #endif /* HTTPD_ROOT */ |
| 96 | |
| 97 | /* |
| 98 | * --------- You shouldn't have to edit anything below this line ---------- |
| 99 | * |
| 100 | * Any modifications to any defaults not defined above should be done in the |
| 101 | * respective configuration file. |
| 102 | * |
| 103 | */ |
| 104 | |
| 105 | /** |
| 106 | * Default location of documents. Can be overridden by the DocumentRoot |
| 107 | * directive. |
| 108 | */ |
| 109 | #ifndef DOCUMENT_LOCATION |
| 110 | #ifdef OS2 |
| 111 | /* Set default for OS/2 file system */ |
| 112 | #define DOCUMENT_LOCATION HTTPD_ROOT "/docs" |
| 113 | #else |
| 114 | /* Set default for non OS/2 file system */ |
| 115 | #define DOCUMENT_LOCATION HTTPD_ROOT "/htdocs" |
| 116 | #endif |
| 117 | #endif /* DOCUMENT_LOCATION */ |
| 118 | |
| 119 | /** Maximum number of dynamically loaded modules */ |
| 120 | #ifndef DYNAMIC_MODULE_LIMIT |
| 121 | #define DYNAMIC_MODULE_LIMIT 128 |
| 122 | #endif |
| 123 | |
| 124 | /** Default administrator's address */ |
| 125 | #define DEFAULT_ADMIN "[no address given]" |
| 126 | |
| 127 | /** The name of the log files */ |
| 128 | #ifndef DEFAULT_ERRORLOG |
| 129 | #if defined(OS2) || defined(WIN32) |
| 130 | #define DEFAULT_ERRORLOG "logs/error.log" |
| 131 | #else |
| 132 | #define DEFAULT_ERRORLOG "logs/error_log" |
| 133 | #endif |
| 134 | #endif /* DEFAULT_ERRORLOG */ |
| 135 | |
| 136 | /** Define this to be what your per-directory security files are called */ |
| 137 | #ifndef DEFAULT_ACCESS_FNAME |
| 138 | #ifdef OS2 |
| 139 | /* Set default for OS/2 file system */ |
| 140 | #define DEFAULT_ACCESS_FNAME "htaccess" |
| 141 | #else |
| 142 | #define DEFAULT_ACCESS_FNAME ".htaccess" |
| 143 | #endif |
| 144 | #endif /* DEFAULT_ACCESS_FNAME */ |
| 145 | |
| 146 | /** The name of the server config file */ |
| 147 | #ifndef SERVER_CONFIG_FILE |
| 148 | #define SERVER_CONFIG_FILE "conf/httpd.conf" |
| 149 | #endif |
| 150 | |
| 151 | /** The default path for CGI scripts if none is currently set */ |
| 152 | #ifndef DEFAULT_PATH |
| 153 | #define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin" |
| 154 | #endif |
| 155 | |
| 156 | /** The path to the suExec wrapper, can be overridden in Configuration */ |
| 157 | #if !defined(NETWARE) && !defined(WIN32) |
| 158 | #ifndef SUEXEC_BIN |
| 159 | #define SUEXEC_BIN HTTPD_ROOT "/bin/suexec" |
| 160 | #endif |
| 161 | #endif |
| 162 | |
| 163 | /** The timeout for waiting for messages */ |
| 164 | #ifndef DEFAULT_TIMEOUT |
| 165 | #define DEFAULT_TIMEOUT 300 |
| 166 | #endif |
| 167 | |
| 168 | /** The timeout for waiting for keepalive timeout until next request */ |
| 169 | #ifndef DEFAULT_KEEPALIVE_TIMEOUT |
| 170 | #define DEFAULT_KEEPALIVE_TIMEOUT 5 |
| 171 | #endif |
| 172 | |
| 173 | /** The number of requests to entertain per connection */ |
| 174 | #ifndef DEFAULT_KEEPALIVE |
| 175 | #define DEFAULT_KEEPALIVE 100 |
| 176 | #endif |
| 177 | |
| 178 | /* |
| 179 | * Limits on the size of various request items. These limits primarily |
| 180 | * exist to prevent simple denial-of-service attacks on a server based |
| 181 | * on misuse of the protocol. The recommended values will depend on the |
| 182 | * nature of the server resources -- CGI scripts and database backends |
| 183 | * might require large values, but most servers could get by with much |
| 184 | * smaller limits than we use below. The request message body size can |
| 185 | * be limited by the per-dir config directive LimitRequestBody. |
| 186 | * |
| 187 | * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE |
| 188 | * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190. |
| 189 | * These two limits can be lowered or raised by the server config |
| 190 | * directives LimitRequestLine and LimitRequestFieldsize, respectively. |
| 191 | * |
| 192 | * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by |
| 193 | * the server config directive LimitRequestFields. |
| 194 | */ |
| 195 | |
| 196 | /** default limit on bytes in Request-Line (Method+URI+HTTP-version) */ |
| 197 | #ifndef DEFAULT_LIMIT_REQUEST_LINE |
| 198 | #define DEFAULT_LIMIT_REQUEST_LINE 8190 |
| 199 | #endif |
| 200 | /** default limit on bytes in any one header field */ |
| 201 | #ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE |
| 202 | #define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190 |
| 203 | #endif |
| 204 | /** default limit on number of request header fields */ |
| 205 | #ifndef DEFAULT_LIMIT_REQUEST_FIELDS |
| 206 | #define DEFAULT_LIMIT_REQUEST_FIELDS 100 |
| 207 | #endif |
| 208 | |
| 209 | /** |
| 210 | * The default default character set name to add if AddDefaultCharset is |
| 211 | * enabled. Overridden with AddDefaultCharsetName. |
| 212 | */ |
| 213 | #define DEFAULT_ADD_DEFAULT_CHARSET_NAME "iso-8859-1" |
| 214 | |
| 215 | #endif /* CORE_PRIVATE */ |
| 216 | |
| 217 | /** default HTTP Server protocol */ |
| 218 | #define AP_SERVER_PROTOCOL "HTTP/1.1" |
| 219 | |
| 220 | |
| 221 | /* ------------------ stuff that modules are allowed to look at ----------- */ |
| 222 | |
| 223 | /** Define this to be what your HTML directory content files are called */ |
| 224 | #ifndef AP_DEFAULT_INDEX |
| 225 | #define AP_DEFAULT_INDEX "index.html" |
| 226 | #endif |
| 227 | |
| 228 | |
| 229 | /** |
| 230 | * Define this to be what type you'd like returned for files with unknown |
| 231 | * suffixes. |
| 232 | * @warning MUST be all lower case. |
| 233 | */ |
| 234 | #ifndef DEFAULT_CONTENT_TYPE |
| 235 | #define DEFAULT_CONTENT_TYPE "text/plain" |
| 236 | #endif |
| 237 | |
| 238 | /** |
| 239 | * NO_CONTENT_TYPE is an alternative DefaultType value that suppresses |
| 240 | * setting any default type when there's no information (e.g. a proxy). |
| 241 | */ |
| 242 | #ifndef NO_CONTENT_TYPE |
| 243 | #define NO_CONTENT_TYPE "none" |
| 244 | #endif |
| 245 | |
| 246 | /** The name of the MIME types file */ |
| 247 | #ifndef AP_TYPES_CONFIG_FILE |
| 248 | #define AP_TYPES_CONFIG_FILE "conf/mime.types" |
| 249 | #endif |
| 250 | |
| 251 | /* |
| 252 | * Define the HTML doctype strings centrally. |
| 253 | */ |
| 254 | /** HTML 2.0 Doctype */ |
| 255 | #define DOCTYPE_HTML_2_0 "<!DOCTYPE HTML PUBLIC \"-//IETF//" \ |
| 256 | "DTD HTML 2.0//EN\">\n" |
| 257 | /** HTML 3.2 Doctype */ |
| 258 | #define DOCTYPE_HTML_3_2 "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
| 259 | "DTD HTML 3.2 Final//EN\">\n" |
| 260 | /** HTML 4.0 Strict Doctype */ |
| 261 | #define DOCTYPE_HTML_4_0S "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
| 262 | "DTD HTML 4.0//EN\"\n" \ |
| 263 | "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" |
| 264 | /** HTML 4.0 Transitional Doctype */ |
| 265 | #define DOCTYPE_HTML_4_0T "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
| 266 | "DTD HTML 4.0 Transitional//EN\"\n" \ |
| 267 | "\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n" |
| 268 | /** HTML 4.0 Frameset Doctype */ |
| 269 | #define DOCTYPE_HTML_4_0F "<!DOCTYPE HTML PUBLIC \"-//W3C//" \ |
| 270 | "DTD HTML 4.0 Frameset//EN\"\n" \ |
| 271 | "\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n" |
| 272 | /** XHTML 1.0 Strict Doctype */ |
| 273 | #define DOCTYPE_XHTML_1_0S "<!DOCTYPE html PUBLIC \"-//W3C//" \ |
| 274 | "DTD XHTML 1.0 Strict//EN\"\n" \ |
| 275 | "\"http://www.w3.org/TR/xhtml1/DTD/" \ |
| 276 | "xhtml1-strict.dtd\">\n" |
| 277 | /** XHTML 1.0 Transitional Doctype */ |
| 278 | #define DOCTYPE_XHTML_1_0T "<!DOCTYPE html PUBLIC \"-//W3C//" \ |
| 279 | "DTD XHTML 1.0 Transitional//EN\"\n" \ |
| 280 | "\"http://www.w3.org/TR/xhtml1/DTD/" \ |
| 281 | "xhtml1-transitional.dtd\">\n" |
| 282 | /** XHTML 1.0 Frameset Doctype */ |
| 283 | #define DOCTYPE_XHTML_1_0F "<!DOCTYPE html PUBLIC \"-//W3C//" \ |
| 284 | "DTD XHTML 1.0 Frameset//EN\"\n" \ |
| 285 | "\"http://www.w3.org/TR/xhtml1/DTD/" \ |
| 286 | "xhtml1-frameset.dtd\">" |
| 287 | |
| 288 | /** Internal representation for a HTTP protocol number, e.g., HTTP/1.1 */ |
| 289 | #define HTTP_VERSION(major,minor) (1000* : pass=0 *(major)+ : pass=0 +(minor)) |
| 290 | /** Major part of HTTP protocol */ |
| 291 | #define HTTP_VERSION_MAJOR(number) ((number)/1000) |
| 292 | /** Minor part of HTTP protocol */ |
| 293 | #define HTTP_VERSION_MINOR(number) ((number)%1000) |
| 294 | |
| 295 | /* -------------- Port number for server running standalone --------------- */ |
| 296 | |
| 297 | /** default HTTP Port */ |
| 298 | #define DEFAULT_HTTP_PORT 80 |
| 299 | /** default HTTPS Port */ |
| 300 | #define DEFAULT_HTTPS_PORT 443 |
| 301 | /** |
| 302 | * Check whether @a port is the default port for the request @a r. |
| 303 | * @param port The port number |
| 304 | * @param r The request |
| 305 | * @see #ap_default_port |
| 306 | */ |
| 307 | #define ap_is_default_port(port,r) ((port) == : true=0, false=0 == ap_default_port(r)) |
| 308 | /** |
| 309 | * Get the default port for a request (which depends on the scheme). |
| 310 | * @param r The request |
| 311 | */ |
| 312 | #define ap_default_port(r) ap_run_default_port : enter=0, leave=0
ap_run_default_port : server/ line=21 column=1
ap_run_default_port : server/ line=16 column=1
ap_run_default_port : modules/loggers/ line=76 column=1
ap_run_default_port(r) |
| 313 | /** |
| 314 | * Get the scheme for a request. |
| 315 | * @param r The request |
| 316 | */ |
| 317 | #define ap_http_scheme(r) ap_run_http_scheme : enter=0, leave=0
ap_run_http_scheme : server/ line=211 column=1
ap_run_http_scheme : server/ line=209 column=1
ap_run_http_scheme(r) |
| 318 | |
| 319 | /** The default string length */ |
| 320 | #define MAX_STRING_LEN HUGE_STRING_LEN |
| 321 | |
| 322 | /** The length of a Huge string */ |
| 323 | #define HUGE_STRING_LEN 8192 |
| 324 | |
| 325 | /** The size of the server's internal read-write buffers */ |
| 326 | #define AP_IOBUFSIZE 8192 |
| 327 | |
| 328 | /** The max number of regex captures that can be expanded by ap_pregsub */ |
| 329 | #define AP_MAX_REG_MATCH 10 |
| 330 | |
| 331 | /** |
| 332 | * APR_HAS_LARGE_FILES introduces the problem of spliting sendfile into |
| 333 | * mutiple buckets, no greater than MAX(apr_size_t), and more granular |
| 334 | * than that in case the brigade code/filters attempt to read it directly. |
| 335 | * ### 16mb is an invention, no idea if it is reasonable. |
| 336 | */ |
| 337 | #define AP_MAX_SENDFILE 16777216 /* 2^24 */ |
| 338 | |
| 339 | /** |
| 340 | * MPM child process exit status values |
| 341 | * The MPM parent process may check the status to see if special |
| 342 | * error handling is required. |
| 343 | */ |
| 344 | /** a normal exit */ |
| 345 | #define APEXIT_OK 0x0 |
| 346 | /** A fatal error arising during the server's init sequence */ |
| 347 | #define APEXIT_INIT 0x2 |
| 348 | /** The child died during its init sequence */ |
| 349 | #define APEXIT_CHILDINIT 0x3 |
| 350 | /** |
| 351 | * The child exited due to a resource shortage. |
| 352 | * The parent should limit the rate of forking until |
| 353 | * the situation is resolved. |
| 354 | */ |
| 355 | #define APEXIT_CHILDSICK 0x7 |
| 356 | /** |
| 357 | * A fatal error, resulting in the whole server aborting. |
| 358 | * If a child exits with this error, the parent process |
| 359 | * considers this a server-wide fatal error and aborts. |
| 360 | */ |
| 361 | #define APEXIT_CHILDFATAL 0xf |
| 362 | |
| 363 | #ifndef AP_DECLARE |
| 364 | /** |
| 365 | * Stuff marked #AP_DECLARE is part of the API, and intended for use |
| 366 | * by modules. Its purpose is to allow us to add attributes that |
| 367 | * particular platforms or compilers require to every exported function. |
| 368 | */ |
| 369 | # define AP_DECLARE(type) type |
| 370 | #endif |
| 371 | |
| 372 | #ifndef AP_DECLARE_NONSTD |
| 373 | /** |
| 374 | * Stuff marked #AP_DECLARE_NONSTD is part of the API, and intended for |
| 375 | * use by modules. The difference between #AP_DECLARE and |
| 376 | * #AP_DECLARE_NONSTD is that the latter is required for any functions |
| 377 | * which use varargs or are used via indirect function call. This |
| 378 | * is to accomodate the two calling conventions in windows dlls. |
| 379 | */ |
| 380 | # define AP_DECLARE_NONSTD(type) type |
| 381 | #endif |
| 382 | #ifndef AP_DECLARE_DATA |
| 383 | # define AP_DECLARE_DATA |
| 384 | #endif |
| 385 | |
| 386 | #ifndef AP_MODULE_DECLARE |
| 387 | # define AP_MODULE_DECLARE(type) type |
| 388 | #endif |
| 389 | #ifndef AP_MODULE_DECLARE_NONSTD |
| 390 | # define AP_MODULE_DECLARE_NONSTD(type) type |
| 391 | #endif |
| 392 | #ifndef AP_MODULE_DECLARE_DATA |
| 393 | # define AP_MODULE_DECLARE_DATA |
| 394 | #endif |
| 395 | |
| 396 | /** |
| 397 | * @internal |
| 398 | * modules should not use functions marked AP_CORE_DECLARE |
| 399 | */ |
| 400 | #ifndef AP_CORE_DECLARE |
| 401 | # define AP_CORE_DECLARE AP_DECLARE |
| 402 | #endif |
| 403 | |
| 404 | /** |
| 405 | * @internal |
| 406 | * modules should not use functions marked AP_CORE_DECLARE_NONSTD |
| 407 | */ |
| 408 | |
| 409 | #ifndef AP_CORE_DECLARE_NONSTD |
| 410 | # define AP_CORE_DECLARE_NONSTD AP_DECLARE_NONSTD |
| 411 | #endif |
| 412 | |
| 413 | /** |
| 414 | * @brief The numeric version information is broken out into fields within this |
| 415 | * structure. |
| 416 | */ |
| 417 | typedef struct { |
| 418 | int major; /**< major number */ |
| 419 | int minor; /**< minor number */ |
| 420 | int patch; /**< patch number */ |
| 421 | const char *add_string; /**< additional string like "-dev" */ |
| 422 | } ap_version_t; |
| 423 | |
| 424 | /** |
| 425 | * Return httpd's version information in a numeric form. |
| 426 | * |
| 427 | * @param version Pointer to a version structure for returning the version |
| 428 | * information. |
| 429 | */ |
| 430 | AP_DECLARE(void) ap_get_server_revision(ap_version_t *version); |
| 431 | |
| 432 | /** |
| 433 | * Get the server version string, as controlled by the ServerTokens directive |
| 434 | * @return The server version string |
| 435 | * @deprecated @see ap_get_server_banner() and ap_get_server_description() |
| 436 | */ |
| 437 | AP_DECLARE(const char *) ap_get_server_version(void); |
| 438 | |
| 439 | /** |
| 440 | * Get the server banner in a form suitable for sending over the |
| 441 | * network, with the level of information controlled by the |
| 442 | * ServerTokens directive. |
| 443 | * @return The server banner |
| 444 | */ |
| 445 | AP_DECLARE(const char *) ap_get_server_banner(void); |
| 446 | |
| 447 | /** |
| 448 | * Get the server description in a form suitable for local displays, |
| 449 | * status reports, or logging. This includes the detailed server |
| 450 | * version and information about some modules. It is not affected |
| 451 | * by the ServerTokens directive. |
| 452 | * @return The server description |
| 453 | */ |
| 454 | AP_DECLARE(const char *) ap_get_server_description(void); |
| 455 | |
| 456 | /** |
| 457 | * Add a component to the server description and banner strings |
| 458 | * (The latter is returned by the deprecated function |
| 459 | * ap_get_server_version().) |
| 460 | * @param pconf The pool to allocate the component from |
| 461 | * @param component The string to add |
| 462 | */ |
| 463 | AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component); |
| 464 | |
| 465 | /** |
| 466 | * Get the date a time that the server was built |
| 467 | * @return The server build time string |
| 468 | */ |
| 469 | AP_DECLARE(const char *) ap_get_server_built(void); |
| 470 | |
| 471 | #define DECLINED -1 /**< Module declines to handle */ |
| 472 | #define DONE -2 /**< Module has served the response completely |
| 473 | * - it's safe to die() with no more output |
| 474 | */ |
| 475 | #define OK 0 /**< Module has handled this stage. */ |
| 476 | |
| 477 | |
| 478 | /** |
| 479 | * @defgroup HTTP_Status HTTP Status Codes |
| 480 | * @{ |
| 481 | */ |
| 482 | /** |
| 483 | * The size of the static array in http_protocol.c for storing |
| 484 | * all of the potential response status-lines (a sparse table). |
| 485 | * A future version should dynamically generate the apr_table_t at startup. |
| 486 | */ |
| 487 | #define RESPONSE_CODES 57 |
| 488 | |
| 489 | #define HTTP_CONTINUE 100 |
| 490 | #define HTTP_SWITCHING_PROTOCOLS 101 |
| 491 | #define HTTP_PROCESSING 102 |
| 492 | #define HTTP_OK 200 |
| 493 | #define HTTP_CREATED 201 |
| 494 | #define HTTP_ACCEPTED 202 |
| 495 | #define HTTP_NON_AUTHORITATIVE 203 |
| 496 | #define HTTP_NO_CONTENT 204 |
| 497 | #define HTTP_RESET_CONTENT 205 |
| 498 | #define HTTP_PARTIAL_CONTENT 206 |
| 499 | #define HTTP_MULTI_STATUS 207 |
| 500 | #define HTTP_MULTIPLE_CHOICES 300 |
| 501 | #define HTTP_MOVED_PERMANENTLY 301 |
| 502 | #define HTTP_MOVED_TEMPORARILY 302 |
| 503 | #define HTTP_SEE_OTHER 303 |
| 504 | #define HTTP_NOT_MODIFIED 304 |
| 505 | #define HTTP_USE_PROXY 305 |
| 506 | #define HTTP_TEMPORARY_REDIRECT 307 |
| 507 | #define HTTP_BAD_REQUEST 400 |
| 508 | #define HTTP_UNAUTHORIZED 401 |
| 509 | #define HTTP_PAYMENT_REQUIRED 402 |
| 510 | #define HTTP_FORBIDDEN 403 |
| 511 | #define HTTP_NOT_FOUND 404 |
| 512 | #define HTTP_METHOD_NOT_ALLOWED 405 |
| 513 | #define HTTP_NOT_ACCEPTABLE 406 |
| 514 | #define HTTP_PROXY_AUTHENTICATION_REQUIRED 407 |
| 515 | #define HTTP_REQUEST_TIME_OUT 408 |
| 516 | #define HTTP_CONFLICT 409 |
| 517 | #define HTTP_GONE 410 |
| 518 | #define HTTP_LENGTH_REQUIRED 411 |
| 519 | #define HTTP_PRECONDITION_FAILED 412 |
| 520 | #define HTTP_REQUEST_ENTITY_TOO_LARGE 413 |
| 521 | #define HTTP_REQUEST_URI_TOO_LARGE 414 |
| 522 | #define HTTP_UNSUPPORTED_MEDIA_TYPE 415 |
| 523 | #define HTTP_RANGE_NOT_SATISFIABLE 416 |
| 524 | #define HTTP_EXPECTATION_FAILED 417 |
| 525 | #define HTTP_UNPROCESSABLE_ENTITY 422 |
| 526 | #define HTTP_LOCKED 423 |
| 527 | #define HTTP_FAILED_DEPENDENCY 424 |
| 528 | #define HTTP_UPGRADE_REQUIRED 426 |
| 529 | #define HTTP_INTERNAL_SERVER_ERROR 500 |
| 530 | #define HTTP_NOT_IMPLEMENTED 501 |
| 531 | #define HTTP_BAD_GATEWAY 502 |
| 532 | #define HTTP_SERVICE_UNAVAILABLE 503 |
| 533 | #define HTTP_GATEWAY_TIME_OUT 504 |
| 534 | #define HTTP_VERSION_NOT_SUPPORTED 505 |
| 535 | #define HTTP_VARIANT_ALSO_VARIES 506 |
| 536 | #define HTTP_INSUFFICIENT_STORAGE 507 |
| 537 | #define HTTP_NOT_EXTENDED 510 |
| 538 | |
| 539 | /** is the status code informational */ |
| 540 | #define ap_is_HTTP_INFO(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 100)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 200)) |
| 541 | /** is the status code OK ?*/ |
| 542 | #define ap_is_HTTP_SUCCESS(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 200)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 300)) |
| 543 | /** is the status code a redirect */ |
| 544 | #define ap_is_HTTP_REDIRECT(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 300)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 400)) |
| 545 | /** is the status code a error (client or server) */ |
| 546 | #define ap_is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600)) |
| 547 | /** is the status code a client error */ |
| 548 | #define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500)) |
| 549 | /** is the status code a server error */ |
| 550 | #define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600)) |
| 551 | /** is the status code a (potentially) valid response code? */ |
| 552 | #define ap_is_HTTP_VALID_RESPONSE(x) (((x) >= : true=0, false=0 MC/DC independently affect : true=0, false=0 >= 100)&& : true=0, false=0 &&((x) < : true=0, false=0 MC/DC independently affect : true=0, false=0 < 600)) |
| 553 | |
| 554 | /** should the status code drop the connection */ |
| 555 | #define ap_status_drops_connection(x) \ |
| 556 | (((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_BAD_REQUEST) || : true=0, false=0 || \ |
| 557 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_REQUEST_TIME_OUT) || : true=0, false=0 || \ |
| 558 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_LENGTH_REQUIRED) || : true=0, false=0 || \ |
| 559 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_REQUEST_ENTITY_TOO_LARGE) || : true=0, false=0 || \ |
| 560 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_REQUEST_URI_TOO_LARGE) || : true=0, false=0 || \ |
| 561 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_INTERNAL_SERVER_ERROR) || : true=0, false=0 || \ |
| 562 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_SERVICE_UNAVAILABLE) || : true=0, false=0 || \ |
| 563 | ((x) == : true=0, false=0 MC/DC independently affect : true=0, false=0 == HTTP_NOT_IMPLEMENTED)) |
| 564 | /** @} */ |
| 565 | |
| 566 | /** |
| 567 | * @defgroup Methods List of Methods recognized by the server |
| 568 | * @ingroup APACHE_CORE_DAEMON |
| 569 | * @{ |
| 570 | * |
| 571 | * @brief Methods recognized (but not necessarily handled) by the server. |
| 572 | * |
| 573 | * These constants are used in bit shifting masks of size int, so it is |
| 574 | * unsafe to have more methods than bits in an int. HEAD == M_GET. |
| 575 | * This list must be tracked by the list in http_protocol.c in routine |
| 576 | * ap_method_name_of(). |
| 577 | * |
| 578 | */ |
| 579 | |
| 580 | #define M_GET 0 /** RFC 2616: HTTP */ |
| 581 | #define M_PUT 1 /* : */ |
| 582 | #define M_POST 2 |
| 583 | #define M_DELETE 3 |
| 584 | #define M_CONNECT 4 |
| 585 | #define M_OPTIONS 5 |
| 586 | #define M_TRACE 6 /** RFC 2616: HTTP */ |
| 587 | #define M_PATCH 7 /** no rfc(!) ### remove this one? */ |
| 588 | #define M_PROPFIND 8 /** RFC 2518: WebDAV */ |
| 589 | #define M_PROPPATCH 9 /* : */ |
| 590 | #define M_MKCOL 10 |
| 591 | #define M_COPY 11 |
| 592 | #define M_MOVE 12 |
| 593 | #define M_LOCK 13 |
| 594 | #define M_UNLOCK 14 /** RFC 2518: WebDAV */ |
| 595 | #define M_VERSION_CONTROL 15 /** RFC 3253: WebDAV Versioning */ |
| 596 | #define M_CHECKOUT 16 /* : */ |
| 597 | #define M_UNCHECKOUT 17 |
| 598 | #define M_CHECKIN 18 |
| 599 | #define M_UPDATE 19 |
| 600 | #define M_LABEL 20 |
| 601 | #define M_REPORT 21 |
| 602 | #define M_MKWORKSPACE 22 |
| 603 | #define M_MKACTIVITY 23 |
| 604 | #define M_BASELINE_CONTROL 24 |
| 605 | #define M_MERGE 25 |
| 606 | #define M_INVALID 26 /** RFC 3253: WebDAV Versioning */ |
| 607 | |
| 608 | /** |
| 609 | * METHODS needs to be equal to the number of bits |
| 610 | * we are using for limit masks. |
| 611 | */ |
| 612 | #define METHODS 64 |
| 613 | |
| 614 | /** |
| 615 | * The method mask bit to shift for anding with a bitmask. |
| 616 | */ |
| 617 | #define AP_METHOD_BIT ((apr_int64_t)1) |
| 618 | /** @} */ |
| 619 | |
| 620 | |
| 621 | /** @see ap_method_list_t */ |
| 622 | typedef struct ap_method_list_t ap_method_list_t; |
| 623 | |
| 624 | /** |
| 625 | * @struct ap_method_list_t |
| 626 | * @brief Structure for handling HTTP methods. |
| 627 | * |
| 628 | * Methods known to the server are accessed via a bitmask shortcut; |
| 629 | * extension methods are handled by an array. |
| 630 | */ |
| 631 | struct ap_method_list_t { |
| 632 | /** The bitmask used for known methods */ |
| 633 | apr_int64_t method_mask; |
| 634 | /** the array used for extension methods */ |
| 635 | apr_array_header_t *method_list; |
| 636 | }; |
| 637 | |
| 638 | /** |
| 639 | * @defgroup module_magic Module Magic mime types |
| 640 | * @{ |
| 641 | */ |
| 642 | /** Magic for mod_cgi[d] */ |
| 643 | #define CGI_MAGIC_TYPE "application/x-httpd-cgi" |
| 644 | /** Magic for mod_include */ |
| 645 | #define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html" |
| 646 | /** Magic for mod_include */ |
| 647 | #define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3" |
| 648 | /** Magic for mod_dir */ |
| 649 | #define DIR_MAGIC_TYPE "httpd/unix-directory" |
| 650 | |
| 651 | /** @} */ |
| 652 | /* Just in case your linefeed isn't the one the other end is expecting. */ |
| 653 | #if !APR_CHARSET_EBCDIC |
| 654 | /** linefeed */ |
| 655 | #define LF 10 |
| 656 | /** carrige return */ |
| 657 | #define CR 13 |
| 658 | /** carrige return /Line Feed Combo */ |
| 659 | #define CRLF "\015\012" |
| 660 | #else /* APR_CHARSET_EBCDIC */ |
| 661 | /* For platforms using the EBCDIC charset, the transition ASCII->EBCDIC is done |
| 662 | * in the buff package (bread/bputs/bwrite). Everywhere else, we use |
| 663 | * "native EBCDIC" CR and NL characters. These are therefore |
| 664 | * defined as |
| 665 | * '\r' and '\n'. |
| 666 | */ |
| 667 | #define CR '\r' |
| 668 | #define LF '\n' |
| 669 | #define CRLF "\r\n" |
| 670 | #endif /* APR_CHARSET_EBCDIC */ |
| 671 | /** Useful for common code with either platform charset. */ |
| 672 | #define CRLF_ASCII "\015\012" |
| 673 | |
| 674 | /** |
| 675 | * @defgroup values_request_rec_body Possible values for request_rec.read_body |
| 676 | * @{ |
| 677 | * Possible values for request_rec.read_body (set by handling module): |
| 678 | */ |
| 679 | |
| 680 | /** Send 413 error if message has any body */ |
| 681 | #define REQUEST_NO_BODY 0 |
| 682 | /** Send 411 error if body without Content-Length */ |
| 683 | #define REQUEST_CHUNKED_ERROR 1 |
| 684 | /** If chunked, remove the chunks for me. */ |
| 685 | #define REQUEST_CHUNKED_DECHUNK 2 |
| 686 | /** @} // values_request_rec_body */ |
| 687 | |
| 688 | /** |
| 689 | * @defgroup values_request_rec_used_path_info Possible values for request_rec.used_path_info |
| 690 | * @ingroup APACHE_CORE_DAEMON |
| 691 | * @{ |
| 692 | * Possible values for request_rec.used_path_info: |
| 693 | */ |
| 694 | |
| 695 | /** Accept the path_info from the request */ |
| 696 | #define AP_REQ_ACCEPT_PATH_INFO 0 |
| 697 | /** Return a 404 error if path_info was given */ |
| 698 | #define AP_REQ_REJECT_PATH_INFO 1 |
| 699 | /** Module may chose to use the given path_info */ |
| 700 | #define AP_REQ_DEFAULT_PATH_INFO 2 |
| 701 | |
| 702 | /** @} // values_request_rec_used_path_info */ |
| 703 | |
| 704 | |
| 705 | /* |
| 706 | * Things which may vary per file-lookup WITHIN a request --- |
| 707 | * e.g., state of MIME config. Basically, the name of an object, info |
| 708 | * about the object, and any other info we may ahve which may need to |
| 709 | * change as we go poking around looking for it (e.g., overridden by |
| 710 | * .htaccess files). |
| 711 | * |
| 712 | * Note how the default state of almost all these things is properly |
| 713 | * zero, so that allocating it with pcalloc does the right thing without |
| 714 | * a whole lot of hairy initialization... so long as we are willing to |
| 715 | * make the (fairly) portable assumption that the bit pattern of a NULL |
| 716 | * pointer is, in fact, zero. |
| 717 | */ |
| 718 | |
| 719 | /** |
| 720 | * @brief This represents the result of calling htaccess; these are cached for |
| 721 | * each request. |
| 722 | */ |
| 723 | struct htaccess_result { |
| 724 | /** the directory to which this applies */ |
| 725 | const char *dir; |
| 726 | /** the overrides allowed for the .htaccess file */ |
| 727 | int override; |
| 728 | /** the override options allowed for the .htaccess file */ |
| 729 | int override_opts; |
| 730 | /** the configuration directives */ |
| 731 | struct ap_conf_vector_t *htaccess; |
| 732 | /** the next one, or NULL if no more; N.B. never change this */ |
| 733 | const struct htaccess_result *next; |
| 734 | }; |
| 735 | |
| 736 | /* The following four types define a hierarchy of activities, so that |
| 737 | * given a request_rec r you can write r->connection->server->process |
| 738 | * to get to the process_rec. While this reduces substantially the |
| 739 | * number of arguments that various hooks require beware that in |
| 740 | * threaded versions of the server you must consider multiplexing |
| 741 | * issues. */ |
| 742 | |
| 743 | |
| 744 | /** A structure that represents one process */ |
| 745 | typedef struct process_rec process_rec; |
| 746 | /** A structure that represents a virtual server */ |
| 747 | typedef struct server_rec server_rec; |
| 748 | /** A structure that represents one connection */ |
| 749 | typedef struct conn_rec conn_rec; |
| 750 | /** A structure that represents the current request */ |
| 751 | typedef struct request_rec request_rec; |
| 752 | /** A structure that represents the status of the current connection */ |
| 753 | typedef struct conn_state_t conn_state_t; |
| 754 | |
| 755 | /* ### would be nice to not include this from httpd.h ... */ |
| 756 | /* This comes after we have defined the request_rec type */ |
| 757 | #include "apr_uri.h" |
| 758 | |
| 759 | /** |
| 760 | * @brief A structure that represents one process |
| 761 | */ |
| 762 | struct process_rec { |
| 763 | /** Global pool. Cleared upon normal exit */ |
| 764 | apr_pool_t *pool; |
| 765 | /** Configuration pool. Cleared upon restart */ |
| 766 | apr_pool_t *pconf; |
| 767 | /** Number of command line arguments passed to the program */ |
| 768 | int argc; |
| 769 | /** The command line arguments */ |
| 770 | const char * const *argv; |
| 771 | /** The program name used to execute the program */ |
| 772 | const char *short_name; |
| 773 | }; |
| 774 | |
| 775 | /** |
| 776 | * @brief A structure that represents the current request |
| 777 | */ |
| 778 | struct request_rec { |
| 779 | /** The pool associated with the request */ |
| 780 | apr_pool_t *pool; |
| 781 | /** The connection to the client */ |
| 782 | conn_rec *connection; |
| 783 | /** The virtual host for this request */ |
| 784 | server_rec *server; |
| 785 | |
| 786 | /** Pointer to the redirected request if this is an external redirect */ |
| 787 | request_rec *next; |
| 788 | /** Pointer to the previous request if this is an internal redirect */ |
| 789 | request_rec *prev; |
| 790 | |
| 791 | /** Pointer to the main request if this is a sub-request |
| 792 | * (see http_request.h) */ |
| 793 | request_rec *main; |
| 794 | |
| 795 | /* Info about the request itself... we begin with stuff that only |
| 796 | * protocol.c should ever touch... |
| 797 | */ |
| 798 | /** First line of request */ |
| 799 | char *the_request; |
| 800 | /** HTTP/0.9, "simple" request (e.g. GET /foo\n w/no headers) */ |
| 801 | int assbackwards; |
| 802 | /** A proxy request (calculated during post_read_request/translate_name) |
| 803 | * possible values PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE, |
| 804 | * PROXYREQ_RESPONSE |
| 805 | */ |
| 806 | int proxyreq; |
| 807 | /** HEAD request, as opposed to GET */ |
| 808 | int header_only; |
| 809 | /** Protocol string, as given to us, or HTTP/0.9 */ |
| 810 | char *protocol; |
| 811 | /** Protocol version number of protocol; 1.1 = 1001 */ |
| 812 | int proto_num; |
| 813 | /** Host, as set by full URI or Host: */ |
| 814 | const char *hostname; |
| 815 | |
| 816 | /** Time when the request started */ |
| 817 | apr_time_t request_time; |
| 818 | |
| 819 | /** Status line, if set by script */ |
| 820 | const char *status_line; |
| 821 | /** Status line */ |
| 822 | int status; |
| 823 | |
| 824 | /* Request method, two ways; also, protocol, etc.. Outside of protocol.c, |
| 825 | * look, but don't touch. |
| 826 | */ |
| 827 | |
| 828 | /** Request method (eg. GET, HEAD, POST, etc.) */ |
| 829 | const char *method; |
| 830 | /** M_GET, M_POST, etc. */ |
| 831 | int method_number; |
| 832 | |
| 833 | /** |
| 834 | * 'allowed' is a bitvector of the allowed methods. |
| 835 | * |
| 836 | * A handler must ensure that the request method is one that |
| 837 | * it is capable of handling. Generally modules should DECLINE |
| 838 | * any request methods they do not handle. Prior to aborting the |
| 839 | * handler like this the handler should set r->allowed to the list |
| 840 | * of methods that it is willing to handle. This bitvector is used |
| 841 | * to construct the "Allow:" header required for OPTIONS requests, |
| 842 | * and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes. |
| 843 | * |
| 844 | * Since the default_handler deals with OPTIONS, all modules can |
| 845 | * usually decline to deal with OPTIONS. TRACE is always allowed, |
| 846 | * modules don't need to set it explicitly. |
| 847 | * |
| 848 | * Since the default_handler will always handle a GET, a |
| 849 | * module which does *not* implement GET should probably return |
| 850 | * HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET |
| 851 | * handler can't be installed by mod_actions. |
| 852 | */ |
| 853 | apr_int64_t allowed; |
| 854 | /** Array of extension methods */ |
| 855 | apr_array_header_t *allowed_xmethods; |
| 856 | /** List of allowed methods */ |
| 857 | ap_method_list_t *allowed_methods; |
| 858 | |
| 859 | /** byte count in stream is for body */ |
| 860 | apr_off_t sent_bodyct; |
| 861 | /** body byte count, for easy access */ |
| 862 | apr_off_t bytes_sent; |
| 863 | /** Last modified time of the requested resource */ |
| 864 | apr_time_t mtime; |
| 865 | |
| 866 | /* HTTP/1.1 connection-level features */ |
| 867 | |
| 868 | /** sending chunked transfer-coding */ |
| 869 | int chunked; |
| 870 | /** The Range: header */ |
| 871 | const char *range; |
| 872 | /** The "real" content length */ |
| 873 | apr_off_t clength; |
| 874 | |
| 875 | /** Remaining bytes left to read from the request body */ |
| 876 | apr_off_t remaining; |
| 877 | /** Number of bytes that have been read from the request body */ |
| 878 | apr_off_t read_length; |
| 879 | /** Method for reading the request body |
| 880 | * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY, |
| 881 | * REQUEST_CHUNKED_DECHUNK, etc...) */ |
| 882 | int read_body; |
| 883 | /** reading chunked transfer-coding */ |
| 884 | int read_chunked; |
| 885 | /** is client waiting for a 100 response? */ |
| 886 | unsigned expecting_100; |
| 887 | |
| 888 | /* MIME header environments, in and out. Also, an array containing |
| 889 | * environment variables to be passed to subprocesses, so people can |
| 890 | * write modules to add to that environment. |
| 891 | * |
| 892 | * The difference between headers_out and err_headers_out is that the |
| 893 | * latter are printed even on error, and persist across internal redirects |
| 894 | * (so the headers printed for ErrorDocument handlers will have them). |
| 895 | * |
| 896 | * The 'notes' apr_table_t is for notes from one module to another, with no |
| 897 | * other set purpose in mind... |
| 898 | */ |
| 899 | |
| 900 | /** MIME header environment from the request */ |
| 901 | apr_table_t *headers_in; |
| 902 | /** MIME header environment for the response */ |
| 903 | apr_table_t *headers_out; |
| 904 | /** MIME header environment for the response, printed even on errors and |
| 905 | * persist across internal redirects */ |
| 906 | apr_table_t *err_headers_out; |
| 907 | /** Array of environment variables to be used for sub processes */ |
| 908 | apr_table_t *subprocess_env; |
| 909 | /** Notes from one module to another */ |
| 910 | apr_table_t *notes; |
| 911 | |
| 912 | /* content_type, handler, content_encoding, and all content_languages |
| 913 | * MUST be lowercased strings. They may be pointers to static strings; |
| 914 | * they should not be modified in place. |
| 915 | */ |
| 916 | /** The content-type for the current request */ |
| 917 | const char *content_type; /* Break these out --- we dispatch on 'em */ |
| 918 | /** The handler string that we use to call a handler function */ |
| 919 | const char *handler; /* What we *really* dispatch on */ |
| 920 | |
| 921 | /** How to encode the data */ |
| 922 | const char *content_encoding; |
| 923 | /** Array of strings representing the content languages */ |
| 924 | apr_array_header_t *content_languages; |
| 925 | |
| 926 | /** variant list validator (if negotiated) */ |
| 927 | char *vlist_validator; |
| 928 | |
| 929 | /** If an authentication check was made, this gets set to the user name. */ |
| 930 | char *user; |
| 931 | /** If an authentication check was made, this gets set to the auth type. */ |
| 932 | char *ap_auth_type; |
| 933 | |
| 934 | /** This response can not be cached */ |
| 935 | int no_cache; |
| 936 | /** There is no local copy of this response */ |
| 937 | int no_local_copy; |
| 938 | |
| 939 | /* What object is being requested (either directly, or via include |
| 940 | * or content-negotiation mapping). |
| 941 | */ |
| 942 | |
| 943 | /** The URI without any parsing performed */ |
| 944 | char *unparsed_uri; |
| 945 | /** The path portion of the URI, or "/" if no path provided */ |
| 946 | char *uri; |
| 947 | /** The filename on disk corresponding to this response */ |
| 948 | char *filename; |
| 949 | /* XXX: What does this mean? Please define "canonicalize" -aaron */ |
| 950 | /** The true filename, we canonicalize r->filename if these don't match */ |
| 951 | char *canonical_filename; |
| 952 | /** The PATH_INFO extracted from this request */ |
| 953 | char *path_info; |
| 954 | /** The QUERY_ARGS extracted from this request */ |
| 955 | char *args; |
| 956 | /** finfo.protection (st_mode) set to zero if no such file */ |
| 957 | apr_finfo_t finfo; |
| 958 | /** A struct containing the components of URI */ |
| 959 | apr_uri_t parsed_uri; |
| 960 | |
| 961 | /** |
| 962 | * Flag for the handler to accept or reject path_info on |
| 963 | * the current request. All modules should respect the |
| 964 | * AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO |
| 965 | * values, while AP_REQ_DEFAULT_PATH_INFO indicates they |
| 966 | * may follow existing conventions. This is set to the |
| 967 | * user's preference upon HOOK_VERY_FIRST of the fixups. |
| 968 | */ |
| 969 | int used_path_info; |
| 970 | |
| 971 | /* Various other config info which may change with .htaccess files |
| 972 | * These are config vectors, with one void* pointer for each module |
| 973 | * (the thing pointed to being the module's business). |
| 974 | */ |
| 975 | |
| 976 | /** Options set in config files, etc. */ |
| 977 | struct ap_conf_vector_t *per_dir_config; |
| 978 | /** Notes on *this* request */ |
| 979 | struct ap_conf_vector_t *request_config; |
| 980 | |
| 981 | /** |
| 982 | * A linked list of the .htaccess configuration directives |
| 983 | * accessed by this request. |
| 984 | * N.B. always add to the head of the list, _never_ to the end. |
| 985 | * that way, a sub request's list can (temporarily) point to a parent's list |
| 986 | */ |
| 987 | const struct htaccess_result *htaccess; |
| 988 | |
| 989 | /** A list of output filters to be used for this request */ |
| 990 | struct ap_filter_t *output_filters; |
| 991 | /** A list of input filters to be used for this request */ |
| 992 | struct ap_filter_t *input_filters; |
| 993 | |
| 994 | /** A list of protocol level output filters to be used for this |
| 995 | * request */ |
| 996 | struct ap_filter_t *proto_output_filters; |
| 997 | /** A list of protocol level input filters to be used for this |
| 998 | * request */ |
| 999 | struct ap_filter_t *proto_input_filters; |
| 1000 | |
| 1001 | /** A flag to determine if the eos bucket has been sent yet */ |
| 1002 | int eos_sent; |
| 1003 | |
| 1004 | /* Things placed at the end of the record to avoid breaking binary |
| 1005 | * compatibility. It would be nice to remember to reorder the entire |
| 1006 | * record to improve 64bit alignment the next time we need to break |
| 1007 | * binary compatibility for some other reason. |
| 1008 | */ |
| 1009 | |
| 1010 | /** MIME trailer environment from the request */ |
| 1011 | apr_table_t *trailers_in; |
| 1012 | /** MIME trailer environment from the response */ |
| 1013 | apr_table_t *trailers_out; |
| 1014 | }; |
| 1015 | |
| 1016 | /** |
| 1017 | * @defgroup ProxyReq Proxy request types |
| 1018 | * |
| 1019 | * Possible values of request_rec->proxyreq. A request could be normal, |
| 1020 | * proxied or reverse proxied. Normally proxied and reverse proxied are |
| 1021 | * grouped together as just "proxied", but sometimes it's necessary to |
| 1022 | * tell the difference between the two, such as for authentication. |
| 1023 | * @{ |
| 1024 | */ |
| 1025 | |
| 1026 | #define PROXYREQ_NONE 0 /**< No proxy */ |
| 1027 | #define PROXYREQ_PROXY 1 /**< Standard proxy */ |
| 1028 | #define PROXYREQ_REVERSE 2 /**< Reverse proxy */ |
| 1029 | #define PROXYREQ_RESPONSE 3 /**< Origin response */ |
| 1030 | |
| 1031 | /* @} */ |
| 1032 | |
| 1033 | /** |
| 1034 | * @brief Enumeration of connection keepalive options |
| 1035 | */ |
| 1036 | typedef enum { |
| 1037 | AP_CONN_UNKNOWN, |
| 1038 | AP_CONN_CLOSE, |
| 1039 | AP_CONN_KEEPALIVE |
| 1040 | } ap_conn_keepalive_e; |
| 1041 | |
| 1042 | /** |
| 1043 | * @brief Structure to store things which are per connection |
| 1044 | */ |
| 1045 | struct conn_rec { |
| 1046 | /** Pool associated with this connection */ |
| 1047 | apr_pool_t *pool; |
| 1048 | /** Physical vhost this conn came in on */ |
| 1049 | server_rec *base_server; |
| 1050 | /** used by http_vhost.c */ |
| 1051 | void *vhost_lookup_data; |
| 1052 | |
| 1053 | /* Information about the connection itself */ |
| 1054 | /** local address */ |
| 1055 | apr_sockaddr_t *local_addr; |
| 1056 | /** remote address */ |
| 1057 | apr_sockaddr_t *remote_addr; |
| 1058 | |
| 1059 | /** Client's IP address */ |
| 1060 | char *remote_ip; |
| 1061 | /** Client's DNS name, if known. NULL if DNS hasn't been checked, |
| 1062 | * "" if it has and no address was found. N.B. Only access this though |
| 1063 | * get_remote_host() */ |
| 1064 | char *remote_host; |
| 1065 | /** Only ever set if doing rfc1413 lookups. N.B. Only access this through |
| 1066 | * get_remote_logname() */ |
| 1067 | char *remote_logname; |
| 1068 | |
| 1069 | /** Are we still talking? */ |
| 1070 | unsigned aborted:1; |
| 1071 | |
| 1072 | /** Are we going to keep the connection alive for another request? |
| 1073 | * @see ap_conn_keepalive_e */ |
| 1074 | ap_conn_keepalive_e keepalive; |
| 1075 | |
| 1076 | /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, |
| 1077 | * 1 yes/success */ |
| 1078 | signed int double_reverse:2; |
| 1079 | |
| 1080 | /** How many times have we used it? */ |
| 1081 | int keepalives; |
| 1082 | /** server IP address */ |
| 1083 | char *local_ip; |
| 1084 | /** used for ap_get_server_name when UseCanonicalName is set to DNS |
| 1085 | * (ignores setting of HostnameLookups) */ |
| 1086 | char *local_host; |
| 1087 | |
| 1088 | /** ID of this connection; unique at any point in time */ |
| 1089 | long id; |
| 1090 | /** Config vector containing pointers to connections per-server |
| 1091 | * config structures. */ |
| 1092 | struct ap_conf_vector_t *conn_config; |
| 1093 | /** Notes on *this* connection: send note from one module to |
| 1094 | * another. must remain valid for all requests on this conn */ |
| 1095 | apr_table_t *notes; |
| 1096 | /** A list of input filters to be used for this connection */ |
| 1097 | struct ap_filter_t *input_filters; |
| 1098 | /** A list of output filters to be used for this connection */ |
| 1099 | struct ap_filter_t *output_filters; |
| 1100 | /** handle to scoreboard information for this connection */ |
| 1101 | void *sbh; |
| 1102 | /** The bucket allocator to use for all bucket/brigade creations */ |
| 1103 | struct apr_bucket_alloc_t *bucket_alloc; |
| 1104 | /** The current state of this connection */ |
| 1105 | conn_state_t *cs; |
| 1106 | /** Is there data pending in the input filters? */ |
| 1107 | int data_in_input_filters; |
| 1108 | |
| 1109 | /** Are there any filters that clogg/buffer the input stream, breaking |
| 1110 | * the event mpm. |
| 1111 | */ |
| 1112 | int clogging_input_filters; |
| 1113 | }; |
| 1114 | |
| 1115 | /** |
| 1116 | * Enumeration of connection states |
| 1117 | */ |
| 1118 | typedef enum { |
| 1119 | CONN_STATE_CHECK_REQUEST_LINE_READABLE, |
| 1120 | CONN_STATE_READ_REQUEST_LINE, |
| 1121 | CONN_STATE_LINGER |
| 1122 | } conn_state_e; |
| 1123 | |
| 1124 | /** |
| 1125 | * @brief A structure to contain connection state information |
| 1126 | */ |
| 1127 | struct conn_state_t { |
| 1128 | /** APR_RING of expiration timeouts */ |
| 1129 | APR_RING_ENTRY(conn_state_t) timeout_list; |
| 1130 | /** the expiration time of the next keepalive timeout */ |
| 1131 | apr_time_t expiration_time; |
| 1132 | /** Current state of the connection */ |
| 1133 | conn_state_e state; |
| 1134 | /** connection record this struct refers to */ |
| 1135 | conn_rec *c; |
| 1136 | /** memory pool to allocate from */ |
| 1137 | apr_pool_t *p; |
| 1138 | /** bucket allocator */ |
| 1139 | apr_bucket_alloc_t *bucket_alloc; |
| 1140 | /** poll file decriptor information */ |
| 1141 | apr_pollfd_t pfd; |
| 1142 | }; |
| 1143 | |
| 1144 | /* Per-vhost config... */ |
| 1145 | |
| 1146 | /** |
| 1147 | * The address 255.255.255.255, when used as a virtualhost address, |
| 1148 | * will become the "default" server when the ip doesn't match other vhosts. |
| 1149 | */ |
| 1150 | #define DEFAULT_VHOST_ADDR 0xfffffffful |
| 1151 | |
| 1152 | |
| 1153 | /** |
| 1154 | * @struct server_addr_rec |
| 1155 | * @brief A structure to be used for Per-vhost config |
| 1156 | */ |
| 1157 | typedef struct server_addr_rec server_addr_rec; |
| 1158 | struct server_addr_rec { |
| 1159 | /** The next server in the list */ |
| 1160 | server_addr_rec *next; |
| 1161 | /** The bound address, for this server */ |
| 1162 | apr_sockaddr_t *host_addr; |
| 1163 | /** The bound port, for this server */ |
| 1164 | apr_port_t host_port; |
| 1165 | /** The name given in "<VirtualHost>" */ |
| 1166 | char *virthost; |
| 1167 | }; |
| 1168 | |
| 1169 | /** |
| 1170 | * @brief A structure to store information for each virtual server |
| 1171 | */ |
| 1172 | struct server_rec { |
| 1173 | /** The process this server is running in */ |
| 1174 | process_rec *process; |
| 1175 | /** The next server in the list */ |
| 1176 | server_rec *next; |
| 1177 | |
| 1178 | /** The name of the server */ |
| 1179 | const char *defn_name; |
| 1180 | /** The line of the config file that the server was defined on */ |
| 1181 | unsigned defn_line_number; |
| 1182 | |
| 1183 | /* Contact information */ |
| 1184 | |
| 1185 | /** The admin's contact information */ |
| 1186 | char *server_admin; |
| 1187 | /** The server hostname */ |
| 1188 | char *server_hostname; |
| 1189 | /** for redirects, etc. */ |
| 1190 | apr_port_t port; |
| 1191 | |
| 1192 | /* Log files --- note that transfer log is now in the modules... */ |
| 1193 | |
| 1194 | /** The name of the error log */ |
| 1195 | char *error_fname; |
| 1196 | /** A file descriptor that references the error log */ |
| 1197 | apr_file_t *error_log; |
| 1198 | /** The log level for this server */ |
| 1199 | int loglevel; |
| 1200 | |
| 1201 | /* Module-specific configuration for server, and defaults... */ |
| 1202 | |
| 1203 | /** true if this is the virtual server */ |
| 1204 | int is_virtual; |
| 1205 | /** Config vector containing pointers to modules' per-server config |
| 1206 | * structures. */ |
| 1207 | struct ap_conf_vector_t *module_config; |
| 1208 | /** MIME type info, etc., before we start checking per-directory info */ |
| 1209 | struct ap_conf_vector_t *lookup_defaults; |
| 1210 | |
| 1211 | /* Transaction handling */ |
| 1212 | |
| 1213 | /** I haven't got a clue */ |
| 1214 | server_addr_rec *addrs; |
| 1215 | /** Timeout, as an apr interval, before we give up */ |
| 1216 | apr_interval_time_t timeout; |
| 1217 | /** The apr interval we will wait for another request */ |
| 1218 | apr_interval_time_t keep_alive_timeout; |
| 1219 | /** Maximum requests per connection */ |
| 1220 | int keep_alive_max; |
| 1221 | /** Use persistent connections? */ |
| 1222 | int keep_alive; |
| 1223 | |
| 1224 | /** Pathname for ServerPath */ |
| 1225 | const char *path; |
| 1226 | /** Length of path */ |
| 1227 | int pathlen; |
| 1228 | |
| 1229 | /** Normal names for ServerAlias servers */ |
| 1230 | apr_array_header_t *names; |
| 1231 | /** Wildcarded names for ServerAlias servers */ |
| 1232 | apr_array_header_t *wild_names; |
| 1233 | |
| 1234 | /** limit on size of the HTTP request line */ |
| 1235 | int limit_req_line; |
| 1236 | /** limit on size of any request header field */ |
| 1237 | int limit_req_fieldsize; |
| 1238 | /** limit on number of request header fields */ |
| 1239 | int limit_req_fields; |
| 1240 | |
| 1241 | /** The server request scheme for redirect responses */ |
| 1242 | const char *server_scheme; |
| 1243 | }; |
| 1244 | |
| 1245 | typedef struct core_output_filter_ctx { |
| 1246 | apr_bucket_brigade *b; |
| 1247 | /** subpool of c->pool used for resources |
| 1248 | * which may outlive the request |
| 1249 | */ |
| 1250 | apr_pool_t *deferred_write_pool; |
| 1251 | } core_output_filter_ctx_t; |
| 1252 | |
| 1253 | typedef struct core_filter_ctx { |
| 1254 | apr_bucket_brigade *b; |
| 1255 | apr_bucket_brigade *tmpbb; |
| 1256 | } core_ctx_t; |
| 1257 | |
| 1258 | typedef struct core_net_rec { |
| 1259 | /** Connection to the client */ |
| 1260 | apr_socket_t *client_socket; |
| 1261 | |
| 1262 | /** connection record */ |
| 1263 | conn_rec *c; |
| 1264 | |
| 1265 | core_output_filter_ctx_t *out_ctx; |
| 1266 | core_ctx_t *in_ctx; |
| 1267 | } core_net_rec; |
| 1268 | |
| 1269 | /** |
| 1270 | * Examine a field value (such as a media-/content-type) string and return |
| 1271 | * it sans any parameters; e.g., strip off any ';charset=foo' and the like. |
| 1272 | * @param p Pool to allocate memory from |
| 1273 | * @param intype The field to examine |
| 1274 | * @return A copy of the field minus any parameters |
| 1275 | */ |
| 1276 | AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype); |
| 1277 | |
| 1278 | /** |
| 1279 | * Convert a time from an integer into a string in a specified format |
| 1280 | * @param p The pool to allocate memory from |
| 1281 | * @param t The time to convert |
| 1282 | * @param fmt The format to use for the conversion |
| 1283 | * @param gmt Convert the time for GMT? |
| 1284 | * @return The string that represents the specified time |
| 1285 | */ |
| 1286 | AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt); |
| 1287 | |
| 1288 | /* String handling. The *_nc variants allow you to use non-const char **s as |
| 1289 | arguments (unfortunately C won't automatically convert a char ** to a const |
| 1290 | char **) */ |
| 1291 | |
| 1292 | /** |
| 1293 | * Get the characters until the first occurance of a specified character |
| 1294 | * @param p The pool to allocate memory from |
| 1295 | * @param line The string to get the characters from |
| 1296 | * @param stop The character to stop at |
| 1297 | * @return A copy of the characters up to the first stop character |
| 1298 | */ |
| 1299 | AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop); |
| 1300 | |
| 1301 | /** |
| 1302 | * Get the characters until the first occurance of a specified character |
| 1303 | * @param p The pool to allocate memory from |
| 1304 | * @param line The string to get the characters from |
| 1305 | * @param stop The character to stop at |
| 1306 | * @return A copy of the characters up to the first stop character |
| 1307 | * @note This is the same as ap_getword(), except it doesn't use const char **. |
| 1308 | */ |
| 1309 | AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop); |
| 1310 | |
| 1311 | /** |
| 1312 | * Get the first word from a given string. A word is defined as all characters |
| 1313 | * up to the first whitespace. |
| 1314 | * @param p The pool to allocate memory from |
| 1315 | * @param line The string to traverse |
| 1316 | * @return The first word in the line |
| 1317 | */ |
| 1318 | AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line); |
| 1319 | |
| 1320 | /** |
| 1321 | * Get the first word from a given string. A word is defined as all characters |
| 1322 | * up to the first whitespace. |
| 1323 | * @param p The pool to allocate memory from |
| 1324 | * @param line The string to traverse |
| 1325 | * @return The first word in the line |
| 1326 | * @note The same as ap_getword_white(), except it doesn't use const char** |
| 1327 | */ |
| 1328 | AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line); |
| 1329 | |
| 1330 | /** |
| 1331 | * Get all characters from the first occurance of @a stop to the first "\0" |
| 1332 | * @param p The pool to allocate memory from |
| 1333 | * @param line The line to traverse |
| 1334 | * @param stop The character to start at |
| 1335 | * @return A copy of all caracters after the first occurance of the specified |
| 1336 | * character |
| 1337 | */ |
| 1338 | AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line, |
| 1339 | char stop); |
| 1340 | |
| 1341 | /** |
| 1342 | * Get all characters from the first occurance of @a stop to the first "\0" |
| 1343 | * @param p The pool to allocate memory from |
| 1344 | * @param line The line to traverse |
| 1345 | * @param stop The character to start at |
| 1346 | * @return A copy of all caracters after the first occurance of the specified |
| 1347 | * character |
| 1348 | * @note The same as ap_getword_nulls(), except it doesn't use const char **. |
| 1349 | */ |
| 1350 | AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop); |
| 1351 | |
| 1352 | /** |
| 1353 | * Get the second word in the string paying attention to quoting |
| 1354 | * @param p The pool to allocate from |
| 1355 | * @param line The line to traverse |
| 1356 | * @return A copy of the string |
| 1357 | */ |
| 1358 | AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line); |
| 1359 | |
| 1360 | /** |
| 1361 | * Get the second word in the string paying attention to quoting |
| 1362 | * @param p The pool to allocate from |
| 1363 | * @param line The line to traverse |
| 1364 | * @return A copy of the string |
| 1365 | * @note The same as ap_getword_conf(), except it doesn't use const char **. |
| 1366 | */ |
| 1367 | AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line); |
| 1368 | |
| 1369 | /** |
| 1370 | * Check a string for any ${ENV} environment variable construct and replace |
| 1371 | * each them by the value of that environment variable, if it exists. If the |
| 1372 | * environment value does not exist, leave the ${ENV} construct alone; it |
| 1373 | * means something else. |
| 1374 | * @param p The pool to allocate from |
| 1375 | * @param word The string to check |
| 1376 | * @return The string with the replaced environment variables |
| 1377 | */ |
| 1378 | AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word); |
| 1379 | |
| 1380 | /** |
| 1381 | * Size an HTTP header field list item, as separated by a comma. |
| 1382 | * @param field The field to size |
| 1383 | * @param len The length of the field |
| 1384 | * @return The return value is a pointer to the beginning of the non-empty |
| 1385 | * list item within the original string (or NULL if there is none) and the |
| 1386 | * address of field is shifted to the next non-comma, non-whitespace |
| 1387 | * character. len is the length of the item excluding any beginning whitespace. |
| 1388 | */ |
| 1389 | AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len); |
| 1390 | |
| 1391 | /** |
| 1392 | * Retrieve an HTTP header field list item, as separated by a comma, |
| 1393 | * while stripping insignificant whitespace and lowercasing anything not in |
| 1394 | * a quoted string or comment. |
| 1395 | * @param p The pool to allocate from |
| 1396 | * @param field The field to retrieve |
| 1397 | * @return The return value is a new string containing the converted list |
| 1398 | * item (or NULL if none) and the address pointed to by field is |
| 1399 | * shifted to the next non-comma, non-whitespace. |
| 1400 | */ |
| 1401 | AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field); |
| 1402 | |
| 1403 | /** |
| 1404 | * Find an item in canonical form (lowercase, no extra spaces) within |
| 1405 | * an HTTP field value list. |
| 1406 | * @param p The pool to allocate from |
| 1407 | * @param line The field value list to search |
| 1408 | * @param tok The token to search for |
| 1409 | * @return 1 if found, 0 if not found. |
| 1410 | */ |
| 1411 | AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok); |
| 1412 | |
| 1413 | /** |
| 1414 | * Retrieve a token, spacing over it and adjusting the pointer to |
| 1415 | * the first non-white byte afterwards. Note that these tokens |
| 1416 | * are delimited by semis and commas and can also be delimited |
| 1417 | * by whitespace at the caller's option. |
| 1418 | * @param p The pool to allocate from |
| 1419 | * @param accept_line The line to retrieve the token from (adjusted afterwards) |
| 1420 | * @param accept_white Is it delimited by whitespace |
| 1421 | * @return the token |
| 1422 | */ |
| 1423 | AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white); |
| 1424 | |
| 1425 | /** |
| 1426 | * Find http tokens, see the definition of token from RFC2068 |
| 1427 | * @param p The pool to allocate from |
| 1428 | * @param line The line to find the token |
| 1429 | * @param tok The token to find |
| 1430 | * @return 1 if the token is found, 0 otherwise |
| 1431 | */ |
| 1432 | AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok); |
| 1433 | |
| 1434 | /** |
| 1435 | * find http tokens from the end of the line |
| 1436 | * @param p The pool to allocate from |
| 1437 | * @param line The line to find the token |
| 1438 | * @param tok The token to find |
| 1439 | * @return 1 if the token is found, 0 otherwise |
| 1440 | */ |
| 1441 | AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok); |
| 1442 | |
| 1443 | /** |
| 1444 | * Check for an Absolute URI syntax |
| 1445 | * @param u The string to check |
| 1446 | * @return 1 if URI, 0 otherwise |
| 1447 | */ |
| 1448 | AP_DECLARE(int) ap_is_url(const char *u); |
| 1449 | |
| 1450 | /** |
| 1451 | * Unescape a URL |
| 1452 | * @param url The url to unescape |
| 1453 | * @return 0 on success, non-zero otherwise |
| 1454 | */ |
| 1455 | AP_DECLARE(int) ap_unescape_url(char *url); |
| 1456 | |
| 1457 | /** |
| 1458 | * Unescape a URL, including encoded slashes. |
| 1459 | * @param url The url to unescape |
| 1460 | * @return 0 on success, non-zero otherwise |
| 1461 | */ |
| 1462 | AP_DECLARE(int) ap_unescape_url_keep2f(char *url); |
| 1463 | |
| 1464 | /** |
| 1465 | * Unescape a URL, including encoded slashes. |
| 1466 | * @param url The url to unescape |
| 1467 | * @param decode_slashes Whether or not slashes should be decoded or not |
| 1468 | * @return 0 on success, non-zero otherwise |
| 1469 | */ |
| 1470 | AP_DECLARE(int) ap_unescape_url_keep2f_ex(char *url, int decode_slashes); |
| 1471 | |
| 1472 | /** |
| 1473 | * Convert all double slashes to single slashes |
| 1474 | * @param name The string to convert |
| 1475 | */ |
| 1476 | AP_DECLARE(void) ap_no2slash(char *name); |
| 1477 | |
| 1478 | /** |
| 1479 | * Remove all ./ and xx/../ substrings from a file name. Also remove |
| 1480 | * any leading ../ or /../ substrings. |
| 1481 | * @param name the file name to parse |
| 1482 | */ |
| 1483 | AP_DECLARE(void) ap_getparents(char *name); |
| 1484 | |
| 1485 | /** |
| 1486 | * Escape a path segment, as defined in RFC 1808 |
| 1487 | * @param p The pool to allocate from |
| 1488 | * @param s The path to convert |
| 1489 | * @return The converted URL |
| 1490 | */ |
| 1491 | AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s); |
| 1492 | |
| 1493 | /** |
| 1494 | * convert an OS path to a URL in an OS dependant way. |
| 1495 | * @param p The pool to allocate from |
| 1496 | * @param path The path to convert |
| 1497 | * @param partial if set, assume that the path will be appended to something |
| 1498 | * with a '/' in it (and thus does not prefix "./") |
| 1499 | * @return The converted URL |
| 1500 | */ |
| 1501 | AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial); |
| 1502 | |
| 1503 | /** @see ap_os_escape_path */ |
| 1504 | #define ap_escape_uri(ppool,path) ap_os_escape_path : enter=0, leave=0
ap_os_escape_path : include/httpd.h line=1501 column=20
ap_os_escape_path(ppool,path,1) |
| 1505 | |
| 1506 | /** |
| 1507 | * Escape an html string |
| 1508 | * @param p The pool to allocate from |
| 1509 | * @param s The html to escape |
| 1510 | * @return The escaped string |
| 1511 | */ |
| 1512 | AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s); |
| 1513 | /** |
| 1514 | * Escape an html string |
| 1515 | * @param p The pool to allocate from |
| 1516 | * @param s The html to escape |
| 1517 | * @param toasc Whether to escape all non-ASCII chars to &#nnn; |
| 1518 | * @return The escaped string |
| 1519 | */ |
| 1520 | AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc); |
| 1521 | |
| 1522 | /** |
| 1523 | * Escape a string for logging |
| 1524 | * @param p The pool to allocate from |
| 1525 | * @param str The string to escape |
| 1526 | * @return The escaped string |
| 1527 | */ |
| 1528 | AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str); |
| 1529 | |
| 1530 | /** |
| 1531 | * Escape a string for logging into the error log (without a pool) |
| 1532 | * @param dest The buffer to write to |
| 1533 | * @param source The string to escape |
| 1534 | * @param buflen The buffer size for the escaped string (including "\0") |
| 1535 | * @return The len of the escaped string (always < maxlen) |
| 1536 | */ |
| 1537 | AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source, |
| 1538 | apr_size_t buflen); |
| 1539 | |
| 1540 | /** |
| 1541 | * Construct a full hostname |
| 1542 | * @param p The pool to allocate from |
| 1543 | * @param hostname The hostname of the server |
| 1544 | * @param port The port the server is running on |
| 1545 | * @param r The current request |
| 1546 | * @return The server's hostname |
| 1547 | */ |
| 1548 | AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname, |
| 1549 | apr_port_t port, const request_rec *r); |
| 1550 | |
| 1551 | /** |
| 1552 | * Escape a shell command |
| 1553 | * @param p The pool to allocate from |
| 1554 | * @param s The command to escape |
| 1555 | * @return The escaped shell command |
| 1556 | */ |
| 1557 | AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s); |
| 1558 | |
| 1559 | /** |
| 1560 | * Count the number of directories in a path |
| 1561 | * @param path The path to count |
| 1562 | * @return The number of directories |
| 1563 | */ |
| 1564 | AP_DECLARE(int) ap_count_dirs(const char *path); |
| 1565 | |
| 1566 | /** |
| 1567 | * Copy at most @a n leading directories of @a s into @a d. @a d |
| 1568 | * should be at least as large as @a s plus 1 extra byte |
| 1569 | * |
| 1570 | * @param d The location to copy to |
| 1571 | * @param s The location to copy from |
| 1572 | * @param n The number of directories to copy |
| 1573 | * @return value is the ever useful pointer to the trailing "\0" of d |
| 1574 | * @note on platforms with drive letters, n = 0 returns the "/" root, |
| 1575 | * whereas n = 1 returns the "d:/" root. On all other platforms, n = 0 |
| 1576 | * returns the empty string. */ |
| 1577 | AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n); |
| 1578 | |
| 1579 | /** |
| 1580 | * Return the parent directory name (including trailing /) of the file |
| 1581 | * @a s |
| 1582 | * @param p The pool to allocate from |
| 1583 | * @param s The file to get the parent of |
| 1584 | * @return A copy of the file's parent directory |
| 1585 | */ |
| 1586 | AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s); |
| 1587 | |
| 1588 | /** |
| 1589 | * Given a directory and filename, create a single path from them. This |
| 1590 | * function is smart enough to ensure that there is a single '/' between the |
| 1591 | * directory and file names |
| 1592 | * @param a The pool to allocate from |
| 1593 | * @param dir The directory name |
| 1594 | * @param f The filename |
| 1595 | * @return A copy of the full path |
| 1596 | * @note Never consider using this function if you are dealing with filesystem |
| 1597 | * names that need to remain canonical, unless you are merging an apr_dir_read |
| 1598 | * path and returned filename. Otherwise, the result is not canonical. |
| 1599 | */ |
| 1600 | AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f); |
| 1601 | |
| 1602 | /** |
| 1603 | * Test if the given path has an an absolute path. |
| 1604 | * @param p The pool to allocate from |
| 1605 | * @param dir The directory name |
| 1606 | * @note The converse is not necessarily true, some OS's (Win32/OS2/Netware) have |
| 1607 | * multiple forms of absolute paths. This only reports if the path is absolute |
| 1608 | * in a canonical sense. |
| 1609 | */ |
| 1610 | AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir); |
| 1611 | |
| 1612 | /** |
| 1613 | * Does the provided string contain wildcard characters? This is useful |
| 1614 | * for determining if the string should be passed to strcmp_match or to strcmp. |
| 1615 | * The only wildcard characters recognized are '?' and '*' |
| 1616 | * @param str The string to check |
| 1617 | * @return 1 if the string has wildcards, 0 otherwise |
| 1618 | */ |
| 1619 | AP_DECLARE(int) ap_is_matchexp(const char *str); |
| 1620 | |
| 1621 | /** |
| 1622 | * Determine if a string matches a patterm containing the wildcards '?' or '*' |
| 1623 | * @param str The string to check |
| 1624 | * @param expected The pattern to match against |
| 1625 | * @return 1 if the two strings match, 0 otherwise |
| 1626 | */ |
| 1627 | AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected); |
| 1628 | |
| 1629 | /** |
| 1630 | * Determine if a string matches a patterm containing the wildcards '?' or '*', |
| 1631 | * ignoring case |
| 1632 | * @param str The string to check |
| 1633 | * @param expected The pattern to match against |
| 1634 | * @return 1 if the two strings match, 0 otherwise |
| 1635 | */ |
| 1636 | AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected); |
| 1637 | |
| 1638 | /** |
| 1639 | * Find the first occurrence of the substring s2 in s1, regardless of case |
| 1640 | * @param s1 The string to search |
| 1641 | * @param s2 The substring to search for |
| 1642 | * @return A pointer to the beginning of the substring |
| 1643 | * @remark See apr_strmatch() for a faster alternative |
| 1644 | */ |
| 1645 | AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2); |
| 1646 | |
| 1647 | /** |
| 1648 | * Return a pointer to the location inside of bigstring immediately after prefix |
| 1649 | * @param bigstring The input string |
| 1650 | * @param prefix The prefix to strip away |
| 1651 | * @return A pointer relative to bigstring after prefix |
| 1652 | */ |
| 1653 | AP_DECLARE(const char *) ap_stripprefix(const char *bigstring, |
| 1654 | const char *prefix); |
| 1655 | |
| 1656 | /** |
| 1657 | * Decode a base64 encoded string into memory allocated from a pool |
| 1658 | * @param p The pool to allocate from |
| 1659 | * @param bufcoded The encoded string |
| 1660 | * @return The decoded string |
| 1661 | */ |
| 1662 | AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded); |
| 1663 | |
| 1664 | /** |
| 1665 | * Encode a string into memory allocated from a pool in base 64 format |
| 1666 | * @param p The pool to allocate from |
| 1667 | * @param string The plaintext string |
| 1668 | * @return The encoded string |
| 1669 | */ |
| 1670 | AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string); |
| 1671 | |
| 1672 | /** |
| 1673 | * Compile a regular expression to be used later |
| 1674 | * @param p The pool to allocate from |
| 1675 | * @param pattern the regular expression to compile |
| 1676 | * @param cflags The bitwise or of one or more of the following: |
| 1677 | * @li REG_EXTENDED - Use POSIX extended Regular Expressions |
| 1678 | * @li REG_ICASE - Ignore case |
| 1679 | * @li REG_NOSUB - Support for substring addressing of matches |
| 1680 | * not required |
| 1681 | * @li REG_NEWLINE - Match-any-character operators don't match new-line |
| 1682 | * @return The compiled regular expression |
| 1683 | */ |
| 1684 | AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, |
| 1685 | int cflags); |
| 1686 | |
| 1687 | /** |
| 1688 | * Free the memory associated with a compiled regular expression |
| 1689 | * @param p The pool the regex was allocated from |
| 1690 | * @param reg The regular expression to free |
| 1691 | */ |
| 1692 | AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg); |
| 1693 | |
| 1694 | /** |
| 1695 | * After performing a successful regex match, you may use this function to |
| 1696 | * perform a series of string substitutions based on subexpressions that were |
| 1697 | * matched during the call to ap_regexec |
| 1698 | * @param p The pool to allocate from |
| 1699 | * @param input An arbitrary string containing $1 through $9. These are |
| 1700 | * replaced with the corresponding matched sub-expressions |
| 1701 | * @param source The string that was originally matched to the regex |
| 1702 | * @param nmatch the nmatch returned from ap_pregex |
| 1703 | * @param pmatch the pmatch array returned from ap_pregex |
| 1704 | */ |
| 1705 | AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, const char *source, |
| 1706 | size_t nmatch, ap_regmatch_t pmatch[]); |
| 1707 | |
| 1708 | /** |
| 1709 | * After performing a successful regex match, you may use this function to |
| 1710 | * perform a series of string substitutions based on subexpressions that were |
| 1711 | * matched during the call to ap_regexec |
| 1712 | * @param p The pool to allocate from |
| 1713 | * @param result where to store the result, will be set to NULL on error |
| 1714 | * @param input An arbitrary string containing $1 through $9. These are |
| 1715 | * replaced with the corresponding matched sub-expressions |
| 1716 | * @param source The string that was originally matched to the regex |
| 1717 | * @param nmatch the nmatch returned from ap_pregex |
| 1718 | * @param pmatch the pmatch array returned from ap_pregex |
| 1719 | * @param maxlen the maximum string length to return, 0 for unlimited |
| 1720 | * @return APR_SUCCESS if successful, APR_ENOMEM or other error code otherwise. |
| 1721 | */ |
| 1722 | AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result, |
| 1723 | const char *input, const char *source, |
| 1724 | apr_size_t nmatch, |
| 1725 | ap_regmatch_t pmatch[], |
| 1726 | apr_size_t maxlen); |
| 1727 | |
| 1728 | /** |
| 1729 | * We want to downcase the type/subtype for comparison purposes |
| 1730 | * but nothing else because ;parameter=foo values are case sensitive. |
| 1731 | * @param s The content-type to convert to lowercase |
| 1732 | */ |
| 1733 | AP_DECLARE(void) ap_content_type_tolower(char *s); |
| 1734 | |
| 1735 | /** |
| 1736 | * convert a string to all lowercase |
| 1737 | * @param s The string to convert to lowercase |
| 1738 | */ |
| 1739 | AP_DECLARE(void) ap_str_tolower(char *s); |
| 1740 | |
| 1741 | /** |
| 1742 | * Search a string from left to right for the first occurrence of a |
| 1743 | * specific character |
| 1744 | * @param str The string to search |
| 1745 | * @param c The character to search for |
| 1746 | * @return The index of the first occurrence of c in str |
| 1747 | */ |
| 1748 | AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */ |
| 1749 | |
| 1750 | /** |
| 1751 | * Search a string from right to left for the first occurrence of a |
| 1752 | * specific character |
| 1753 | * @param str The string to search |
| 1754 | * @param c The character to search for |
| 1755 | * @return The index of the first occurrence of c in str |
| 1756 | */ |
| 1757 | AP_DECLARE(int) ap_rind(const char *str, char c); |
| 1758 | |
| 1759 | /** |
| 1760 | * Given a string, replace any bare " with \" . |
| 1761 | * @param p The pool to allocate memory from |
| 1762 | * @param instring The string to search for " |
| 1763 | * @return A copy of the string with escaped quotes |
| 1764 | */ |
| 1765 | AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring); |
| 1766 | |
| 1767 | /** |
| 1768 | * Given a string, append the PID deliminated by delim. |
| 1769 | * Usually used to create a pid-appended filepath name |
| 1770 | * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not |
| 1771 | * a macro, to avoid unistd.h dependency |
| 1772 | * @param p The pool to allocate memory from |
| 1773 | * @param string The string to append the PID to |
| 1774 | * @param delim The string to use to deliminate the string from the PID |
| 1775 | * @return A copy of the string with the PID appended |
| 1776 | */ |
| 1777 | AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string, |
| 1778 | const char *delim); |
| 1779 | |
| 1780 | /** |
| 1781 | * Parse a given timeout parameter string into an apr_interval_time_t value. |
| 1782 | * The unit of the time interval is given as postfix string to the numeric |
| 1783 | * string. Currently the following units are understood: |
| 1784 | * |
| 1785 | * ms : milliseconds |
| 1786 | * s : seconds |
| 1787 | * mi[n] : minutes |
| 1788 | * h : hours |
| 1789 | * |
| 1790 | * If no unit is contained in the given timeout parameter the default_time_unit |
| 1791 | * will be used instead. |
| 1792 | * @param timeout_parameter The string containing the timeout parameter. |
| 1793 | * @param timeout The timeout value to be returned. |
| 1794 | * @param default_time_unit The default time unit to use if none is specified |
| 1795 | * in timeout_parameter. |
| 1796 | * @return Status value indicating whether the parsing was successful or not. |
| 1797 | */ |
| 1798 | AP_DECLARE(apr_status_t) ap_timeout_parameter_parse( |
| 1799 | const char *timeout_parameter, |
| 1800 | apr_interval_time_t *timeout, |
| 1801 | const char *default_time_unit); |
| 1802 | |
| 1803 | /* Misc system hackery */ |
| 1804 | /** |
| 1805 | * Given the name of an object in the file system determine if it is a directory |
| 1806 | * @param p The pool to allocate from |
| 1807 | * @param name The name of the object to check |
| 1808 | * @return 1 if it is a directory, 0 otherwise |
| 1809 | */ |
| 1810 | AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name); |
| 1811 | |
| 1812 | /** |
| 1813 | * Given the name of an object in the file system determine if it is a directory - this version is symlink aware |
| 1814 | * @param p The pool to allocate from |
| 1815 | * @param name The name of the object to check |
| 1816 | * @return 1 if it is a directory, 0 otherwise |
| 1817 | */ |
| 1818 | AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name); |
| 1819 | |
| 1820 | #ifdef _OSD_POSIX |
| 1821 | extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process); |
| 1822 | #endif /* _OSD_POSIX */ |
| 1823 | |
| 1824 | /** |
| 1825 | * Determine the local host name for the current machine |
| 1826 | * @param p The pool to allocate from |
| 1827 | * @return A copy of the local host name |
| 1828 | */ |
| 1829 | char *ap_get_local_host(apr_pool_t *p); |
| 1830 | |
| 1831 | /** |
| 1832 | * Log an assertion to the error log |
| 1833 | * @param szExp The assertion that failed |
| 1834 | * @param szFile The file the assertion is in |
| 1835 | * @param nLine The line the assertion is defined on |
| 1836 | */ |
| 1837 | AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine) |
| 1838 | __attribute__((noreturn)); |
| 1839 | |
| 1840 | /** |
| 1841 | * @internal Internal Assert function |
| 1842 | */ |
| 1843 | #define ap_assert(exp) ((exp) conditional operator : true=0, false=0 ? (void)0 : ap_log_assert : enter=0, leave=0
ap_log_assert : include/httpd.h line=1837 column=18
ap_log_assert(#exp,__FILE__,__LINE__)) |
| 1844 | |
| 1845 | /** |
| 1846 | * Redefine assert() to something more useful for an Apache... |
| 1847 | * |
| 1848 | * Use ap_assert() if the condition should always be checked. |
| 1849 | * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG |
| 1850 | * is defined. |
| 1851 | */ |
| 1852 | #ifdef AP_DEBUG |
| 1853 | #define AP_DEBUG_ASSERT(exp) ap_assert(exp) |
| 1854 | #else |
| 1855 | #define AP_DEBUG_ASSERT(exp) ((void)0) |
| 1856 | #endif |
| 1857 | |
| 1858 | /** |
| 1859 | * @defgroup stopsignal Flags which indicate places where the sever should stop for debugging. |
| 1860 | * @{ |
| 1861 | * A set of flags which indicate places where the server should raise(SIGSTOP). |
| 1862 | * This is useful for debugging, because you can then attach to that process |
| 1863 | * with gdb and continue. This is important in cases where one_process |
| 1864 | * debugging isn't possible. |
| 1865 | */ |
| 1866 | /** stop on a Detach */ |
| 1867 | #define SIGSTOP_DETACH 1 |
| 1868 | /** stop making a child process */ |
| 1869 | #define SIGSTOP_MAKE_CHILD 2 |
| 1870 | /** stop spawning a child process */ |
| 1871 | #define SIGSTOP_SPAWN_CHILD 4 |
| 1872 | /** stop spawning a child process with a piped log */ |
| 1873 | #define SIGSTOP_PIPED_LOG_SPAWN 8 |
| 1874 | /** stop spawning a CGI child process */ |
| 1875 | #define SIGSTOP_CGI_CHILD 16 |
| 1876 | |
| 1877 | /** Macro to get GDB started */ |
| 1878 | #ifdef DEBUG_SIGSTOP |
| 1879 | extern int raise_sigstop_flags; |
| 1880 | #define RAISE_SIGSTOP(x) do { \ |
| 1881 | if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\ |
| 1882 | } while (0) |
| 1883 | #else |
| 1884 | #define RAISE_SIGSTOP(x) |
| 1885 | #endif |
| 1886 | /** @} */ |
| 1887 | /** |
| 1888 | * Get HTML describing the address and (optionally) admin of the server. |
| 1889 | * @param prefix Text which is prepended to the return value |
| 1890 | * @param r The request_rec |
| 1891 | * @return HTML describing the server, allocated in @a r's pool. |
| 1892 | */ |
| 1893 | AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r); |
| 1894 | |
| 1895 | |
| 1896 | /** |
| 1897 | * Short function to execute a command and return the first line of |
| 1898 | * output minus \r \n. Useful for "obscuring" passwords via exec calls |
| 1899 | * @param p the pool to allocate from |
| 1900 | * @param cmd the command to execute |
| 1901 | * @param argv the arguments to pass to the cmd |
| 1902 | * @return ptr to characters or NULL on any error |
| 1903 | */ |
| 1904 | AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p, |
| 1905 | const char *cmd, |
| 1906 | const char * const *argv); |
| 1907 | |
| 1908 | /** strtoul does not exist on sunos4. */ |
| 1909 | #ifdef strtoul |
| 1910 | #undef strtoul |
| 1911 | #endif |
| 1912 | #define strtoul strtoul_is_not_a_portable_function_use_strtol_instead |
| 1913 | |
| 1914 | /* The C library has functions that allow const to be silently dropped ... |
| 1915 | these macros detect the drop in maintainer mode, but use the native |
| 1916 | methods for normal builds |
| 1917 | |
| 1918 | Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs |
| 1919 | to be included before the macros are defined or compilation will fail. |
| 1920 | */ |
| 1921 | #include <string.h> |
| 1922 | |
| 1923 | AP_DECLARE(char *) ap_strchr(char *s, int c); |
| 1924 | AP_DECLARE(const char *) ap_strchr_c(const char *s, int c); |
| 1925 | AP_DECLARE(char *) ap_strrchr(char *s, int c); |
| 1926 | AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c); |
| 1927 | AP_DECLARE(char *) ap_strstr(char *s, const char *c); |
| 1928 | AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c); |
| 1929 | |
| 1930 | #ifdef AP_DEBUG |
| 1931 | |
| 1932 | #undef strchr |
| 1933 | # define strchr(s, c) ap_strchr(s,c) |
| 1934 | #undef strrchr |
| 1935 | # define strrchr(s, c) ap_strrchr(s,c) |
| 1936 | #undef strstr |
| 1937 | # define strstr(s, c) ap_strstr(s,c) |
| 1938 | |
| 1939 | #else |
| 1940 | |
| 1941 | /** use this instead of strchr */ |
| 1942 | # define ap_strchr(s, c) strchr : enter=0, leave=0
strchr : /usr/include/string.h line=235 column=14
strchr(s, c) |
| 1943 | /** use this instead of strchr */ |
| 1944 | # define ap_strchr_c(s, c) MC/DC independently affect : true=0, false=0 strchr : enter=0, leave=0
strchr : /usr/include/string.h line=235 column=14
strchr(s, c) |
| 1945 | /** use this instead of strrchr */ |
| 1946 | # define ap_strrchr(s, c) strrchr : enter=0, leave=0
strrchr : /usr/include/string.h line=262 column=14
strrchr(s, c) |
| 1947 | /** use this instead of strrchr */ |
| 1948 | # define ap_strrchr_c(s, c) strrchr : enter=0, leave=0
strrchr : /usr/include/string.h line=262 column=14
strrchr(s, c) |
| 1949 | /** use this instead of strrstr*/ |
| 1950 | # define ap_strstr(s, c) strstr(s, c) |
| 1951 | /** use this instead of strrstr*/ |
| 1952 | # define ap_strstr_c(s, c) MC/DC independently affect : true=0, false=0 strstr : enter=0, leave=0
strstr : /usr/include/string.h line=342 column=14
strstr(s, c) |
| 1953 | |
| 1954 | #endif |
| 1955 | |
| 1956 | #define AP_NORESTART APR_OS_START_USEERR + : pass=0 + 1 |
| 1957 | |
| 1958 | #ifdef __cplusplus |
| 1959 | } |
| 1960 | #endif |
| 1961 | |
| 1962 | #endif /* !APACHE_HTTPD_H */ |
| 1963 | |
| 1964 | /** @} //APACHE Daemon */ |
| 1965 | /** @} //APACHE Core */ |
| 1966 | /** @} //APACHE super group */ |
| 1967 | |
| 1968 | [EOF] |