File Coverage

inc/Test/Net/SSLeay/Socket.pm
Criterion Covered Total %
statement 63 65 96.9
branch 13 34 38.2
condition 6 11 54.5
subroutine 15 15 100.0
pod 6 6 100.0
total 103 131 78.6


line stmt bran cond sub pod time code
1             package Test::Net::SSLeay::Socket;
2              
3 60     60   1375 use 5.008001;
  60         237  
4 60     60   334 use strict;
  60         618  
  60         2021  
5 60     60   549 use warnings;
  60         282  
  60         4026  
6              
7 60     60   654 use Carp qw(croak);
  60         171  
  60         5781  
8 60     60   427 use English qw( $EVAL_ERROR $OS_ERROR $OUTPUT_AUTOFLUSH -no_match_vars );
  60         122  
  60         632  
9 60     60   12000 use Scalar::Util qw(refaddr reftype);
  60         199  
  60         4094  
10 60     60   31998 use SelectSaver;
  60         138240  
  60         2883  
11 60         79886 use Socket qw(
12             AF_INET SOCK_DGRAM SOCK_STREAM
13             inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in
14 60     60   2651 );
  60         26212  
15              
16             our $VERSION = '1.95_01';
17              
18             my %PROTOS = (
19             tcp => SOCK_STREAM,
20             udp => SOCK_DGRAM,
21             );
22              
23             sub new {
24 26     26 1 166 my ( $class, %args ) = @_;
25              
26             my $self = bless {
27             addr => delete $args{addr} || '127.0.0.1',
28             port => delete $args{port} || 0,
29             proto => delete $args{proto} || 'tcp',
30 26   50     694 queue => delete $args{queue} || 5,
      50        
      50        
      50        
31             }, $class;
32              
33 26 50       238 if ( !exists $PROTOS{ $self->{proto} } ) {
34 0         0 croak "Unknown protocol '$self->{proto}'";
35             }
36              
37 26         122 $self->_init_server();
38              
39 26         120 return $self;
40             }
41              
42             sub _init_server {
43 26     26   150 my ($self) = @_;
44              
45 26 0       84 my $addr = eval { inet_aton( $self->{addr} ) }
  26 50       710  
46             or croak 'Could not pack IP address'
47             . ( $EVAL_ERROR ? ": $EVAL_ERROR" : q{} );
48              
49 26 0       200 my $sockaddr = eval { pack_sockaddr_in( $self->{port}, $addr ) }
  26 50       268  
50             or croak 'Could not create sockaddr_in structure'
51             . ( $EVAL_ERROR ? ": $EVAL_ERROR" : q{} );
52              
53 26 50       2186 socket $self->{sock}, AF_INET, $PROTOS{ $self->{proto} }, 0
54             or croak "Could not open server socket: $OS_ERROR";
55              
56 26 50       136 if ( $self->{proto} eq 'tcp' ) {
57 26 50       1302 bind $self->{sock}, $sockaddr
58             or croak "Could not bind server socket: $OS_ERROR";
59              
60             listen $self->{sock}, $self->{queue}
61 26 50       462 or croak "Could not listen on server socket: $OS_ERROR";
62             }
63              
64 26         230 my $sockname = getsockname $self->{sock};
65 26         232 ( $self->{sport}, $self->{saddr} ) = unpack_sockaddr_in($sockname);
66 26         180 $self->{saddr} = inet_ntoa( $self->{saddr} );
67              
68 26         82 return 1;
69             }
70              
71             sub get_addr {
72 2     2 1 5924 my ($self) = @_;
73              
74 2         111 return $self->{saddr};
75             }
76              
77             sub get_port {
78 2     2 1 42 my ($self) = @_;
79              
80 2         402 return $self->{sport};
81             }
82              
83             sub accept {
84 42     42 1 347538 my ( $self, $sock ) = @_;
85              
86 42 50 66     1567 if ( defined $sock && reftype($sock) ne 'GLOB' ) {
87 0         0 croak 'Argument #1 to accept() must be a typeglob reference';
88             }
89              
90             accept $sock, $self->{sock}
91 42 50       133510 or croak "Could not accept connection: $OS_ERROR";
92              
93 42         1159 my $saver = SelectSaver->new($sock);
94 42         2662 local $OUTPUT_AUTOFLUSH = 1;
95              
96 42         857 return $sock;
97             }
98              
99             sub connect {
100 40     40 1 199273 my ($self) = @_;
101              
102 40 0       429 my $addr = eval { inet_aton( $self->{saddr} ) }
  40 50       1502  
103             or croak 'Could not pack IP address in connect'
104             . ( $EVAL_ERROR ? ": $EVAL_ERROR" : q{} );
105              
106 40 0       186 my $sockaddr = eval { pack_sockaddr_in( $self->{sport}, $addr ) }
  40 50       901  
107             or croak 'Could not create sockaddr_in structure in connect'
108             . ( $EVAL_ERROR ? ": $EVAL_ERROR" : q{} );
109              
110 40 50       3700 socket my $sock, AF_INET, $PROTOS{ $self->{proto} }, 0
111             or croak "Could not open server socket in connect: $OS_ERROR";
112 40 50       7200 connect $sock, $sockaddr
113             or croak "Could not connect to server socket: $OS_ERROR";
114              
115 40         1375 my $saver = SelectSaver->new($sock);
116 40         2427 local $OUTPUT_AUTOFLUSH = 1;
117              
118 40         681 return $sock;
119             }
120              
121             sub close {
122 26     26 1 303026 my ($self) = @_;
123              
124 26         703 return close $self->{sock};
125             }
126              
127             1;
128              
129             __END__