File Coverage

blib/lib/IO/Tty.pm
Criterion Covered Total %
statement 53 65 81.5
branch 10 22 45.4
condition 1 3 33.3
subroutine 13 14 92.8
pod 0 5 0.0
total 77 109 70.6


line stmt bran cond sub pod time code
1             # Documentation at the __END__
2             # -*-cperl-*-
3              
4             package IO::Tty;
5              
6 11     11   77234 use 5.008008;
  11         47  
7              
8 11     11   51 use strict;
  11         14  
  11         260  
9 11     11   36 use warnings;
  11         40  
  11         645  
10 11     11   6127 use IO::Handle;
  11         70309  
  11         762  
11 11     11   4880 use IO::File;
  11         19589  
  11         1241  
12 11     11   7119 use IO::Tty::Constant;
  11         55  
  11         587  
13 11     11   53 use Carp;
  11         15  
  11         1384  
14              
15             require POSIX;
16              
17             our @ISA = qw(IO::Handle);
18             our $VERSION = '1.27';
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   81 use XSLoader;
  11         18  
  11         7149  
25             XSLoader::load(__PACKAGE__, $VERSION);
26              
27             sub import {
28 14     14   12836 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 1259 my ( $self, $fh ) = @_;
44 3 100       54 croak "Given filehandle is not a tty in clone_winsize_from, called"
45             if not POSIX::isatty($fh);
46 2 50       36 return 1 if not POSIX::isatty($self); # ignored for master ptys
47 2         10 my $winsize = " " x 1024; # preallocate memory for older perl versions
48 2         4 $winsize = ''; # But leave the SV as empty
49 2 50 33     22 ioctl( $fh, &IO::Tty::Constant::TIOCGWINSZ, $winsize )
50             and ioctl( $self, &IO::Tty::Constant::TIOCSWINSZ, $winsize )
51             and return 1;
52 0 0       0 warn "clone_winsize_from: error: $!" if $^W;
53 0         0 return undef;
54             }
55              
56             # ioctl() doesn't tell us how long the structure is, so we'll have to trim it
57             # after TIOCGWINSZ
58             my $SIZEOF_WINSIZE = length IO::Tty::pack_winsize( 0, 0, 0, 0 );
59              
60             sub get_winsize {
61 5     5 0 250 my $self = shift;
62 5         8 my $winsize = " " x 1024; # preallocate memory
63 5 50       38 ioctl( $self, IO::Tty::Constant::TIOCGWINSZ(), $winsize )
64             or croak "Cannot TIOCGWINSZ - $!";
65 5         13 substr( $winsize, $SIZEOF_WINSIZE ) = "";
66 5         27 return IO::Tty::unpack_winsize($winsize);
67             }
68              
69             sub set_winsize {
70 3     3 0 536 my $self = shift;
71 3         12 my $winsize = IO::Tty::pack_winsize(@_);
72 3 50       33 ioctl( $self, IO::Tty::Constant::TIOCSWINSZ(), $winsize )
73             or croak "Cannot TIOCSWINSZ - $!";
74             }
75              
76             sub set_raw($) {
77 4     4 0 6278 require POSIX;
78 4         22 my $self = shift;
79 4 50       106 return 1 if not POSIX::isatty($self);
80 4         52 my $ttyno = fileno($self);
81 4         101 my $termios = POSIX::Termios->new;
82 4 50       44 unless ($termios) {
83 0         0 warn "set_raw: new POSIX::Termios failed: $!";
84 0         0 return undef;
85             }
86 4 50       66 unless ( $termios->getattr($ttyno) ) {
87 0         0 warn "set_raw: getattr($ttyno) failed: $!";
88 0         0 return undef;
89             }
90 4         18 $termios->setiflag(0);
91 4         23 $termios->setoflag(0);
92 4         24 $termios->setlflag(0);
93 4         71 $termios->setcflag(
94             ( $termios->getcflag() & ~( &POSIX::CSIZE | &POSIX::PARENB ) )
95             | &POSIX::CS8
96             );
97 4         32 $termios->setcc( &POSIX::VMIN, 1 );
98 4         24 $termios->setcc( &POSIX::VTIME, 0 );
99 4 50       66 unless ( $termios->setattr( $ttyno, &POSIX::TCSANOW ) ) {
100 0         0 warn "set_raw: setattr($ttyno) failed: $!";
101 0         0 return undef;
102             }
103 4         44 return 1;
104             }
105              
106             1;
107              
108             __END__