From 3e4e8795c192882e1ede36f6749be80a3a7f74d9 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 15 Aug 2022 21:21:30 +0100 Subject: [PATCH] prefork-interp: Perl: new protocol, wip Signed-off-by: Ian Jackson --- perl/Prefork.pm | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/perl/Prefork.pm b/perl/Prefork.pm index bb39265..10c7ec1 100644 --- a/perl/Prefork.pm +++ b/perl/Prefork.pm @@ -36,6 +36,10 @@ sub server_quit ($) { # Returns in the executor process sub become_monitor () { + close LISTEN; + eval { protocol_exchange(); 1; } + or fail_log("protocol exchange failed: $@"); + my $child = fork // fail_log("fork executor: $!"); if (!$child) { #---- executor ---- @@ -43,6 +47,7 @@ sub become_monitor () { 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; } @@ -54,16 +59,8 @@ sub become_monitor () { _exit(0); } -sub forked_monitor () { - close LISTEN; - eval { protocol_exchange(); 1; } - or fail_log("protocol exchange failed: $@"); - return become_monitor(); -} - sub close_call_fds () { foreach (@call_fds) { - next if $_ <= 2; POSIX::close($_); } close CALL; @@ -93,7 +90,8 @@ sub protocol_read_fail ($) { } sub protocol_exchange () { - protocol_write("\n"); + my $greeting = "PFI\n\0\0\0\0"; + protocol_write($greeting); @call_fds = map { my $r; @@ -223,7 +221,7 @@ sub initialisation_complete { $child = fork // fail_log("fork for accepted call failed: $!"); if (!$child) { #---- monitor [1] ---- - forked_monitor(); + become_monitor(); } close(CALL); $errcount = 0; -- 2.30.2