coar        99/05/03 12:05:19

  Modified:    src      CHANGES
               src/modules/standard mod_autoindex.c
  Log:
        Rip loose another piece of mod_autoindex's configuration hairball,
        breaking the description handling free from the path/filename
        paradigm used for most of the stuff.  Make AddDescription work
        as documented.
  
  PR:           1898, 3072
  
  Revision  Changes    Path
  1.1342    +3 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1341
  retrieving revision 1.1342
  diff -u -r1.1341 -r1.1342
  --- CHANGES   1999/05/03 15:09:04     1.1341
  +++ CHANGES   1999/05/03 19:05:11     1.1342
  @@ -1,5 +1,8 @@
   Changes with Apache 1.3.7
   
  +  *) Modify mod_autoindex's handling of AddDescription so that the
  +     behaviour matches the documentation.  [Ken Coar] PR#1898, 3072.
  +
     *) Add functionality to the install-bindist.sh script created by
        binbuild.sh to use tar when copying distribution files to the
        serverroot. This allows upgrading an existing installation
  
  
  
  1.105     +76 -6     apache-1.3/src/modules/standard/mod_autoindex.c
  
  Index: mod_autoindex.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_autoindex.c,v
  retrieving revision 1.104
  retrieving revision 1.105
  diff -u -r1.104 -r1.105
  --- mod_autoindex.c   1999/05/01 17:13:04     1.104
  +++ mod_autoindex.c   1999/05/03 19:05:17     1.105
  @@ -72,6 +72,7 @@
   #include "http_log.h"
   #include "http_main.h"
   #include "util_script.h"
  +#include "fnmatch.h"
   
   module MODULE_VAR_EXPORT autoindex_module;
   
  @@ -131,6 +132,12 @@
       char *data;
   };
   
  +typedef struct ai_desc_t {
  +    char *pattern;
  +    char *description;
  +    int full_path;
  +} ai_desc_t;
  +
   typedef struct autoindex_config_struct {
   
       char *default_icon;
  @@ -143,8 +150,12 @@
       int icon_height;
       char *default_order;
   
  -    array_header *icon_list, *alt_list, *desc_list, *ign_list;
  -    array_header *hdr_list, *rdme_list;
  +    array_header *icon_list;
  +    array_header *alt_list;
  +    array_header *desc_list;
  +    array_header *ign_list;
  +    array_header *hdr_list;
  +    array_header *rdme_list;
   
   } autoindex_config_rec;
   
  @@ -257,10 +268,31 @@
       return NULL;
   }
   
  +/*
  + * Add description text for a filename pattern.  Prefix the pattern
  + * with a wildcard unless it begins with '/' signifying an absolute
  + * path.  If the pattern contains a '/' anywhere, add a slash to the
  + * prefix so that "bar/bletch" won't be matched by "foobar/bletch",
  + * and make a note that there's a delimiter; the matching routine
  + * simplifies to just the actual filename whenever it can.  This allows
  + * definitions in parent directories to be made for files in subordinate
  + * ones using relative paths.  Always postfix with a wildard so that
  + * partial or leading names will match.
  + */
   static const char *add_desc(cmd_parms *cmd, void *d, char *desc, char *to)
   {
  -    push_item(((autoindex_config_rec *) d)->desc_list, cmd->info, to,
  -           cmd->path, desc);
  +    autoindex_config_rec *dcfg = (autoindex_config_rec *) d;
  +    ai_desc_t *desc_entry;
  +    char *prefix = "";
  +
  +    desc_entry = (ai_desc_t *) ap_push_array(dcfg->desc_list);
  +    desc_entry->full_path = (strchr(to, '/') == NULL) ? 0 : 1;
  +    if (*to != '/') {
  +     prefix = desc_entry->full_path ? "*/" : "*";
  +    }
  +    desc_entry->pattern = ap_pstrcat(dcfg->desc_list->pool,
  +                                  prefix, to, "*", NULL);
  +    desc_entry->description = ap_pstrdup(dcfg->desc_list->pool, desc);
       return NULL;
   }
   
  @@ -530,7 +562,7 @@
       new->name_adjust = K_UNSET;
       new->icon_list = ap_make_array(p, 4, sizeof(struct item));
       new->alt_list = ap_make_array(p, 4, sizeof(struct item));
  -    new->desc_list = ap_make_array(p, 4, sizeof(struct item));
  +    new->desc_list = ap_make_array(p, 4, sizeof(ai_desc_t));
       new->ign_list = ap_make_array(p, 4, sizeof(struct item));
       new->hdr_list = ap_make_array(p, 4, sizeof(struct item));
       new->rdme_list = ap_make_array(p, 4, sizeof(struct item));
  @@ -688,7 +720,6 @@
   
   #define find_icon(d,p,t) find_item(p,d->icon_list,t)
   #define find_alt(d,p,t) find_item(p,d->alt_list,t)
  -#define find_desc(d,p) find_item(p,d->desc_list,0)
   #define find_header(d,p) find_item(p,d->hdr_list,0)
   #define find_readme(d,p) find_item(p,d->rdme_list,0)
   
  @@ -705,6 +736,45 @@
       r.content_type = r.content_encoding = NULL;
   
       return find_item(&r, d->icon_list, 1);
  +}
  +
  +/*
  + * Look through the list of pattern/description pairs and return the first 
one
  + * if any) that matches the filename in the request.  If multiple patterns
  + * match, only the first one is used; since the order in the array is the
  + * same as the order in which directives were processed, earlier matching
  + * directives will dominate.
  + */
  +static char *find_desc(autoindex_config_rec *dcfg, request_rec *r)
  +{
  +    int i;
  +    ai_desc_t *list = (ai_desc_t *) dcfg->desc_list->elts;
  +    const char *filename_full = r->filename;
  +    const char *filename_only;
  +    const char *filename;
  +
  +    /*
  +     * If the filename includes a path, extract just the name itself
  +     * for the simple matches.
  +     */
  +    if ((filename_only = strrchr(filename_full, '/')) == NULL) {
  +     filename_only = filename_full;
  +    }
  +    else {
  +     filename_only++;
  +    }
  +    for (i = 0; i < dcfg->desc_list->nelts; ++i) {
  +     ai_desc_t *tuple = &list[i];
  +
  +     /*
  +      * Only use the full-path filename if the pattern contains '/'s.
  +      */
  +     filename = (tuple->full_path) ? filename_full : filename_only;
  +     if (ap_fnmatch(tuple->pattern, filename, 0) == 0) {
  +         return tuple->description;
  +     }
  +    }
  +    return NULL;
   }
   
   static int ignore_entry(autoindex_config_rec *d, char *path)
  
  
  

Reply via email to