IO-Event
view release on metacpan or search on metacpan
lib/IO/Event.pm view on Meta::CPAN
}
sub ie_desc
{
my ($self, $new) = @_;
my $r = ${*$self}{ie_desc} || "no description";
${*$self}{ie_desc} = $new if defined $new;
return $r;
}
no warnings;
*PRINT = \&print;
*READ = \&sysread;
# from IO::Handle
*read = \&sysread;
*WRITE = \&syswrite;
*CLOSE = \&close;
*EOF = \&eof;
*TELL = \&tell;
*FILENO = \&fileno;
*SEEK = \&seek;
*BINMODE = \&binmode;
*OPEN = \&open;
*GETC = \&getc;
use warnings;
}{package IO::Event::Socket::INET;
# XXX version 1.26 required for IO::Socket::INET
use strict;
use warnings;
use List::MoreUtils qw(any);
our @ISA = qw(IO::Event);
sub new
{
my ($pkg, $a, $b, %sock) = @_;
# emulate behavior in the IO::Socket::INET API
if (! %sock && ! $b) {
$sock{PeerAddr} = $a;
} else {
$sock{$a} = $b;
}
my $handler = $sock{Handler} || (caller)[0];
delete $sock{Handler};
my $timeout;
if ($sock{Timeout}) {
$timeout = $sock{Timeout};
delete $sock{Timeout};
}
$sock{Blocking} = 0;
my (%ds) = %sock;
delete $sock{Description};
require IO::Socket::INET;
my $fh = new IO::Socket::INET(%sock);
return undef unless defined $fh;
my $peer = any { /Peer/ } keys %sock;
if ($peer) {
$ds{LocalPort} = $fh->sockport
unless defined $ds{LocalPort};
$ds{LocalHost} = $fh->sockhost
unless defined $ds{LocalHost};
}
my $desc = $ds{Description}
|| join(" ",
map {
defined $ds{$_}
? "$_=$ds{$_}"
: $_
} sort keys %ds);
return undef unless $fh;
my $self = $pkg->SUPER::new($fh, $handler, $desc);
bless $self, $pkg;
$self->listener(1)
if $sock{Listen};
$fh->blocking(0); # XXX may be redundant
if ($peer) {
if ($fh->connected()) {
$self->ie_invoke(0, 'ie_connected');
} else {
${*$self}{ie_connecting} = 1;
$self->writeevents(1);
${*$self}{ie_connect_timeout} = $timeout + time
if $timeout;
}
}
${*$self}{ie_socket_timeout} = $timeout
if $timeout;
return $self;
}
}{
package IO::Event::Socket::UNIX;
use strict;
use warnings;
our @ISA = qw(IO::Event);
sub new
{
my ($pkg, $a, $b, %sock) = @_;
# emulate behavior in the IO::Socket::INET API
if (! %sock && ! $b) {
$sock{Peer} = $a;
} else {
$sock{$a} = $b;
}
my $handler = $sock{Handler} || (caller)[0];
delete $sock{Handler};
my $desc = $sock{Description}
|| join(" ", map { "$_=$sock{$_}" } sort keys %sock);
delete $sock{Description};
require IO::Socket::UNIX;
my $fh = new IO::Socket::UNIX(%sock);
return undef unless $fh;
my $self = $pkg->SUPER::new($fh, $handler, $desc);
bless $self, $pkg;
$self->listener(1)
if $sock{Listen};
$fh->blocking(0);
if ($sock{Peer}) {
if ($fh->connected()) {
$self->ie_invoke(0, 'ie_connected');
} else {
${*$self}{ie_connecting} = 1;
$self->writeevents(1);
}
}
return $self;
}
}#end package
1;
( run in 0.592 second using v1.01-cache-2.11-cpan-e93a5daba3e )