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   95883 use 5.008008;
  11         30  
7              
8 11     11   36 use strict;
  11         17  
  11         217  
9 11     11   38 use warnings;
  11         27  
  11         441  
10 11     11   6381 use IO::Handle;
  11         59871  
  11         500  
11 11     11   4273 use IO::File;
  11         16882  
  11         1041  
12 11     11   6584 use IO::Tty::Constant;
  11         49  
  11         498  
13 11     11   43 use Carp;
  11         15  
  11         1223  
14              
15             require POSIX;
16              
17             our @ISA = qw(IO::Handle);
18             our $VERSION = '1.29';
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         14  
  11         5537  
25             XSLoader::load(__PACKAGE__, $VERSION);
26              
27             sub import {
28 14     14   12456 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 1314 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       34 return 1 if not POSIX::isatty($self); # ignored for master ptys
47 2         14 my $winsize = IO::Tty::pack_winsize( 0, 0, 0, 0 );
48 2 50 33     21 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 237 my $self = shift;
61 5         15 my $winsize = IO::Tty::pack_winsize( 0, 0, 0, 0 );
62 5 50       27 ioctl( $self, IO::Tty::Constant::TIOCGWINSZ(), $winsize )
63             or croak "Cannot TIOCGWINSZ - $!";
64 5         12 substr( $winsize, $SIZEOF_WINSIZE ) = "";
65 5         22 return IO::Tty::unpack_winsize($winsize);
66             }
67              
68             sub set_winsize {
69 3     3 0 505 my $self = shift;
70 3         13 my $winsize = IO::Tty::pack_winsize(@_);
71 3 50       29 ioctl( $self, IO::Tty::Constant::TIOCSWINSZ(), $winsize )
72             or croak "Cannot TIOCSWINSZ - $!";
73             }
74              
75             sub set_raw($) {
76 4     4 0 5824 require POSIX;
77 4         11 my $self = shift;
78 4 50       100 return 1 if not POSIX::isatty($self);
79 4         73 my $ttyno = fileno($self);
80 4         109 my $termios = POSIX::Termios->new;
81 4 50       37 unless ($termios) {
82 0         0 warn "set_raw: new POSIX::Termios failed: $!";
83 0         0 return undef;
84             }
85 4 50       89 unless ( $termios->getattr($ttyno) ) {
86 0         0 warn "set_raw: getattr($ttyno) failed: $!";
87 0         0 return undef;
88             }
89 4         24 $termios->setiflag(0);
90 4         22 $termios->setoflag(0);
91 4         24 $termios->setlflag(0);
92 4         47 $termios->setcflag(
93             ( $termios->getcflag() & ~( &POSIX::CSIZE | &POSIX::PARENB ) )
94             | &POSIX::CS8
95             );
96 4         24 $termios->setcc( &POSIX::VMIN, 1 );
97 4         27 $termios->setcc( &POSIX::VTIME, 0 );
98 4 50       94 unless ( $termios->setattr( $ttyno, &POSIX::TCSANOW ) ) {
99 0         0 warn "set_raw: setattr($ttyno) failed: $!";
100 0         0 return undef;
101             }
102 4         42 return 1;
103             }
104              
105             1;
106              
107             __END__