Add --detach commandline option to forkserver; if supplied, daemonize just

prior to entering the main accept loop.

Split handling of --pid-file so that preexisting pid files are dealt with and
the file is opened before priveleges are dropped, but the writing out of the
new file happens after dropping privs and (if applicable) forking the
daemonized process, so the correct PID is recorded.


git-svn-id: https://svn.perl.org/qpsmtpd/branches/0.31@524 958fd67b-6ff1-0310-b445-bb7760255be9
This commit is contained in:
Devin Carraway 2005-07-29 06:42:00 +00:00
parent a3ff03fec9
commit a2064bc22e

View File

@ -24,6 +24,7 @@ my @LOCALADDR; # ip address(es) to bind to
my $USER = 'smtpd'; # user to suid to my $USER = 'smtpd'; # user to suid to
my $MAXCONNIP = 5; # max simultaneous connections from one IP my $MAXCONNIP = 5; # max simultaneous connections from one IP
my $PID_FILE = ''; my $PID_FILE = '';
my $DETACH; # daemonize on startup
sub usage { sub usage {
print <<"EOT"; print <<"EOT";
@ -36,6 +37,7 @@ usage: qpsmtpd-forkserver [ options ]
-u, --user U : run as a particular user (default 'smtpd') -u, --user U : run as a particular user (default 'smtpd')
-m, --max-from-ip M : limit connections from a single IP; default 5 -m, --max-from-ip M : limit connections from a single IP; default 5
--pid-file P : print main servers PID to file P --pid-file P : print main servers PID to file P
-d, --detach : detach from controlling terminal (daemonize)
EOT EOT
exit 0; exit 0;
} }
@ -47,6 +49,7 @@ GetOptions('h|help' => \&usage,
'p|port=i' => \$PORT, 'p|port=i' => \$PORT,
'u|user=s' => \$USER, 'u|user=s' => \$USER,
'pid-file=s' => \$PID_FILE, 'pid-file=s' => \$PID_FILE,
'd|detach' => \$DETACH,
) || &usage; ) || &usage;
# detaint the commandline # detaint the commandline
@ -119,8 +122,6 @@ if ($PID_FILE) {
open PID, ">$PID_FILE" open PID, ">$PID_FILE"
or die "open pid_file: $!\n"; or die "open pid_file: $!\n";
} }
print PID $$,"\n";
close PID;
} }
# Load plugins here # Load plugins here
@ -151,6 +152,20 @@ $> = $quid;
', group '. ', group '.
(getgrgid($)) || $))); (getgrgid($)) || $)));
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;
}
while (1) { while (1) {
REAPER(); REAPER();
my $running = scalar keys %childstatus; my $running = scalar keys %childstatus;