Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
- my $flags = fcntl(LISTEN, F_GETFL, 0)
- or fail_log("F_GETFL listen socket: $!");
- $flags |= O_NONBLOCK;
- fcntl(LISTEN, F_SETFL, $flags)
- or fail_log("F_SETFL listen socket: $!");
-
my $errcount = 0;
local $0 = "$0 [server]";
my $errcount = 0;
local $0 = "$0 [server]";
my $full = %children >= $num_servers;
my $got = waitpid -1, ($full ? 0 : WNOHANG);
$got >= 0 or fail_log("failed to wait for monitor(s)");
my $full = %children >= $num_servers;
my $got = waitpid -1, ($full ? 0 : WNOHANG);
$got >= 0 or fail_log("failed to wait for monitor(s)");
- last if $got == 0;
- if ($?) {
- syslog(LOG_WARNING,
+ if ($got) {
+ if ($?) {
+ syslog(LOG_WARNING,
"$0 prefork [$$]: monitor process [$got] failed with wait status $?");
"$0 prefork [$$]: monitor process [$got] failed with wait status $?");
- }
- if (!exists $children{$got}) {
- syslog(LOG_WARNING,
+ }
+ if (!exists $children{$got}) {
+ syslog(LOG_WARNING,
"$0 prefork [$$]: monitor process [$got] wasn't one of ours?!");
"$0 prefork [$$]: monitor process [$got] wasn't one of ours?!");
+ }
+ delete $children{$got};
+ next;
- delete $children{$got};
- next;
}
# select for accepting or housekeeping timeout
}
# select for accepting or housekeeping timeout
my $nfound = select($rbits, '', $ebits, ($opts{idle_timeout} // 1000000));
# Idle timeout?
my $nfound = select($rbits, '', $ebits, ($opts{idle_timeout} // 1000000));
# Idle timeout?
- if (!$nfound) { _exit(0); }
+ last if $nfound == 0;
+ if ($nfound < 0) {
+ next if $! == EINTR;
+ fail_log("select failed: $!");
+ }
# Has the watcher told us to shut down, or died with a message ?
my $msgbuf = '';
# Has the watcher told us to shut down, or died with a message ?
my $msgbuf = '';
chomp $msgbuf;
fail_log("watcher: $msgbuf");
} elsif ($r == 0) {
chomp $msgbuf;
fail_log("watcher: $msgbuf");
} elsif ($r == 0) {
} elsif ($! == EINTR || $! == EAGAIN || $! == EWOULDBLOCK) {
} else {
fail_log("watcher stderr read: $!");
} elsif ($! == EINTR || $! == EAGAIN || $! == EWOULDBLOCK) {
} else {
fail_log("watcher stderr read: $!");
} else {
syslog(LOG_WARNING, "$0 prefork [$$]: accept failed: $!");
if ($errcount > ($opts{max_errors} // 100)) {
} else {
syslog(LOG_WARNING, "$0 prefork [$$]: accept failed: $!");
if ($errcount > ($opts{max_errors} // 100)) {
- syslog(LOG_ERR,
- "$0 prefork [$$]: too many accept failures, quitting");
- _exit(16);
+ fail_log("too many accept failures, quitting");