Author: radu
Date: Thu Sep  4 04:38:54 2008
New Revision: 938

Modified:
   trunk/Changes
   trunk/qpsmtpd-async
   trunk/qpsmtpd-prefork

Log:
Detach and daemonize only after reading the configuration and loading
the plugins, to give the init scripts a chance to detect failed startups
due to broken configuration or plugins.


Modified: trunk/Changes
==============================================================================
--- trunk/Changes       (original)
+++ trunk/Changes       Thu Sep  4 04:38:54 2008
@@ -1,3 +1,7 @@
+  async, prefork: detach and daemonize only after reading the configuration
+  and loading the plugins, to give the init scripts a chance to detect
+  failed startups due to broken configuration or plugins (Diego d'Ambra)
+
   plugins/tls: close the file descriptor for the SSL socket
 
   Set the Return-Path header when queuing into maildir mailboxes.

Modified: trunk/qpsmtpd-async
==============================================================================
--- trunk/qpsmtpd-async (original)
+++ trunk/qpsmtpd-async Thu Sep  4 04:38:54 2008
@@ -248,21 +248,6 @@
     IO::Handle::blocking($CONFIG_SERVER, 0);
     binmode($CONFIG_SERVER, ':raw');
 
-    if ($DETACH) {
-       open STDIN, '/dev/null' or die "/dev/null: $!";
-       open STDOUT, '>/dev/null' or die "/dev/null: $!";
-       open STDERR, '>&STDOUT' or die "open(stderr): $!";
-       defined (my $pid = fork) or die "fork: $!";
-       exit 0 if $pid;
-       POSIX::setsid or die "setsid: $!";
-    }
-
-    if ($PID_FILE) {
-       open PID, ">$PID_FILE" || die "$PID_FILE: $!";
-           print PID $$,"\n";
-        close PID;
-    }
- 
     # Drop priviledges
     my (undef, undef, $quid, $qgid) = getpwnam $USER or
           die "unable to determine uid/gid for $USER\n";
@@ -285,6 +270,21 @@
     my $plugin_loader = Qpsmtpd::SMTP->new();
     $plugin_loader->load_plugins;
     
+    if ($DETACH) {
+       open STDIN, '/dev/null' or die "/dev/null: $!";
+       open STDOUT, '>/dev/null' or die "/dev/null: $!";
+       open STDERR, '>&STDOUT' or die "open(stderr): $!";
+       defined (my $pid = fork) or die "fork: $!";
+       exit 0 if $pid;
+       POSIX::setsid or die "setsid: $!";
+    }
+
+    if ($PID_FILE) {
+       open PID, ">$PID_FILE" || die "$PID_FILE: $!";
+           print PID $$,"\n";
+        close PID;
+    }
+ 
     $plugin_loader->log(LOGINFO, 'Running as user '.
         (getpwuid($>) || $>) .
         ', group '.

Modified: trunk/qpsmtpd-prefork
==============================================================================
--- trunk/qpsmtpd-prefork       (original)
+++ trunk/qpsmtpd-prefork       Thu Sep  4 04:38:54 2008
@@ -150,20 +150,6 @@
     }
 }
 
-if ($detach) {
-    open STDIN, '/dev/null' or die "/dev/null: $!";
-    open STDOUT, '>/dev/null' or die "/dev/null: $!";
-    open STDERR, '>&STDOUT' or die "open(stderr): $!";
-    defined (my $pid = fork) or die "fork: $!";
-    exit 0 if $pid;
-    POSIX::setsid or die "setsid: $!";
-}
-
-if ($pid_file) {
-    print PID $$,"\n";
-    close PID;
-}
-
 run();
 
 #start daemon
@@ -262,6 +248,20 @@
     # after each connection
     $qpsmtpd = $qpsmtpd_base = qpsmtpd_instance();
 
+    if ($detach) {
+        open STDIN, '/dev/null' or die "/dev/null: $!";
+        open STDOUT, '>/dev/null' or die "/dev/null: $!";
+        open STDERR, '>&STDOUT' or die "open(stderr): $!";
+        defined (my $pid = fork) or die "fork: $!";
+        exit 0 if $pid;
+        POSIX::setsid or die "setsid: $!";
+    }
+
+    if ($pid_file) {
+        print PID $$,"\n";
+        close PID;
+    }
+
     # child reaper
     $SIG{CHLD} = \&reaper;
     spawn_children();

Reply via email to