On Wed, Feb 19, 2003 at 03:28:52PM -0500, Jim Jagielski wrote:
> I'm considering releasing 1.3.28 soonish... comments?

Here's a patch that makes Include config directives work recursively,
posted it months ago, but I never chased it up :/

Months old but should apply :)

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)
 {
+    cmd_parms parms;
     name = ap_server_root_relative(cmd->pool, name);
+
+    memcpy(&parms, cmd, 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;
 }
-- 
Colm MacC�rthaigh                        Public Key: [EMAIL PROTECTED]
[EMAIL PROTECTED]                                   http://www.stdlib.net/

Reply via email to