dougm       2002/09/04 18:47:39

  Modified:    src/modules/perl modperl_config.c modperl_config.h
               xs/Apache/Directive Apache__Directive.h
  Log:
  pulling config insert logic out of Apache__Directive.h so it can be
  used elsewhere.  made more generic so it can be used at both startup
  time and request time.
  
  Revision  Changes    Path
  1.56      +118 -0    modperl-2.0/src/modules/perl/modperl_config.c
  
  Index: modperl_config.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -r1.55 -r1.56
  --- modperl_config.c  27 Aug 2002 04:27:44 -0000      1.55
  +++ modperl_config.c  5 Sep 2002 01:47:39 -0000       1.56
  @@ -324,3 +324,121 @@
   
       return TRUE;
   }
  +
  +typedef struct {
  +    AV *av;
  +    I32 ix;
  +    PerlInterpreter *perl;
  +} svav_param_t;
  +
  +static void *svav_getstr(void *buf, size_t bufsiz, void *param)
  +{
  +    svav_param_t *svav_param = (svav_param_t *)param;
  +    dTHXa(svav_param->perl);
  +    AV *av = svav_param->av;
  +    SV *sv;
  +    STRLEN n_a;
  +
  +    if (svav_param->ix > AvFILL(av)) {
  +        return NULL;
  +    }
  +
  +    sv = AvARRAY(av)[svav_param->ix++];
  +    SvPV_force(sv, n_a);
  +
  +    apr_cpystrn(buf, SvPVX(sv), bufsiz);
  +
  +    return buf;
  +}
  +
  +const char *modperl_config_insert(pTHX_ server_rec *s,
  +                                  apr_pool_t *p,
  +                                  apr_pool_t *ptmp,
  +                                  int override,
  +                                  char *path,
  +                                  ap_conf_vector_t *conf,
  +                                  SV *lines)
  +{
  +    const char *errmsg;
  +    cmd_parms parms;
  +    svav_param_t svav_parms;
  +    ap_directive_t *conftree = NULL;
  +
  +    memset(&parms, '\0', sizeof(parms));
  +
  +    parms.limited = -1;
  +    parms.server = s;
  +    parms.override = override;
  +    parms.path = path;
  +    parms.pool = p;
  +
  +    if (ptmp) {
  +        parms.temp_pool = ptmp;
  +    }
  +    else {
  +        apr_pool_create(&parms.temp_pool, p);
  +    }
  +
  +    if (!(SvROK(lines) && (SvTYPE(SvRV(lines)) == SVt_PVAV))) {
  +        return "not an array reference";
  +    }
  +
  +    svav_parms.av = (AV*)SvRV(lines);
  +    svav_parms.ix = 0;
  +#ifdef USE_ITHREADS
  +    svav_parms.perl = aTHX;
  +#endif
  +
  +    parms.config_file = ap_pcfg_open_custom(p, "mod_perl",
  +                                            &svav_parms, NULL,
  +                                            svav_getstr, NULL);
  +
  +    errmsg = ap_build_config(&parms, p, parms.temp_pool, &conftree);
  +
  +    if (!errmsg) {
  +        errmsg = ap_walk_config(conftree, &parms, conf);
  +    }
  +
  +    ap_cfg_closefile(parms.config_file);
  +
  +    if (ptmp != parms.temp_pool) {
  +        apr_pool_destroy(parms.temp_pool);
  +    }
  +
  +    return errmsg;
  +}
  +
  +const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines)
  +{
  +    int override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
  +    apr_pool_t *p = s->process->pconf;
  +
  +    return modperl_config_insert(aTHX_ s, p, NULL, override, NULL,
  +                                 s->lookup_defaults, lines);
  +}
  +
  +const char *modperl_config_insert_request(pTHX_
  +                                          request_rec *r,
  +                                          SV *lines,
  +                                          char *path,
  +                                          int override)
  +{
  +    const char *errmsg;
  +    ap_conf_vector_t *dconf = ap_create_per_dir_config(r->pool);
  +
  +    errmsg = modperl_config_insert(aTHX_
  +                                   r->server, r->pool, r->pool,
  +                                   override, path,
  +                                   dconf, lines);
  +
  +    if (errmsg) {
  +        return errmsg;
  +    }
  +
  +    r->per_dir_config = 
  +        ap_merge_per_dir_configs(r->pool,
  +                                 r->per_dir_config,
  +                                 dconf);
  +
  +    return NULL;
  +}
  
  
  
  1.31      +15 -0     modperl-2.0/src/modules/perl/modperl_config.h
  
  Index: modperl_config.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- modperl_config.h  5 Nov 2001 05:19:01 -0000       1.30
  +++ modperl_config.h  5 Sep 2002 01:47:39 -0000       1.31
  @@ -107,4 +107,19 @@
                                        modperl_config_srv_t *scfg,
                                        PerlInterpreter *perl, apr_pool_t *p);
   
  +const char *modperl_config_insert(pTHX_ server_rec *s,
  +                                  apr_pool_t *p,
  +                                  apr_pool_t *ptmp,
  +                                  int override,
  +                                  char *path,
  +                                  ap_conf_vector_t *conf,
  +                                  SV *lines);
  +
  +const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines);
  +
  +const char *modperl_config_insert_request(pTHX_
  +                                          request_rec *r,
  +                                          SV *lines,
  +                                          char *path,
  +                                          int override);
   #endif /* MODPERL_CONFIG_H */
  
  
  
  1.5       +0 -71     modperl-2.0/xs/Apache/Directive/Apache__Directive.h
  
  Index: Apache__Directive.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/xs/Apache/Directive/Apache__Directive.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Apache__Directive.h       28 Aug 2002 03:11:21 -0000      1.4
  +++ Apache__Directive.h       5 Sep 2002 01:47:39 -0000       1.5
  @@ -1,77 +1,6 @@
   #define mpxs_Apache__Directive_conftree(CLASS) \
   (CLASS ? ap_conftree : ap_conftree)
   
  -typedef struct {
  -    AV *av;
  -    I32 ix;
  -    PerlInterpreter *perl;
  -} svav_param_t;
  -
  -static void *svav_getstr(void *buf, size_t bufsiz, void *param)
  -{
  -    svav_param_t *svav_param = (svav_param_t *)param;
  -    dTHXa(svav_param->perl);
  -    AV *av = svav_param->av;
  -    SV *sv;
  -    STRLEN n_a;
  -
  -    if (svav_param->ix > AvFILL(av)) {
  -        return NULL;
  -    }
  -
  -    sv = AvARRAY(av)[svav_param->ix++];
  -    SvPV_force(sv, n_a);
  -
  -    apr_cpystrn(buf, SvPVX(sv), bufsiz);
  -
  -    return buf;
  -}
  -
  -static MP_INLINE const char *mpxs_Apache__Directive_insert(pTHX_
  -                                                           SV *self,
  -                                                           server_rec *s,
  -                                                           apr_pool_t *p,
  -                                                           SV *svav)
  -{
  -    const char *errmsg;
  -    cmd_parms parms;
  -    svav_param_t svav_parms;
  -    ap_directive_t *conftree = NULL; /* XXX: self isa Apache::Directive */
  -
  -    memset(&parms, '\0', sizeof(parms));
  -
  -    parms.limited = -1;
  -    parms.pool = p;
  -    parms.server = s;
  -    parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
  -    apr_pool_create(&parms.temp_pool, p);
  -
  -    if (!(SvROK(svav) && (SvTYPE(SvRV(svav)) == SVt_PVAV))) {
  -        return "not an array reference";
  -    }
  -
  -    svav_parms.av = (AV*)SvRV(svav);
  -    svav_parms.ix = 0;
  -#ifdef USE_ITHREADS
  -    svav_parms.perl = aTHX;
  -#endif
  -
  -    parms.config_file = ap_pcfg_open_custom(p, "mod_perl",
  -                                            &svav_parms, NULL,
  -                                            svav_getstr, NULL);
  -
  -    errmsg = ap_build_config(&parms, p, parms.temp_pool, &conftree);
  -
  -    if (!errmsg) {
  -        errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults);
  -    }
  -
  -    ap_cfg_closefile(parms.config_file);
  -    apr_pool_destroy(parms.temp_pool);
  -
  -    return errmsg;
  -}
  -
   /* XXX: this is only useful for <Perl> at the moment */
   static MP_INLINE SV *mpxs_Apache__Directive_as_string(pTHX_
                                                         ap_directive_t *self)
  
  
  


Reply via email to