ktest: Give console process a dedicated tty

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>
This commit is contained in:
Josh Poimboeuf 2015-01-28 13:38:38 -06:00 committed by Steven Rostedt
parent 64d982838e
commit 9f2cdcbbb9
1 changed files with 57 additions and 9 deletions

View File

@ -1410,23 +1410,71 @@ sub dodie {
die @_, "\n"; die @_, "\n";
} }
sub open_console { sub create_pty {
my ($fp) = @_; my ($ptm, $pts) = @_;
my $tmp;
my $TIOCSPTLCK = 0x40045431;
my $TIOCGPTN = 0x80045430;
my $flags; 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);
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 # save terminal settings
$stty = `stty -g`; $stty = `stty -g`;
my $pid = open($fp, "$console|") or create_pty($ptm, $pts);
dodie "Can't open console $console";
$flags = fcntl($fp, F_GETFL, 0) or $pid = fork;
dodie "Can't get flags for the socket: $!";
$flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or if (!$pid) {
dodie "Can't set flags for the socket: $!"; # child
exec_console($ptm, $pts)
}
# parent
close($pts);
return $pid; return $pid;
open(PTSFD, "Stop perl from warning about single use of PTSFD");
} }
sub close_console { sub close_console {