forked from pool/perl-IO-Socket-INET6
63 lines
1.6 KiB
Diff
63 lines
1.6 KiB
Diff
--- lib/IO/Socket/INET6.pm
|
|
+++ lib/IO/Socket/INET6.pm
|
|
@@ -148,12 +148,6 @@
|
|
$proto ||= (getprotobyname('tcp'))[2];
|
|
$type = $arg->{Type} || $socket_type{(getprotobynumber($proto))[0]};
|
|
|
|
- my @lres = ();
|
|
- @lres = getaddrinfo($laddr,$lport,$family,$type,$proto,AI_PASSIVE);
|
|
-
|
|
- return _error($sock, $EINVAL, "getaddrinfo: $lres[0]")
|
|
- unless(scalar(@lres)>=5);
|
|
-
|
|
$arg->{PeerAddr} = $arg->{PeerHost}
|
|
if exists $arg->{PeerHost} && !exists $arg->{PeerAddr};
|
|
|
|
@@ -164,17 +158,40 @@
|
|
}
|
|
|
|
$sock->blocking($arg->{Blocking}) if defined $arg->{Blocking};
|
|
-
|
|
|
|
+ my @families;
|
|
+ if ($family == AF_UNSPEC){
|
|
+ @families = (AF_INET6, AF_INET);
|
|
+ } else {
|
|
+ @families = ($family);
|
|
+ }
|
|
+
|
|
+ my $ok = 0;
|
|
+ my $msg;
|
|
+ my @lres = ();
|
|
my @rres = ();
|
|
- if (defined $raddr) {
|
|
- @rres = getaddrinfo($raddr,$rport,$family,$type,$proto,AI_PASSIVE);
|
|
- return _error($sock, $EINVAL, "getaddrinfo: $rres[0]")
|
|
- unless (scalar(@rres)>=5);
|
|
+ for my $fam (@families) {
|
|
+ @lres = getaddrinfo($laddr,$lport,$fam,$type,$proto,AI_PASSIVE);
|
|
+ if (scalar(@lres)<5){
|
|
+ $msg = $lres[0];
|
|
+ next;
|
|
+ }
|
|
+ if (defined $raddr) {
|
|
+ @rres = getaddrinfo($raddr,$rport,$fam,$type,$proto,AI_PASSIVE);
|
|
+ if (scalar(@rres)>=5){
|
|
+ $ok = 1;
|
|
+ last;
|
|
+ } else {
|
|
+ $msg = $rres[0];
|
|
+ }
|
|
+ } else {
|
|
+ $ok = 1;
|
|
+ last;
|
|
+ }
|
|
}
|
|
+ return _error($sock, $EINVAL, "getaddrinfo: $msg") unless $ok;
|
|
|
|
while(1) {
|
|
-
|
|
$family = (exists $arg->{PeerAddr})? ($rres[0]):($lres[0]) ; # One concrete family.
|
|
|
|
#printf "DEBUG $family \n";
|