From: Marius Gavrilescu Date: Wed, 29 Jul 2015 11:32:10 +0000 (+0300) Subject: Test pipes when running interactive programs before executing them X-Git-Tag: 5999.000_005~9 X-Git-Url: http://git.ieval.ro/?p=gruntmaster-daemon.git;a=commitdiff_plain;h=e9f461045839794795f6b16e1c31d36e6cf1d38d Test pipes when running interactive programs before executing them This is relevant for VM users, as the pipes used by QEMU do not work at the beginning (all data sent to them is silently discarded). --- diff --git a/gruntmaster-exec b/gruntmaster-exec index fd79d8f..d280765 100755 --- a/gruntmaster-exec +++ b/gruntmaster-exec @@ -39,6 +39,25 @@ GetOptions( "sudo!" => \$sudo, ); +sub test_pipe_read { + my $data = ''; + sysread STDIN, $data, 4096 and syswrite STDOUT, "recvd\n" until $data =~ /done/; + syswrite STDOUT, 'done'; +} + +sub test_pipe_write { + my ($rin, $rout); + vec($rin, fileno STDIN, 1) = 1; + syswrite STDOUT, "data\n" until select $rout = $rin, undef, undef, 0.05; + syswrite STDOUT, 'done'; + my $data = ''; + sysread STDIN, $data, 4096 until $data =~ /done/; +} + +sub test_pipes { + $ARGV[0] =~ /prog/ ? test_pipe_read : test_pipe_write +} + my $killuser = $ENV{GRUNTMASTER_KILL_USER}; my @sudo; @sudo = (shellwords ($ENV{GRUNTMASTER_SUDO}), '--') if $ENV{GRUNTMASTER_SUDO} && $sudo; @@ -88,6 +107,7 @@ if ($ret) { POSIX::close $oldfd or die $!; } } + test_pipes if grep /tty|fifo/, @fds; my $nproc = $killuser ? 15 : 1; my $debug = $ENV{TEST_VERBOSE}; %ENV = (ONLINE_JUDGE => 1, PATH => $ENV{PATH}, HOME => $ENV{HOME});