The following patch implements PerlModule and PerlRequire configuration
directives, for the main server and virtual hosts. I apologize for putting
both features in one patch, but the two are absolutely identical. having
the two in the same patch will probably help to see how to abstract the
two and reduce code duplication.

Probably the naming convention could be improved as well.

Index: src/modules/perl/mod_perl.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
retrieving revision 1.60
diff -u -r1.60 mod_perl.c
--- src/modules/perl/mod_perl.c 2001/07/15 22:33:48     1.60
+++ src/modules/perl/mod_perl.c 2001/08/05 14:57:24
@@ -79,6 +79,9 @@
     apr_pool_cleanup_register(p, cdata,
                               modperl_shutdown, apr_pool_cleanup_null);
 #endif
+
+    modperl_config_exec_PerlModule(s, scfg, perl, p);
+    modperl_config_exec_PerlRequire(s, scfg, perl, p);

     return perl;
 }
@@ -126,6 +129,9 @@
                        modperl_server_desc(s, p));
         }

+        modperl_config_exec_PerlModule(s, scfg, perl, p);
+        modperl_config_exec_PerlRequire(s, scfg, perl, p);
+
 #ifdef USE_ITHREADS

         if (!MpSrvENABLED(scfg)) {
@@ -355,6 +361,8 @@

 static const command_rec modperl_cmds[] = {
     MP_CMD_SRV_ITERATE("PerlSwitches", switches, "Perl Switches"),
+    MP_CMD_SRV_ITERATE("PerlModule", modules, "PerlModule"),
+    MP_CMD_SRV_ITERATE("PerlRequire", requires, "PerlRequire"),
     MP_CMD_DIR_ITERATE("PerlOptions", options, "Perl Options"),
 #ifdef MP_TRACE
     MP_CMD_SRV_TAKE1("PerlTrace", trace, "Trace level"),
Index: src/modules/perl/modperl_cmd.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_cmd.c,v
retrieving revision 1.4
diff -u -r1.4 modperl_cmd.c
--- src/modules/perl/modperl_cmd.c      2001/04/06 02:18:15     1.4
+++ src/modules/perl/modperl_cmd.c      2001/08/05 14:57:24
@@ -39,7 +39,26 @@
 MP_CMD_SRV_DECLARE(switches)
 {
     MP_dSCFG(parms->server);
+    MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
     modperl_config_srv_argv_push(arg);
+    return NULL;
+}
+
+MP_CMD_SRV_DECLARE(modules)
+{
+    MP_dSCFG(parms->server);
+
+    *(const char **)apr_array_push(scfg->PerlModule) = arg;
+    MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
+    return NULL;
+}
+
+MP_CMD_SRV_DECLARE(requires)
+{
+    MP_dSCFG(parms->server);
+
+    *(const char **)apr_array_push(scfg->PerlRequire) = arg;
+    MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
     return NULL;
 }

Index: src/modules/perl/modperl_cmd.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_cmd.h,v
retrieving revision 1.4
diff -u -r1.4 modperl_cmd.h
--- src/modules/perl/modperl_cmd.h      2001/04/06 02:18:15     1.4
+++ src/modules/perl/modperl_cmd.h      2001/08/05 14:57:24
@@ -10,6 +10,8 @@
                                void *dummy, const char *arg)
 MP_CMD_SRV_DECLARE(trace);
 MP_CMD_SRV_DECLARE(switches);
+MP_CMD_SRV_DECLARE(modules);
+MP_CMD_SRV_DECLARE(requires);
 MP_CMD_SRV_DECLARE(options);

 #ifdef USE_ITHREADS
Index: src/modules/perl/modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.32
diff -u -r1.32 modperl_config.c
--- src/modules/perl/modperl_config.c   2001/05/08 21:08:26     1.32
+++ src/modules/perl/modperl_config.c   2001/08/05 14:57:25
@@ -71,6 +71,9 @@
     MpSrvENABLED_On(scfg); /* mod_perl enabled by default */
     MpSrvHOOKS_ALL_On(scfg); /* all hooks enabled by default */

+    scfg->PerlModule  = apr_array_make(p, 2, sizeof(char *));
+    scfg->PerlRequire = apr_array_make(p, 2, sizeof(char *));
+
     scfg->argv = apr_array_make(p, 2, sizeof(char *));

     modperl_config_srv_argv_push((char *)ap_server_argv0);
@@ -152,6 +155,9 @@
     MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n",
                (unsigned long)basev, (unsigned long)addv);

+    merge_item(PerlModule);
+    merge_item(PerlRequire);
+
     merge_item(threaded_mpm);

 #ifdef USE_ITHREADS
@@ -183,3 +189,50 @@
     return mrg;
 }

