]> granicus.if.org Git - apache/commitdiff
core: Add dirwalk_stat hook.
authorGraham Leggett <minfrin@apache.org>
Mon, 10 Jun 2013 14:46:37 +0000 (14:46 +0000)
committerGraham Leggett <minfrin@apache.org>
Mon, 10 Jun 2013 14:46:37 +0000 (14:46 +0000)
trunk patch: http://svn.apache.org/r1388447
Submitted by: trawick
Reviewed by: minfrin, jim, sf

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1491476 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
include/ap_mmn.h
include/http_request.h
server/core.c
server/request.c

diff --git a/CHANGES b/CHANGES
index 8777dd218c278416e4ae4c5acadc32d54465a191..056d401868acc751677652056a52b11abf11b116 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,8 @@
 
 Changes with Apache 2.4.5
 
+  *) core: Add dirwalk_stat hook.  [Jeff Trawick]
+
   *) core: Add post_perdir_config hook.
      [Steinar Gunderson <sgunderson bigfoot.com>]
 
diff --git a/STATUS b/STATUS
index 142cfdc7501bbe186fcb1417f6c45d3c49be1ee2..8e088abdc330736db0bf90a747e7a6b343c05ca2 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -90,11 +90,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
  
-    * core: Add dirwalk_stat hook.
-      trunk patch: http://svn.apache.org/r1388447
-      2.4.x patch: trunk patch works modulo CHANGES and mmn bump
-      +1: minfrin, jim, sf
-
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
   [ New proposals should be added at the end of the list ]
index ceced61ce299cf3b4e205be8fea9ac0ac741601f..3531807807073079b08e3d1425da52fe5f1caab6 100644 (file)
  *                         ap_condition_if_modified_since(),
  *                         ap_condition_if_range()
  * 20120211.19 (2.4.5-dev) Add post_perdir_config hook.
+ * 20120211.20 (2.4.5-dev) Add dirwalk_stat hook.
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20120211
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 19                   /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 20                   /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
index 086e930871fca9804f179a5fc7921bc88c8a49ed..1884fbef22bff0eb8bde0482b20e55c635f246b3 100644 (file)
@@ -538,6 +538,15 @@ AP_DECLARE_HOOK(void,insert_filter,(request_rec *r))
  */
 AP_DECLARE_HOOK(int,post_perdir_config,(request_rec *r))
 
+/**
+ * This hook allows modules to handle/emulate the apr_stat() calls
+ * needed for directory walk.
+ * @param r The current request
+ * @return apr_status_t or AP_DECLINED (let later modules decide)
+ * @ingroup hooks
+ */
+AP_DECLARE_HOOK(apr_status_t,dirwalk_stat,(apr_finfo_t *finfo, request_rec *r, apr_int32_t wanted))
+
 AP_DECLARE(int) ap_location_walk(request_rec *r);
 AP_DECLARE(int) ap_directory_walk(request_rec *r);
 AP_DECLARE(int) ap_file_walk(request_rec *r);
index 094559937d693b662821de27d64c2d43f3680a0d..fb5e34a0b420596819c4f8bef8fe596ce8768be9 100644 (file)
@@ -4795,6 +4795,12 @@ static apr_status_t core_insert_network_bucket(conn_rec *c,
     return APR_SUCCESS;
 }
 
+static apr_status_t core_dirwalk_stat(apr_finfo_t *finfo, request_rec *r,
+                                      apr_int32_t wanted) 
+{
+    return apr_stat(finfo, r->filename, wanted, r->pool);
+}
+
 static void core_dump_config(apr_pool_t *p, server_rec *s)
 {
     core_server_config *sconf = ap_get_core_module_config(s->module_config);
@@ -4871,7 +4877,8 @@ static void register_hooks(apr_pool_t *p)
     ap_hook_child_status(ap_core_child_status, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_insert_network_bucket(core_insert_network_bucket, NULL, NULL,
                                   APR_HOOK_REALLY_LAST);
-
+    ap_hook_dirwalk_stat(core_dirwalk_stat, NULL, NULL, APR_HOOK_REALLY_LAST);
+    
     /* register the core's insert_filter hook and register core-provided
      * filters
      */
index 4abe99ca76ba833b9f49929ce7764b648eba4c8e..1f4d99270ce56868a4f31d07f63da0ae892b1c9f 100644 (file)
@@ -70,6 +70,7 @@ APR_HOOK_STRUCT(
     APR_HOOK_LINK(insert_filter)
     APR_HOOK_LINK(create_request)
     APR_HOOK_LINK(post_perdir_config)
+    APR_HOOK_LINK(dirwalk_stat)
 )
 
 AP_IMPLEMENT_HOOK_RUN_FIRST(int,translate_name,
@@ -93,6 +94,9 @@ AP_IMPLEMENT_HOOK_RUN_ALL(int, create_request,
                           (request_rec *r), (r), OK, DECLINED)
 AP_IMPLEMENT_HOOK_RUN_ALL(int, post_perdir_config,
                           (request_rec *r), (r), OK, DECLINED)
+AP_IMPLEMENT_HOOK_RUN_FIRST(apr_status_t,dirwalk_stat,
+                            (apr_finfo_t *finfo, request_rec *r, apr_int32_t wanted),
+                            (finfo, r, wanted), AP_DECLINED)
 
 static int auth_internal_per_conf = 0;
 static int auth_internal_per_conf_hooks = 0;
@@ -609,7 +613,7 @@ AP_DECLARE(int) ap_directory_walk(request_rec *r)
      * with APR_ENOENT, knowing that the path is good.
      */
     if (r->finfo.filetype == APR_NOFILE || r->finfo.filetype == APR_LNK) {
-        rv = apr_stat(&r->finfo, r->filename, APR_FINFO_MIN, r->pool);
+        rv = ap_run_dirwalk_stat(&r->finfo, r, APR_FINFO_MIN);
 
         /* some OSs will return APR_SUCCESS/APR_REG if we stat
          * a regular file but we have '/' at the end of the name;
@@ -675,9 +679,8 @@ AP_DECLARE(int) ap_directory_walk(request_rec *r)
              * check.
              */
             if (!(opts & OPT_SYM_LINKS)) {
-                rv = apr_stat(&thisinfo, r->filename,
-                              APR_FINFO_MIN | APR_FINFO_NAME | APR_FINFO_LINK,
-                              r->pool);
+                rv = ap_run_dirwalk_stat(&thisinfo, r,
+                                         APR_FINFO_MIN | APR_FINFO_NAME | APR_FINFO_LINK);
                 /*
                  * APR_INCOMPLETE is as fine as result as APR_SUCCESS as we
                  * have added APR_FINFO_NAME to the wanted parameter of
@@ -1092,9 +1095,8 @@ AP_DECLARE(int) ap_directory_walk(request_rec *r)
              * the name of its target, if we are fixing the filename
              * case/resolving aliases.
              */
-            rv = apr_stat(&thisinfo, r->filename,
-                          APR_FINFO_MIN | APR_FINFO_NAME | APR_FINFO_LINK,
-                          r->pool);
+            rv = ap_run_dirwalk_stat(&thisinfo, r,
+                                     APR_FINFO_MIN | APR_FINFO_NAME | APR_FINFO_LINK);
 
             if (APR_STATUS_IS_ENOENT(rv)) {
                 /* Nothing?  That could be nice.  But our directory