Annotation of win32/apache13/src/include/http_config.h, revision 1.1.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_HTTP_CONFIG_H
                     59: #define APACHE_HTTP_CONFIG_H
                     60: 
                     61: #ifdef __cplusplus
                     62: extern "C" {
                     63: #endif
                     64: 
                     65: /*
                     66:  * The central data structures around here...
                     67:  */
                     68: 
                     69: /* Command dispatch structures... */
                     70: 
                     71: /* Note that for all of these except RAW_ARGS, the config routine is
                     72:  * passed a freshly allocated string which can be modified or stored
                     73:  * or whatever... it's only necessary to do pstrdup() stuff with
                     74:  * RAW_ARGS.
                     75:  */
                     76: enum cmd_how {
                     77:     RAW_ARGS,                  /* cmd_func parses command line itself */
                     78:     TAKE1,                     /* one argument only */
                     79:     TAKE2,                     /* two arguments only */
                     80:     ITERATE,                   /* one argument, occuring multiple times
                     81:                                 * (e.g., IndexIgnore)
                     82:                                 */
                     83:     ITERATE2,                  /* two arguments, 2nd occurs multiple times
                     84:                                 * (e.g., AddIcon)
                     85:                                 */
                     86:     FLAG,                      /* One of 'On' or 'Off' */
                     87:     NO_ARGS,                   /* No args at all, e.g. </Directory> */
                     88:     TAKE12,                    /* one or two arguments */
                     89:     TAKE3,                     /* three arguments only */
                     90:     TAKE23,                    /* two or three arguments */
                     91:     TAKE123,                   /* one, two or three arguments */
                     92:     TAKE13                     /* one or three arguments */
                     93: };
                     94: 
                     95: typedef struct command_struct {
                     96:     const char *name;          /* Name of this command */
                     97:     const char *(*func) ();    /* Function invoked */
                     98:     void *cmd_data;            /* Extra data, for functions which
                     99:                                 * implement multiple commands...
                    100:                                 */
                    101:     int req_override;          /* What overrides need to be allowed to
                    102:                                 * enable this command.
                    103:                                 */
                    104:     enum cmd_how args_how;     /* What the command expects as arguments */
                    105: 
                    106:     const char *errmsg;                /* 'usage' message, in case of syntax errors */
                    107: } command_rec;
                    108: 
                    109: /* The allowed locations for a configuration directive are the union of
                    110:  * those indicated by each set bit in the req_override mask.
                    111:  *
                    112:  * (req_override & RSRC_CONF)   => *.conf outside <Directory> or <Location>
                    113:  * (req_override & ACCESS_CONF) => *.conf inside <Directory> or <Location>
                    114:  * (req_override & OR_AUTHCFG)  => *.conf inside <Directory> or <Location>
                    115:  *                                 and .htaccess when AllowOverride AuthConfig
                    116:  * (req_override & OR_LIMIT)    => *.conf inside <Directory> or <Location>
                    117:  *                                 and .htaccess when AllowOverride Limit
                    118:  * (req_override & OR_OPTIONS)  => *.conf anywhere
                    119:  *                                 and .htaccess when AllowOverride Options
                    120:  * (req_override & OR_FILEINFO) => *.conf anywhere
                    121:  *                                 and .htaccess when AllowOverride FileInfo
                    122:  * (req_override & OR_INDEXES)  => *.conf anywhere
                    123:  *                                 and .htaccess when AllowOverride Indexes
                    124:  */
                    125: #define OR_NONE 0
                    126: #define OR_LIMIT 1
                    127: #define OR_OPTIONS 2
                    128: #define OR_FILEINFO 4
                    129: #define OR_AUTHCFG 8
                    130: #define OR_INDEXES 16
                    131: #define OR_UNSET 32
                    132: #define ACCESS_CONF 64
                    133: #define RSRC_CONF 128
                    134: #define OR_ALL (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES)
                    135: 
                    136: /* This can be returned by a function if they don't wish to handle
                    137:  * a command. Make it something not likely someone will actually use
                    138:  * as an error code.
                    139:  */
                    140: 
                    141: #define DECLINE_CMD "\a\b"
                    142: 
                    143: /*
                    144:  * This structure is passed to a command which is being invoked,
                    145:  * to carry a large variety of miscellaneous data which is all of
                    146:  * use to *somebody*...
                    147:  */
                    148: 
                    149: typedef struct {
                    150:     void *info;                        /* Argument to command from cmd_table */
                    151:     int override;              /* Which allow-override bits are set */
                    152:     int limited;               /* Which methods are <Limit>ed */
                    153: 
                    154:     configfile_t *config_file; /* Config file structure from pcfg_openfile() */
                    155: 
                    156:     ap_pool *pool;                     /* Pool to allocate new storage in */
                    157:     struct pool *temp_pool;            /* Pool for scratch memory; persists during
                    158:                                 * configuration, but wiped before the first
                    159:                                 * request is served...
                    160:                                 */
                    161:     server_rec *server;                /* Server_rec being configured for */
                    162:     char *path;                        /* If configuring for a directory,
                    163:                                 * pathname of that directory.
                    164:                                 * NOPE!  That's what it meant previous to the
                    165:                                 * existance of <Files>, <Location> and regex
                    166:                                 * matching.  Now the only usefulness that can
                    167:                                 * be derived from this field is whether a command
                    168:                                 * is being called in a server context (path == NULL)
                    169:                                 * or being called in a dir context (path != NULL).
                    170:                                 */
                    171:     const command_rec *cmd;    /* configuration command */
                    172:     const char *end_token;     /* end token required to end a nested section */
                    173:     void *context;             /* per_dir_config vector passed 
                    174:                                 * to handle_command */
                    175: } cmd_parms;
                    176: 
                    177: /* This structure records the existence of handlers in a module... */
                    178: 
                    179: typedef struct {
                    180:     const char *content_type;  /* MUST be all lower case */
                    181:     int (*handler) (request_rec *);
                    182: } handler_rec;
                    183: 
                    184: /*
                    185:  * Module structures.  Just about everything is dispatched through
                    186:  * these, directly or indirectly (through the command and handler
                    187:  * tables).
                    188:  */
                    189: 
                    190: typedef struct module_struct {
                    191:     int version;               /* API version, *not* module version;
                    192:                                 * check that module is compatible with this
                    193:                                 * version of the server.
                    194:                                 */
                    195:     int minor_version;          /* API minor version. Provides API feature
                    196:                                  * milestones. Not checked during module init
                    197:                                 */
                    198:     int module_index;          /* Index to this modules structures in
                    199:                                 * config vectors.
                    200:                                 */
                    201: 
                    202:     const char *name;
                    203:     void *dynamic_load_handle;
                    204: 
                    205:     struct module_struct *next;
                    206: 
                    207:     unsigned long magic;        /* Magic Cookie to identify a module structure;
                    208:                                  * It's mainly important for the DSO facility
                    209:                                  * (see also mod_so).
                    210:                                  */
                    211: 
                    212:     /* init() occurs after config parsing, but before any children are
                    213:      * forked.
                    214:      * Modules should not rely on the order in which create_server_config
                    215:      * and create_dir_config are called.
                    216:      */
                    217: #ifdef ULTRIX_BRAIN_DEATH
                    218:     void (*init) ();
                    219:     void *(*create_dir_config) ();
                    220:     void *(*merge_dir_config) ();
                    221:     void *(*create_server_config) ();
                    222:     void *(*merge_server_config) ();
                    223: #else
                    224:     void (*init) (server_rec *, pool *);
                    225:     void *(*create_dir_config) (pool *p, char *dir);
                    226:     void *(*merge_dir_config) (pool *p, void *base_conf, void *new_conf);
                    227:     void *(*create_server_config) (pool *p, server_rec *s);
                    228:     void *(*merge_server_config) (pool *p, void *base_conf, void *new_conf);
                    229: #endif
                    230: 
                    231:     const command_rec *cmds;
                    232:     const handler_rec *handlers;
                    233: 
                    234:     /* Hooks for getting into the middle of server ops...
                    235: 
                    236:      * translate_handler --- translate URI to filename
                    237:      * access_checker --- check access by host address, etc.   All of these
                    238:      *                    run; if all decline, that's still OK.
                    239:      * check_user_id --- get and validate user id from the HTTP request
                    240:      * auth_checker --- see if the user (from check_user_id) is OK *here*.
                    241:      *                  If all of *these* decline, the request is rejected
                    242:      *                  (as a SERVER_ERROR, since the module which was
                    243:      *                  supposed to handle this was configured wrong).
                    244:      * type_checker --- Determine MIME type of the requested entity;
                    245:      *                  sets content_type, _encoding and _language fields.
                    246:      * logger --- log a transaction.
                    247:      * post_read_request --- run right after read_request or internal_redirect,
                    248:      *                  and not run during any subrequests.
                    249:      */
                    250: 
                    251:     int (*translate_handler) (request_rec *);
                    252:     int (*ap_check_user_id) (request_rec *);
                    253:     int (*auth_checker) (request_rec *);
                    254:     int (*access_checker) (request_rec *);
                    255:     int (*type_checker) (request_rec *);
                    256:     int (*fixer_upper) (request_rec *);
                    257:     int (*logger) (request_rec *);
                    258:     int (*header_parser) (request_rec *);
                    259: 
                    260:     /* Regardless of the model the server uses for managing "units of
                    261:      * execution", i.e. multi-process, multi-threaded, hybrids of those,
                    262:      * there is the concept of a "heavy weight process".  That is, a
                    263:      * process with its own memory space, file spaces, etc.  This method,
                    264:      * child_init, is called once for each heavy-weight process before
                    265:      * any requests are served.  Note that no provision is made yet for
                    266:      * initialization per light-weight process (i.e. thread).  The
                    267:      * parameters passed here are the same as those passed to the global
                    268:      * init method above.
                    269:      */
                    270: #ifdef ULTRIX_BRAIN_DEATH
                    271:     void (*child_init) ();
                    272:     void (*child_exit) ();
                    273: #else
                    274:     void (*child_init) (server_rec *, pool *);
                    275:     void (*child_exit) (server_rec *, pool *);
                    276: #endif
                    277:     int (*post_read_request) (request_rec *);
                    278: } module;
                    279: 
                    280: /* Initializer for the first few module slots, which are only
                    281:  * really set up once we start running.  Note that the first two slots
                    282:  * provide a version check; this should allow us to deal with changes to
                    283:  * the API. The major number should reflect changes to the API handler table
                    284:  * itself or removal of functionality. The minor number should reflect
                    285:  * additions of functionality to the existing API. (the server can detect
                    286:  * an old-format module, and either handle it back-compatibly, or at least
                    287:  * signal an error). See src/include/ap_mmn.h for MMN version history.
                    288:  */
                    289: 
                    290: #define STANDARD_MODULE_STUFF  MODULE_MAGIC_NUMBER_MAJOR, \
                    291:                                MODULE_MAGIC_NUMBER_MINOR, \
                    292:                                -1, \
                    293:                                __FILE__, \
                    294:                                NULL, \
                    295:                                NULL, \
                    296:                                MODULE_MAGIC_COOKIE
                    297: 
                    298: /* Generic accessors for other modules to get at their own module-specific
                    299:  * data
                    300:  */
                    301: 
                    302: API_EXPORT(void *) ap_get_module_config(void *conf_vector, module *m);
                    303: API_EXPORT(void) ap_set_module_config(void *conf_vector, module *m, void *val);
                    304: 
                    305: #define ap_get_module_config(v,m)      \
                    306:     (((void **)(v))[(m)->module_index])
                    307: #define ap_set_module_config(v,m,val)  \
                    308:     ((((void **)(v))[(m)->module_index]) = (val))
                    309: 
                    310: /* Generic command handling function... */
                    311: 
                    312: API_EXPORT_NONSTD(const char *) ap_set_string_slot(cmd_parms *, char *, char *);
                    313: API_EXPORT_NONSTD(const char *) ap_set_string_slot_lower(cmd_parms *, char *, char *);
                    314: API_EXPORT_NONSTD(const char *) ap_set_flag_slot(cmd_parms *, char *, int);
                    315: API_EXPORT_NONSTD(const char *) ap_set_file_slot(cmd_parms *, char *, char *);
                    316: 
                    317: /* For modules which need to read config files, open logs, etc. ...
                    318:  * this returns the fname argument if it begins with '/'; otherwise
                    319:  * it relativizes it wrt server_root.
                    320:  */
                    321: 
                    322: API_EXPORT(char *) ap_server_root_relative(pool *p, char *fname);
                    323: 
                    324: /* Finally, the hook for dynamically loading modules in... */
                    325: 
                    326: API_EXPORT(void) ap_add_module(module *m);
                    327: API_EXPORT(void) ap_remove_module(module *m);
                    328: API_EXPORT(void) ap_add_loaded_module(module *mod);
                    329: API_EXPORT(void) ap_remove_loaded_module(module *mod);
                    330: API_EXPORT(int) ap_add_named_module(const char *name);
                    331: API_EXPORT(void) ap_clear_module_list(void);
                    332: API_EXPORT(const char *) ap_find_module_name(module *m);
                    333: API_EXPORT(module *) ap_find_linked_module(const char *name);
                    334: 
                    335: /* for implementing subconfigs and customized config files */
                    336: API_EXPORT(const char *) ap_srm_command_loop(cmd_parms *parms, void *config);
                    337: 
                    338: #ifdef CORE_PRIVATE
                    339: 
                    340: extern API_VAR_EXPORT module *top_module;
                    341: 
                    342: extern module *ap_prelinked_modules[];
                    343: extern module *ap_preloaded_modules[];
                    344: extern API_VAR_EXPORT module **ap_loaded_modules;
                    345: 
                    346: /* For mod_so.c... */
                    347: 
                    348: void ap_single_module_configure(pool *p, server_rec *s, module *m);
                    349: 
                    350: /* For http_main.c... */
                    351: 
                    352: server_rec *ap_read_config(pool *conf_pool, pool *temp_pool, char *config_name);
                    353: void ap_init_modules(pool *p, server_rec *s);
                    354: void ap_child_init_modules(pool *p, server_rec *s);
                    355: void ap_child_exit_modules(pool *p, server_rec *s);
                    356: void ap_setup_prelinked_modules(void);
                    357: void ap_show_directives(void);
                    358: void ap_show_modules(void);
                    359: void ap_cleanup_method_ptrs(void);
                    360: 
                    361: /* For http_request.c... */
                    362: 
                    363: void *ap_create_request_config(pool *p);
                    364: CORE_EXPORT(void *) ap_create_per_dir_config(pool *p);
                    365: void *ap_merge_per_dir_configs(pool *p, void *base, void *new);
                    366: 
                    367: /* For http_core.c... (<Directory> command and virtual hosts) */
                    368: 
                    369: int ap_parse_htaccess(void **result, request_rec *r, int override,
                    370:                const char *path, const char *access_name);
                    371: 
                    372: CORE_EXPORT(const char *) ap_init_virtual_host(pool *p, const char *hostname,
                    373:                                server_rec *main_server, server_rec **);
                    374: void ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp);
                    375: 
                    376: /* ap_check_cmd_context() definitions: */
                    377: API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden);
                    378: 
                    379: /* ap_check_cmd_context():              Forbidden in: */
                    380: #define  NOT_IN_VIRTUALHOST     0x01 /* <Virtualhost> */
                    381: #define  NOT_IN_LIMIT           0x02 /* <Limit> */
                    382: #define  NOT_IN_DIRECTORY       0x04 /* <Directory> */
                    383: #define  NOT_IN_LOCATION        0x08 /* <Location> */
                    384: #define  NOT_IN_FILES           0x10 /* <Files> */
                    385: #define  NOT_IN_DIR_LOC_FILE    (NOT_IN_DIRECTORY|NOT_IN_LOCATION|NOT_IN_FILES) /* <Directory>/<Location>/<Files>*/
                    386: #define  GLOBAL_ONLY            (NOT_IN_VIRTUALHOST|NOT_IN_LIMIT|NOT_IN_DIR_LOC_FILE)
                    387: 
                    388: 
                    389: /* Module-method dispatchers, also for http_request.c */
                    390: 
                    391: int ap_translate_name(request_rec *);
                    392: int ap_check_access(request_rec *);    /* check access on non-auth basis */
                    393: int ap_check_user_id(request_rec *);   /* obtain valid username from client auth */
                    394: int ap_check_auth(request_rec *);      /* check (validated) user is authorized here */
                    395: int ap_find_types(request_rec *);      /* identify MIME type */
                    396: int ap_run_fixups(request_rec *);      /* poke around for other metainfo, etc.... */
                    397: int ap_invoke_handler(request_rec *);
                    398: int ap_log_transaction(request_rec *r);
                    399: int ap_header_parse(request_rec *);
                    400: int ap_run_post_read_request(request_rec *);
                    401: 
                    402: /* for mod_perl */
                    403: 
                    404: CORE_EXPORT(const command_rec *) ap_find_command(const char *name, const command_rec *cmds);
                    405: CORE_EXPORT(const command_rec *) ap_find_command_in_modules(const char *cmd_name, module **mod);
                    406: CORE_EXPORT(void *) ap_set_config_vectors(cmd_parms *parms, void *config, module *mod);
                    407: CORE_EXPORT(const char *) ap_handle_command(cmd_parms *parms, void *config, const char *l);
                    408: 
                    409: #endif
                    410: 
                    411: #ifdef __cplusplus
                    412: }
                    413: #endif
                    414: 
                    415: #endif /* !APACHE_HTTP_CONFIG_H */

E-mail: