From: Marius Gavrilescu <marius@ieval.ro>
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/?a=commitdiff_plain;h=e9f461045839794795f6b16e1c31d36e6cf1d38d;p=gruntmaster-daemon.git

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});