dgaudet 98/03/12 02:18:26
Modified: src/modules/standard mod_dir.c
Log:
Death to pointless run-time memory allocation wastage... split up
DirectoryIndex at config time.
Revision Changes Path
1.47 +29 -8 apache-1.3/src/modules/standard/mod_dir.c
Index: mod_dir.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_dir.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- mod_dir.c 1998/02/01 22:05:40 1.46
+++ mod_dir.c 1998/03/12 10:18:25 1.47
@@ -67,16 +67,26 @@
module MODULE_VAR_EXPORT dir_module;
typedef struct dir_config_struct {
- char *index_names;
+ array_header *index_names;
} dir_config_rec;
#define DIR_CMD_PERMS OR_INDEXES
+static const char *add_index(cmd_parms *cmd, void *dummy, char *arg)
+{
+ dir_config_rec *d = dummy;
+
+ if (!d->index_names) {
+ d->index_names = make_array(cmd->pool, 2, sizeof(char *));
+ }
+ *(char **)push_array(d->index_names) = arg;
+ return NULL;
+}
+
static command_rec dir_cmds[] =
{
- {"DirectoryIndex", set_string_slot,
- (void *) XtOffsetOf(dir_config_rec, index_names),
- DIR_CMD_PERMS, RAW_ARGS,
+ {"DirectoryIndex", add_index, NULL,
+ DIR_CMD_PERMS, ITERATE,
"a list of file names"},
{NULL}
};
@@ -105,7 +115,9 @@
dir_config_rec *d =
(dir_config_rec *) get_module_config(r->per_dir_config,
&dir_module);
- const char *names_ptr = d->index_names ? d->index_names : DEFAULT_INDEX;
+ char *dummy_ptr[1];
+ char **names_ptr;
+ int num_names;
int error_notfound = 0;
if (r->uri[0] == '\0' || r->uri[strlen(r->uri) - 1] != '/') {
@@ -131,9 +143,18 @@
r->filename = pstrcat(r->pool, r->filename, "/", NULL);
}
- while (*names_ptr) {
+ if (d->index_names) {
+ names_ptr = (char **)d->index_names->elts;
+ num_names = d->index_names->nelts;
+ }
+ else {
+ dummy_ptr[0] = DEFAULT_INDEX;
+ names_ptr = dummy_ptr;
+ num_names = 1;
+ }
- char *name_ptr = getword_conf(r->pool, &names_ptr);
+ for (; num_names; ++names_ptr, --num_names) {
+ char *name_ptr = *names_ptr;
request_rec *rr = sub_req_lookup_uri(name_ptr, r);
if (rr->status == HTTP_OK && rr->finfo.st_mode != 0) {
@@ -152,7 +173,7 @@
/* If the request returned a redirect, propagate it to the client */
if (is_HTTP_REDIRECT(rr->status) ||
- (rr->status == HTTP_NOT_ACCEPTABLE && *names_ptr == '\0')) {
+ (rr->status == HTTP_NOT_ACCEPTABLE && num_names == 1)) {
error_notfound = rr->status;
r->notes = overlay_tables(r->pool, r->notes, rr->notes);