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:
parent
a3ff03fec9
commit
a2064bc22e
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user