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   82879 use 5.008008;
  11         31  
7              
8 11     11   37 use strict;
  11         17  
  11         218  
9 11     11   58 use warnings;
  11         18  
  11         399  
10 11     11   5092 use IO::Handle;
  11         57428  
  11         547  
11 11     11   4028 use IO::File;
  11         16632  
  11         939  
12 11     11   6047 use IO::Tty::Constant;
  11         53  
  11         592  
13 11     11   47 use Carp;
  11         18  
  11         1309  
14              
15             require POSIX;
16              
17             our @ISA = qw(IO::Handle);
18             our $VERSION = '1.25';
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   50 use XSLoader;
  11         14  
  11         5755  
25             XSLoader::load(__PACKAGE__, $VERSION);
26              
27             sub import {
28 14     14   10709 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 1557 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       55 return 1 if not POSIX::isatty($self); # ignored for master ptys
47 2         17 my $winsize = " " x 1024; # preallocate memory for older perl versions
48 2         4 $winsize = ''; # But leave the SV as empty
49 2 50 33     27 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 274 my $self = shift;
62 5         8 my $winsize = " " x 1024; # preallocate memory
63 5 50       39 ioctl( $self, IO::Tty::Constant::TIOCGWINSZ(), $winsize )
64             or croak "Cannot TIOCGWINSZ - $!";
65 5         11 substr( $winsize, $SIZEOF_WINSIZE ) = "";
66 5         30 return IO::Tty::unpack_winsize($winsize);
67             }
68              
69             sub set_winsize {
70 3     3 0 680 my $self = shift;
71 3         15 my $winsize = IO::Tty::pack_winsize(@_);
72 3 50       49 ioctl( $self, IO::Tty::Constant::TIOCSWINSZ(), $winsize )
73             or croak "Cannot TIOCSWINSZ - $!";
74             }
75              
76             sub set_raw($) {
77 4     4 0 5980 require POSIX;
78 4         15 my $self = shift;
79 4 50       107 return 1 if not POSIX::isatty($self);
80 4         64 my $ttyno = fileno($self);
81 4         133 my $termios = POSIX::Termios->new;
82 4 50       47 unless ($termios) {
83 0         0 warn "set_raw: new POSIX::Termios failed: $!";
84 0         0 return undef;
85             }
86 4 50       62 unless ( $termios->getattr($ttyno) ) {
87 0         0 warn "set_raw: getattr($ttyno) failed: $!";
88 0         0 return undef;
89             }
90 4         21 $termios->setiflag(0);
91 4         13 $termios->setoflag(0);
92 4         14 $termios->setlflag(0);
93 4         35 $termios->setcflag(
94             ( $termios->getcflag() & ~( &POSIX::CSIZE | &POSIX::PARENB ) )
95             | &POSIX::CS8
96             );
97 4         14 $termios->setcc( &POSIX::VMIN, 1 );
98 4         15 $termios->setcc( &POSIX::VTIME, 0 );
99 4 50       39 unless ( $termios->setattr( $ttyno, &POSIX::TCSANOW ) ) {
100 0         0 warn "set_raw: setattr($ttyno) failed: $!";
101 0         0 return undef;
102             }
103 4         59 return 1;
104             }
105              
106             1;
107              
108             __END__