randy 97/08/22 19:19:04
Modified: src/modules/standard mod_cern_meta.c Log: This version of mod_cern_meta.c controls Meta File behaviour on a per-directory basis. Previous versions of the module defined behaviour on a per-server basis. The upshot is that you'll need to revisit your configuration files in order to make use of the new module. Submitted by: David J. MacKenzie <[EMAIL PROTECTED]> Reviewed by: Dean Gaudet, Brian Behlendorf, Randy Terbush Revision Changes Path 1.18 +78 -34 apachen/src/modules/standard/mod_cern_meta.c Index: mod_cern_meta.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/standard/mod_cern_meta.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- mod_cern_meta.c 1997/08/18 13:12:10 1.17 +++ mod_cern_meta.c 1997/08/23 02:19:01 1.18 @@ -52,11 +52,18 @@ /* * mod_cern_meta.c - * version 0.0.5 + * version 0.1.0 * status beta * * Andrew Wilson <[EMAIL PROTECTED]> 25.Jan.96 * + * *** IMPORTANT *** + * This version of mod_cern_meta.c controls Meta File behaviour on a + * per-directory basis. Previous versions of the module defined behaviour + * on a per-server basis. The upshot is that you'll need to revisit your + * configuration files in order to make use of the new module. + * *** + * * Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP * headers that can be output in addition to the normal range of * headers for each file accessed. They appear rather like the Apache @@ -67,8 +74,16 @@ * who can exploit this module. It should be noted that there are probably * more sensitive ways of managing the Expires: header specifically. * - * The module obeys the following directives, which can only appear - * in the server's .conf files and not in any .htaccess file. + * The module obeys the following directives, which can appear + * in the server's .conf files and in .htaccess files. + * + * MetaFiles <on|off> + * + * turns on|off meta file processing for any directory. + * Default value is off + * + * # turn on MetaFiles in this directory + * MetaFiles on * * MetaDir <directory name> * @@ -122,7 +137,10 @@ * need to report missing ones as spurious errors. * 31.Jan.96 log_error reports about a malformed .meta file, rather * than a script error. - * + * 20.Jun.96 MetaFiles <on|off> default off, added, so that module + * can be configured per-directory. Prior to this the module + * was running for each request anywhere on the server, naughty.. + * 29.Jun.96 All directives made per-directory. */ #include "httpd.h" @@ -133,51 +151,70 @@ #include "http_log.h" #include "http_request.h" +#define DIR_CMD_PERMS OR_INDEXES + #define DEFAULT_METADIR ".web" #define DEFAULT_METASUFFIX ".meta" +#define DEFAULT_METAFILES 0 module MODULE_VAR_EXPORT cern_meta_module; typedef struct { - char *metadir; - char *metasuffix; -} cern_meta_config; + char *metadir; + char *metasuffix; + char *metafiles; +} cern_meta_dir_config; -void *create_cern_meta_config (pool *p, server_rec *dummy) +void *create_cern_meta_dir_config (pool *p, char *dummy) { - cern_meta_config *new = - (cern_meta_config *) palloc (p, sizeof(cern_meta_config)); - - new->metadir = DEFAULT_METADIR; - new->metasuffix = DEFAULT_METASUFFIX; + cern_meta_dir_config *new = + (cern_meta_dir_config *)palloc(p, sizeof(cern_meta_dir_config)); + + new->metadir = NULL; + new->metasuffix = NULL; + new->metafiles = DEFAULT_METAFILES; + + return new; +} + +void *merge_cern_meta_dir_configs (pool *p, void *basev, void *addv) +{ + cern_meta_dir_config *base = (cern_meta_dir_config *)basev; + cern_meta_dir_config *add = (cern_meta_dir_config *)addv; + cern_meta_dir_config *new = + (cern_meta_dir_config *)palloc(p, sizeof(cern_meta_dir_config)); + new->metadir = add->metadir ? add->metadir : base->metadir; + new->metasuffix = add->metasuffix ? add->metasuffix : base->metasuffix; + new->metafiles = add->metafiles; + return new; } -const char *set_metadir (cmd_parms *parms, void *dummy, char *arg) +const char *set_metadir (cmd_parms *parms, cern_meta_dir_config *dconf, char *arg) { - cern_meta_config *cmc ; - - cmc = get_module_config (parms->server->module_config, - &cern_meta_module); - cmc->metadir = arg; + dconf->metadir = arg; return NULL; } -const char *set_metasuffix (cmd_parms *parms, void *dummy, char *arg) +const char *set_metasuffix (cmd_parms *parms, cern_meta_dir_config *dconf, char *arg) { - cern_meta_config *cmc ; - - cmc = get_module_config (parms->server->module_config, - &cern_meta_module); - cmc->metasuffix = arg; + dconf->metasuffix = arg; + return NULL; +} + +const char *set_metafiles (cmd_parms *parms, cern_meta_dir_config *dconf, char *arg) +{ + dconf->metafiles = arg; return NULL; } + command_rec cern_meta_cmds[] = { -{ "MetaDir", set_metadir, NULL, RSRC_CONF, TAKE1, +{ "MetaFiles", set_metafiles, NULL, DIR_CMD_PERMS, FLAG, NULL}, +{ "MetaDir", set_metadir, NULL, DIR_CMD_PERMS, TAKE1, "the name of the directory containing meta files"}, -{ "MetaSuffix", set_metasuffix, NULL, RSRC_CONF, TAKE1, +{ "MetaSuffix", set_metasuffix, NULL, DIR_CMD_PERMS, TAKE1, "the filename suffix for meta files"}, { NULL } }; @@ -240,12 +277,15 @@ char *real_file; char *scrap_book; FILE *f; - cern_meta_config *cmc ; + cern_meta_dir_config *dconf ; int rv; request_rec *rr; - cmc = get_module_config (r->server->module_config, - &cern_meta_module); + dconf = get_module_config (r->per_dir_config, &cern_meta_module); + + if (!dconf->metafiles) { + return DECLINED; + }; /* if ./.web/$1.meta exists then output 'asis' */ @@ -275,7 +315,11 @@ return DECLINED; }; - metafilename = pstrcat(r->pool, "/", scrap_book, "/", cmc->metadir, "/", real_file, cmc->metasuffix, NULL); + metafilename = pstrcat(r->pool, "/", scrap_book, "/", + dconf->metadir ? dconf->metadir : DEFAULT_METADIR, + "/", real_file, + dconf->metasuffix ? dconf->metasuffix : DEFAULT_METASUFFIX, + NULL); /* XXX: it sucks to require this subrequest to complete, because this * means people must leave their meta files accessible to the world. @@ -308,9 +352,9 @@ module MODULE_VAR_EXPORT cern_meta_module = { STANDARD_MODULE_STUFF, NULL, /* initializer */ - NULL, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - create_cern_meta_config, /* server config */ + create_cern_meta_dir_config, /* dir config creater */ + merge_cern_meta_dir_configs, /* dir merger --- default is to override */ + NULL, /* server config */ NULL, /* merge server configs */ cern_meta_cmds, /* command table */ NULL, /* handlers */