]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Revert vetoed backport r925858 and related docs commits.
authorWilliam A. Rowe Jr <wrowe@apache.org>
Mon, 29 Mar 2010 22:38:41 +0000 (22:38 +0000)
committerWilliam A. Rowe Jr <wrowe@apache.org>
Mon, 29 Mar 2010 22:38:41 +0000 (22:38 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@928928 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
docs/manual/mod/core.xml
server/config.c

diff --git a/CHANGES b/CHANGES
index 3fd21667a34a206919b1e4b849e26f8a618cb90e..419b9379d6812e7d70e2631f0ce5f4a30fbc02a5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,9 +1,6 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.2.16
 
-  *) core: Support wildcards in both the directory and file components of
-     the path specified by the Include directive. [Graham Leggett, Dan
-     Poirier]
 
 
 Changes with Apache 2.2.15
diff --git a/STATUS b/STATUS
index ea89b8a2c56317a54c45856b1adec7cf1d418d41..1b583839635bf15aec82c68e74422eab2bff6dd3 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -86,6 +86,15 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
+  * core: Support wildcards in both the directory and file components of
+    the path specified by the Include directive.
+    Trunk patch: http://svn.apache.org/viewvc?rev=909878&view=rev
+                 http://svn.apache.org/viewvc?rev=917735&view=rev
+                 http://svn.apache.org/viewvc?rev=917759&view=rev
+    2.2.x patch: http://people.apache.org/~minfrin/httpd-wildcard+docs2.patch
+    Submitted by: minfrin, poirier
+    +1: minfrin, jim, poirier
+
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
   [ New proposals should be added at the end of the list ]
index 3a1d8dccde1f537e4db0a783576ff930c1762ae2..12c37e2dad10357f69ccb209713d74cd0a4e5969 100644 (file)
@@ -1513,33 +1513,20 @@ the server configuration files</description>
 <contextlist><context>server config</context><context>virtual host</context>
 <context>directory</context>
 </contextlist>
-<compatibility>Wildcard matching available in 2.0.41 and later, directory
-wildcard matching available in 2.3.6 and later</compatibility>
+<compatibility>Wildcard matching available in 2.0.41 and later</compatibility>
 
 <usage>
     <p>This directive allows inclusion of other configuration files
     from within the server configuration files.</p>
 
-    <p>Shell-style (<code>fnmatch()</code>) wildcard characters can be used
-    in the filename or directory parts of the path to include several files
-    at once, in alphabetical order. In addition, if
-    <directive>Include</directive> points to a directory, rather than a file,
-    Apache will read all files in that directory and any subdirectory.
-    However, including entire directories is not recommended, because it is
-    easy to accidentally leave temporary files in a directory that can cause
-    <program>httpd</program> to fail. Instead, we encourage you to use the
-    wildcard syntax shown below, to include files that match a particular
-    pattern, such as *.conf, for example.</p>
-  
-    <p>When a wildcard is specified for a file or directory component of the
-    path, and no file or directory matches the wildcard, the
-    <directive module="core">Include</directive> directive will be
-    silently ignored. When a directory or file component of the path is
-    specified exactly, and that directory or file does not exist,
-    <directive module="core">Include</directive> directive will fail with an
-    error saying the file or directory cannot be found. This removes the need
-    for placeholder files to exist so that at least one file or directory is
-    found by the wildcard.</p>
+    <p>Shell-style (<code>fnmatch()</code>) wildcard characters can be used to
+    include several files at once, in alphabetical order. In
+    addition, if <directive>Include</directive> points to a directory,
+    rather than a file, Apache will read all files in that directory
+    and any subdirectory.  But including entire directories is not
+    recommended, because it is easy to accidentally leave temporary
+    files in a directory that can cause <program>httpd</program> to
+    fail.</p>
 
     <p>The file path specified may be an absolute path, or may be relative 
     to the <directive module="core">ServerRoot</directive> directory.</p>
index 00a0d031dcf8e173ef3e2605f3cec61a685c0cff..101d0e4ed0678f7d11a49c9614c534699a1138db 100644 (file)
@@ -1528,7 +1528,7 @@ static const char *process_command_config(server_rec *s,
 }
 
 typedef struct {
-    const char *fname;
+    char *fname;
 } fnames;
 
 static int fname_alphasort(const void *fn1, const void *fn2)
@@ -1639,107 +1639,6 @@ static const char *process_resource_config_nofnmatch(server_rec *s,
     return NULL;
 }
 
