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   76766 use 5.008008;
  11         33  
7              
8 11     11   40 use strict;
  11         16  
  11         253  
9 11     11   40 use warnings;
  11         25  
  11         377  
10 11     11   5055 use IO::Handle;
  11         55040  
  11         608  
11 11     11   4123 use IO::File;
  11         15847  
  11         891  
12 11     11   6154 use IO::Tty::Constant;
  11         46  
  11         517  
13 11     11   47 use Carp;
  11         14  
  11         1140  
14              
15             require POSIX;
16              
17             our @ISA = qw(IO::Handle);
18             our $VERSION = '1.31';
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   48 use XSLoader;
  11         12  
  11         5663  
25             XSLoader::load(__PACKAGE__, $VERSION);
26              
27             sub import {
28 14     14   10179 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 1354 my ( $self, $fh ) = @_;
44 3 100       52 croak "Given filehandle is not a tty in clone_winsize_from, called"
45             if not POSIX::isatty($fh);
46 2 50       35 return 1 if not POSIX::isatty($self); # ignored for master ptys
47 2         12 my $winsize = IO::Tty::pack_winsize( 0, 0, 0, 0 );
48 2 50 33     20 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 261 my $self = shift;
61 5         15 my $winsize = IO::Tty::pack_winsize( 0, 0, 0, 0 );
62 5 50       30 ioctl( $self, IO::Tty::Constant::TIOCGWINSZ(), $winsize )
63             or croak "Cannot TIOCGWINSZ - $!";
64 5         10 substr( $winsize, $SIZEOF_WINSIZE ) = "";
65 5         38 return IO::Tty::unpack_winsize($winsize);
66             }
67              
68             sub set_winsize {
69 3     3 0 513 my $self = shift;
70 3         12 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 5423 require POSIX;
77 4         9 my $self = shift;
78 4 50       76 return 1 if not POSIX::isatty($self);
79 4         55 my $ttyno = fileno($self);
80 4         77 my $termios = POSIX::Termios->new;
81 4 50       44 unless ($termios) {
82 0         0 warn "set_raw: new POSIX::Termios failed: $!";
83 0         0 return undef;
84             }
85 4 50       65 unless ( $termios->getattr($ttyno) ) {
86 0         0 warn "set_raw: getattr($ttyno) failed: $!";
87 0         0 return undef;
88             }
89 4         18 $termios->setiflag(0);
90 4         13 $termios->setoflag(0);
91 4         10 $termios->setlflag(0);
92 4         38 $termios->setcflag(
93             ( $termios->getcflag() & ~( &POSIX::CSIZE | &POSIX::PARENB ) )
94             | &POSIX::CS8
95             );
96 4         13 $termios->setcc( &POSIX::VMIN, 1 );
97 4         13 $termios->setcc( &POSIX::VTIME, 0 );
98 4 50       37 unless ( $termios->setattr( $ttyno, &POSIX::TCSANOW ) ) {
99 0         0 warn "set_raw: setattr($ttyno) failed: $!";
100 0         0 return undef;
101             }
102 4         35 return 1;
103             }
104              
105             1;
106              
107             __END__