+int modperl_config_exec_PerlModule(server_rec *s, modperl_config_srv_t *scfg, 
+PerlInterpreter *perl, apr_pool_t *p)
+{
+    char **entries;
+    int i;
+    dTHXa(perl);
+
+    entries = (char **)scfg->PerlModule->elts;
+    for (i = 0; i < scfg->PerlModule->nelts; i++){
+        if (modperl_require_module(aTHX_ entries[i], TRUE)){
+            MP_TRACE_i(MP_FUNC, "loaded Perl module %s for server %s\n",
+                       entries[i], modperl_server_desc(s,p));
+        }
+        else {
+            fprintf(stderr,
+                    "Can't load Perl module `%s' for server %s, exiting...\n",
+                    entries[i], modperl_server_desc(s,p));
+            exit(1);
+        }
+    }
+
+    return TRUE;
+
+}
+
+int modperl_config_exec_PerlRequire(server_rec *s, modperl_config_srv_t *scfg, 
+PerlInterpreter *perl, apr_pool_t *p)
+{
+    char **entries;
+    int i;
+    dTHXa(perl);
+
+    entries = (char **)scfg->PerlRequire->elts;
+    for (i = 0; i < scfg->PerlRequire->nelts; i++){
+        if (modperl_require_file(aTHX_ entries[i], TRUE)){
+            MP_TRACE_i(MP_FUNC, "loaded Perl module %s for server %s\n",
+                       entries[i], modperl_server_desc(s,p));
+        }
+        else {
+            fprintf(stderr,
+                    "Can't load Perl module `%s' for server %s, exiting...\n",
+                    entries[i], modperl_server_desc(s,p));
+            exit(1);
+        }
+    }
+
+    return TRUE;
+
+}
Index: src/modules/perl/modperl_config.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
retrieving revision 1.25
diff -u -r1.25 modperl_config.h
--- src/modules/perl/modperl_config.h   2001/03/25 21:26:47     1.25
+++ src/modules/perl/modperl_config.h   2001/08/05 14:57:25
@@ -59,4 +59,9 @@
 #   define MP_dSCFG_dTHX dTHXa(scfg->perl)
 #endif

+int modperl_config_exec_PerlModule(server_rec *s, modperl_config_srv_t *scfg, 
+PerlInterpreter *perl, apr_pool_t *p);
+int modperl_config_exec_PerlRequire(server_rec *s, modperl_config_srv_t *scfg, 
+PerlInterpreter *perl, apr_pool_t *p);
+
 #endif /* MODPERL_CONFIG_H */
+
+
Index: src/modules/perl/modperl_util.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v
retrieving revision 1.15
diff -u -r1.15 modperl_util.c
--- src/modules/perl/modperl_util.c     2001/05/22 20:57:33     1.15
+++ src/modules/perl/modperl_util.c     2001/08/05 14:57:25
@@ -25,6 +25,32 @@
     return TRUE;
 }

+int modperl_require_file(pTHX_ const char *pv, int logfailure)
+{
+    SV *sv;
+
+    dSP;
+    PUSHSTACKi(PERLSI_REQUIRE);
+    PUTBACK;
+    sv = sv_newmortal();
+    sv_setpv(sv, "require \"");
+    sv_catpv(sv, pv);
+    sv_catpv(sv, "\"");
+    eval_sv(sv, G_DISCARD);
+    SPAGAIN;
+    POPSTACK;
+
+    if (SvTRUE(ERRSV)) {
+        if (logfailure) {
+            (void)modperl_errsv(aTHX_ HTTP_INTERNAL_SERVER_ERROR,
+                                NULL, NULL);
+        }
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
 static SV *modperl_hv_request_find(pTHX_ SV *in, char *classname, CV *cv)
 {
     static char *r_keys[] = { "r", "_r", NULL };
Index: src/modules/perl/modperl_util.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.h,v
retrieving revision 1.15
diff -u -r1.15 modperl_util.h
--- src/modules/perl/modperl_util.h     2001/05/22 20:57:34     1.15
+++ src/modules/perl/modperl_util.h     2001/08/05 14:57:25
@@ -36,6 +36,7 @@
 int modperl_errsv(pTHX_ int status, request_rec *r, server_rec *s);

 int modperl_require_module(pTHX_ const char *pv, int logfailure);
+int modperl_require_file(pTHX_ const char *pv, int logfailure);

 char *modperl_server_desc(server_rec *s, apr_pool_t *p);





_____________________________________________________________________
Stas Bekman              JAm_pH     --   Just Another mod_perl Hacker
http://stason.org/       mod_perl Guide  http://perl.apache.org/guide
mailto:[EMAIL PROTECTED]   http://apachetoday.com http://eXtropia.com/
http://singlesheaven.com http://perl.apache.org http://perlmonth.com/



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to