-static const char *process_resource_config_fnmatch(server_rec *s,
-                                                   const char *path,
-                                                   const char *fname,
-                                                   ap_directive_t **conftree,
-                                                   apr_pool_t *p,
-                                                   apr_pool_t *ptemp,
-                                                   unsigned depth)
-{
-    char *rest;
-    apr_status_t rv;
-    apr_dir_t *dirp;
-    apr_finfo_t dirent;
-    apr_array_header_t *candidates = NULL;
-    fnames *fnew;
-    int current;
-
-    /* find the first part of the filename */
-    rest = ap_strchr(fname, '/');
-    if (rest) {
-        fname = apr_pstrndup(ptemp, fname, rest - fname);
-        rest++;
-    }
-
-    /* optimisation - if the filename isn't a wildcard, process it directly */
-    if (!apr_fnmatch_test(fname)) {
-        path = ap_make_full_path(ptemp, path, fname);
-        if (!rest) {
-            return process_resource_config_nofnmatch(s, path,
-                                                     conftree, p,
-                                                     ptemp, 0);
-        }
-        else {
-            return process_resource_config_fnmatch(s, path, rest,
-                                                   conftree, p,
-                                                   ptemp, 0);
-        }
-    }
-
-    /*
-     * first course of business is to grok all the directory
-     * entries here and store 'em away. Recall we need full pathnames
-     * for this.
-     */
-    rv = apr_dir_open(&dirp, path, ptemp);
-    if (rv != APR_SUCCESS) {
-        char errmsg[120];
-        return apr_psprintf(p, "Could not open config directory %s: %s",
-                            path, apr_strerror(rv, errmsg, sizeof errmsg));
-    }
-
-    candidates = apr_array_make(ptemp, 1, sizeof(fnames));
-    while (apr_dir_read(&dirent, APR_FINFO_DIRENT | APR_FINFO_TYPE, dirp) == APR_SUCCESS) {
-        /* strip out '.' and '..' */
-        if (strcmp(dirent.name, ".")
-            && strcmp(dirent.name, "..")
-            && (apr_fnmatch(fname, dirent.name,
-                            APR_FNM_PERIOD) == APR_SUCCESS)) {
-            const char *full_path = ap_make_full_path(ptemp, path, dirent.name);
-            /* If matching internal to path, and we happen to match something
-             * other than a directory, skip it
-             */
-            if (rest && (rv == APR_SUCCESS) && (dirent.filetype != APR_DIR)) {
-                continue;
-            }
-            fnew = (fnames *) apr_array_push(candidates);
-            fnew->fname = full_path;
-        }
-    }
-
-    apr_dir_close(dirp);
-    if (candidates->nelts != 0) {
-        const char *error;
-
-        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];
-            if (!rest) {
-                error = process_resource_config_nofnmatch(s, fnew->fname,
-                                                          conftree, p,
-                                                          ptemp, 0);
-            }
-            else {
-                error = process_resource_config_fnmatch(s, fnew->fname, rest,
-                                                        conftree, p,
-                                                        ptemp, 0);
-            }
-            if (error) {
-                return error;
-            }
-        }
-    }
-
-    return NULL;
-}
-
 AP_DECLARE(const char *) ap_process_resource_config(server_rec *s,
                                                     const char *fname,
                                                     ap_directive_t **conftree,
@@ -1764,24 +1663,80 @@ AP_DECLARE(const char *) ap_process_resource_config(server_rec *s,
                                                  0);
     }
     else {
-        apr_status_t status;
-        const char *rootpath, *filepath = fname;
+        apr_dir_t *dirp;
+        apr_finfo_t dirent;
+        int current;
+        apr_array_header_t *candidates = NULL;
+        fnames *fnew;
+        apr_status_t rv;
+        char *path = apr_pstrdup(p, fname), *pattern = NULL;
+
+        pattern = ap_strrchr(path, '/');
 
-        /* locate the start of the directories proper */
-        status = apr_filepath_root(&rootpath, &filepath, APR_FILEPATH_TRUENAME, ptemp);
+        AP_DEBUG_ASSERT(pattern != NULL); /* path must be absolute. */
 
-        /* we allow APR_SUCCESS and APR_EINCOMPLETE */
-        if (APR_ERELATIVE == status) {
-            return apr_pstrcat(p, "Include must have an absolute path, ", fname, NULL);
+        *pattern++ = '\0';
+
+        if (apr_fnmatch_test(path)) {
+            return apr_pstrcat(p, "Wildcard patterns not allowed in Include ",
+                               fname, NULL);
         }
-        else if (APR_EBADPATH == status) {
-            return apr_pstrcat(p, "Include has a bad path, ", fname, NULL);
+
+        if (!ap_is_directory(p, path)){
+            return apr_pstrcat(p, "Include directory '", path, "' not found",
+                               NULL);
         }
 
-        /* walk the filepath */
-        return process_resource_config_fnmatch(s, rootpath, filepath, conftree, p, ptemp,
-                                                 0);
+        if (!apr_fnmatch_test(pattern)) {
+            return apr_pstrcat(p, "Must include a wildcard pattern for "
+                               "Include ", fname, NULL);
+        }
+
+        /*
+         * first course of business is to grok all the directory
+         * entries here and store 'em away. Recall we need full pathnames
+         * for this.
+         */
+        rv = apr_dir_open(&dirp, path, p);
+        if (rv != APR_SUCCESS) {
+            char errmsg[120];
+            return apr_psprintf(p, "Could not open config directory %s: %s",
+                                path, apr_strerror(rv, errmsg, sizeof errmsg));
+        }
+
+        candidates = apr_array_make(p, 1, sizeof(fnames));
+        while (apr_dir_read(&dirent, APR_FINFO_DIRENT, dirp) == APR_SUCCESS) {
+            /* strip out '.' and '..' */
+            if (strcmp(dirent.name, ".")
+                && strcmp(dirent.name, "..")
+                && (apr_fnmatch(pattern, dirent.name,
+                                APR_FNM_PERIOD) == APR_SUCCESS)) {
+                fnew = (fnames *) apr_array_push(candidates);
+                fnew->fname = ap_make_full_path(p, path, dirent.name);
+            }
+        }
+
+        apr_dir_close(dirp);
+        if (candidates->nelts != 0) {
+            const char *error;
 
+            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];
+                error = process_resource_config_nofnmatch(s, fnew->fname,
+                                                          conftree, p,
+                                                          ptemp, 0);
+                if (error) {
+                    return error;
+                }
+            }
+        }
     }
 
     return NULL;