A friend wanted to keep a (very big) list of "Allow" directives in a file and Include them from several directories (needed to put an ACL in force basically).
But the contexts get warped when you call Include and certain things are allowed and certain not allowed because they are always treated as resource configs .. and so on, The patch below should fix it, I simply copied ap_process_resource_config and removed the lines that warp the context, ap_process_include_config inherits the correct context from it's caller. Index: src/include/http_config.h =================================================================== RCS file: /home/cvspublic/apache-1.3/src/include/http_config.h,v retrieving revision 1.108 diff -u -r1.108 http_config.h --- src/include/http_config.h 13 Mar 2002 21:05:29 -0000 1.108 +++ src/include/http_config.h 28 May 2002 17:15:11 -0000 @@ -373,6 +373,8 @@ CORE_EXPORT(const char *) ap_init_virtual_host(pool *p, const char *hostname, server_rec *main_server, server_rec **); CORE_EXPORT(void) ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp); +CORE_EXPORT(void) ap_process_include_config(server_rec *s, char *fname, pool *p, pool +*ptemp, + cmd_parms *parms); /* ap_check_cmd_context() definitions: */ API_EXPORT(const char *) ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden); Index: src/main/http_config.c =================================================================== RCS file: /home/cvspublic/apache-1.3/src/main/http_config.c,v retrieving revision 1.163 diff -u -r1.163 http_config.c --- src/main/http_config.c 13 Mar 2002 21:05:30 -0000 1.163 +++ src/main/http_config.c 28 May 2002 17:15:12 -0000 @@ -1206,6 +1206,101 @@ return strcmp(f1->fname,f2->fname); } +CORE_EXPORT(void) ap_process_include_config(server_rec *s, char *fname, pool *p, pool +*ptemp, + cmd_parms *parms) +{ + const char *errmsg; + struct stat finfo; + + fname = ap_server_root_relative(p, fname); + + if (stat(fname, &finfo) == -1) + return; + + /* + * here we want to check if the candidate file is really a + * directory, and most definitely NOT a symlink (to prevent + * horrible loops). If so, let's recurse and toss it back into + * the function. + */ + if (ap_is_rdirectory(fname)) { + DIR *dirp; + struct DIR_TYPE *dir_entry; + int current; + array_header *candidates = NULL; + fnames *fnew; + + /* + * first course of business is to grok all the directory + * entries here and store 'em away. Recall we need full pathnames + * for this. + */ + fprintf(stderr, "Processing config directory: %s\n", fname); + dirp = ap_popendir(p, fname); + if (dirp == NULL) { + perror("fopen"); + fprintf(stderr, "%s: could not open config directory %s\n", + ap_server_argv0, fname); +#ifdef NETWARE + clean_parent_exit(1); +#else + exit(1); +#endif + } + candidates = ap_make_array(p, 1, sizeof(fnames)); + while ((dir_entry = readdir(dirp)) != NULL) { + /* strip out '.' and '..' */ + if (strcmp(dir_entry->d_name, ".") && + strcmp(dir_entry->d_name, "..")) { + fnew = (fnames *) ap_push_array(candidates); + fnew->fname = ap_make_full_path(p, fname, dir_entry->d_name); + } + } + ap_pclosedir(p, dirp); + if (candidates->nelts != 0) { + qsort((void *) candidates->elts, candidates->nelts, + sizeof(fnames), fname_alphasort); + /* + * Now recurse these... we handle errors and subdirectories + * via the recursion, which is nice + */ + for (current = 0; current < candidates->nelts; ++current) { + fnew = &((fnames *) candidates->elts)[current]; + fprintf(stderr, " Processing config file: %s\n", fnew->fname); + ap_process_resource_config(s, fnew->fname, p, ptemp); + } + } + return; + } + + if (!(parms->config_file = ap_pcfg_openfile(p,fname))) { + perror("fopen"); + fprintf(stderr, "%s: could not open document config file %s\n", + ap_server_argv0, fname); +#ifdef NETWARE + clean_parent_exit(1); +#else + exit(1); +#endif + } + + errmsg = ap_srm_command_loop(parms, s->lookup_defaults); + + if (errmsg) { + fprintf(stderr, "Syntax error on line %d of %s:\n", + parms->config_file->line_number, parms->config_file->name); + fprintf(stderr, "%s\n", errmsg); +#ifdef NETWARE + clean_parent_exit(1); +#else + exit(1); +#endif + } + + ap_cfg_closefile(parms->config_file); +} + + CORE_EXPORT(void) ap_process_resource_config(server_rec *s, char *fname, pool *p, pool *ptemp) { const char *errmsg; Index: src/main/http_core.c =================================================================== RCS file: /home/cvspublic/apache-1.3/src/main/http_core.c,v retrieving revision 1.312 diff -u -r1.312 http_core.c --- src/main/http_core.c 17 May 2002 18:01:57 -0000 1.312 +++ src/main/http_core.c 28 May 2002 17:15:12 -0000 @@ -2674,9 +2674,12 @@ static const char *include_config (cmd_parms *cmd, void *dummy, char *name) { + static cmd_parms parms; name = ap_server_root_relative(cmd->pool, name); + + bcopy(cmd, &parms, sizeof(parms)); - ap_process_resource_config(cmd->server, name, cmd->pool, cmd->temp_pool); + ap_process_include_config(cmd->server, name, cmd->pool, cmd->temp_pool, &parms); return NULL; } -- [EMAIL PROTECTED] PubKey: [EMAIL PROTECTED] Web: http://devnull.redbrick.dcu.ie/