From e9f461045839794795f6b16e1c31d36e6cf1d38d Mon Sep 17 00:00:00 2001 From: Marius Gavrilescu Date: Wed, 29 Jul 2015 14:32:10 +0300 Subject: [PATCH] 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). --- gruntmaster-exec | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) 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}); -- 2.30.2