--- qpsmtpd.orig/lib/Qpsmtpd/Auth.pm    2004-09-23 11:14:56.000000000 -0500
+++ qpsmtpd/lib/Qpsmtpd/Auth.pm 2004-11-28 11:22:04.000000000 -0600
@@ -260,7 +260,7 @@ sub SASL {
     
           $session->respond(334, e64("Username:"));
           $user = decode_base64(<>);
-          #warn("Debug: User: '$user'");
+          #$session->log( LOGDEBUG, ("Debug: User: '$user'"));
           if ($user eq '*') {
             $session->respond(501, "Authentification canceled");
             return DECLINED;
@@ -269,7 +269,7 @@ sub SASL {
           $session->respond(334, e64("Password:"));
           $passClear = <>;
           $passClear = decode_base64($passClear);
-          #warn("Debug: Pass: '$pass'");
+          #$session->log( LOGDEBUG, ("Debug: Pass: '$pass'"));
           if ($passClear eq '*') {
             $session->respond(501, "Authentification canceled");
             return DECLINED;
diff -urNp qpsmtpd.orig/lib/Qpsmtpd/SMTP.pm qpsmtpd/lib/Qpsmtpd/SMTP.pm
--- qpsmtpd.orig/lib/Qpsmtpd/SMTP.pm    2004-11-27 00:38:32.000000000 -0600
+++ qpsmtpd/lib/Qpsmtpd/SMTP.pm 2004-11-28 11:23:38.000000000 -0600
@@ -21,7 +21,7 @@ use Net::DNS;
 # this is only good for forkserver
 # can't set these here, cause forkserver resets them
 #$SIG{ALRM} = sub { respond(421, "Game over pal, game over. You got a timeout; I just can't wait that long..."); exit };
-#$SIG{ALRM} = sub { warn "Connection Timed Out\n"; exit; };
+#$SIG{ALRM} = sub { $self->log(LOGERROR, "Connection Timed Out"); exit; };
 
 sub new {
   my $proto = shift;
diff -urNp qpsmtpd.orig/lib/Qpsmtpd/SelectServer.pm qpsmtpd/lib/Qpsmtpd/SelectServer.pm
--- qpsmtpd.orig/lib/Qpsmtpd/SelectServer.pm    2004-03-05 06:46:23.000000000 -0600
+++ qpsmtpd/lib/Qpsmtpd/SelectServer.pm 2004-11-28 11:28:22.000000000 -0600
@@ -8,6 +8,7 @@ use Socket qw(CRLF);
 use Fcntl;
 use Tie::RefHash;
 use Net::DNS;
+use Sys::Syslog qw(:DEFAULT setlogsock);
 
 @ISA = qw(Qpsmtpd::SMTP);
 use strict;
@@ -31,8 +32,13 @@ sub log {
   my ($self, $trace, @log) = @_;
   my $level = Qpsmtpd::TRACE_LEVEL();
   $level = $self->init_logger unless defined $level;
-  warn join(" ", fileno($self->client), @log), "\n"
-    if $trace <= $level;
+  my $msg = join(" ", $$, @log);
+  if ($level eq 'syslog') {
+      syslog((($trace - 1 < 0) ? 0 : $trace -1), $msg);
+  } else {
+      warn $msg, "\n"
+         if $trace <= $level;
+  }
 }
 
 sub main {
@@ -135,7 +141,7 @@ sub main {
             
             my $rv = $client->send($outbuffer{$client}, 0);
             unless (defined($rv)) {
-                warn("I was told to write, but I can't: $!\n");
+                $qp->log(LOGERROR, ("I was told to write, but I can't: $!"));
                 next;
             }
             if ($rv == length($outbuffer{$client}) ||
diff -urNp qpsmtpd.orig/lib/Qpsmtpd.pm qpsmtpd/lib/Qpsmtpd.pm
--- qpsmtpd.orig/lib/Qpsmtpd.pm 2004-11-27 00:46:21.000000000 -0600
+++ qpsmtpd/lib/Qpsmtpd.pm      2004-11-28 11:28:51.000000000 -0600
@@ -4,6 +4,7 @@ use vars qw($VERSION $LogLevel);
 
 use Sys::Hostname;
 use Qpsmtpd::Constants;
+use Sys::Syslog qw(:DEFAULT setlogsock);
 
 $VERSION = "0.28";
 sub TRACE_LEVEL { $LogLevel }
@@ -17,11 +18,21 @@ sub init_logger {
         local $LogLevel = 0;
         $self->config("loglevel");
     };
-    if (defined($loglevel) and $loglevel =~ /^\d+$/) {
+    $LogLevel = LOGWARN; # Default if no loglevel file found.
+    if (defined($loglevel) and ($loglevel =~ /^\d+$/)) {
         $LogLevel = $loglevel;
     }
-    else {
-        $LogLevel = LOGWARN; # Default if no loglevel file found.
+    if (defined($loglevel) and ($loglevel =~ /syslog/)) {
+       $LogLevel = 'syslog';
+       if ($loglevel =~ /stream (\W+)/) {
+           warn "logging to syslog via stream: $1\n";
+           setlogsock('stream', $1);
+       }
+       if ($loglevel =~ /unix/) {
+           warn "logging to syslog via unix\n";
+           setlogsock('unix');
+       }
+       openlog('qpsmtpd', 'ndelay', 'mail');
     }
     return $LogLevel;
 }
@@ -30,8 +41,13 @@ sub log {
   my ($self, $trace, @log) = @_;
   my $level = TRACE_LEVEL();
   $level = $self->init_logger unless defined $level;
-  warn join(" ", $$, @log), "\n"
-    if $trace <= $level;
+  my $msg = join(" ", $$, @log);
+  if ($level eq 'syslog') {
+      syslog((($trace - 1 < 0) ? 0 : $trace -1), $msg);
+  } else {
+      warn $msg, "\n"
+         if $trace <= $level;
+  }
 }
 
 #
@@ -110,7 +126,7 @@ sub get_qmail_config {
 sub _config_from_file {
   my ($self, $configfile, $config) = @_;
   return unless -e $configfile;
-  open CF, "<$configfile" or warn "$$ could not open configfile $configfile: $!" and return;
+  open CF, "<$configfile" or $self->log(LOGERROR, "$$ could not open configfile $configfile: $!") and return;
   my @config = <CF>;
   chomp @config;
   @config = grep { length($_) and $_ !~ m/^\s*#/ and $_ =~ m/\S/} @config;
diff -urNp qpsmtpd.orig/plugins/check_badmailfrom qpsmtpd/plugins/check_badmailfrom
--- qpsmtpd.orig/plugins/check_badmailfrom      2004-11-27 12:40:54.000000000 -0600
+++ qpsmtpd/plugins/check_badmailfrom   2004-11-28 11:31:05.000000000 -0600
@@ -42,7 +42,7 @@ sub mail_handler {
     $bad =~ s/^\s*(\S+).*/$1/;
     next unless $bad;
     $bad = lc $bad;
-    warn "Bad badmailfrom config: No \@ sign in $bad\n" and next unless $bad =~ m/\@/;
+    $self->log(LOGINFO, "Bad badmailfrom config: No \@ sign in $bad\n") and next unless $bad =~ m/\@/;
     $transaction->notes('badmailfrom', "Mail from $bad not accepted here")
       if ($bad eq $from) || (substr($bad,0,1) eq '@' && $bad eq "\@$host");
   }
diff -urNp qpsmtpd.orig/plugins/require_resolvable_fromhost qpsmtpd/plugins/require_resolvable_fromhost
--- qpsmtpd.orig/plugins/require_resolvable_fromhost    2004-11-27 01:08:45.000000000 -0600
+++ qpsmtpd/plugins/require_resolvable_fromhost 2004-11-28 11:32:41.000000000 -0600
@@ -40,7 +40,7 @@ sub check_dns {
     }
   }
   else {
-    warn "$$ query for $host failed: ", $res->errorstring, "\n"
+    $self->log(LOGINFO, "$$ query for $host failed: ", $res->errorstring)
       unless $res->errorstring eq "NXDOMAIN";
   }
   return 0;
diff -urNp qpsmtpd.orig/plugins/spamassassin qpsmtpd/plugins/spamassassin
--- qpsmtpd.orig/plugins/spamassassin   2004-11-27 01:02:23.000000000 -0600
+++ qpsmtpd/plugins/spamassassin        2004-11-28 11:35:04.000000000 -0600
@@ -138,18 +138,18 @@ sub check_spam {
   # or CHECK or REPORT or SYMBOLS
 
   print SPAMD "X-Envelope-From: ", $transaction->sender->format, CRLF
-    or warn "Could not print to spamd: $!";
+    or $self->log(LOGERROR, "Could not print to spamd: $!");
 
   print SPAMD join CRLF, split /\n/, $transaction->header->as_string
-    or warn "Could not print to spamd: $!";
+    or $self->log(LOGERROR, "Could not print to spamd: $!");
 
   print SPAMD CRLF
-    or warn "Could not print to spamd: $!";
+    or $self->log(LOGERROR, "Could not print to spamd: $!");
 
   while (my $line = $transaction->body_getline) {
     chomp $line;
     print SPAMD $line, CRLF
-      or warn "Could not print to spamd: $!";
+      or $self->log(LOGERROR, "Could not print to spamd: $!");
   }
 
   print SPAMD CRLF;
diff -urNp qpsmtpd.orig/qpsmtpd-forkserver qpsmtpd/qpsmtpd-forkserver
--- qpsmtpd.orig/qpsmtpd-forkserver     2004-08-29 02:57:07.000000000 -0500
+++ qpsmtpd/qpsmtpd-forkserver  2004-11-28 11:16:38.000000000 -0600
@@ -55,7 +55,7 @@ sub REAPER {
   $SIG{CHLD} = \&REAPER;
   while ( defined(my $chld = waitpid(-1, WNOHANG)) ){
     last unless $chld > 0;
-    warn("$$ cleaning up after $chld\n");
+    ::log(LOGINFO, "$$ cleaning up after $chld\n");
     delete $childstatus{$chld};
   }
 }
@@ -188,7 +188,10 @@ while (1) {
 sub log {
   my ($level,$message) = @_;
   # $level not used yet.  this is reimplemented from elsewhere anyway
+  # pae: syslog is set up in Qpsmtpd, so throw it out both ways
+  # pae: this is most certainly wrong.
   warn("$$ $message\n");
+  syslog(4, "$$ $message");
 }
 
 __END__
