Author: radu
Date: Mon Sep 29 03:11:33 2008
New Revision: 948

Modified:
   trunk/qpsmtpd-prefork

Log:
Diego warned me that the construct I used, signal sent to negative PID,
is not portable. Replaced it with his construct, the negative signal.
Also added the short sleep after socket close, as in his patch.


Modified: trunk/qpsmtpd-prefork
==============================================================================
--- trunk/qpsmtpd-prefork       (original)
+++ trunk/qpsmtpd-prefork       Mon Sep 29 03:11:33 2008
@@ -19,6 +19,9 @@
 use Qpsmtpd::Constants;
 use Getopt::Long;
 
+use Config;
+defined $Config{sig_name} || die "No signals?";
+
 my $has_ipv6 = Qpsmtpd::TcpServer::has_ipv6;
 
 if ($has_ipv6) {
@@ -27,6 +30,14 @@
 
 #use Time::HiRes qw(gettimeofday tv_interval);
 
+#get available signals
+my %sig_num;
+my $i = 0;
+foreach my $sig_name ( split( /\s/, $Config{sig_name} ) )
+{
+    $sig_num{$sig_name} = $i++;
+}
+
 # secure shell
 $ENV{'PATH'} = '/bin:/usr/bin';
 delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
@@ -227,11 +238,15 @@
         # prevent another signal and disable reaper
         $SIG{$sig} = $SIG{CHLD} = $SIG{HUP} = 'IGNORE';
 
+        # a notice, before the sleep below
+        info("shutting down");
+
         # close socket
         $d->close();
+        sleep 2;
 
         # send signal to process group
-        kill $sig, -$$;
+        kill -$sig_num{$sig} => $$;
 
         # cleanup
         IPC::Shareable->clean_up;

Reply via email to