chiark / gitweb /
prefork-interp: New protocol: change env var
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Aug 2022 16:37:28 +0000 (17:37 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 20:21:10 +0000 (21:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
cprogs/prefork-interp.c
perl/Prefork.pm

index 11f53d0d1c9eb23c97b7bfea502e90189dac2c91..338e60ef58b84b6924a73a2c18698335f4ade920 100644 (file)
@@ -336,7 +336,7 @@ void become_setup(int sfd, int fake_pair[2]) {
   if (dup2(null_0, 0)) diee("dup2 /dev/null onto stdin");
   if (dup2(2, 1) != 1) die("dup2 stderr onto stdout");
 
-  putenv(m_asprintf("PREFORK_INTERP=%d,%d,%s",
+  putenv(m_asprintf("PREFORK_INTERP=v1 %d,%d %s",
                    sfd, call_fd, socket_path));
 
   execvp(executor_argv[0], (char**)executor_argv);
index 9137ac83159dcd910cd1a8ed63f721ace7e89043..d79eb5bf522514ccd2ceaf6ead5c51efdc74181d 100644 (file)
@@ -119,20 +119,24 @@ sub initialisation_complete {
   my %opts = @_;
 
   # if env var not set, we're not running under prefork-interp
-  my @env_params = split /,/, ($ENV{$env_name} // return), 5;
-  croak "$env_name has too few entries" unless @env_params == 5;
+  my @env_data = split / /, ($ENV{$env_name} // return), 3;
+  croak "$env_name has the wrong number of words" unless @env_data == 3;
+  my (@vsns) = split /,/, $env_data[0];
+  croak "$env_name doesn't offer protocol v1" unless grep { $_ eq 'v1' } @vsns;
+  my @env_fds = split /,/, $env_data[1];
+  croak "$env_name has too few fds" unless @env_fds >= 3;;
+  $#env_fds = 1;
+  $socket_path = $env_data[2];
 
   $num_servers = $opts{max_servers} // 4;
 
   #---- setup (pm) [1] ----
 
-  $socket_path = pop @env_params;
-  foreach (@env_params) {
+  foreach (@env_fds) {
     $_ eq ($_+0) or croak "$env_name contains $_, not a number";
   }
-  open LISTEN, "+>&=$env_params[0]" or croak "listen fd: $!";
-  open CALL,   "+>&=$env_params[1]" or croak "listen fd: $!";
-  @call_fds = ($env_params[2], $env_params[3], 2);
+  open LISTEN, "+>&=$env_fds[0]" or croak "listen fd: $!";
+  open CALL,   "+>&=$env_fds[1]" or croak "listen fd: $!";
 
   if (!$opts{no_openlog}) {
     openlog("prefork-interp $0", 'ndelay,nofatal,pid',