ktest: Make sure wait_for_input does honor the timeout
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) <rostedt@goodmis.org>
This commit is contained in:
parent
99c014a879
commit
f7c6401ff8
1 changed files with 11 additions and 7 deletions
|
@ -1880,6 +1880,7 @@ sub get_grub_index {
|
||||||
sub wait_for_input
|
sub wait_for_input
|
||||||
{
|
{
|
||||||
my ($fp, $time) = @_;
|
my ($fp, $time) = @_;
|
||||||
|
my $start_time;
|
||||||
my $rin;
|
my $rin;
|
||||||
my $rout;
|
my $rout;
|
||||||
my $nr;
|
my $nr;
|
||||||
|
@ -1895,12 +1896,12 @@ sub wait_for_input
|
||||||
vec($rin, fileno($fp), 1) = 1;
|
vec($rin, fileno($fp), 1) = 1;
|
||||||
vec($rin, fileno(\*STDIN), 1) = 1;
|
vec($rin, fileno(\*STDIN), 1) = 1;
|
||||||
|
|
||||||
|
$start_time = time;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
$nr = select($rout=$rin, undef, undef, $time);
|
$nr = select($rout=$rin, undef, undef, $time);
|
||||||
|
|
||||||
if ($nr <= 0) {
|
last if ($nr <= 0);
|
||||||
return undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
# copy data from stdin to the console
|
# copy data from stdin to the console
|
||||||
if (vec($rout, fileno(\*STDIN), 1) == 1) {
|
if (vec($rout, fileno(\*STDIN), 1) == 1) {
|
||||||
|
@ -1908,7 +1909,11 @@ sub wait_for_input
|
||||||
syswrite($fp, $buf, $nr) if ($nr > 0);
|
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 = "";
|
$line = "";
|
||||||
|
|
||||||
|
@ -1918,12 +1923,11 @@ sub wait_for_input
|
||||||
last if ($ch eq "\n");
|
last if ($ch eq "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!length($line)) {
|
last if (!length($line));
|
||||||
return undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $line;
|
return $line;
|
||||||
}
|
}
|
||||||
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub reboot_to {
|
sub reboot_to {
|
||||||
|
|
Loading…
Reference in a new issue