From: Graham Leggett Date: Mon, 10 Jun 2013 14:46:37 +0000 (+0000) Subject: core: Add dirwalk_stat hook. X-Git-Tag: 2.4.5~141 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=97113724d46496c4165b7a52519e1568d8673fd5;p=apache core: Add dirwalk_stat hook. 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 --- diff --git a/CHANGES b/CHANGES index 8777dd218c..056d401868 100644 --- 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 ] diff --git a/STATUS b/STATUS index 142cfdc750..8e088abdc3 100644 --- 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 ] diff --git a/include/ap_mmn.h b/include/ap_mmn.h index ceced61ce2..3531807807 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -413,6 +413,7 @@ * 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" */ @@ -420,7 +421,7 @@ #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 diff --git a/include/http_request.h b/include/http_request.h index 086e930871..1884fbef22 100644 --- a/include/http_request.h +++ b/include/http_request.h @@ -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); diff --git a/server/core.c b/server/core.c index 094559937d..fb5e34a0b4 100644 --- a/server/core.c +++ b/server/core.c @@ -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 */ diff --git a/server/request.c b/server/request.c index 4abe99ca76..1f4d99270c 100644 --- a/server/request.c +++ b/server/request.c @@ -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