File Coverage

blib/lib/IO/Lambda/Socket.pm
Criterion Covered Total %
statement 68 85 80.0
branch 19 48 39.5
condition 2 4 50.0
subroutine 15 17 88.2
pod n/a
total 104 154 67.5


line stmt bran cond sub pod time code
1             # $Id: Socket.pm,v 1.12 2010/03/26 20:45:45 dk Exp $
2 2     2   27970 use strict;
  2         5  
  2         69  
3 2     2   13 use warnings;
  2         5  
  2         101  
4              
5             package IO::Lambda::Socket;
6 2     2   14 use Carp qw(croak);
  2         5  
  2         116  
7 2     2   19 use Socket;
  2         23  
  2         1581  
8 2     2   11 use Exporter;
  2         4  
  2         68  
9 2     2   10 use IO::Lambda qw(:all :dev);
  2         3  
  2         616  
10 2     2   11 use Time::HiRes qw(time);
  2         3  
  2         17  
11 2     2   220 use vars qw(@ISA @EXPORT_OK %EXPORT_TAGS);
  2         2  
  2         189  
12             @ISA = qw(Exporter);
13             %EXPORT_TAGS = (all => \@EXPORT_OK);
14             @EXPORT_OK = qw(connect accept send recv);
15 2     2   25680 use subs qw(connect accept send recv);
  2         69  
  2         15  
16              
17             sub connect(&)
18             {
19             return this-> override_handler('connect', \&connect, shift)
20 8 50   8   45 if this-> {override}->{connect};
21              
22 8         84 my $cb = _subname connect => shift;
23 8         37 my ($socket, $deadline) = context;
24              
25 8 50       52 return this-> add_constant( $cb, \&connect, "Bad socket") unless $socket;
26              
27 8         42 my $w32 = $^O eq 'MSWin32';
28              
29             this-> watch_io(
30             IO_WRITE | ( $w32 ? IO_EXCEPTION : 0),
31             $socket, $deadline,
32             sub {
33 8     8   56 shift-> set_frame( \&connect, $cb, $socket, $deadline);
34              
35 8         63 my @param;
36 8 50       29 unless ( $_[0]) {
37 0         0 @param = ('timeout');
38             } else {
39 8 50       91 my $e = $w32 ? \ $^E : \ $!;
40 8         145 $$e = unpack('i', getsockopt( $socket, SOL_SOCKET, SO_ERROR));
41 8 50       68 @param = ($$e) if $$e;
42             }
43 8         65 local *__ANON__ = "IO::Lambda::Socket::connect::callback";
44 8 50       50 $cb ? $cb-> (@param) : @param;
45             }
46 8 50       31 );
47             }
48              
49             sub accept(&)
50             {
51             return this-> override_handler('accept', \&accept, shift)
52 0 0   0   0 if this-> {override}->{accept};
53              
54 0         0 my $cb = _subname accept => shift;
55 0         0 my ($socket, $deadline) = context;
56              
57 0 0       0 return this-> add_constant( $cb, \&connect, "Bad socket") unless $socket;
58              
59             this-> watch_io(
60             IO_READ, $socket, $deadline,
61             sub {
62 0     0   0 shift-> set_frame( \&accept, $cb, $socket, $deadline);
63              
64 0         0 my @param;
65 0 0       0 unless ( $_[0]) {
66 0         0 @param = ('timeout');
67             } else {
68 0         0 my $h = IO::Handle-> new;
69 0 0       0 @param = (
70             CORE::accept( $h, $socket) ?
71             ($h) : ($!)
72             );
73             }
74 0         0 local *__ANON__ = "IO::Lambda::Socket::accept::callback";
75 0 0       0 $cb ? $cb-> (@param) : @param;
76             }
77 0         0 );
78             }
79              
80             # recv($fh, $length, $flags, $deadline) -> (address,msg|undef,error)
81             sub recv(&)
82             {
83             return this-> override_handler('recv', \&recv, shift)
84 5 50   5   32 if this-> {override}->{recv};
85              
86 5         15 my $cb = _subname( recv => shift );
87 5         12 my ($socket, $length, $flags, $deadline) = context;
88              
89 5 50       13 return this-> add_constant( $cb, \&recv, undef, "Bad socket")
90             unless $socket;
91              
92             this-> watch_io(
93             IO_READ, $socket, $deadline,
94             sub {
95 5     5   17 shift-> set_frame( \&recv, $cb, $socket, $length, $flags, $deadline);
96              
97 5         16 my @param;
98 5 50       11 unless ( $_[0]) {
99 0         0 @param = ('timeout');
100             } else {
101 5         9 my $buf = '';
102 5   50     47 my $r = CORE::recv(
103             $socket, $buf, $length,
104             $flags || 0
105             );
106 5 50       13 if ( defined($r)) {
107 5 50       18 @param = defined($r) ? ($r,$buf) : (undef,$!);
108             } else {
109 0         0 @param = ( undef, $!);
110             }
111             }
112 5         61 local *__ANON__ = "IO::Lambda::Socket::recv::callback";
113 5 50       25 $cb ? $cb-> (@param) : @param;
114             }
115 5         11 );
116             }
117              
118             # send($fh, $msg, $flags, $to, $deadline) -> ioresult
119             sub send(&)
120             {
121             return this-> override_handler('send', \&send, shift)
122 5 50   5   36 if this-> {override}->{send};
123              
124 5         14 my $cb = _subname send => shift;
125 5         15 my ($socket, $msg, $flags, $to, $deadline) = context;
126              
127 5 50       13 return this-> add_constant( $cb, \&send, undef, "Bad socket")
128             unless $socket;
129              
130             this-> watch_io(
131             IO_WRITE, $socket, $deadline,
132             sub {
133 5     5   18 shift-> set_frame( \&recv, $cb, $socket, $msg, $flags, $to, $deadline);
134              
135 5         21 my @param;
136 5 50       16 unless ( $_[0]) {
137 0         0 @param = ('timeout');
138             } else {
139 5   50     19 $flags ||= 0;
140 5 50       157 my $r = defined($to) ?
141             CORE::send($socket, $msg, $flags, $to) :
142             CORE::send($socket, $msg, $flags);
143 5 50       19 @param = defined($r) ? ($r) : (undef,$!);
144             }
145 5         26 local *__ANON__ = "IO::Lambda::Socket::send::callback";
146 5 50       18 $cb ? $cb-> (@param) : @param;
147             }
148 5         11 );
149             }
150              
151             1;
152              
153             __DATA__