Skip to content

Commit

Permalink
ktest: Make sure wait_for_input does honor the timeout
Browse files Browse the repository at this point in the history
The function wait_for_input takes in a timeout, and even has a default
timeout. But if for some reason the STDIN descriptor keeps sending in data,
the function will never time out. The timout is to wait for the data from
the passed in file descriptor, not for STDIN. Adding a test in the case
where there's no data from the passed in file descriptor that checks to see
if the timeout passed, will ensure that it will timeout properly even if
there's input in STDIN.

Signed-off-by: Steven Rostedt (VMware) <[email protected]>
  • Loading branch information
rostedt committed Mar 8, 2017
1 parent 99c014a commit f7c6401
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions tools/testing/ktest/ktest.pl
Original file line number Diff line number Diff line change
Expand Up @@ -1880,6 +1880,7 @@ sub get_grub_index {
sub wait_for_input
{
my ($fp, $time) = @_;
my $start_time;
my $rin;
my $rout;
my $nr;
Expand All @@ -1895,20 +1896,24 @@ sub wait_for_input
vec($rin, fileno($fp), 1) = 1;
vec($rin, fileno(\*STDIN), 1) = 1;

$start_time = time;

while (1) {
$nr = select($rout=$rin, undef, undef, $time);

if ($nr <= 0) {
return undef;
}
last if ($nr <= 0);

# copy data from stdin to the console
if (vec($rout, fileno(\*STDIN), 1) == 1) {
$nr = sysread(\*STDIN, $buf, 1000);
syswrite($fp, $buf, $nr) if ($nr > 0);
}

next if (vec($rout, fileno($fp), 1) != 1);
# The timeout is based on time waiting for the fp data
if (vec($rout, fileno($fp), 1) != 1) {
last if (defined($time) && (time - $start_time > $time));
next;
}

$line = "";

Expand All @@ -1918,12 +1923,11 @@ sub wait_for_input
last if ($ch eq "\n");
}

if (!length($line)) {
return undef;
}
last if (!length($line));

return $line;
}
return undef;
}

sub reboot_to {
Expand Down

0 comments on commit f7c6401

Please sign in to comment.