switch to IPC::Run, add logging master
authormark <mark>
Fri, 14 Oct 2011 02:15:40 +0000 (02:15 +0000)
committermark <mark>
Fri, 14 Oct 2011 02:15:40 +0000 (02:15 +0000)
_smtpd

diff --git a/_smtpd b/_smtpd
index 1bd2021..60654f7 100644 (file)
--- a/_smtpd
+++ b/_smtpd
@@ -2,19 +2,22 @@
 
 use strict;
 use Getopt::Std;
-use vars qw(%aliases $opt_d $opt_a);
+use vars qw(%aliases $opt_a);
 use subs qw(validate_recipient process_message read_aliases);
 use Net::Server::Mail::ESMTP;
+use IPC::Run qw( run );
+use Sys::Syslog;
 
-getopt('a:');
+getopt('a:v');
 
 my $smtp = new Net::Server::Mail::ESMTP;
 $smtp->set_callback(RCPT => \&validate_recipient);
 $smtp->set_callback(DATA => \&process_message);
 
+openlog('[_smtpd]', '', 'mail');
 read_aliases;
 $smtp->process;
-
+closelog();
 #--
 
 sub validate_recipient {
@@ -34,19 +37,21 @@ sub process_message {
   return(0, 554, 'Error: no valid recipients')
     unless(@recipients);
 
+  syslog('info',
+         'received '.length($$data).' bytes for '.join(',', @recipients)
+  );
   foreach my $recipient ( @recipients ) {
     $recipient =~ s/^<//;
     $recipient =~ s/\@.*$//;
 
-    open(PIPE, '|'.$aliases{$recipient})
-      or return(0, 451, "Can't fork: $!" );
-    print PIPE $$data
-      or return(0, 451, "Can't write to pipe: $!" );
-    close PIPE
-      or return(0, 451, "Can't close: status=$?" );
-
+    my $result = eval { run $aliases{$recipient}, $data };
+    if (!$result) {
+      syslog('info', "pipe command failed: $@");
+      return(0, 451, "pipe command failed: $@");
+    }
   }
 
+  syslog('info', 'message piped');
   return(1, 250, 'message piped');
 
 }
@@ -62,7 +67,7 @@ sub read_aliases {
     next if /^$/ or /^#/;
     /^([\w\-\+\.]+):\s*("?)\|(.*)\2\s*$/ or next;
     #$aliases{$1} = [ split(/\s+/, $3) ];
-    $aliases{$1} = $3;
+    $aliases{$1} = [ qw(/bin/sh -c), $3 ];
   }
 
 }