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 */
  
  
  

Reply via email to