Skip to content

Commit

Permalink
ktest: Enable user input to the console
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Steven Rostedt <[email protected]>
  • Loading branch information
jpoimboe authored and rostedt committed Feb 2, 2015
1 parent 9f2cdcb commit 9d2f7f0
Showing 1 changed file with 36 additions and 15 deletions.
51 changes: 36 additions & 15 deletions tools/testing/ktest/ktest.pl
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
my $localversion;
my $iteration = 0;
my $successes = 0;
my $stty;
my $stty_orig;

my $bisect_good;
my $bisect_bad;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -1487,7 +1491,7 @@ sub close_console {
close($fp);

# restore terminal settings
system("stty $stty");
system("stty $stty_orig");
}

sub start_monitor {
Expand Down Expand Up @@ -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;

Expand All @@ -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 {
Expand Down

0 comments on commit 9d2f7f0

Please sign in to comment.