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 */
  
  
  

Reply via email to