--- inn-1.7.2.orig/lib/perl.c
+++ inn-1.7.2/lib/perl.c
@@ -29,11 +29,15 @@
 #include <perl.h>
 #include <XSUB.h>
 
+#include "libinn.h"  /* xmalloc() prototype */
 #include "macros.h"
 
+extern void xs_init    _((pTHX));
+extern void boot_DynaLoader _((CV* cv));
+
 int	PerlFilterActive = FALSE;
 
-static PerlInterpreter	*PerlCode;
+PerlInterpreter	*PerlCode;
 CV *perl_filter_cv ;                 /* filter_art or filter_post holder */
 extern char	LogName[];
 
@@ -56,9 +60,9 @@
     if (PerlFilterActive && !value) {
         if (perl_get_cv("filter_end", FALSE) != NULL) {
             perl_call_argv("filter_end", G_EVAL|G_DISCARD|G_NOARGS, NULL);
-            if (SvTRUE(GvSV(errgv)))     /* check $@ */ {
+            if (SvTRUE(ERRSV))     /* check $@ */ {
                 syslog (L_ERROR,"%s perl function filter_end died: %s",
-                        LogName, SvPV(GvSV(errgv), na)) ;
+                        LogName, SvPV(ERRSV, PL_na)) ;
                 POPs ;
             }
         } else {
@@ -89,7 +93,7 @@
     /* We can't call 'eval' and 'do' directly for some reason, so we define
        some wrapper functions to give us access. */
         
-    perl_parse (PerlCode,NULL,5,argv,NULL) ;
+    perl_parse (PerlCode,xs_init,5,argv,NULL) ;
 }
 
 
@@ -126,9 +130,9 @@
         
         SPAGAIN ;
         
-        if (SvTRUE(GvSV(errgv)))     /* check $@ */ {
+        if (SvTRUE(ERRSV))     /* check $@ */ {
             syslog (L_ERROR,"%s perl loading %s failed: %s",
-                    LogName, startupfile, SvPV(GvSV(errgv), na)) ;
+                    LogName, startupfile, SvPV(ERRSV, PL_na)) ;
             PerlFilter (FALSE) ;
     
         } else {
@@ -163,9 +167,9 @@
     
     if (perl_get_cv("filter_before_reload", FALSE) != NULL)    {
         perl_call_argv("filter_before_reload",G_EVAL|G_DISCARD|G_NOARGS,NULL);
-        if (SvTRUE(GvSV(errgv)))     /* check $@ */ {
+        if (SvTRUE(ERRSV))     /* check $@ */ {
             syslog (L_ERROR,"%s perl function filter_before_reload died: %s",
-                    LogName, SvPV(GvSV(errgv), na)) ;
+                    LogName, SvPV(ERRSV, PL_na)) ;
             POPs ;
             PerlFilter (FALSE) ;
         }
@@ -173,9 +177,9 @@
 
     perl_call_argv ("_load_", 0, argv) ;
 
-    if (SvTRUE(GvSV(errgv)))     /* check $@ */ {
+    if (SvTRUE(ERRSV))     /* check $@ */ {
         syslog (L_ERROR,"%s perl loading %s failed: %s",
-                LogName, filterfile, SvPV(GvSV(errgv), na)) ;
+                LogName, filterfile, SvPV(ERRSV, PL_na)) ;
         PerlFilter (FALSE) ;
         
         /* If the reload failed we don't want the old definition hanging
@@ -184,9 +188,9 @@
         sprintf (argv[0],"undef &%s",function) ;
         perl_call_argv ("_eval_",0,argv) ;
 
-        if (SvTRUE(GvSV(errgv)))     /* check $@ */ {
+        if (SvTRUE(ERRSV))     /* check $@ */ {
             syslog (L_ERROR,"%s perl undef &%s failed: %s",
-                    LogName, function, SvPV(GvSV(errgv), na)) ;
+                    LogName, function, SvPV(ERRSV, PL_na)) ;
         }
         DISPOSE (argv[0]) ;
     } else if ((perl_filter_cv = perl_get_cv(function, FALSE)) == NULL) {
@@ -195,9 +199,9 @@
     
     if (perl_get_cv("filter_after_reload", FALSE) != NULL) {
         perl_call_argv("filter_after_reload", G_EVAL|G_DISCARD|G_NOARGS, NULL);
-        if (SvTRUE(GvSV(errgv)))     /* check $@ */ {
+        if (SvTRUE(ERRSV))     /* check $@ */ {
             syslog (L_ERROR,"%s perl function filter_after_reload died: %s",
-                    LogName, SvPV(GvSV(errgv), na)) ;
+                    LogName, SvPV(ERRSV, PL_na)) ;
             POPs ;
             PerlFilter (FALSE) ;
         }
@@ -221,5 +225,13 @@
    PerlFilterActive = FALSE;
 }
 
+extern void xs_init(pTHX)
+{
+    char * file = __FILE__;
+    dXSUB_SYS;
+
+    newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
+}
+	
 #endif /* defined(DO_PERL) */
 
--- inn-1.7.2.orig/innd/perl.c
+++ inn-1.7.2/innd/perl.c
@@ -27,6 +27,8 @@
 
 #include <EXTERN.h>
 #include <perl.h>
+#define my_perl PerlCode
+extern PerlInterpreter *PerlCode;
 
 extern BOOL		PerlFilterActive;
 extern ARTHEADER	ARTheaders[], *ARTheadersENDOF;
@@ -79,10 +81,63 @@
 
    buf [0] = '\0' ;
    
-   if (SvTRUE(GvSV(errgv)))     /* check $@ */
+   if (SvTRUE(ERRSV))     /* check $@ */
      {
        syslog (L_ERROR,"Perl function filter_art died: %s",
-               SvPV(GvSV(errgv), na)) ;
+               SvPV(ERRSV, PL_na)) ;
+       POPs ;
+       PerlFilter (FALSE) ;
+     }
+   else if (rc == 1)
+     {
+       p = POPp;
+
+       if (p != NULL && *p != '\0')
+         {
+           strncpy(buf, p, sizeof(buf) - 1);
+           buf[sizeof(buf) - 1] = '\0';
+         }
+     }
+ 
+   PUTBACK;
+   FREETMPS;
+   LEAVE;
+
+   if (buf[0] != '\0') 
+      return buf ;
+   return NULL;
+}
+
+
+char *
+HandleMessageID(messageID)
+char *messageID;
+{
+   dSP;
+   int		rc;
+   char		*p;
+   static char * args[2];
+   static char	buf[256];
+
+   if (!PerlFilterActive || perl_filter_cv == NULL || perl_get_cv("filter_messageid", FALSE) == NULL)
+     return NULL;
+
+
+   ENTER ;
+   SAVETMPS ;
+
+   args[0] = messageID;
+   args[1] = 0;
+   rc = perl_call_argv ("filter_messageid", G_EVAL|G_SCALAR, args);
+
+   SPAGAIN;
+
+   buf [0] = '\0' ;
+   
+   if (SvTRUE(ERRSV))     /* check $@ */
+     {
+       syslog (L_ERROR,"Perl function filter_messageid died: %s",
+               SvPV(ERRSV, PL_na)) ;
        POPs ;
        PerlFilter (FALSE) ;
      }
@@ -137,9 +192,9 @@
 
     if (perl_get_cv("filter_mode", FALSE) != NULL) {
         perl_call_argv("filter_mode", G_EVAL|G_DISCARD|G_NOARGS, NULL);
-        if (SvTRUE(GvSV(errgv))) { /* check $@ */
+        if (SvTRUE(ERRSV)) { /* check $@ */
             syslog (L_ERROR,"Perl function filter_mode died: %s",
-                    SvPV(GvSV(errgv), na)) ;
+                    SvPV(ERRSV, PL_na)) ;
             POPs ;
             PerlFilter (FALSE) ;
         }
