- exec qw(env -i), @$env, @$cmd;
- die "exec env -i ... $cmd->[0] failed: $!\n";
+ while (@$rlim) {
+ my ($r, $soft, $hard) = splice(@$rlim, 0, 3);
+ BSD::Resource::setrlimit($r, $soft, $hard) or
+ die "setrlimit($r=[$soft,$hard]: $!)";
+ }
+ $old->delset(POSIX::SIGCHLD) or die "delset SIGCHLD: $!";
+ sigprocmask(SIG_SETMASK, $old) or die "SETMASK: ~SIGCHLD: $!";
+ $cmd->[0] = $f;
+ if ($ENV{MOD_PERL}) {
+ @$cmd = (which('env'), '-i', @$env, @$cmd);
+ } else {
+ %ENV = map { split(/=/, $_, 2) } @$env;
+ }
+ undef $r;
+ exec { $f } @$cmd;
+ die "exec @$cmd failed: $!";
+ }
+ close $w;
+ sigprocmask(SIG_SETMASK, $old) or die "can't unblock signals: $!";
+ if (my $cerrnum = do { local $/, <$r> }) {
+ $pid = -1;
+ $! = $cerrnum;
+ } else {
+ $! = $syserr;