dougm 01/03/09 15:42:28
Added: src/modules/perl modperl_pcw.c modperl_pcw.h
Log:
module for walking the parsed Apache configuration
Revision Changes Path
1.1 modperl-2.0/src/modules/perl/modperl_pcw.c
Index: modperl_pcw.c
===================================================================
#include "mod_perl.h"
/*
* pcw == Parsed Config Walker
* generic functions for walking parsed config using callbacks
*/
void ap_pcw_walk_location_config(apr_pool_t *pconf, server_rec *s,
core_server_config *sconf,
module *modp,
ap_pcw_dir_walker dw, void *data)
{
int i;
ap_conf_vector_t **urls = (ap_conf_vector_t **)sconf->sec_url->elts;
for (i = 0; i < sconf->sec_url->nelts; i++) {
core_dir_config *conf =
ap_get_module_config(urls[i], &core_module);
void *dir_cfg = ap_get_module_config(urls[i], modp);
if (!dw(pconf, s, dir_cfg, conf->d, data)) {
break;
}
}
}
void ap_pcw_walk_directory_config(apr_pool_t *pconf, server_rec *s,
core_server_config *sconf,
module *modp,
ap_pcw_dir_walker dw, void *data)
{
int i;
ap_conf_vector_t **dirs = (ap_conf_vector_t **)sconf->sec->elts;
for (i = 0; i < sconf->sec->nelts; i++) {
core_dir_config *conf =
ap_get_module_config(dirs[i], &core_module);
void *dir_cfg = ap_get_module_config(dirs[i], modp);
if (!dw(pconf, s, dir_cfg, conf->d, data)) {
break;
}
}
}
void ap_pcw_walk_files_config(apr_pool_t *pconf, server_rec *s,
core_dir_config *dconf,
module *modp,
ap_pcw_dir_walker dw, void *data)
{
int i;
ap_conf_vector_t **dirs = (ap_conf_vector_t **)dconf->sec->elts;
for (i = 0; i < dconf->sec->nelts; i++) {
core_dir_config *conf =
ap_get_module_config(dirs[i], &core_module);
void *dir_cfg = ap_get_module_config(dirs[i], modp);
if (!dw(pconf, s, dir_cfg, conf->d, data)) {
break;
}
}
}
void ap_pcw_walk_default_config(apr_pool_t *pconf, server_rec *s,
module *modp,
ap_pcw_dir_walker dw, void *data)
{
core_dir_config *conf =
ap_get_module_config(s->lookup_defaults, &core_module);
void *dir_cfg =
ap_get_module_config(s->lookup_defaults, modp);
dw(pconf, s, dir_cfg, conf->d, data);
}
void ap_pcw_walk_server_config(apr_pool_t *pconf, server_rec *s,
module *modp,
ap_pcw_srv_walker sw, void *data)
{
void *cfg = ap_get_module_config(s->module_config, modp);
if (!cfg) {
return;
}
sw(pconf, s, cfg, data);
}
void ap_pcw_walk_config(apr_pool_t *pconf, server_rec *s,
module *modp, void *data,
ap_pcw_dir_walker dw, ap_pcw_srv_walker sw)
{
for (; s; s = s->next) {
core_dir_config *dconf =
ap_get_module_config(s->lookup_defaults,
&core_module);
core_server_config *sconf =
ap_get_module_config(s->module_config,
&core_module);
if (dw) {
ap_pcw_walk_location_config(pconf, s, sconf, modp, dw, data);
ap_pcw_walk_directory_config(pconf, s, sconf, modp, dw, data);
ap_pcw_walk_files_config(pconf, s, dconf, modp, dw, data);
ap_pcw_walk_default_config(pconf, s, modp, dw, data);
}
if (sw) {
ap_pcw_walk_server_config(pconf, s, modp, sw, data);
}
}
}
1.1 modperl-2.0/src/modules/perl/modperl_pcw.h
Index: modperl_pcw.h
===================================================================
#ifndef MODPERL_PCW_H
#define MODPERL_PCW_H
typedef int (*ap_pcw_dir_walker) (apr_pool_t *, server_rec *,
void *, char *, void *);
typedef int (*ap_pcw_srv_walker) (apr_pool_t *, server_rec *,
void *, void *);
void ap_pcw_walk_location_config(apr_pool_t *pconf, server_rec *s,
core_server_config *sconf,
module *modp,
ap_pcw_dir_walker dw, void *data);
void ap_pcw_walk_directory_config(apr_pool_t *pconf, server_rec *s,
core_server_config *sconf,
module *modp,
ap_pcw_dir_walker dw, void *data);
void ap_pcw_walk_files_config(apr_pool_t *pconf, server_rec *s,
core_dir_config *dconf,
module *modp,
ap_pcw_dir_walker dw, void *data);
void ap_pcw_walk_default_config(apr_pool_t *pconf, server_rec *s,
module *modp,
ap_pcw_dir_walker dw, void *data);
void ap_pcw_walk_server_config(apr_pool_t *pconf, server_rec *s,
module *modp,
ap_pcw_srv_walker sw, void *data);
void ap_pcw_walk_config(apr_pool_t *pconf, server_rec *s,
module *modp, void *data,
ap_pcw_dir_walker dw, ap_pcw_srv_walker sw);
#endif /* MODPERL_PCW_H */