Return-Path: Delivered-To: apache-cvs-archive@hyperreal.org Received: (qmail 17939 invoked by uid 6000); 3 May 1999 19:05:28 -0000 Received: (qmail 17798 invoked by alias); 3 May 1999 19:05:24 -0000 Delivered-To: apache-1.3-cvs@hyperreal.org Received: (qmail 17734 invoked by uid 161); 3 May 1999 19:05:23 -0000 Date: 3 May 1999 19:05:23 -0000 Message-ID: <19990503190523.17733.qmail@hyperreal.org> From: coar@hyperreal.org To: apache-1.3-cvs@hyperreal.org Subject: cvs commit: apache-1.3/src/modules/standard mod_autoindex.c Sender: apache-cvs-owner@apache.org Precedence: bulk Reply-To: new-httpd@apache.org 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)