AnyEvent-FDpasser
view release on metacpan or search on metacpan
lib/AnyEvent/FDpasser.pm view on Meta::CPAN
}
} elsif ($rv == -2) {
$self->error("cmsg truncated");
} elsif ($rv == 0) {
## Orderly shutdown
$self->error(undef);
} else {
open(my $new_fh, '+<&=', $rv);
$self->{iwatcher} = undef;
$cb->($new_fh);
$self->try_to_recv;
}
};
$self->setup_fh_duped;
}
sub _convert_fh_to_fd {
my $fh = shift;
$fh = fileno($fh) unless $fh =~ /^\d+$/;
return $fh;
}
sub fdpasser_socketpair {
my ($s1, $s2);
if ($^O eq 'MSWin32') {
die "AnyEvent::FDpasser does not support windows";
} elsif (fdpasser_mode() == 2) {
pipe $s1, $s2;
die "can't pipe: $!" unless $s1;
} else {
socketpair $s1, $s2, AF_UNIX, SOCK_STREAM, AF_UNSPEC;
die "can't make socketpair: $!" unless $s2;
}
return ($s1, $s2);
}
sub fdpasser_server {
my ($path, $backlog) = @_;
$backlog ||= 10;
my $fh;
if ($^O eq 'MSWin32') {
die "AnyEvent::FDpasser does not support windows";
} elsif (fdpasser_mode() == 2) {
my $fd = _fdpasser_server($path);
die "unable to _fdpasser_server($path) : $!" if $fd < 0;
open($fh, '+<&=', $fd) || die "couldn't open";
} else {
socket($fh, AF_UNIX, SOCK_STREAM, AF_UNSPEC) || die "Unable to create AF_UNIX socket: $!";
setsockopt($fh, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "Unable to setsockopt(SO_REUSEADDR): $!";
unlink($path);
bind($fh, Socket::sockaddr_un($path)) || die "Unable to bind AF_UNIX socket to $path : $!";
listen($fh, $backlog) || die "Unable to listen on $path : $!";
}
return $fh;
}
sub fdpasser_accept {
my ($listener_fh) = @_;
my $passer_fh;
if ($^O eq 'MSWin32') {
die "AnyEvent::FDpasser does not support windows";
} elsif (fdpasser_mode() == 2) {
my $fd = _fdpasser_accept(fileno($listener_fh));
die "unable to _fdpasser_accept($listener_fh) : $!" if $fd < 0;
open($passer_fh, '+<&=', $fd) || die "couldn't open";
} else {
accept($passer_fh, $listener_fh);
}
return $passer_fh;
}
sub fdpasser_connect {
my ($path) = @_;
my $fh;
if ($^O eq 'MSWin32') {
die "AnyEvent::FDpasser does not support windows";
} elsif (fdpasser_mode() == 2) {
my $fd = _fdpasser_connect($path);
die "unable to _fdpasser_connect($path) : $!" if $fd < 0;
open($fh, '+<&=', $fd) || die "couldn't open";
} else {
socket($fh, AF_UNIX, SOCK_STREAM, AF_UNSPEC) || die "Unable to create AF_UNIX socket: $!";
connect($fh, Socket::sockaddr_un($path)) || die "Unable to connect AF_UNIX socket to $path : $!";
}
return $fh;
}
sub error {
my ($self, $err) = @_;
my $on_error = $self->{on_error};
close($self->{fh});
close($self->{fh_pair}) if exists $self->{fh_pair};
if (exists $self->{fh_duped}) {
POSIX::close($self->{fh_duped});
delete $self->{fh_duped};
}
if (exists $self->{fh_duped_orig}) {
POSIX::close($self->{fh_duped_orig});
delete $self->{fh_duped_orig};
}
( run in 1.003 second using v1.01-cache-2.11-cpan-2398b32b56e )