Annotation of win32/apache13/src/include/httpd.h, revision 1.1

1.1     ! parser      1: /* ====================================================================
        !             2:  * Copyright (c) 1995-1999 The Apache Group.  All rights reserved.
        !             3:  *
        !             4:  * Redistribution and use in source and binary forms, with or without
        !             5:  * modification, are permitted provided that the following conditions
        !             6:  * are met:
        !             7:  *
        !             8:  * 1. Redistributions of source code must retain the above copyright
        !             9:  *    notice, this list of conditions and the following disclaimer. 
        !            10:  *
        !            11:  * 2. Redistributions in binary form must reproduce the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer in
        !            13:  *    the documentation and/or other materials provided with the
        !            14:  *    distribution.
        !            15:  *
        !            16:  * 3. All advertising materials mentioning features or use of this
        !            17:  *    software must display the following acknowledgment:
        !            18:  *    "This product includes software developed by the Apache Group
        !            19:  *    for use in the Apache HTTP server project (http://www.apache.org/)."
        !            20:  *
        !            21:  * 4. The names "Apache Server" and "Apache Group" must not be used to
        !            22:  *    endorse or promote products derived from this software without
        !            23:  *    prior written permission. For written permission, please contact
        !            24:  *    apache@apache.org.
        !            25:  *
        !            26:  * 5. Products derived from this software may not be called "Apache"
        !            27:  *    nor may "Apache" appear in their names without prior written
        !            28:  *    permission of the Apache Group.
        !            29:  *
        !            30:  * 6. Redistributions of any form whatsoever must retain the following
        !            31:  *    acknowledgment:
        !            32:  *    "This product includes software developed by the Apache Group
        !            33:  *    for use in the Apache HTTP server project (http://www.apache.org/)."
        !            34:  *
        !            35:  * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
        !            36:  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            37:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            38:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
        !            39:  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        !            40:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            41:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
        !            42:  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            43:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            44:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            45:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
        !            46:  * OF THE POSSIBILITY OF SUCH DAMAGE.
        !            47:  * ====================================================================
        !            48:  *
        !            49:  * This software consists of voluntary contributions made by many
        !            50:  * individuals on behalf of the Apache Group and was originally based
        !            51:  * on public domain software written at the National Center for
        !            52:  * Supercomputing Applications, University of Illinois, Urbana-Champaign.
        !            53:  * For more information on the Apache Group and the Apache HTTP server
        !            54:  * project, please see <http://www.apache.org/>.
        !            55:  *
        !            56:  */
        !            57: 
        !            58: #ifndef APACHE_HTTPD_H
        !            59: #define APACHE_HTTPD_H
        !            60: 
        !            61: #ifdef __cplusplus
        !            62: extern "C" {
        !            63: #endif
        !            64: 
        !            65: /*
        !            66:  * httpd.h: header for simple (ha! not anymore) http daemon
        !            67:  */
        !            68: 
        !            69: /* Headers in which EVERYONE has an interest... */
        !            70: 
        !            71: #include "ap_config.h"
        !            72: #include "ap_alloc.h"
        !            73: #include "buff.h"
        !            74: #include "ap.h"
        !            75: 
        !            76: /* ----------------------------- config dir ------------------------------ */
        !            77: 
        !            78: /* Define this to be the default server home dir. Most things later in this
        !            79:  * file with a relative pathname will have this added.
        !            80:  */
        !            81: #ifndef HTTPD_ROOT
        !            82: #ifdef OS2
        !            83: /* Set default for OS/2 file system */
        !            84: #define HTTPD_ROOT "/os2httpd"
        !            85: #elif defined(WIN32)
        !            86: /* Set default for Windows file system */
        !            87: #define HTTPD_ROOT "/apache"
        !            88: #elif defined(BEOS)
        !            89: #define HTTPD_ROOT "/boot/home/apache"
        !            90: #elif defined(NETWARE)
        !            91: #define HTTPD_ROOT "sys:/apache"
        !            92: #else
        !            93: #define HTTPD_ROOT "/usr/local/apache"
        !            94: #endif
        !            95: #endif /* HTTPD_ROOT */
        !            96: 
        !            97: /* Default location of documents.  Can be overridden by the DocumentRoot
        !            98:  * directive.
        !            99:  */
        !           100: #ifndef DOCUMENT_LOCATION
        !           101: #ifdef OS2
        !           102: /* Set default for OS/2 file system */
        !           103: #define DOCUMENT_LOCATION  HTTPD_ROOT "/docs"
        !           104: #else
        !           105: #define DOCUMENT_LOCATION  HTTPD_ROOT "/htdocs"
        !           106: #endif
        !           107: #endif /* DOCUMENT_LOCATION */
        !           108: 
        !           109: /* Max. number of dynamically loaded modules */
        !           110: #ifndef DYNAMIC_MODULE_LIMIT
        !           111: #define DYNAMIC_MODULE_LIMIT 64
        !           112: #endif
        !           113: 
        !           114: /* Default administrator's address */
        !           115: #define DEFAULT_ADMIN "[no address given]"
        !           116: 
        !           117: /* The target name of the installed Apache */
        !           118: #ifndef TARGET
        !           119: #define TARGET "httpd"
        !           120: #endif
        !           121: 
        !           122: /* 
        !           123:  * --------- You shouldn't have to edit anything below this line ----------
        !           124:  *
        !           125:  * Any modifications to any defaults not defined above should be done in the 
        !           126:  * respective config. file. 
        !           127:  *
        !           128:  */
        !           129: 
        !           130: 
        !           131: /* -- Internal representation for a HTTP protocol number, e.g., HTTP/1.1 -- */
        !           132: 
        !           133: #define HTTP_VERSION(major,minor) (1000*(major)+(minor))
        !           134: #define HTTP_VERSION_MAJOR(number) ((number)/1000)
        !           135: #define HTTP_VERSION_MINOR(number) ((number)%1000)
        !           136: 
        !           137: 
        !           138: /* -------------- Port number for server running standalone --------------- */
        !           139: 
        !           140: #define DEFAULT_HTTP_PORT      80
        !           141: #define DEFAULT_HTTPS_PORT     443
        !           142: #define ap_is_default_port(port,r)     ((port) == ap_default_port(r))
        !           143: #define ap_http_method(r)      "http"
        !           144: #define ap_default_port(r)     DEFAULT_HTTP_PORT
        !           145: 
        !           146: /* --------- Default user name and group name running standalone ---------- */
        !           147: /* --- These may be specified as numbers by placing a # before a number --- */
        !           148: 
        !           149: #ifndef DEFAULT_USER
        !           150: #define DEFAULT_USER "#-1"
        !           151: #endif
        !           152: #ifndef DEFAULT_GROUP
        !           153: #define DEFAULT_GROUP "#-1"
        !           154: #endif
        !           155: 
        !           156: /* The name of the log files */
        !           157: #ifndef DEFAULT_XFERLOG
        !           158: #if defined(OS2) || defined(WIN32)
        !           159: #define DEFAULT_XFERLOG "logs/access.log"
        !           160: #else
        !           161: #define DEFAULT_XFERLOG "logs/access_log"
        !           162: #endif
        !           163: #endif /* DEFAULT_XFERLOG */
        !           164: 
        !           165: #ifndef DEFAULT_ERRORLOG
        !           166: #if defined(OS2) || defined(WIN32)
        !           167: #define DEFAULT_ERRORLOG "logs/error.log"
        !           168: #else
        !           169: #define DEFAULT_ERRORLOG "logs/error_log"
        !           170: #endif
        !           171: #endif /* DEFAULT_ERRORLOG */
        !           172: 
        !           173: #ifndef DEFAULT_PIDLOG
        !           174: #define DEFAULT_PIDLOG "logs/httpd.pid"
        !           175: #endif
        !           176: #ifndef DEFAULT_SCOREBOARD
        !           177: #define DEFAULT_SCOREBOARD "logs/apache_runtime_status"
        !           178: #endif
        !           179: #ifndef DEFAULT_LOCKFILE
        !           180: #define DEFAULT_LOCKFILE "logs/accept.lock"
        !           181: #endif
        !           182: 
        !           183: /* Define this to be what your HTML directory content files are called */
        !           184: #ifndef DEFAULT_INDEX
        !           185: #define DEFAULT_INDEX "index.html"
        !           186: #endif
        !           187: 
        !           188: /* Define this to 1 if you want fancy indexing, 0 otherwise */
        !           189: #ifndef DEFAULT_INDEXING
        !           190: #define DEFAULT_INDEXING 0
        !           191: #endif
        !           192: 
        !           193: /* Define this to be what type you'd like returned for files with unknown */
        !           194: /* suffixes.  MUST be all lower case. */
        !           195: #ifndef DEFAULT_CONTENT_TYPE
        !           196: #define DEFAULT_CONTENT_TYPE "text/plain"
        !           197: #endif
        !           198: 
        !           199: /* Define this to be what your per-directory security files are called */
        !           200: #ifndef DEFAULT_ACCESS_FNAME
        !           201: #ifdef OS2
        !           202: /* Set default for OS/2 file system */
        !           203: #define DEFAULT_ACCESS_FNAME "htaccess"
        !           204: #else
        !           205: #define DEFAULT_ACCESS_FNAME ".htaccess"
        !           206: #endif
        !           207: #endif /* DEFAULT_ACCESS_FNAME */
        !           208: 
        !           209: /* The name of the server config file */
        !           210: #ifndef SERVER_CONFIG_FILE
        !           211: #define SERVER_CONFIG_FILE "conf/httpd.conf"
        !           212: #endif
        !           213: 
        !           214: /* The name of the document config file */
        !           215: #ifndef RESOURCE_CONFIG_FILE
        !           216: #define RESOURCE_CONFIG_FILE "conf/srm.conf"
        !           217: #endif
        !           218: 
        !           219: /* The name of the MIME types file */
        !           220: #ifndef TYPES_CONFIG_FILE
        !           221: #define TYPES_CONFIG_FILE "conf/mime.types"
        !           222: #endif
        !           223: 
        !           224: /* The name of the access file */
        !           225: #ifndef ACCESS_CONFIG_FILE
        !           226: #define ACCESS_CONFIG_FILE "conf/access.conf"
        !           227: #endif
        !           228: 
        !           229: /* Whether we should enable rfc1413 identity checking */
        !           230: #ifndef DEFAULT_RFC1413
        !           231: #define DEFAULT_RFC1413 0
        !           232: #endif
        !           233: /* The default directory in user's home dir */
        !           234: #ifndef DEFAULT_USER_DIR
        !           235: #define DEFAULT_USER_DIR "public_html"
        !           236: #endif
        !           237: 
        !           238: /* The default path for CGI scripts if none is currently set */
        !           239: #ifndef DEFAULT_PATH
        !           240: #define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
        !           241: #endif
        !           242: 
        !           243: /* The path to the shell interpreter, for parsed docs */
        !           244: #ifndef SHELL_PATH
        !           245: #if defined(OS2) || defined(WIN32)
        !           246: /* Set default for OS/2 and Windows file system */
        !           247: #define SHELL_PATH "CMD.EXE"
        !           248: #else
        !           249: #define SHELL_PATH "/bin/sh"
        !           250: #endif
        !           251: #endif /* SHELL_PATH */
        !           252: 
        !           253: /* The path to the suExec wrapper, can be overridden in Configuration */
        !           254: #ifndef SUEXEC_BIN
        !           255: #define SUEXEC_BIN  HTTPD_ROOT "/bin/suexec"
        !           256: #endif
        !           257: 
        !           258: /* The default string lengths */
        !           259: #define MAX_STRING_LEN HUGE_STRING_LEN
        !           260: #define HUGE_STRING_LEN 8192
        !           261: 
        !           262: /* The timeout for waiting for messages */
        !           263: #ifndef DEFAULT_TIMEOUT
        !           264: #define DEFAULT_TIMEOUT 300
        !           265: #endif
        !           266: 
        !           267: /* The timeout for waiting for keepalive timeout until next request */
        !           268: #ifndef DEFAULT_KEEPALIVE_TIMEOUT
        !           269: #define DEFAULT_KEEPALIVE_TIMEOUT 15
        !           270: #endif
        !           271: 
        !           272: /* The number of requests to entertain per connection */
        !           273: #ifndef DEFAULT_KEEPALIVE
        !           274: #define DEFAULT_KEEPALIVE 100
        !           275: #endif
        !           276: 
        !           277: /* The size of the server's internal read-write buffers */
        !           278: #define IOBUFSIZE 8192
        !           279: 
        !           280: /* Number of servers to spawn off by default --- also, if fewer than
        !           281:  * this free when the caretaker checks, it will spawn more.
        !           282:  */
        !           283: #ifndef DEFAULT_START_DAEMON
        !           284: #define DEFAULT_START_DAEMON 5
        !           285: #endif
        !           286: 
        !           287: /* Maximum number of *free* server processes --- more than this, and
        !           288:  * they will die off.
        !           289:  */
        !           290: 
        !           291: #ifndef DEFAULT_MAX_FREE_DAEMON
        !           292: #define DEFAULT_MAX_FREE_DAEMON 10
        !           293: #endif
        !           294: 
        !           295: /* Minimum --- fewer than this, and more will be created */
        !           296: 
        !           297: #ifndef DEFAULT_MIN_FREE_DAEMON
        !           298: #define DEFAULT_MIN_FREE_DAEMON 5
        !           299: #endif
        !           300: 
        !           301: /* Limit on the total --- clients will be locked out if more servers than
        !           302:  * this are needed.  It is intended solely to keep the server from crashing
        !           303:  * when things get out of hand.
        !           304:  *
        !           305:  * We keep a hard maximum number of servers, for two reasons --- first off,
        !           306:  * in case something goes seriously wrong, we want to stop the fork bomb
        !           307:  * short of actually crashing the machine we're running on by filling some
        !           308:  * kernel table.  Secondly, it keeps the size of the scoreboard file small
        !           309:  * enough that we can read the whole thing without worrying too much about
        !           310:  * the overhead.
        !           311:  */
        !           312: #ifndef HARD_SERVER_LIMIT
        !           313: #ifdef WIN32
        !           314: #define HARD_SERVER_LIMIT 1024
        !           315: #else
        !           316: #define HARD_SERVER_LIMIT 256
        !           317: #endif
        !           318: #endif
        !           319: 
        !           320: /*
        !           321:  * Special Apache error codes. These are basically used
        !           322:  *  in http_main.c so we can keep track of various errors.
        !           323:  *
        !           324:  *   APEXIT_OK:
        !           325:  *     A normal exit
        !           326:  *   APEXIT_INIT:
        !           327:  *     A fatal error arising during the server's init sequence
        !           328:  *   APEXIT_CHILDINIT:
        !           329:  *     The child died during it's init sequence
        !           330:  *   APEXIT_CHILDFATAL:
        !           331:  *     A fatal error, resulting in the whole server aborting.
        !           332:  *     If a child exits with this error, the parent process
        !           333:  *     considers this a server-wide fatal error and aborts.
        !           334:  *                 
        !           335:  */
        !           336: #define APEXIT_OK              0x0
        !           337: #define APEXIT_INIT            0x2
        !           338: #define APEXIT_CHILDINIT       0x3
        !           339: #define APEXIT_CHILDFATAL      0xf
        !           340: 
        !           341: /*
        !           342:  * (Unix, OS/2 only)
        !           343:  * Interval, in microseconds, between scoreboard maintenance.  During
        !           344:  * each scoreboard maintenance cycle the parent decides if it needs to
        !           345:  * spawn a new child (to meet MinSpareServers requirements), or kill off
        !           346:  * a child (to meet MaxSpareServers requirements).  It will only spawn or
        !           347:  * kill one child per cycle.  Setting this too low will chew cpu.  The
        !           348:  * default is probably sufficient for everyone.  But some people may want
        !           349:  * to raise this on servers which aren't dedicated to httpd and where they
        !           350:  * don't like the httpd waking up each second to see what's going on.
        !           351:  */
        !           352: #ifndef SCOREBOARD_MAINTENANCE_INTERVAL
        !           353: #define SCOREBOARD_MAINTENANCE_INTERVAL 1000000
        !           354: #endif
        !           355: 
        !           356: /* Number of requests to try to handle in a single process.  If <= 0,
        !           357:  * the children don't die off.  That's the default here, since I'm still
        !           358:  * interested in finding and stanching leaks.
        !           359:  */
        !           360: 
        !           361: #ifndef DEFAULT_MAX_REQUESTS_PER_CHILD
        !           362: #define DEFAULT_MAX_REQUESTS_PER_CHILD 0
        !           363: #endif
        !           364: 
        !           365: #ifndef DEFAULT_THREADS_PER_CHILD
        !           366: #define DEFAULT_THREADS_PER_CHILD 50
        !           367: #endif
        !           368: #ifndef DEFAULT_EXCESS_REQUESTS_PER_CHILD
        !           369: #define DEFAULT_EXCESS_REQUESTS_PER_CHILD 0
        !           370: #endif
        !           371: 
        !           372: /* The maximum length of the queue of pending connections, as defined
        !           373:  * by listen(2).  Under some systems, it should be increased if you
        !           374:  * are experiencing a heavy TCP SYN flood attack.
        !           375:  *
        !           376:  * It defaults to 511 instead of 512 because some systems store it 
        !           377:  * as an 8-bit datatype; 512 truncated to 8-bits is 0, while 511 is 
        !           378:  * 255 when truncated.
        !           379:  */
        !           380: 
        !           381: #ifndef DEFAULT_LISTENBACKLOG
        !           382: #define DEFAULT_LISTENBACKLOG 511
        !           383: #endif
        !           384: 
        !           385: /* Limits on the size of various request items.  These limits primarily
        !           386:  * exist to prevent simple denial-of-service attacks on a server based
        !           387:  * on misuse of the protocol.  The recommended values will depend on the
        !           388:  * nature of the server resources -- CGI scripts and database backends
        !           389:  * might require large values, but most servers could get by with much
        !           390:  * smaller limits than we use below.  The request message body size can
        !           391:  * be limited by the per-dir config directive LimitRequestBody.
        !           392:  *
        !           393:  * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE
        !           394:  * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190.
        !           395:  * These two limits can be lowered (but not raised) by the server config
        !           396:  * directives LimitRequestLine and LimitRequestFieldsize, respectively.
        !           397:  *
        !           398:  * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by
        !           399:  * the server config directive LimitRequestFields.
        !           400:  */
        !           401: #ifndef DEFAULT_LIMIT_REQUEST_LINE
        !           402: #define DEFAULT_LIMIT_REQUEST_LINE 8190
        !           403: #endif /* default limit on bytes in Request-Line (Method+URI+HTTP-version) */
        !           404: #ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE
        !           405: #define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190
        !           406: #endif /* default limit on bytes in any one header field  */
        !           407: #ifndef DEFAULT_LIMIT_REQUEST_FIELDS
        !           408: #define DEFAULT_LIMIT_REQUEST_FIELDS 100
        !           409: #endif /* default limit on number of request header fields */
        !           410: 
        !           411: /*
        !           412:  * The default default character set name to add if AddDefaultCharset is 
        !           413:  * enabled.  Overridden with AddDefaultCharsetName.
        !           414:  */
        !           415: #define DEFAULT_ADD_DEFAULT_CHARSET_NAME "iso-8859-1"
        !           416: 
        !           417: /*
        !           418:  * The below defines the base string of the Server: header. Additional
        !           419:  * tokens can be added via the ap_add_version_component() API call.
        !           420:  *
        !           421:  * The tokens are listed in order of their significance for identifying the
        !           422:  * application.
        !           423:  *
        !           424:  * "Product tokens should be short and to the point -- use of them for 
        !           425:  * advertizing or other non-essential information is explicitly forbidden."
        !           426:  *
        !           427:  * Example: "Apache/1.1.0 MrWidget/0.1-alpha" 
        !           428:  */
        !           429: 
        !           430: #define SERVER_BASEVENDOR   "Apache Group"
        !           431: #define SERVER_BASEPRODUCT  "Apache"
        !           432: #define SERVER_BASEREVISION "1.3.14"
        !           433: #define SERVER_BASEVERSION  SERVER_BASEPRODUCT "/" SERVER_BASEREVISION
        !           434: 
        !           435: #define SERVER_PRODUCT  SERVER_BASEPRODUCT
        !           436: #define SERVER_REVISION SERVER_BASEREVISION
        !           437: #define SERVER_VERSION  SERVER_PRODUCT "/" SERVER_REVISION
        !           438: enum server_token_type {
        !           439:     SrvTk_MIN,         /* eg: Apache/1.3.0 */
        !           440:     SrvTk_OS,          /* eg: Apache/1.3.0 (UNIX) */
        !           441:     SrvTk_FULL,                /* eg: Apache/1.3.0 (UNIX) PHP/3.0 FooBar/1.2b */
        !           442:     SrvTk_PRODUCT_ONLY /* eg: Apache */
        !           443: };
        !           444: 
        !           445: API_EXPORT(const char *) ap_get_server_version(void);
        !           446: API_EXPORT(void) ap_add_version_component(const char *component);
        !           447: API_EXPORT(const char *) ap_get_server_built(void);
        !           448: 
        !           449: /* Numeric release version identifier: MMNNFFRBB: major minor fix final beta
        !           450:  * Always increases along the same track as the source branch.
        !           451:  * For example, Apache 1.4.2 would be '10402100', 2.5b7 would be '20500007'.
        !           452:  */
        !           453: #define APACHE_RELEASE 10314100
        !           454: 
        !           455: #define SERVER_PROTOCOL "HTTP/1.1"
        !           456: #ifndef SERVER_SUPPORT
        !           457: #define SERVER_SUPPORT "http://www.apache.org/"
        !           458: #endif
        !           459: 
        !           460: #define DECLINED -1            /* Module declines to handle */
        !           461: #define DONE -2                        /* Module has served the response completely 
        !           462:                                 *  - it's safe to die() with no more output
        !           463:                                 */
        !           464: #define OK 0                   /* Module has handled this stage. */
        !           465: 
        !           466: 
        !           467: /* ----------------------- HTTP Status Codes  ------------------------- */
        !           468: 
        !           469: /* The size of the static array in http_protocol.c for storing
        !           470:  * all of the potential response status-lines (a sparse table).
        !           471:  * A future version should dynamically generate the table at startup.
        !           472:  */
        !           473: #define RESPONSE_CODES 55
        !           474: 
        !           475: #define HTTP_CONTINUE                      100
        !           476: #define HTTP_SWITCHING_PROTOCOLS           101
        !           477: #define HTTP_PROCESSING                    102
        !           478: #define HTTP_OK                            200
        !           479: #define HTTP_CREATED                       201
        !           480: #define HTTP_ACCEPTED                      202
        !           481: #define HTTP_NON_AUTHORITATIVE             203
        !           482: #define HTTP_NO_CONTENT                    204
        !           483: #define HTTP_RESET_CONTENT                 205
        !           484: #define HTTP_PARTIAL_CONTENT               206
        !           485: #define HTTP_MULTI_STATUS                  207
        !           486: #define HTTP_MULTIPLE_CHOICES              300
        !           487: #define HTTP_MOVED_PERMANENTLY             301
        !           488: #define HTTP_MOVED_TEMPORARILY             302
        !           489: #define HTTP_SEE_OTHER                     303
        !           490: #define HTTP_NOT_MODIFIED                  304
        !           491: #define HTTP_USE_PROXY                     305
        !           492: #define HTTP_TEMPORARY_REDIRECT            307
        !           493: #define HTTP_BAD_REQUEST                   400
        !           494: #define HTTP_UNAUTHORIZED                  401
        !           495: #define HTTP_PAYMENT_REQUIRED              402
        !           496: #define HTTP_FORBIDDEN                     403
        !           497: #define HTTP_NOT_FOUND                     404
        !           498: #define HTTP_METHOD_NOT_ALLOWED            405
        !           499: #define HTTP_NOT_ACCEPTABLE                406
        !           500: #define HTTP_PROXY_AUTHENTICATION_REQUIRED 407
        !           501: #define HTTP_REQUEST_TIME_OUT              408
        !           502: #define HTTP_CONFLICT                      409
        !           503: #define HTTP_GONE                          410
        !           504: #define HTTP_LENGTH_REQUIRED               411
        !           505: #define HTTP_PRECONDITION_FAILED           412
        !           506: #define HTTP_REQUEST_ENTITY_TOO_LARGE      413
        !           507: #define HTTP_REQUEST_URI_TOO_LARGE         414
        !           508: #define HTTP_UNSUPPORTED_MEDIA_TYPE        415
        !           509: #define HTTP_RANGE_NOT_SATISFIABLE         416
        !           510: #define HTTP_EXPECTATION_FAILED            417
        !           511: #define HTTP_UNPROCESSABLE_ENTITY          422
        !           512: #define HTTP_LOCKED                        423
        !           513: #define HTTP_FAILED_DEPENDENCY             424
        !           514: #define HTTP_INTERNAL_SERVER_ERROR         500
        !           515: #define HTTP_NOT_IMPLEMENTED               501
        !           516: #define HTTP_BAD_GATEWAY                   502
        !           517: #define HTTP_SERVICE_UNAVAILABLE           503
        !           518: #define HTTP_GATEWAY_TIME_OUT              504
        !           519: #define HTTP_VERSION_NOT_SUPPORTED         505
        !           520: #define HTTP_VARIANT_ALSO_VARIES           506
        !           521: #define HTTP_INSUFFICIENT_STORAGE          507
        !           522: #define HTTP_NOT_EXTENDED                  510
        !           523: 
        !           524: #define DOCUMENT_FOLLOWS    HTTP_OK
        !           525: #define PARTIAL_CONTENT     HTTP_PARTIAL_CONTENT
        !           526: #define MULTIPLE_CHOICES    HTTP_MULTIPLE_CHOICES
        !           527: #define MOVED               HTTP_MOVED_PERMANENTLY
        !           528: #define REDIRECT            HTTP_MOVED_TEMPORARILY
        !           529: #define USE_LOCAL_COPY      HTTP_NOT_MODIFIED
        !           530: #define BAD_REQUEST         HTTP_BAD_REQUEST
        !           531: #define AUTH_REQUIRED       HTTP_UNAUTHORIZED
        !           532: #define FORBIDDEN           HTTP_FORBIDDEN
        !           533: #define NOT_FOUND           HTTP_NOT_FOUND
        !           534: #define METHOD_NOT_ALLOWED  HTTP_METHOD_NOT_ALLOWED
        !           535: #define NOT_ACCEPTABLE      HTTP_NOT_ACCEPTABLE
        !           536: #define LENGTH_REQUIRED     HTTP_LENGTH_REQUIRED
        !           537: #define PRECONDITION_FAILED HTTP_PRECONDITION_FAILED
        !           538: #define SERVER_ERROR        HTTP_INTERNAL_SERVER_ERROR
        !           539: #define NOT_IMPLEMENTED     HTTP_NOT_IMPLEMENTED
        !           540: #define BAD_GATEWAY         HTTP_BAD_GATEWAY
        !           541: #define VARIANT_ALSO_VARIES HTTP_VARIANT_ALSO_VARIES
        !           542: 
        !           543: #define ap_is_HTTP_INFO(x)         (((x) >= 100)&&((x) < 200))
        !           544: #define ap_is_HTTP_SUCCESS(x)      (((x) >= 200)&&((x) < 300))
        !           545: #define ap_is_HTTP_REDIRECT(x)     (((x) >= 300)&&((x) < 400))
        !           546: #define ap_is_HTTP_ERROR(x)        (((x) >= 400)&&((x) < 600))
        !           547: #define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500))
        !           548: #define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600))
        !           549: 
        !           550: #define ap_status_drops_connection(x) \
        !           551:                                    (((x) == HTTP_BAD_REQUEST)           || \
        !           552:                                     ((x) == HTTP_REQUEST_TIME_OUT)      || \
        !           553:                                     ((x) == HTTP_LENGTH_REQUIRED)       || \
        !           554:                                     ((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \
        !           555:                                     ((x) == HTTP_REQUEST_URI_TOO_LARGE) || \
        !           556:                                     ((x) == HTTP_INTERNAL_SERVER_ERROR) || \
        !           557:                                     ((x) == HTTP_SERVICE_UNAVAILABLE) || \
        !           558:                                    ((x) == HTTP_NOT_IMPLEMENTED))
        !           559: 
        !           560: /* Methods recognized (but not necessarily handled) by the server.
        !           561:  * These constants are used in bit shifting masks of size int, so it is
        !           562:  * unsafe to have more methods than bits in an int.  HEAD == M_GET.
        !           563:  */
        !           564: #define M_GET        0
        !           565: #define M_PUT        1
        !           566: #define M_POST       2
        !           567: #define M_DELETE     3
        !           568: #define M_CONNECT    4
        !           569: #define M_OPTIONS    5
        !           570: #define M_TRACE      6
        !           571: #define M_PATCH      7
        !           572: #define M_PROPFIND   8
        !           573: #define M_PROPPATCH  9
        !           574: #define M_MKCOL     10
        !           575: #define M_COPY      11
        !           576: #define M_MOVE      12
        !           577: #define M_LOCK      13
        !           578: #define M_UNLOCK    14
        !           579: #define M_INVALID   15
        !           580: 
        !           581: #define METHODS     16
        !           582: 
        !           583: #define CGI_MAGIC_TYPE "application/x-httpd-cgi"
        !           584: #define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html"
        !           585: #define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3"
        !           586: #ifdef CHARSET_EBCDIC
        !           587: #define ASCIITEXT_MAGIC_TYPE_PREFIX "text/x-ascii-" /* Text files whose content-type starts with this are passed thru unconverted */
        !           588: #endif /*CHARSET_EBCDIC*/
        !           589: #define MAP_FILE_MAGIC_TYPE "application/x-type-map"
        !           590: #define ASIS_MAGIC_TYPE "httpd/send-as-is"
        !           591: #define DIR_MAGIC_TYPE "httpd/unix-directory"
        !           592: #define STATUS_MAGIC_TYPE "application/x-httpd-status"
        !           593: 
        !           594: /*
        !           595:  * Define the HTML doctype strings centrally.
        !           596:  */
        !           597: #define DOCTYPE_HTML_2_0  "<!DOCTYPE HTML PUBLIC \"-//IETF//" \
        !           598:                           "DTD HTML 2.0//EN\">\n"
        !           599: #define DOCTYPE_HTML_3_2  "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
        !           600:                           "DTD HTML 3.2 Final//EN\">\n"
        !           601: #define DOCTYPE_HTML_4_0S "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
        !           602:                           "DTD HTML 4.0//EN\"\n" \
        !           603:                           "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
        !           604: #define DOCTYPE_HTML_4_0T "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
        !           605:                           "DTD HTML 4.0 Transitional//EN\"\n" \
        !           606:                           "\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n"
        !           607: #define DOCTYPE_HTML_4_0F "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
        !           608:                           "DTD HTML 4.0 Frameset//EN\"\n" \
        !           609:                           "\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n"
        !           610: 
        !           611: /* Just in case your linefeed isn't the one the other end is expecting. */
        !           612: #ifndef CHARSET_EBCDIC
        !           613: #define LF 10
        !           614: #define CR 13
        !           615: #define CRLF "\015\012"
        !           616: #define OS_ASC(c) (c)
        !           617: #else /* CHARSET_EBCDIC */
        !           618: #include "ebcdic.h"
        !           619: /* OSD_POSIX uses the EBCDIC charset. The transition ASCII->EBCDIC is done in
        !           620:  * the buff package (bread/bputs/bwrite), so everywhere else, we use
        !           621:  * "native EBCDIC" CR and NL characters. These are therefore defined as
        !           622:  * '\r' and '\n'.
        !           623:  * NB: this is not the whole truth - sometimes \015 and \012 are contained
        !           624:  * in literal (EBCDIC!) strings, so these are not converted but passed.
        !           625:  */
        !           626: #define CR '\r'
        !           627: #define LF '\n'
        !           628: #define CRLF "\r\n"
        !           629: #define OS_ASC(c) (os_toascii[c])
        !           630: #endif /* CHARSET_EBCDIC */
        !           631: 
        !           632: /* Possible values for request_rec.read_body (set by handling module):
        !           633:  *    REQUEST_NO_BODY          Send 413 error if message has any body
        !           634:  *    REQUEST_CHUNKED_ERROR    Send 411 error if body without Content-Length
        !           635:  *    REQUEST_CHUNKED_DECHUNK  If chunked, remove the chunks for me.
        !           636:  *    REQUEST_CHUNKED_PASS     Pass the chunks to me without removal.
        !           637:  */
        !           638: #define REQUEST_NO_BODY          0
        !           639: #define REQUEST_CHUNKED_ERROR    1
        !           640: #define REQUEST_CHUNKED_DECHUNK  2
        !           641: #define REQUEST_CHUNKED_PASS     3
        !           642: 
        !           643: /* Things which may vary per file-lookup WITHIN a request ---
        !           644:  * e.g., state of MIME config.  Basically, the name of an object, info
        !           645:  * about the object, and any other info we may ahve which may need to
        !           646:  * change as we go poking around looking for it (e.g., overridden by
        !           647:  * .htaccess files).
        !           648:  *
        !           649:  * Note how the default state of almost all these things is properly
        !           650:  * zero, so that allocating it with pcalloc does the right thing without
        !           651:  * a whole lot of hairy initialization... so long as we are willing to
        !           652:  * make the (fairly) portable assumption that the bit pattern of a NULL
        !           653:  * pointer is, in fact, zero.
        !           654:  */
        !           655: 
        !           656: /* This represents the result of calling htaccess; these are cached for
        !           657:  * each request.
        !           658:  */
        !           659: struct htaccess_result {
        !           660:     char *dir;                 /* the directory to which this applies */
        !           661:     int override;              /* the overrides allowed for the .htaccess file */
        !           662:     void *htaccess;            /* the configuration directives */
        !           663: /* the next one, or NULL if no more; N.B. never change this */
        !           664:     const struct htaccess_result *next;
        !           665: };
        !           666: 
        !           667: typedef struct conn_rec conn_rec;
        !           668: typedef struct server_rec server_rec;
        !           669: typedef struct request_rec request_rec;
        !           670: typedef struct listen_rec listen_rec;
        !           671: 
        !           672: #include "util_uri.h"
        !           673: 
        !           674: enum proxyreqtype {
        !           675:     NOT_PROXY=0,
        !           676:     STD_PROXY,
        !           677:     PROXY_PASS
        !           678: };
        !           679: 
        !           680: struct request_rec {
        !           681: 
        !           682:     ap_pool *pool;
        !           683:     conn_rec *connection;
        !           684:     server_rec *server;
        !           685: 
        !           686:     request_rec *next;         /* If we wind up getting redirected,
        !           687:                                 * pointer to the request we redirected to.
        !           688:                                 */
        !           689:     request_rec *prev;         /* If this is an internal redirect,
        !           690:                                 * pointer to where we redirected *from*.
        !           691:                                 */
        !           692: 
        !           693:     request_rec *main;         /* If this is a sub_request (see request.h) 
        !           694:                                 * pointer back to the main request.
        !           695:                                 */
        !           696: 
        !           697:     /* Info about the request itself... we begin with stuff that only
        !           698:      * protocol.c should ever touch...
        !           699:      */
        !           700: 
        !           701:     char *the_request;         /* First line of request, so we can log it */
        !           702:     int assbackwards;          /* HTTP/0.9, "simple" request */
        !           703:     enum proxyreqtype proxyreq;/* A proxy request (calculated during
        !           704:                                 * post_read_request or translate_name) */
        !           705:     int header_only;           /* HEAD request, as opposed to GET */
        !           706:     char *protocol;            /* Protocol, as given to us, or HTTP/0.9 */
        !           707:     int proto_num;             /* Number version of protocol; 1.1 = 1001 */
        !           708:     const char *hostname;      /* Host, as set by full URI or Host: */
        !           709: 
        !           710:     time_t request_time;       /* When the request started */
        !           711: 
        !           712:     const char *status_line;   /* Status line, if set by script */
        !           713:     int status;                        /* In any case */
        !           714: 
        !           715:     /* Request method, two ways; also, protocol, etc..  Outside of protocol.c,
        !           716:      * look, but don't touch.
        !           717:      */
        !           718: 
        !           719:     const char *method;                /* GET, HEAD, POST, etc. */
        !           720:     int method_number;         /* M_GET, M_POST, etc. */
        !           721: 
        !           722:     /*
        !           723:        allowed is a bitvector of the allowed methods.
        !           724: 
        !           725:        A handler must ensure that the request method is one that
        !           726:        it is capable of handling.  Generally modules should DECLINE
        !           727:        any request methods they do not handle.  Prior to aborting the
        !           728:        handler like this the handler should set r->allowed to the list
        !           729:        of methods that it is willing to handle.  This bitvector is used
        !           730:        to construct the "Allow:" header required for OPTIONS requests,
        !           731:        and METHOD_NOT_ALLOWED and NOT_IMPLEMENTED status codes.
        !           732: 
        !           733:        Since the default_handler deals with OPTIONS, all modules can
        !           734:        usually decline to deal with OPTIONS.  TRACE is always allowed,
        !           735:        modules don't need to set it explicitly.
        !           736: 
        !           737:        Since the default_handler will always handle a GET, a
        !           738:        module which does *not* implement GET should probably return
        !           739:        METHOD_NOT_ALLOWED.  Unfortunately this means that a Script GET
        !           740:        handler can't be installed by mod_actions.
        !           741:     */
        !           742:     int allowed;               /* Allowed methods - for 405, OPTIONS, etc */
        !           743: 
        !           744:     int sent_bodyct;           /* byte count in stream is for body */
        !           745:     long bytes_sent;           /* body byte count, for easy access */
        !           746:     time_t mtime;              /* Time the resource was last modified */
        !           747: 
        !           748:     /* HTTP/1.1 connection-level features */
        !           749: 
        !           750:     int chunked;               /* sending chunked transfer-coding */
        !           751:     int byterange;             /* number of byte ranges */
        !           752:     char *boundary;            /* multipart/byteranges boundary */
        !           753:     const char *range;         /* The Range: header */
        !           754:     long clength;              /* The "real" content length */
        !           755: 
        !           756:     long remaining;            /* bytes left to read */
        !           757:     long read_length;          /* bytes that have been read */
        !           758:     int read_body;             /* how the request body should be read */
        !           759:     int read_chunked;          /* reading chunked transfer-coding */
        !           760:     unsigned expecting_100;    /* is client waiting for a 100 response? */
        !           761: 
        !           762:     /* MIME header environments, in and out.  Also, an array containing
        !           763:      * environment variables to be passed to subprocesses, so people can
        !           764:      * write modules to add to that environment.
        !           765:      *
        !           766:      * The difference between headers_out and err_headers_out is that the
        !           767:      * latter are printed even on error, and persist across internal redirects
        !           768:      * (so the headers printed for ErrorDocument handlers will have them).
        !           769:      *
        !           770:      * The 'notes' table is for notes from one module to another, with no
        !           771:      * other set purpose in mind...
        !           772:      */
        !           773: 
        !           774:     table *headers_in;
        !           775:     table *headers_out;
        !           776:     table *err_headers_out;
        !           777:     table *subprocess_env;
        !           778:     table *notes;
        !           779: 
        !           780:     /* content_type, handler, content_encoding, content_language, and all
        !           781:      * content_languages MUST be lowercased strings.  They may be pointers
        !           782:      * to static strings; they should not be modified in place.
        !           783:      */
        !           784:     const char *content_type;  /* Break these out --- we dispatch on 'em */
        !           785:     const char *handler;       /* What we *really* dispatch on           */
        !           786: 
        !           787:     const char *content_encoding;
        !           788:     const char *content_language;      /* for back-compat. only -- do not use */
        !           789:     array_header *content_languages;   /* array of (char*) */
        !           790: 
        !           791:     char *vlist_validator;      /* variant list validator (if negotiated) */
        !           792: 
        !           793:     int no_cache;
        !           794:     int no_local_copy;
        !           795: 
        !           796:     /* What object is being requested (either directly, or via include
        !           797:      * or content-negotiation mapping).
        !           798:      */
        !           799: 
        !           800:     char *unparsed_uri;                /* the uri without any parsing performed */
        !           801:     char *uri;                 /* the path portion of the URI */
        !           802:     char *filename;
        !           803:     char *path_info;
        !           804:     char *args;                        /* QUERY_ARGS, if any */
        !           805:     struct stat finfo;         /* ST_MODE set to zero if no such file */
        !           806:     uri_components parsed_uri; /* components of uri, dismantled */
        !           807: 
        !           808:     /* Various other config info which may change with .htaccess files
        !           809:      * These are config vectors, with one void* pointer for each module
        !           810:      * (the thing pointed to being the module's business).
        !           811:      */
        !           812: 
        !           813:     void *per_dir_config;      /* Options set in config files, etc. */
        !           814:     void *request_config;      /* Notes on *this* request */
        !           815: 
        !           816: /*
        !           817:  * a linked list of the configuration directives in the .htaccess files
        !           818:  * accessed by this request.
        !           819:  * N.B. always add to the head of the list, _never_ to the end.
        !           820:  * that way, a sub request's list can (temporarily) point to a parent's list
        !           821:  */
        !           822:     const struct htaccess_result *htaccess;
        !           823: 
        !           824:     /* On systems with case insensitive file systems (Windows, OS/2, etc.), 
        !           825:      * r->filename is case canonicalized (folded to either lower or upper 
        !           826:      * case, depending on the specific system) to accomodate file access
        !           827:      * checking. case_preserved_filename is the same as r->filename 
        !           828:      * except case is preserved. There is at least one instance where Apache 
        !           829:      * needs access to the case preserved filename: Java class files published 
        !           830:      * with WebDAV need to preserve filename case to make the Java compiler 
        !           831:      * happy.
        !           832:      */
        !           833:     char *case_preserved_filename;
        !           834: 
        !           835: /* Things placed at the end of the record to avoid breaking binary
        !           836:  * compatibility.  It would be nice to remember to reorder the entire
        !           837:  * record to improve 64bit alignment the next time we need to break
        !           838:  * binary compatibility for some other reason.
        !           839:  */
        !           840: };
        !           841: 
        !           842: 
        !           843: /* Things which are per connection
        !           844:  */
        !           845: 
        !           846: struct conn_rec {
        !           847: 
        !           848:     ap_pool *pool;
        !           849:     server_rec *server;
        !           850:     server_rec *base_server;   /* Physical vhost this conn come in on */
        !           851:     void *vhost_lookup_data;   /* used by http_vhost.c */
        !           852: 
        !           853:     /* Information about the connection itself */
        !           854: 
        !           855:     int child_num;             /* The number of the child handling conn_rec */
        !           856:     BUFF *client;              /* Connection to the guy */
        !           857: 
        !           858:     /* Who is the client? */
        !           859: 
        !           860:     struct sockaddr_in local_addr;     /* local address */
        !           861:     struct sockaddr_in remote_addr;    /* remote address */
        !           862:     char *remote_ip;           /* Client's IP address */
        !           863:     char *remote_host;         /* Client's DNS name, if known.
        !           864:                                 * NULL if DNS hasn't been checked,
        !           865:                                 * "" if it has and no address was found.
        !           866:                                 * N.B. Only access this though
        !           867:                                 * get_remote_host() */
        !           868:     char *remote_logname;      /* Only ever set if doing rfc1413 lookups.
        !           869:                                 * N.B. Only access this through
        !           870:                                 * get_remote_logname() */
        !           871:     char *user;                        /* If an authentication check was made,
        !           872:                                 * this gets set to the user name.  We assume
        !           873:                                 * that there's only one user per connection(!)
        !           874:                                 */
        !           875:     char *ap_auth_type;                /* Ditto. */
        !           876: 
        !           877:     unsigned aborted:1;                /* Are we still talking? */
        !           878:     signed int keepalive:2;    /* Are we using HTTP Keep-Alive?
        !           879:                                 * -1 fatal error, 0 undecided, 1 yes */
        !           880:     unsigned keptalive:1;      /* Did we use HTTP Keep-Alive? */
        !           881:     signed int double_reverse:2;/* have we done double-reverse DNS?
        !           882:                                 * -1 yes/failure, 0 not yet, 1 yes/success */
        !           883:     int keepalives;            /* How many times have we used it? */
        !           884:     char *local_ip;            /* server IP address */
        !           885:     char *local_host;          /* used for ap_get_server_name when
        !           886:                                 * UseCanonicalName is set to DNS
        !           887:                                 * (ignores setting of HostnameLookups) */
        !           888: };
        !           889: 
        !           890: /* Per-vhost config... */
        !           891: 
        !           892: /* The address 255.255.255.255, when used as a virtualhost address,
        !           893:  * will become the "default" server when the ip doesn't match other vhosts.
        !           894:  */
        !           895: #define DEFAULT_VHOST_ADDR 0xfffffffful
        !           896: 
        !           897: typedef struct server_addr_rec server_addr_rec;
        !           898: struct server_addr_rec {
        !           899:     server_addr_rec *next;
        !           900:     struct in_addr host_addr;  /* The bound address, for this server */
        !           901:     unsigned short host_port;  /* The bound port, for this server */
        !           902:     char *virthost;            /* The name given in <VirtualHost> */
        !           903: };
        !           904: 
        !           905: struct server_rec {
        !           906: 
        !           907:     server_rec *next;
        !           908: 
        !           909:     /* description of where the definition came from */
        !           910:     const char *defn_name;
        !           911:     unsigned defn_line_number;
        !           912: 
        !           913:     /* Full locations of server config info */
        !           914: 
        !           915:     char *srm_confname;
        !           916:     char *access_confname;
        !           917: 
        !           918:     /* Contact information */
        !           919: 
        !           920:     char *server_admin;
        !           921:     char *server_hostname;
        !           922:     unsigned short port;       /* for redirects, etc. */
        !           923: 
        !           924:     /* Log files --- note that transfer log is now in the modules... */
        !           925: 
        !           926:     char *error_fname;
        !           927:     FILE *error_log;
        !           928:     int loglevel;
        !           929: 
        !           930:     /* Module-specific configuration for server, and defaults... */
        !           931: 
        !           932:     int is_virtual;            /* true if this is the virtual server */
        !           933:     void *module_config;       /* Config vector containing pointers to
        !           934:                                 * modules' per-server config structures.
        !           935:                                 */
        !           936:     void *lookup_defaults;     /* MIME type info, etc., before we start
        !           937:                                 * checking per-directory info.
        !           938:                                 */
        !           939:     /* Transaction handling */
        !           940: 
        !           941:     server_addr_rec *addrs;
        !           942:     int timeout;               /* Timeout, in seconds, before we give up */
        !           943:     int keep_alive_timeout;    /* Seconds we'll wait for another request */
        !           944:     int keep_alive_max;                /* Maximum requests per connection */
        !           945:     int keep_alive;            /* Use persistent connections? */
        !           946:     int send_buffer_size;      /* size of TCP send buffer (in bytes) */
        !           947: 
        !           948:     char *path;                        /* Pathname for ServerPath */
        !           949:     int pathlen;               /* Length of path */
        !           950: 
        !           951:     array_header *names;       /* Normal names for ServerAlias servers */
        !           952:     array_header *wild_names;  /* Wildcarded names for ServerAlias servers */
        !           953: 
        !           954:     uid_t server_uid;        /* effective user id when calling exec wrapper */
        !           955:     gid_t server_gid;        /* effective group id when calling exec wrapper */
        !           956: 
        !           957:     int limit_req_line;      /* limit on size of the HTTP request line    */
        !           958:     int limit_req_fieldsize; /* limit on size of any request header field */
        !           959:     int limit_req_fields;    /* limit on number of request header fields  */
        !           960: };
        !           961: 
        !           962: /* These are more like real hosts than virtual hosts */
        !           963: struct listen_rec {
        !           964:     listen_rec *next;
        !           965:     struct sockaddr_in local_addr;     /* local IP address and port */
        !           966:     int fd;
        !           967:     int used;                  /* Only used during restart */        
        !           968: /* more stuff here, like which protocol is bound to the port */
        !           969: };
        !           970: 
        !           971: /* Prototypes for utilities... util.c.
        !           972:  */
        !           973: 
        !           974: extern void ap_util_init(void);
        !           975: 
        !           976: /* Time */
        !           977: extern API_VAR_EXPORT const char ap_month_snames[12][4];
        !           978: extern API_VAR_EXPORT const char ap_day_snames[7][4];
        !           979: 
        !           980: API_EXPORT(struct tm *) ap_get_gmtoff(int *tz);
        !           981: API_EXPORT(char *) ap_get_time(void);
        !           982: API_EXPORT(char *) ap_field_noparam(pool *p, const char *intype);
        !           983: API_EXPORT(char *) ap_ht_time(pool *p, time_t t, const char *fmt, int gmt);
        !           984: API_EXPORT(char *) ap_gm_timestr_822(pool *p, time_t t);
        !           985: 
        !           986: /* String handling. The *_nc variants allow you to use non-const char **s as
        !           987:    arguments (unfortunately C won't automatically convert a char ** to a const
        !           988:    char **) */
        !           989: 
        !           990: API_EXPORT(char *) ap_getword(pool *p, const char **line, char stop);
        !           991: API_EXPORT(char *) ap_getword_nc(pool *p, char **line, char stop);
        !           992: API_EXPORT(char *) ap_getword_white(pool *p, const char **line);
        !           993: API_EXPORT(char *) ap_getword_white_nc(pool *p, char **line);
        !           994: API_EXPORT(char *) ap_getword_nulls(pool *p, const char **line, char stop);
        !           995: API_EXPORT(char *) ap_getword_nulls_nc(pool *p, char **line, char stop);
        !           996: API_EXPORT(char *) ap_getword_conf(pool *p, const char **line);
        !           997: API_EXPORT(char *) ap_getword_conf_nc(pool *p, char **line);
        !           998: 
        !           999: API_EXPORT(const char *) ap_size_list_item(const char **field, int *len);
        !          1000: API_EXPORT(char *) ap_get_list_item(pool *p, const char **field);
        !          1001: API_EXPORT(int) ap_find_list_item(pool *p, const char *line, const char *tok);
        !          1002: 
        !          1003: API_EXPORT(char *) ap_get_token(pool *p, const char **accept_line, int accept_white);
        !          1004: API_EXPORT(int) ap_find_token(pool *p, const char *line, const char *tok);
        !          1005: API_EXPORT(int) ap_find_last_token(pool *p, const char *line, const char *tok);
        !          1006: 
        !          1007: API_EXPORT(int) ap_is_url(const char *u);
        !          1008: API_EXPORT(int) ap_unescape_url(char *url);
        !          1009: API_EXPORT(void) ap_no2slash(char *name);
        !          1010: API_EXPORT(void) ap_getparents(char *name);
        !          1011: API_EXPORT(char *) ap_escape_path_segment(pool *p, const char *s);
        !          1012: API_EXPORT(char *) ap_os_escape_path(pool *p, const char *path, int partial);
        !          1013: #define ap_escape_uri(ppool,path) ap_os_escape_path(ppool,path,1)
        !          1014: API_EXPORT(char *) ap_escape_html(pool *p, const char *s);
        !          1015: API_EXPORT(char *) ap_construct_server(pool *p, const char *hostname,
        !          1016:                                    unsigned port, const request_rec *r);
        !          1017: API_EXPORT(char *) ap_escape_shell_cmd(pool *p, const char *s);
        !          1018: 
        !          1019: API_EXPORT(int) ap_count_dirs(const char *path);
        !          1020: API_EXPORT(char *) ap_make_dirstr_prefix(char *d, const char *s, int n);
        !          1021: API_EXPORT(char *) ap_make_dirstr_parent(pool *p, const char *s);
        !          1022: /* deprecated.  The previous two routines are preferred. */
        !          1023: API_EXPORT(char *) ap_make_dirstr(pool *a, const char *s, int n);
        !          1024: API_EXPORT(char *) ap_make_full_path(pool *a, const char *dir, const char *f);
        !          1025: 
        !          1026: API_EXPORT(int) ap_is_matchexp(const char *str);
        !          1027: API_EXPORT(int) ap_strcmp_match(const char *str, const char *exp);
        !          1028: API_EXPORT(int) ap_strcasecmp_match(const char *str, const char *exp);
        !          1029: API_EXPORT(char *) ap_stripprefix(const char *bigstring, const char *prefix);
        !          1030: API_EXPORT(char *) ap_strcasestr(const char *s1, const char *s2);
        !          1031: API_EXPORT(char *) ap_pbase64decode(pool *p, const char *bufcoded);
        !          1032: API_EXPORT(char *) ap_pbase64encode(pool *p, char *string); 
        !          1033: API_EXPORT(char *) ap_uudecode(pool *p, const char *bufcoded);
        !          1034: API_EXPORT(char *) ap_uuencode(pool *p, char *string); 
        !          1035: 
        !          1036: #ifdef OS2
        !          1037: void os2pathname(char *path);
        !          1038: char *ap_double_quotes(pool *p, char *str);
        !          1039: #endif
        !          1040: 
        !          1041: API_EXPORT(int)    ap_regexec(const regex_t *preg, const char *string,
        !          1042:                               size_t nmatch, regmatch_t pmatch[], int eflags);
        !          1043: API_EXPORT(size_t) ap_regerror(int errcode, const regex_t *preg, 
        !          1044:                                char *errbuf, size_t errbuf_size);
        !          1045: API_EXPORT(char *) ap_pregsub(pool *p, const char *input, const char *source,
        !          1046:                               size_t nmatch, regmatch_t pmatch[]);
        !          1047: 
        !          1048: API_EXPORT(void) ap_content_type_tolower(char *);
        !          1049: API_EXPORT(void) ap_str_tolower(char *);
        !          1050: API_EXPORT(int) ap_ind(const char *, char);    /* Sigh... */
        !          1051: API_EXPORT(int) ap_rind(const char *, char);
        !          1052: 
        !          1053: API_EXPORT(char *) ap_escape_quotes (pool *p, const char *instring);
        !          1054: API_EXPORT(void) ap_remove_spaces(char *dest, char *src);
        !          1055: 
        !          1056: /* Common structure for reading of config files / passwd files etc. */
        !          1057: typedef struct {
        !          1058:     int (*getch) (void *param);        /* a getc()-like function */
        !          1059:     void *(*getstr) (void *buf, size_t bufsiz, void *param); /* a fgets()-like function */
        !          1060:     int (*close) (void *param);        /* a close hander function */
        !          1061:     void *param;               /* the argument passed to getch/getstr/close */
        !          1062:     const char *name;          /* the filename / description */
        !          1063:     unsigned line_number;      /* current line number, starting at 1 */
        !          1064: } configfile_t;
        !          1065: 
        !          1066: /* Open a configfile_t as FILE, return open configfile_t struct pointer */
        !          1067: API_EXPORT(configfile_t *) ap_pcfg_openfile(pool *p, const char *name);
        !          1068: 
        !          1069: /* Allocate a configfile_t handle with user defined functions and params */
        !          1070: API_EXPORT(configfile_t *) ap_pcfg_open_custom(pool *p, const char *descr,
        !          1071:     void *param,
        !          1072:     int(*getc_func)(void*),
        !          1073:     void *(*gets_func) (void *buf, size_t bufsiz, void *param),
        !          1074:     int(*close_func)(void *param));
        !          1075: 
        !          1076: /* Read one line from open configfile_t, strip LF, increase line number */
        !          1077: API_EXPORT(int) ap_cfg_getline(char *buf, size_t bufsize, configfile_t *cfp);
        !          1078: 
        !          1079: /* Read one char from open configfile_t, increase line number upon LF */
        !          1080: API_EXPORT(int) ap_cfg_getc(configfile_t *cfp);
        !          1081: 
        !          1082: /* Detach from open configfile_t, calling the close handler */
        !          1083: API_EXPORT(int) ap_cfg_closefile(configfile_t *cfp);
        !          1084: 
        !          1085: #ifdef NEED_STRERROR
        !          1086: char *strerror(int err);
        !          1087: #endif
        !          1088: 
        !          1089: /* Misc system hackery */
        !          1090: 
        !          1091: API_EXPORT(uid_t) ap_uname2id(const char *name);
        !          1092: API_EXPORT(gid_t) ap_gname2id(const char *name);
        !          1093: API_EXPORT(int) ap_is_directory(const char *name);
        !          1094: API_EXPORT(int) ap_is_rdirectory(const char *name);
        !          1095: API_EXPORT(int) ap_can_exec(const struct stat *);
        !          1096: API_EXPORT(void) ap_chdir_file(const char *file);
        !          1097: 
        !          1098: #ifndef HAVE_CANONICAL_FILENAME
        !          1099: /*
        !          1100:  *  We can't define these in os.h because of dependence on pool pointer.
        !          1101:  */
        !          1102: #define ap_os_canonical_filename(p,f)  (f)
        !          1103: #define ap_os_case_canonical_filename(p,f)  (f)
        !          1104: #define ap_os_systemcase_filename(p,f)  (f)
        !          1105: #else
        !          1106: API_EXPORT(char *) ap_os_canonical_filename(pool *p, const char *file);
        !          1107: #ifdef WIN32
        !          1108: API_EXPORT(char *) ap_os_case_canonical_filename(pool *pPool, const char *szFile);
        !          1109: API_EXPORT(char *) ap_os_systemcase_filename(pool *pPool, const char *szFile);
        !          1110: #elif defined(OS2)
        !          1111: API_EXPORT(char *) ap_os_case_canonical_filename(pool *pPool, const char *szFile);
        !          1112: API_EXPORT(char *) ap_os_systemcase_filename(pool *pPool, const char *szFile);
        !          1113: #else
        !          1114: /* XXX: This makes little sense for NETWARE ... NETWARE is case insensitive?
        !          1115:  */
        !          1116: #define ap_os_case_canonical_filename(p,f) ap_os_canonical_filename(p,f)
        !          1117: #define ap_os_systemcase_filename(p,f) ap_os_canonical_filename(p,f)
        !          1118: #endif
        !          1119: #endif
        !          1120: 
        !          1121: #ifdef _OSD_POSIX
        !          1122: extern const char *os_set_account(pool *p, const char *account);
        !          1123: extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process);
        !          1124: #endif /* _OSD_POSIX */
        !          1125: 
        !          1126: char *ap_get_local_host(pool *);
        !          1127: unsigned long ap_get_virthost_addr(char *hostname, unsigned short *port);
        !          1128: 
        !          1129: extern API_VAR_EXPORT time_t ap_restart_time;
        !          1130: 
        !          1131: /*
        !          1132:  * Apache tries to keep all of its long term filehandles (such as log files,
        !          1133:  * and sockets) above this number.  This is to workaround problems in many
        !          1134:  * third party libraries that are compiled with a small FD_SETSIZE.  There
        !          1135:  * should be no reason to lower this, because it's only advisory.  If a file
        !          1136:  * can't be allocated above this number then it will remain in the "slack"
        !          1137:  * area.
        !          1138:  *
        !          1139:  * Only the low slack line is used by default.  If HIGH_SLACK_LINE is defined
        !          1140:  * then an attempt is also made to keep all non-FILE * files above the high
        !          1141:  * slack line.  This is to work around a Solaris C library limitation, where it
        !          1142:  * uses an unsigned char to store the file descriptor.
        !          1143:  */
        !          1144: #ifndef LOW_SLACK_LINE
        !          1145: #define LOW_SLACK_LINE 15
        !          1146: #endif
        !          1147: /* #define HIGH_SLACK_LINE      255 */
        !          1148: 
        !          1149: /*
        !          1150:  * The ap_slack() function takes a fd, and tries to move it above the indicated
        !          1151:  * line.  It returns an fd which may or may not have moved above the line, and
        !          1152:  * never fails.  If the high line was requested and it fails it will also try
        !          1153:  * the low line.
        !          1154:  */
        !          1155: #ifdef NO_SLACK
        !          1156: #define ap_slack(fd,line)   (fd)
        !          1157: #else
        !          1158: int ap_slack(int fd, int line);
        !          1159: #define AP_SLACK_LOW   1
        !          1160: #define AP_SLACK_HIGH  2
        !          1161: #endif
        !          1162: 
        !          1163: API_EXPORT(char *) ap_escape_quotes(pool *p, const char *instr);
        !          1164: 
        !          1165: /*
        !          1166:  * Redefine assert() to something more useful for an Apache...
        !          1167:  */
        !          1168: API_EXPORT(void) ap_log_assert(const char *szExp, const char *szFile, int nLine)
        !          1169:                            __attribute__((noreturn));
        !          1170: #define ap_assert(exp) ((exp) ? (void)0 : ap_log_assert(#exp,__FILE__,__LINE__))
        !          1171: 
        !          1172: /* The optimized timeout code only works if we're not MULTITHREAD and we're
        !          1173:  * also not using a scoreboard file
        !          1174:  */
        !          1175: #if !defined (MULTITHREAD) && \
        !          1176:     (defined (USE_MMAP_SCOREBOARD) || defined (USE_SHMGET_SCOREBOARD))
        !          1177: #define OPTIMIZE_TIMEOUTS
        !          1178: #endif
        !          1179: 
        !          1180: /* A set of flags which indicate places where the server should raise(SIGSTOP).
        !          1181:  * This is useful for debugging, because you can then attach to that process
        !          1182:  * with gdb and continue.  This is important in cases where one_process
        !          1183:  * debugging isn't possible.
        !          1184:  */
        !          1185: #define SIGSTOP_DETACH                 1
        !          1186: #define SIGSTOP_MAKE_CHILD             2
        !          1187: #define SIGSTOP_SPAWN_CHILD            4
        !          1188: #define SIGSTOP_PIPED_LOG_SPAWN                8
        !          1189: #define SIGSTOP_CGI_CHILD              16
        !          1190: 
        !          1191: #ifdef DEBUG_SIGSTOP
        !          1192: extern int raise_sigstop_flags;
        !          1193: #define RAISE_SIGSTOP(x)       do { \
        !          1194:        if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\
        !          1195:     } while (0)
        !          1196: #else
        !          1197: #define RAISE_SIGSTOP(x)
        !          1198: #endif
        !          1199: 
        !          1200: API_EXPORT(extern const char *) ap_psignature(const char *prefix, request_rec *r);
        !          1201: 
        !          1202: /* strtoul does not exist on sunos4. */
        !          1203: #ifdef strtoul
        !          1204: #undef strtoul
        !          1205: #endif
        !          1206: #define strtoul strtoul_is_not_a_portable_function_use_strtol_instead
        !          1207: 
        !          1208: #ifdef __cplusplus
        !          1209: }
        !          1210: #endif
        !          1211: 
        !          1212: #endif /* !APACHE_HTTPD_H */

E-mail: