File Coverage

blib/lib/IO/Tty.pm
Criterion Covered Total %
statement 40 60 66.6
branch 5 22 22.7
condition 0 3 0.0
subroutine 10 13 76.9
pod 0 5 0.0
total 55 103 53.4


line stmt bran cond sub pod time code
1             # Documentation at the __END__
2             # -*-cperl-*-
3              
4             package IO::Tty;
5              
6 4     4   27 use strict;
  4         6  
  4         119  
7 4     4   20 use warnings;
  4         7  
  4         103  
8 4     4   2352 use IO::Handle;
  4         27252  
  4         175  
9 4     4   2106 use IO::File;
  4         7970  
  4         418  
10 4     4   1904 use IO::Tty::Constant;
  4         22  
  4         181  
11 4     4   27 use Carp;
  4         5  
  4         253  
12              
13             require POSIX;
14             require DynaLoader;
15              
16 4     4   20 use vars qw(@ISA $VERSION $XS_VERSION $CONFIG $DEBUG);
  4         8  
  4         3200  
17              
18             $VERSION = '1.16';
19             $XS_VERSION = "1.16";
20             @ISA = qw(IO::Handle);
21              
22             eval { local $^W = 0; undef local $SIG{__DIE__}; require IO::Stty };
23             push @ISA, "IO::Stty" if ( not $@ ); # if IO::Stty is installed
24              
25             BOOT_XS: {
26             # If I inherit DynaLoader then I inherit AutoLoader and I DON'T WANT TO
27             require DynaLoader;
28              
29             # DynaLoader calls dl_load_flags as a static method.
30             *dl_load_flags = DynaLoader->can('dl_load_flags');
31              
32             do {
33             defined(&bootstrap)
34             ? \&bootstrap
35             : \&DynaLoader::bootstrap;
36             }
37             ->(__PACKAGE__);
38             }
39              
40             sub import {
41 7     7   11030 IO::Tty::Constant->export_to_level( 1, @_ );
42             }
43              
44             sub open {
45 0     0 0 0 my ( $tty, $dev, $mode ) = @_;
46              
47 0 0       0 IO::File::open( $tty, $dev, $mode )
48             or return undef;
49              
50 0         0 $tty->autoflush;
51              
52 0         0 1;
53             }
54              
55             sub clone_winsize_from {
56 0     0 0 0 my ( $self, $fh ) = @_;
57 0 0       0 croak "Given filehandle is not a tty in clone_winsize_from, called"
58             if not POSIX::isatty($fh);
59 0 0       0 return 1 if not POSIX::isatty($self); # ignored for master ptys
60 0         0 my $winsize = " " x 1024; # preallocate memory
61 0 0 0     0 ioctl( $fh, &IO::Tty::Constant::TIOCGWINSZ, $winsize )
62             and ioctl( $self, &IO::Tty::Constant::TIOCSWINSZ, $winsize )
63             and return 1;
64 0 0       0 warn "clone_winsize_from: error: $!" if $^W;
65 0         0 return undef;
66             }
67              
68             # ioctl() doesn't tell us how long the structure is, so we'll have to trim it
69             # after TIOCGWINSZ
70             my $SIZEOF_WINSIZE = length IO::Tty::pack_winsize( 0, 0, 0, 0 );
71              
72             sub get_winsize {
73 1     1 0 17 my $self = shift;
74 1 50       21 ioctl( $self, IO::Tty::Constant::TIOCGWINSZ(), my $winsize = q<> )
75             or croak "Cannot TIOCGWINSZ - $!";
76 1         5 substr( $winsize, $SIZEOF_WINSIZE ) = "";
77 1         72 return IO::Tty::unpack_winsize($winsize);
78             }
79              
80             sub set_winsize {
81 0     0 0 0 my $self = shift;
82 0         0 my $winsize = IO::Tty::pack_winsize(@_);
83 0 0       0 ioctl( $self, IO::Tty::Constant::TIOCSWINSZ(), $winsize )
84             or croak "Cannot TIOCSWINSZ - $!";
85             }
86              
87             sub set_raw($) {
88 3     3 0 3709 require POSIX;
89 3         19 my $self = shift;
90 3 50       94 return 1 if not POSIX::isatty($self);
91 3         54 my $ttyno = fileno($self);
92 3         70 my $termios = new POSIX::Termios;
93 3 50       35 unless ($termios) {
94 0         0 warn "set_raw: new POSIX::Termios failed: $!";
95 0         0 return undef;
96             }
97 3 50       48 unless ( $termios->getattr($ttyno) ) {
98 0         0 warn "set_raw: getattr($ttyno) failed: $!";
99 0         0 return undef;
100             }
101 3         28 $termios->setiflag(0);
102 3         11 $termios->setoflag(0);
103 3         8 $termios->setlflag(0);
104 3         36 $termios->setcc( &POSIX::VMIN, 1 );
105 3         15 $termios->setcc( &POSIX::VTIME, 0 );
106 3 50       58 unless ( $termios->setattr( $ttyno, &POSIX::TCSANOW ) ) {
107 0         0 warn "set_raw: setattr($ttyno) failed: $!";
108 0         0 return undef;
109             }
110 3         50 return 1;
111             }
112              
113             1;
114              
115             __END__