This makes hook_reset_transaction a bit more useful by running it on
disconnections.  It also ensures that hook_disconnect runs when the
client disconnects without QUITing.
---
 lib/Qpsmtpd/SMTP.pm              |    1 +
 lib/Qpsmtpd/TcpServer.pm         |    4 ++++
 lib/Qpsmtpd/TcpServer/Prefork.pm |    5 +++++
 3 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/lib/Qpsmtpd/SMTP.pm b/lib/Qpsmtpd/SMTP.pm
index a820a12..5a248d1 100644
--- a/lib/Qpsmtpd/SMTP.pm
+++ b/lib/Qpsmtpd/SMTP.pm
@@ -578,6 +578,7 @@ sub quit_respond {
 sub disconnect {
   my $self = shift;
   $self->run_hooks("disconnect");
+  $self->connection->notes(disconnected => 1);
   $self->reset_transaction;
 }
 
diff --git a/lib/Qpsmtpd/TcpServer.pm b/lib/Qpsmtpd/TcpServer.pm
index df9da9a..446870b 100644
--- a/lib/Qpsmtpd/TcpServer.pm
+++ b/lib/Qpsmtpd/TcpServer.pm
@@ -100,6 +100,10 @@ sub read_input {
     alarm $timeout;
   }
   alarm(0);
+  return if $self->connection->notes('disconnected');
+  $self->reset_transaction;
+  $self->run_hooks('disconnect');
+  $self->connection->notes(disconnected => 1);
 }
 
 sub respond {
diff --git a/lib/Qpsmtpd/TcpServer/Prefork.pm b/lib/Qpsmtpd/TcpServer/Prefork.pm
index 28f60dc..2728cea 100644
--- a/lib/Qpsmtpd/TcpServer/Prefork.pm
+++ b/lib/Qpsmtpd/TcpServer/Prefork.pm
@@ -35,6 +35,11 @@ sub read_input {
         or $self->respond(502, "command unrecognized: '$_'");
       alarm $timeout;
     }
+    unless ($self->connection->notes('disconnected')) {
+      $self->reset_transaction;
+      $self->run_hooks('disconnect');
+      $self->connection->notes(disconnected => 1);
+    }
   };
   if ($@ =~ /^disconnect_tcpserver/) {
        die "disconnect_tcpserver";
-- 
1.5.6.3

Reply via email to