From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1161610AbbBDTw4 (ORCPT ); Wed, 4 Feb 2015 14:52:56 -0500 Received: from cdptpa-outbound-snat.email.rr.com ([107.14.166.226]:15394 "EHLO cdptpa-oedge-vip.email.rr.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755796AbbBDTvZ (ORCPT ); Wed, 4 Feb 2015 14:51:25 -0500 Message-Id: <20150204195123.971086496@goodmis.org> User-Agent: quilt/0.61-1 Date: Wed, 04 Feb 2015 14:50:53 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Josh Poimboeuf Subject: [for-next][PATCH 6/9] ktest: Enable user input to the console References: <20150204195047.818126814@goodmis.org> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=0006-ktest-Enable-user-input-to-the-console.patch X-RR-Connecting-IP: 107.14.168.118:25 X-Cloudmark-Score: 0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Josh Poimboeuf 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 Signed-off-by: Steven Rostedt --- tools/testing/ktest/ktest.pl | 51 +++++++++++++++++++++++++++++++------------- 1 file 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 { -- 2.1.4