Commit f7c6401f authored by Steven Rostedt (VMware)'s avatar Steven Rostedt (VMware)
Browse files

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: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 99c014a8
Loading
Loading
Loading
Loading
+11 −7
Original line number Original line Diff line number Diff line
@@ -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 {