diff options
author | Josh Poimboeuf <jpoimboe@redhat.com> | 2015-01-28 13:38:39 -0600 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2015-02-02 10:43:24 -0500 |
commit | 9d2f7f051b8917305ea20ed79ff08254ea73f26d (patch) | |
tree | 4241225b589643b8d7dc70d412d137712e357770 | |
parent | 9f2cdcbbb90e70e5e8fe6cd30151b8ac1c8745ac (diff) |
ktest: Enable user input to the console
Allow the user to send input to the console by putting the terminal in
cbreak mode (to allow reading stdin one character at a time) and copying
all stdin data to the console's pty.
Link: http://lkml.kernel.org/r/bb1bbe7d202c95a3ce7894cfffdd8c725875978e.1422473610.git.jpoimboe@redhat.com
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rwxr-xr-x | tools/testing/ktest/ktest.pl | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index 2d3191693567..ef1d99f3859c 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl @@ -178,7 +178,7 @@ my $checkout; my $localversion; my $iteration = 0; my $successes = 0; -my $stty; +my $stty_orig; my $bisect_good; my $bisect_bad; @@ -1458,7 +1458,11 @@ sub open_console { my $pid; # save terminal settings - $stty = `stty -g`; + $stty_orig = `stty -g`; + + # place terminal in cbreak mode so that stdin can be read one character at + # a time without having to wait for a newline + system("stty -icanon -echo -icrnl"); create_pty($ptm, $pts); @@ -1487,7 +1491,7 @@ sub close_console { close($fp); # restore terminal settings - system("stty $stty"); + system("stty $stty_orig"); } sub start_monitor { @@ -1827,7 +1831,9 @@ sub wait_for_input { my ($fp, $time) = @_; my $rin; - my $ready; + my $rout; + my $nr; + my $buf; my $line; my $ch; @@ -1837,21 +1843,36 @@ sub wait_for_input $rin = ''; vec($rin, fileno($fp), 1) = 1; - ($ready, $time) = select($rin, undef, undef, $time); + vec($rin, fileno(\*STDIN), 1) = 1; - $line = ""; + while (1) { + $nr = select($rout=$rin, undef, undef, $time); - # try to read one char at a time - while (sysread $fp, $ch, 1) { - $line .= $ch; - last if ($ch eq "\n"); - } + if ($nr <= 0) { + return undef; + } - if (!length($line)) { - return undef; - } + # copy data from stdin to the console + if (vec($rout, fileno(\*STDIN), 1) == 1) { + sysread(\*STDIN, $buf, 1000); + syswrite($fp, $buf, 1000); + next; + } - return $line; + $line = ""; + + # try to read one char at a time + while (sysread $fp, $ch, 1) { + $line .= $ch; + last if ($ch eq "\n"); + } + + if (!length($line)) { + return undef; + } + + return $line; + } } sub reboot_to { |