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