- my $basename = fileparse $name, qr/\.[^.]*/;
- my $ret = fork // die 'Cannot fork';
- if ($ret) {
- my $tle;
- local $SIG{ALRM} = sub { kill KILL => $ret; $tle = 1};
- alarm $args{timeout} if exists $args{timeout};
- waitpid $ret, 0;
- alarm 0;
- my $sig = $? & 127;
- my $signame = sig_name $sig;
- die [TLE, "Time Limit Exceeded"] if $tle;
- die [OLE, 'Output Limit Exceeded'] if $sig && $signame eq 'XFSZ';
- die [DIED, "Crash (SIG$signame)"] if $sig && $signame ne 'PIPE';
- die [NZX, "Non-zero exit status: " . ($? >> 8)] if $? >> 8;
- } else {
- my @fds = exists $args{fds} ? @{$args{fds}} : ();
- $^F = 50;
- POSIX::close $_ for 0 .. $^F;
- my $it = natatime 2, @fds;
- while (my ($fd, $file) = $it->()) {
- open my $fh, $file or die $!;
- my $oldfd = fileno $fh;
- if ($oldfd != $fd) {
- POSIX::dup2 $oldfd, $fd or die $!;
- POSIX::close $oldfd or die $!;
- }
- }
- exec 'gruntmaster-exec', $args{mlimit} // 0, $args{olimit} // 0, command_and_args($format, $basename), exists $args{args} ? @{$args{args}} : ();
- exit 42
+ my $basename = fileparse $name, qr/[.][^.]*/s;
+ my @args = ('--sudo');
+ push @args, '--keep-stderr' if $ENV{TEST_VERBOSE};
+ push @args, '--timeout', $args{timeout} if $args{timeout};
+ push @args, '--mlimit', $args{mlimit} if $args{mlimit};
+ push @args, '--olimit', $args{olimit} if $args{olimit};
+ my @fds = exists $args{fds} ? @{$args{fds}} : ();
+ my $it = natatime 2, @fds;
+ while (my ($fd, $file) = $it->()) {
+ push @args, "--fd=$fd $file";