our @call_fds;
our $socket_path;
+our $fail_log = 0;
sub fail_log ($) {
my ($m) = @_;
- syslog(LOG_ERR, "$0: prefork [$$]: error: $m");
+ if ($fail_log) {
+ syslog(LOG_ERR, "$0: prefork [$$]: error: $m");
+ } else {
+ croak "$0: prefork: initialisation error: $m";
+ }
_exit 127;
}
# Returns in the executor process
sub become_monitor () {
- my $child = fork // fail("fork executor: $!");
+ close LISTEN;
+ eval { protocol_exchange(); 1; }
+ or fail_log("protocol exchange failed: $@");
+
+ my $child = fork // fail_log("fork executor: $!");
if (!$child) {
#---- executor ----
open ::STDIN , "<& $call_fds[0]" or fail_log("dup for fd0");
open ::STDOUT, ">& $call_fds[1]" or fail_log("dup for fd1");
open ::STDERR, ">& $call_fds[2]" or fail_log("dup for fd2");
close_call_fds();
+ $! = 0;
return;
}
sub close_call_fds () {
foreach (@call_fds) {
- next if $_ <= 2;
POSIX::close($_);
}
close CALL;
}
sub protocol_exchange () {
- protocol_write("\n");
+ my $greeting = "PFI\n\0\0\0\0";
+ protocol_write($greeting);
@call_fds = map {
my $r;
# --- server(pm) [2] ----
+ $fail_log = 1;
setsid() > 0 or fail_log("setsid: $!");
open STDIN, "<&NULL" or fail_log("dup null onto stdin: $!");
open STDOUT, ">&NULL" or fail_log("dup null onto stdout: $!");
$child = fork // fail_log("fork for accepted call failed: $!");
if (!$child) {
#---- monitor [1] ----
- close LISTEN;
- eval { protocol_exchange(); 1; }
- or fail_log("protocol exchange failed: $@");
- return become_monitor();
+ become_monitor();
}
close(CALL);
$errcount = 0;