Skip to content

Commit

Permalink
ktest: Give console process a dedicated tty
Browse files Browse the repository at this point in the history
Create a pseudoterminal (pty pair) to give the console a dedicated tty
so it doesn't mess with ktest's terminal settings.

Link: http://lkml.kernel.org/r/37b0127f9efad09ff4fc994334db998141e4f6ca.1422473610.git.jpoimboe@redhat.com

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Josh Poimboeuf authored and Steven Rostedt committed Feb 2, 2015
1 parent 64d9828 commit 9f2cdcb
Showing 1 changed file with 57 additions and 9 deletions.
66 changes: 57 additions & 9 deletions tools/testing/ktest/ktest.pl
Original file line number Diff line number Diff line change
Expand Up @@ -1410,23 +1410,71 @@ sub dodie {
die @_, "\n";
}

sub open_console {
my ($fp) = @_;
sub create_pty {
my ($ptm, $pts) = @_;
my $tmp;
my $TIOCSPTLCK = 0x40045431;
my $TIOCGPTN = 0x80045430;

sysopen($ptm, "/dev/ptmx", O_RDWR | O_NONBLOCK) or
dodie "Cant open /dev/ptmx";

# unlockpt()
$tmp = pack("i", 0);
ioctl($ptm, $TIOCSPTLCK, $tmp) or
dodie "ioctl TIOCSPTLCK for /dev/ptmx failed";

# ptsname()
ioctl($ptm, $TIOCGPTN, $tmp) or
dodie "ioctl TIOCGPTN for /dev/ptmx failed";
$tmp = unpack("i", $tmp);

sysopen($pts, "/dev/pts/$tmp", O_RDWR | O_NONBLOCK) or
dodie "Can't open /dev/pts/$tmp";
}

sub exec_console {
my ($ptm, $pts) = @_;

close($ptm);

close(\*STDIN);
close(\*STDOUT);
close(\*STDERR);

my $flags;
open(\*STDIN, '<&', $pts);
open(\*STDOUT, '>&', $pts);
open(\*STDERR, '>&', $pts);

close($pts);

exec $console or
dodie "Can't open console $console";
}

sub open_console {
my ($ptm) = @_;
my $pts = \*PTSFD;
my $pid;

# save terminal settings
$stty = `stty -g`;

my $pid = open($fp, "$console|") or
dodie "Can't open console $console";
create_pty($ptm, $pts);

$flags = fcntl($fp, F_GETFL, 0) or
dodie "Can't get flags for the socket: $!";
$flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
dodie "Can't set flags for the socket: $!";
$pid = fork;

if (!$pid) {
# child
exec_console($ptm, $pts)
}

# parent
close($pts);

return $pid;

open(PTSFD, "Stop perl from warning about single use of PTSFD");
}

sub close_console {
Expand Down

0 comments on commit 9f2cdcb

Please sign in to comment.