--- 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";