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: