File Coverage

blib/lib/IO/Tty.pm
Criterion Covered Total %
statement 52 64 81.2
branch 10 20 50.0
condition 1 3 33.3
subroutine 13 14 92.8
pod 0 5 0.0
total 76 106 71.7


line stmt bran cond sub pod time code
1             # Documentation at the __END__
2             # -*-cperl-*-
3              
4             package IO::Tty;
5              
6 11     11   76953 use 5.008008;
  11         32  
7              
8 11     11   38 use strict;
  11         52  
  11         211  
9 11     11   31 use warnings;
  11         21  
  11         451  
10 11     11   5208 use IO::Handle;
  11         56304  
  11         476  
11 11     11   4146 use IO::File;
  11         16046  
  11         991  
12 11     11   6064 use IO::Tty::Constant;
  11         55  
  11         509  
13 11     11   49 use Carp;
  11         14  
  11         1110  
14              
15             require POSIX;
16              
17             our @ISA = qw(IO::Handle);
18             our $VERSION = '1.28';
19             our ( $CONFIG, $DEBUG );
20              
21             eval { local $^W = 0; local $SIG{__DIE__}; require IO::Stty };
22             push @ISA, "IO::Stty" if ( not $@ ); # if IO::Stty is installed
23              
24 11     11   44 use XSLoader;
  11         12  
  11         5843  
25             XSLoader::load(__PACKAGE__, $VERSION);
26              
27             sub import {
28 14     14   10458 IO::Tty::Constant->export_to_level( 1, @_ );
29             }
30              
31             sub open {
32 0     0 0 0 my ( $tty, $dev, $mode ) = @_;
33              
34 0 0       0 IO::File::open( $tty, $dev, $mode )
35             or return undef;
36              
37 0         0 $tty->autoflush;
38              
39 0         0 1;
40             }
41              
42             sub clone_winsize_from {
43 3     3 0 1612 my ( $self, $fh ) = @_;
44 3 100       69 croak "Given filehandle is not a tty in clone_winsize_from, called"
45             if not POSIX::isatty($fh);
46 2 50       54 return 1 if not POSIX::isatty($self); # ignored for master ptys
47 2         19 my $winsize = IO::Tty::pack_winsize( 0, 0, 0, 0 );
48 2 50 33     26 ioctl( $fh, &IO::Tty::Constant::TIOCGWINSZ, $winsize )
49             and ioctl( $self, &IO::Tty::Constant::TIOCSWINSZ, $winsize )
50             and return 1;
51 0         0 carp "clone_winsize_from: error: $!";
52 0         0 return undef;
53             }
54              
55             # ioctl() may pad the buffer beyond sizeof(struct winsize),
56             # so trim it before passing to unpack_winsize.
57             my $SIZEOF_WINSIZE = length IO::Tty::pack_winsize( 0, 0, 0, 0 );
58              
59             sub get_winsize {
60 5     5 0 365 my $self = shift;
61 5         18 my $winsize = IO::Tty::pack_winsize( 0, 0, 0, 0 );
62 5 50       38 ioctl( $self, IO::Tty::Constant::TIOCGWINSZ(), $winsize )
63             or croak "Cannot TIOCGWINSZ - $!";
64 5         13 substr( $winsize, $SIZEOF_WINSIZE ) = "";
65 5         24 return IO::Tty::unpack_winsize($winsize);
66             }
67              
68             sub set_winsize {
69 3     3 0 493 my $self = shift;
70 3         10 my $winsize = IO::Tty::pack_winsize(@_);
71 3 50       26 ioctl( $self, IO::Tty::Constant::TIOCSWINSZ(), $winsize )
72             or croak "Cannot TIOCSWINSZ - $!";
73             }
74              
75             sub set_raw($) {
76 4     4 0 5933 require POSIX;
77 4         13 my $self = shift;
78 4 50       76 return 1 if not POSIX::isatty($self);
79 4         59 my $ttyno = fileno($self);
80 4         78 my $termios = POSIX::Termios->new;
81 4 50       42 unless ($termios) {
82 0         0 warn "set_raw: new POSIX::Termios failed: $!";
83 0         0 return undef;
84             }
85 4 50       67 unless ( $termios->getattr($ttyno) ) {
86 0         0 warn "set_raw: getattr($ttyno) failed: $!";
87 0         0 return undef;
88             }
89 4         31 $termios->setiflag(0);
90 4         17 $termios->setoflag(0);
91 4         8 $termios->setlflag(0);
92 4         61 $termios->setcflag(
93             ( $termios->getcflag() & ~( &POSIX::CSIZE | &POSIX::PARENB ) )
94             | &POSIX::CS8
95             );
96 4         22 $termios->setcc( &POSIX::VMIN, 1 );
97 4         14 $termios->setcc( &POSIX::VTIME, 0 );
98 4 50       55 unless ( $termios->setattr( $ttyno, &POSIX::TCSANOW ) ) {
99 0         0 warn "set_raw: setattr($ttyno) failed: $!";
100 0         0 return undef;
101             }
102 4         39 return 1;
103             }
104              
105             1;
106              
107             __END__