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);
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',