| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | =head1 NAME | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | AnyEvent::Socket - useful IPv4 and IPv6 stuff. also unix domain sockets. and stuff. | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | use AnyEvent::Socket; | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | tcp_connect "gameserver.deliantra.net", 13327, sub { | 
| 10 |  |  |  |  |  |  | my ($fh) = @_ | 
| 11 |  |  |  |  |  |  | or die "gameserver.deliantra.net connect failed: $!"; | 
| 12 |  |  |  |  |  |  |  | 
| 13 |  |  |  |  |  |  | # enjoy your filehandle | 
| 14 |  |  |  |  |  |  | }; | 
| 15 |  |  |  |  |  |  |  | 
| 16 |  |  |  |  |  |  | # a simple tcp server | 
| 17 |  |  |  |  |  |  | tcp_server undef, 8888, sub { | 
| 18 |  |  |  |  |  |  | my ($fh, $host, $port) = @_; | 
| 19 |  |  |  |  |  |  |  | 
| 20 |  |  |  |  |  |  | syswrite $fh, "The internet is full, $host:$port. Go away!\015\012"; | 
| 21 |  |  |  |  |  |  | }; | 
| 22 |  |  |  |  |  |  |  | 
| 23 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  | This module implements various utility functions for handling internet | 
| 26 |  |  |  |  |  |  | protocol addresses and sockets, in an as transparent and simple way as | 
| 27 |  |  |  |  |  |  | possible. | 
| 28 |  |  |  |  |  |  |  | 
| 29 |  |  |  |  |  |  | All functions documented without C prefix are exported | 
| 30 |  |  |  |  |  |  | by default. | 
| 31 |  |  |  |  |  |  |  | 
| 32 |  |  |  |  |  |  | =over 4 | 
| 33 |  |  |  |  |  |  |  | 
| 34 |  |  |  |  |  |  | =cut | 
| 35 |  |  |  |  |  |  |  | 
| 36 |  |  |  |  |  |  | package AnyEvent::Socket; | 
| 37 |  |  |  |  |  |  |  | 
| 38 | 8 |  |  | 8 |  | 84678 | use Carp (); | 
|  | 8 |  |  |  |  | 28 |  | 
|  | 8 |  |  |  |  | 186 |  | 
| 39 | 8 |  |  | 8 |  | 473 | use Errno (); | 
|  | 8 |  |  |  |  | 1485 |  | 
|  | 8 |  |  |  |  | 173 |  | 
| 40 | 8 |  |  | 8 |  | 1158 | use Socket qw(AF_INET AF_UNIX SOCK_STREAM SOCK_DGRAM SOL_SOCKET SO_REUSEADDR); | 
|  | 8 |  |  |  |  | 8661 |  | 
|  | 8 |  |  |  |  | 1233 |  | 
| 41 |  |  |  |  |  |  |  | 
| 42 | 8 |  |  | 8 |  | 1912 | use AnyEvent (); BEGIN { AnyEvent::common_sense } | 
|  | 8 |  |  | 8 |  | 17 |  | 
|  | 8 |  |  |  |  | 169 |  | 
|  | 8 |  |  |  |  | 37 |  | 
| 43 | 8 |  |  | 8 |  | 1466 | use AnyEvent::Util qw(guard AF_INET6); | 
|  | 8 |  |  |  |  | 28 |  | 
|  | 8 |  |  |  |  | 488 |  | 
| 44 | 8 |  |  | 8 |  | 2717 | use AnyEvent::DNS (); | 
|  | 8 |  |  |  |  | 21 |  | 
|  | 8 |  |  |  |  | 231 |  | 
| 45 |  |  |  |  |  |  |  | 
| 46 | 8 |  |  | 8 |  | 50 | use base 'Exporter'; | 
|  | 8 |  |  |  |  | 22 |  | 
|  | 8 |  |  |  |  | 19250 |  | 
| 47 |  |  |  |  |  |  |  | 
| 48 |  |  |  |  |  |  | our @EXPORT = qw( | 
| 49 |  |  |  |  |  |  | getprotobyname | 
| 50 |  |  |  |  |  |  | parse_hostport format_hostport | 
| 51 |  |  |  |  |  |  | parse_ipv4 parse_ipv6 | 
| 52 |  |  |  |  |  |  | parse_ip parse_address | 
| 53 |  |  |  |  |  |  | format_ipv4 format_ipv6 | 
| 54 |  |  |  |  |  |  | format_ip format_address | 
| 55 |  |  |  |  |  |  | address_family | 
| 56 |  |  |  |  |  |  | inet_aton | 
| 57 |  |  |  |  |  |  | tcp_server | 
| 58 |  |  |  |  |  |  | tcp_connect | 
| 59 |  |  |  |  |  |  | ); | 
| 60 |  |  |  |  |  |  |  | 
| 61 |  |  |  |  |  |  | our $VERSION = $AnyEvent::VERSION; | 
| 62 |  |  |  |  |  |  |  | 
| 63 |  |  |  |  |  |  | =item $ipn = parse_ipv4 $dotted_quad | 
| 64 |  |  |  |  |  |  |  | 
| 65 |  |  |  |  |  |  | Tries to parse the given dotted quad IPv4 address and return it in | 
| 66 |  |  |  |  |  |  | octet form (or undef when it isn't in a parsable format). Supports all | 
| 67 |  |  |  |  |  |  | forms specified by POSIX (e.g. C<10.0.0.1>, C<10.1>, C<10.0x020304>, | 
| 68 |  |  |  |  |  |  | C<0x12345678> or C<0377.0377.0377.0377>). | 
| 69 |  |  |  |  |  |  |  | 
| 70 |  |  |  |  |  |  | =cut | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | sub parse_ipv4($) { | 
| 73 | 23 | 100 |  | 23 | 1 | 160 | $_[0] =~ /^      (?: 0x[0-9a-fA-F]+ | 0[0-7]* | [1-9][0-9]* ) | 
| 74 |  |  |  |  |  |  | (?:\. (?: 0x[0-9a-fA-F]+ | 0[0-7]* | [1-9][0-9]* ) ){0,3}$/x | 
| 75 |  |  |  |  |  |  | or return undef; | 
| 76 |  |  |  |  |  |  |  | 
| 77 | 21 | 100 |  |  |  | 225 | @_ = map /^0/ ? oct : $_, split /\./, $_[0]; | 
| 78 |  |  |  |  |  |  |  | 
| 79 |  |  |  |  |  |  | # check leading parts against range | 
| 80 | 21 | 50 |  |  |  | 193 | return undef if grep $_ >= 256, @_[0 .. @_ - 2]; | 
| 81 |  |  |  |  |  |  |  | 
| 82 |  |  |  |  |  |  | # check trailing part against range | 
| 83 | 21 | 50 |  |  |  | 86 | return undef if $_[-1] >= 2 ** (8 * (4 - $#_)); | 
| 84 |  |  |  |  |  |  |  | 
| 85 | 21 |  |  |  |  | 146 | pack "N", (pop) | 
| 86 |  |  |  |  |  |  | + ($_[0] << 24) | 
| 87 |  |  |  |  |  |  | + ($_[1] << 16) | 
| 88 |  |  |  |  |  |  | + ($_[2] <<  8); | 
| 89 |  |  |  |  |  |  | } | 
| 90 |  |  |  |  |  |  |  | 
| 91 |  |  |  |  |  |  | =item $ipn = parse_ipv6 $textual_ipv6_address | 
| 92 |  |  |  |  |  |  |  | 
| 93 |  |  |  |  |  |  | Tries to parse the given IPv6 address and return it in | 
| 94 |  |  |  |  |  |  | octet form (or undef when it isn't in a parsable format). | 
| 95 |  |  |  |  |  |  |  | 
| 96 |  |  |  |  |  |  | Should support all forms specified by RFC 2373 (and additionally all IPv4 | 
| 97 |  |  |  |  |  |  | forms supported by parse_ipv4). Note that scope-id's are not supported | 
| 98 |  |  |  |  |  |  | (and will not parse). | 
| 99 |  |  |  |  |  |  |  | 
| 100 |  |  |  |  |  |  | This function works similarly to C. | 
| 101 |  |  |  |  |  |  |  | 
| 102 |  |  |  |  |  |  | Example: | 
| 103 |  |  |  |  |  |  |  | 
| 104 |  |  |  |  |  |  | print unpack "H*", parse_ipv6 "2002:5345::10.0.0.1"; | 
| 105 |  |  |  |  |  |  | # => 2002534500000000000000000a000001 | 
| 106 |  |  |  |  |  |  |  | 
| 107 |  |  |  |  |  |  | print unpack "H*", parse_ipv6 "192.89.98.1"; | 
| 108 |  |  |  |  |  |  | # => 00000000000000000000ffffc0596201 | 
| 109 |  |  |  |  |  |  |  | 
| 110 |  |  |  |  |  |  | =cut | 
| 111 |  |  |  |  |  |  |  | 
| 112 |  |  |  |  |  |  | sub parse_ipv6($) { | 
| 113 |  |  |  |  |  |  | # quick test to avoid longer processing | 
| 114 | 31 |  |  | 31 | 1 | 107 | my $n = $_[0] =~ y/://; | 
| 115 |  |  |  |  |  |  |  | 
| 116 | 31 | 100 | 66 |  |  | 105 | if ($n < 2 || $n > 8) { | 
| 117 | 18 | 100 | 66 |  |  | 112 | if (!$n && (my $ipn = parse_ipv4 $_[0])) { | 
| 118 | 16 |  |  |  |  | 65 | return "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff$ipn"; | 
| 119 |  |  |  |  |  |  | } | 
| 120 | 2 |  |  |  |  | 8 | return undef; | 
| 121 |  |  |  |  |  |  | } | 
| 122 |  |  |  |  |  |  |  | 
| 123 | 13 |  |  |  |  | 42 | my ($h, $t) = split /::/, $_[0], 2; | 
| 124 |  |  |  |  |  |  |  | 
| 125 | 13 | 50 |  |  |  | 39 | unless (defined $t) { | 
| 126 | 0 |  |  |  |  | 0 | ($h, $t) = (undef, $h); | 
| 127 |  |  |  |  |  |  | } | 
| 128 |  |  |  |  |  |  |  | 
| 129 | 13 |  |  |  |  | 26 | my @h = split /:/, $h, -1; | 
| 130 | 13 |  |  |  |  | 22 | my @t = split /:/, $t, -1; | 
| 131 |  |  |  |  |  |  |  | 
| 132 |  |  |  |  |  |  | # check for ipv4 tail | 
| 133 | 13 | 100 | 66 |  |  | 52 | if (@t && $t[-1]=~ /\./) { | 
| 134 | 4 | 50 |  |  |  | 9 | return undef if $n > 6; | 
| 135 |  |  |  |  |  |  |  | 
| 136 | 4 | 50 |  |  |  | 9 | my $ipn = parse_ipv4 pop @t | 
| 137 |  |  |  |  |  |  | or return undef; | 
| 138 |  |  |  |  |  |  |  | 
| 139 | 4 |  |  |  |  | 24 | push @t, map +(sprintf "%x", $_), unpack "nn", $ipn; | 
| 140 |  |  |  |  |  |  | } | 
| 141 |  |  |  |  |  |  |  | 
| 142 |  |  |  |  |  |  | # no :: then we need to have exactly 8 components | 
| 143 | 13 | 50 | 33 |  |  | 58 | return undef unless @h + @t == 8 || $_[0] =~ /::/; | 
| 144 |  |  |  |  |  |  |  | 
| 145 |  |  |  |  |  |  | # now check all parts for validity | 
| 146 | 13 | 50 |  |  |  | 63 | return undef if grep !/^[0-9a-fA-F]{1,4}$/, @h, @t; | 
| 147 |  |  |  |  |  |  |  | 
| 148 |  |  |  |  |  |  | # now pad... | 
| 149 | 13 |  |  |  |  | 77 | push @h, 0 while @h + @t < 8; | 
| 150 |  |  |  |  |  |  |  | 
| 151 |  |  |  |  |  |  | # and done | 
| 152 | 13 |  |  |  |  | 116 | pack "n*", map hex, @h, @t | 
| 153 |  |  |  |  |  |  | } | 
| 154 |  |  |  |  |  |  |  | 
| 155 |  |  |  |  |  |  | =item $token = parse_unix $hostname | 
| 156 |  |  |  |  |  |  |  | 
| 157 |  |  |  |  |  |  | This function exists mainly for symmetry to the other C | 
| 158 |  |  |  |  |  |  | functions - it takes a hostname and, if it is C, it returns a | 
| 159 |  |  |  |  |  |  | special address token, otherwise C. | 
| 160 |  |  |  |  |  |  |  | 
| 161 |  |  |  |  |  |  | The only use for this function is probably to detect whether a hostname | 
| 162 |  |  |  |  |  |  | matches whatever AnyEvent uses for unix domain sockets. | 
| 163 |  |  |  |  |  |  |  | 
| 164 |  |  |  |  |  |  | =cut | 
| 165 |  |  |  |  |  |  |  | 
| 166 |  |  |  |  |  |  | sub parse_unix($) { | 
| 167 | 2 | 50 |  | 2 | 1 | 13 | $_[0] eq "unix/" | 
| 168 |  |  |  |  |  |  | ? pack "S", AF_UNIX | 
| 169 |  |  |  |  |  |  | : undef | 
| 170 |  |  |  |  |  |  |  | 
| 171 |  |  |  |  |  |  | } | 
| 172 |  |  |  |  |  |  |  | 
| 173 |  |  |  |  |  |  | =item $ipn = parse_address $ip | 
| 174 |  |  |  |  |  |  |  | 
| 175 |  |  |  |  |  |  | Combines C, C and C in one | 
| 176 |  |  |  |  |  |  | function. The address here refers to the host address (not socket address) | 
| 177 |  |  |  |  |  |  | in network form (binary). | 
| 178 |  |  |  |  |  |  |  | 
| 179 |  |  |  |  |  |  | If the C<$text> is C, then this function returns a special token | 
| 180 |  |  |  |  |  |  | recognised by the other functions in this module to mean "UNIX domain | 
| 181 |  |  |  |  |  |  | socket". | 
| 182 |  |  |  |  |  |  |  | 
| 183 |  |  |  |  |  |  | If the C<$text> to parse is a plain IPv4 or mapped IPv4 in IPv6 address | 
| 184 |  |  |  |  |  |  | (:ffff::), then it will be treated as an IPv4 address and four | 
| 185 |  |  |  |  |  |  | octets will be returned. If you don't want that, you have to call | 
| 186 |  |  |  |  |  |  | C and/or C manually (the latter always returning a | 
| 187 |  |  |  |  |  |  | 16 octet IPv6 address for mapped IPv4 addresses). | 
| 188 |  |  |  |  |  |  |  | 
| 189 |  |  |  |  |  |  | Example: | 
| 190 |  |  |  |  |  |  |  | 
| 191 |  |  |  |  |  |  | print unpack "H*", parse_address "10.1.2.3"; | 
| 192 |  |  |  |  |  |  | # => 0a010203 | 
| 193 |  |  |  |  |  |  |  | 
| 194 |  |  |  |  |  |  | =item $ipn = AnyEvent::Socket::aton $ip | 
| 195 |  |  |  |  |  |  |  | 
| 196 |  |  |  |  |  |  | Same as C, but not exported (think C but | 
| 197 |  |  |  |  |  |  | I name resolution). | 
| 198 |  |  |  |  |  |  |  | 
| 199 |  |  |  |  |  |  | =cut | 
| 200 |  |  |  |  |  |  |  | 
| 201 |  |  |  |  |  |  | sub parse_address($) { | 
| 202 | 19 |  |  | 19 | 1 | 56 | for (&parse_ipv6) { | 
| 203 | 19 | 100 |  |  |  | 46 | if ($_) { | 
| 204 | 17 |  |  |  |  | 58 | s/^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff//; | 
| 205 | 17 |  |  |  |  | 71 | return $_ | 
| 206 |  |  |  |  |  |  | } else { | 
| 207 | 2 |  |  |  |  | 6 | return &parse_unix | 
| 208 |  |  |  |  |  |  | } | 
| 209 |  |  |  |  |  |  | } | 
| 210 |  |  |  |  |  |  | } | 
| 211 |  |  |  |  |  |  |  | 
| 212 |  |  |  |  |  |  | *aton = \&parse_address; | 
| 213 |  |  |  |  |  |  |  | 
| 214 |  |  |  |  |  |  | =item ($name, $aliases, $proto) = getprotobyname $name | 
| 215 |  |  |  |  |  |  |  | 
| 216 |  |  |  |  |  |  | Works like the builtin function of the same name, except it tries hard to | 
| 217 |  |  |  |  |  |  | work even on broken platforms (well, that's windows), where getprotobyname | 
| 218 |  |  |  |  |  |  | is traditionally very unreliable. | 
| 219 |  |  |  |  |  |  |  | 
| 220 |  |  |  |  |  |  | Example: get the protocol number for TCP (usually 6) | 
| 221 |  |  |  |  |  |  |  | 
| 222 |  |  |  |  |  |  | my $proto = getprotobyname "tcp"; | 
| 223 |  |  |  |  |  |  |  | 
| 224 |  |  |  |  |  |  | =cut | 
| 225 |  |  |  |  |  |  |  | 
| 226 |  |  |  |  |  |  | # microsoft can't even get getprotobyname working (the etc/protocols file | 
| 227 |  |  |  |  |  |  | # gets lost fairly often on windows), so we have to hardcode some common | 
| 228 |  |  |  |  |  |  | # protocol numbers ourselves. | 
| 229 |  |  |  |  |  |  | our %PROTO_BYNAME; | 
| 230 |  |  |  |  |  |  |  | 
| 231 |  |  |  |  |  |  | $PROTO_BYNAME{tcp}  = Socket::IPPROTO_TCP () if defined &Socket::IPPROTO_TCP; | 
| 232 |  |  |  |  |  |  | $PROTO_BYNAME{udp}  = Socket::IPPROTO_UDP () if defined &Socket::IPPROTO_UDP; | 
| 233 |  |  |  |  |  |  | $PROTO_BYNAME{icmp} = Socket::IPPROTO_ICMP() if defined &Socket::IPPROTO_ICMP; | 
| 234 |  |  |  |  |  |  |  | 
| 235 |  |  |  |  |  |  | sub getprotobyname($) { | 
| 236 | 8 |  |  | 8 | 1 | 25 | my $name = lc shift; | 
| 237 |  |  |  |  |  |  |  | 
| 238 | 8 | 50 | 33 |  |  | 37 | defined (my $proton = $PROTO_BYNAME{$name} || (getprotobyname $name)[2]) | 
| 239 |  |  |  |  |  |  | or return; | 
| 240 |  |  |  |  |  |  |  | 
| 241 | 8 |  |  |  |  | 40 | ($name, uc $name, $proton) | 
| 242 |  |  |  |  |  |  | } | 
| 243 |  |  |  |  |  |  |  | 
| 244 |  |  |  |  |  |  | =item ($host, $service) = parse_hostport $string[, $default_service] | 
| 245 |  |  |  |  |  |  |  | 
| 246 |  |  |  |  |  |  | Splitting a string of the form C is a common | 
| 247 |  |  |  |  |  |  | problem. Unfortunately, just splitting on the colon makes it hard to | 
| 248 |  |  |  |  |  |  | specify IPv6 addresses and doesn't support the less common but well | 
| 249 |  |  |  |  |  |  | standardised C<[ip literal]> syntax. | 
| 250 |  |  |  |  |  |  |  | 
| 251 |  |  |  |  |  |  | This function tries to do this job in a better way, it supports (at | 
| 252 |  |  |  |  |  |  | least) the following formats, where C can be a numerical port | 
| 253 |  |  |  |  |  |  | number of a service name, or a C string, and the C< port> and | 
| 254 |  |  |  |  |  |  | C<:port> parts are optional. Also, everywhere where an IP address is | 
| 255 |  |  |  |  |  |  | supported a hostname or unix domain socket address is also supported (see | 
| 256 |  |  |  |  |  |  | C), and strings starting with C> will also be interpreted as | 
| 257 |  |  |  |  |  |  | unix domain sockets. | 
| 258 |  |  |  |  |  |  |  | 
| 259 |  |  |  |  |  |  | hostname:port    e.g. "www.linux.org", "www.x.de:443", "www.x.de:https=443", | 
| 260 |  |  |  |  |  |  | ipv4:port        e.g. "198.182.196.56", "127.1:22" | 
| 261 |  |  |  |  |  |  | ipv6             e.g. "::1", "affe::1" | 
| 262 |  |  |  |  |  |  | [ipv4or6]:port   e.g. "[::1]", "[10.0.1]:80" | 
| 263 |  |  |  |  |  |  | [ipv4or6] port   e.g. "[127.0.0.1]", "[www.x.org] 17" | 
| 264 |  |  |  |  |  |  | ipv4or6 port     e.g. "::1 443", "10.0.0.1 smtp" | 
| 265 |  |  |  |  |  |  | unix/:path       e.g. "unix/:/path/to/socket" | 
| 266 |  |  |  |  |  |  | /path            e.g. "/path/to/socket" | 
| 267 |  |  |  |  |  |  |  | 
| 268 |  |  |  |  |  |  | It also supports defaulting the service name in a simple way by using | 
| 269 |  |  |  |  |  |  | C<$default_service> if no service was detected. If neither a service was | 
| 270 |  |  |  |  |  |  | detected nor a default was specified, then this function returns the | 
| 271 |  |  |  |  |  |  | empty list. The same happens when a parse error was detected, such as a | 
| 272 |  |  |  |  |  |  | hostname with a colon in it (the function is rather forgiving, though). | 
| 273 |  |  |  |  |  |  |  | 
| 274 |  |  |  |  |  |  | Example: | 
| 275 |  |  |  |  |  |  |  | 
| 276 |  |  |  |  |  |  | print join ",", parse_hostport "localhost:443"; | 
| 277 |  |  |  |  |  |  | # => "localhost,443" | 
| 278 |  |  |  |  |  |  |  | 
| 279 |  |  |  |  |  |  | print join ",", parse_hostport "localhost", "https"; | 
| 280 |  |  |  |  |  |  | # => "localhost,https" | 
| 281 |  |  |  |  |  |  |  | 
| 282 |  |  |  |  |  |  | print join ",", parse_hostport "[::1]"; | 
| 283 |  |  |  |  |  |  | # => "," (empty list) | 
| 284 |  |  |  |  |  |  |  | 
| 285 |  |  |  |  |  |  | print join ",", parse_hostport "/tmp/debug.sock"; | 
| 286 |  |  |  |  |  |  | # => "unix/", "/tmp/debug.sock" | 
| 287 |  |  |  |  |  |  |  | 
| 288 |  |  |  |  |  |  | =cut | 
| 289 |  |  |  |  |  |  |  | 
| 290 |  |  |  |  |  |  | sub parse_hostport($;$) { | 
| 291 | 18 |  |  | 18 | 1 | 429 | my ($host, $port); | 
| 292 |  |  |  |  |  |  |  | 
| 293 | 18 |  |  |  |  | 47 | for ("$_[0]") { # work on a copy, just in case, and also reset pos | 
| 294 |  |  |  |  |  |  |  | 
| 295 |  |  |  |  |  |  | # shortcut for /path | 
| 296 | 18 | 50 |  |  |  | 43 | return ("unix/", $_) | 
| 297 |  |  |  |  |  |  | if m%^/%; | 
| 298 |  |  |  |  |  |  |  | 
| 299 |  |  |  |  |  |  | # parse host, special cases: "ipv6" or "ipv6[#p ]port" | 
| 300 | 18 | 100 | 66 |  |  | 80 | unless ( | 
| 301 |  |  |  |  |  |  | ($host) = /^\s* ([0-9a-fA-F:]*:[0-9a-fA-F:]*:[0-9a-fA-F\.:]*)/xgc | 
| 302 |  |  |  |  |  |  | and parse_ipv6 $host | 
| 303 |  |  |  |  |  |  | ) { | 
| 304 | 13 |  |  |  |  | 37 | /^\s*/xgc; | 
| 305 |  |  |  |  |  |  |  | 
| 306 | 13 | 100 |  |  |  | 47 | if (/^ \[ ([^\[\]]+) \]/xgc) { | 
|  |  | 100 |  |  |  |  |  | 
| 307 | 6 |  |  |  |  | 13 | $host = $1; | 
| 308 |  |  |  |  |  |  | } elsif (/^ ([^\[\]:\ ]+) /xgc) { | 
| 309 | 6 |  |  |  |  | 16 | $host = $1; | 
| 310 |  |  |  |  |  |  | } else { | 
| 311 | 1 |  |  |  |  | 4 | return; | 
| 312 |  |  |  |  |  |  | } | 
| 313 |  |  |  |  |  |  | } | 
| 314 |  |  |  |  |  |  |  | 
| 315 |  |  |  |  |  |  | # parse port | 
| 316 | 17 | 100 | 100 |  |  | 80 | if (/\G (?:\s+|:|\#) ([^:[:space:]]+) \s*$/xgc) { | 
|  |  | 100 |  |  |  |  |  | 
| 317 | 8 |  |  |  |  | 24 | $port = $1; | 
| 318 |  |  |  |  |  |  | } elsif (/\G\s*$/gc && length $_[1]) { | 
| 319 | 6 |  |  |  |  | 18 | $port = $_[1]; | 
| 320 |  |  |  |  |  |  | } else { | 
| 321 | 3 |  |  |  |  | 9 | return; | 
| 322 |  |  |  |  |  |  | } | 
| 323 |  |  |  |  |  |  |  | 
| 324 |  |  |  |  |  |  | } | 
| 325 |  |  |  |  |  |  |  | 
| 326 |  |  |  |  |  |  | # hostnames must not contain :'s | 
| 327 | 14 | 50 | 66 |  |  | 42 | return if $host =~ /:/ && !parse_ipv6 $host; | 
| 328 |  |  |  |  |  |  |  | 
| 329 | 14 |  |  |  |  | 42 | ($host, $port) | 
| 330 |  |  |  |  |  |  | } | 
| 331 |  |  |  |  |  |  |  | 
| 332 |  |  |  |  |  |  | =item $string = format_hostport $host, $port | 
| 333 |  |  |  |  |  |  |  | 
| 334 |  |  |  |  |  |  | Takes a host (in textual form) and a port and formats in unambigiously in | 
| 335 |  |  |  |  |  |  | a way that C can parse it again. C<$port> can be C. | 
| 336 |  |  |  |  |  |  |  | 
| 337 |  |  |  |  |  |  | =cut | 
| 338 |  |  |  |  |  |  |  | 
| 339 |  |  |  |  |  |  | sub format_hostport($;$) { | 
| 340 | 0 |  |  | 0 | 1 | 0 | my ($host, $port) = @_; | 
| 341 |  |  |  |  |  |  |  | 
| 342 | 0 | 0 |  |  |  | 0 | $port = ":$port"  if length $port; | 
| 343 | 0 | 0 |  |  |  | 0 | $host = "[$host]" if $host =~ /:/; | 
| 344 |  |  |  |  |  |  |  | 
| 345 | 0 |  |  |  |  | 0 | "$host$port" | 
| 346 |  |  |  |  |  |  | } | 
| 347 |  |  |  |  |  |  |  | 
| 348 |  |  |  |  |  |  | =item $sa_family = address_family $ipn | 
| 349 |  |  |  |  |  |  |  | 
| 350 |  |  |  |  |  |  | Returns the address family/protocol-family (AF_xxx/PF_xxx, in one value :) | 
| 351 |  |  |  |  |  |  | of the given host address in network format. | 
| 352 |  |  |  |  |  |  |  | 
| 353 |  |  |  |  |  |  | =cut | 
| 354 |  |  |  |  |  |  |  | 
| 355 |  |  |  |  |  |  | sub address_family($) { | 
| 356 | 33 | 50 |  | 33 | 1 | 87 | 4 == length $_[0] | 
|  |  | 100 |  |  |  |  |  | 
| 357 |  |  |  |  |  |  | ? AF_INET | 
| 358 |  |  |  |  |  |  | : 16 == length $_[0] | 
| 359 |  |  |  |  |  |  | ? AF_INET6 | 
| 360 |  |  |  |  |  |  | : unpack "S", $_[0] | 
| 361 |  |  |  |  |  |  | } | 
| 362 |  |  |  |  |  |  |  | 
| 363 |  |  |  |  |  |  | =item $text = format_ipv4 $ipn | 
| 364 |  |  |  |  |  |  |  | 
| 365 |  |  |  |  |  |  | Expects a four octet string representing a binary IPv4 address and returns | 
| 366 |  |  |  |  |  |  | its textual format. Rarely used, see C for a nicer | 
| 367 |  |  |  |  |  |  | interface. | 
| 368 |  |  |  |  |  |  |  | 
| 369 |  |  |  |  |  |  | =item $text = format_ipv6 $ipn | 
| 370 |  |  |  |  |  |  |  | 
| 371 |  |  |  |  |  |  | Expects a sixteen octet string representing a binary IPv6 address and | 
| 372 |  |  |  |  |  |  | returns its textual format. Rarely used, see C for a | 
| 373 |  |  |  |  |  |  | nicer interface. | 
| 374 |  |  |  |  |  |  |  | 
| 375 |  |  |  |  |  |  | =item $text = format_address $ipn | 
| 376 |  |  |  |  |  |  |  | 
| 377 |  |  |  |  |  |  | Covnvert a host address in network format (e.g. 4 octets for IPv4 or 16 | 
| 378 |  |  |  |  |  |  | octets for IPv6) and convert it into textual form. | 
| 379 |  |  |  |  |  |  |  | 
| 380 |  |  |  |  |  |  | Returns C for UNIX domain sockets. | 
| 381 |  |  |  |  |  |  |  | 
| 382 |  |  |  |  |  |  | This function works similarly to C, | 
| 383 |  |  |  |  |  |  | except it automatically detects the address type. | 
| 384 |  |  |  |  |  |  |  | 
| 385 |  |  |  |  |  |  | Returns C if it cannot detect the type. | 
| 386 |  |  |  |  |  |  |  | 
| 387 |  |  |  |  |  |  | If the C<$ipn> is a mapped IPv4 in IPv6 address (:ffff::), then just | 
| 388 |  |  |  |  |  |  | the contained IPv4 address will be returned. If you do not want that, you | 
| 389 |  |  |  |  |  |  | have to call C manually. | 
| 390 |  |  |  |  |  |  |  | 
| 391 |  |  |  |  |  |  | Example: | 
| 392 |  |  |  |  |  |  |  | 
| 393 |  |  |  |  |  |  | print format_address "\x01\x02\x03\x05"; | 
| 394 |  |  |  |  |  |  | => 1.2.3.5 | 
| 395 |  |  |  |  |  |  |  | 
| 396 |  |  |  |  |  |  | =item $text = AnyEvent::Socket::ntoa $ipn | 
| 397 |  |  |  |  |  |  |  | 
| 398 |  |  |  |  |  |  | Same as format_address, but not exported (think C). | 
| 399 |  |  |  |  |  |  |  | 
| 400 |  |  |  |  |  |  | =cut | 
| 401 |  |  |  |  |  |  |  | 
| 402 |  |  |  |  |  |  | sub format_ipv4($) { | 
| 403 | 20 |  |  | 20 | 1 | 192 | join ".", unpack "C4", $_[0] | 
| 404 |  |  |  |  |  |  | } | 
| 405 |  |  |  |  |  |  |  | 
| 406 |  |  |  |  |  |  | sub format_ipv6($) { | 
| 407 | 0 | 0 |  | 0 | 1 | 0 | if ($_[0] =~ /^\x00\x00\x00\x00\x00\x00\x00\x00/) { | 
| 408 | 0 | 0 |  |  |  | 0 | if (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 eq $_[0]) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 409 | 0 |  |  |  |  | 0 | return "::"; | 
| 410 |  |  |  |  |  |  | } elsif (v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1 eq $_[0]) { | 
| 411 | 0 |  |  |  |  | 0 | return "::1"; | 
| 412 |  |  |  |  |  |  | } elsif (v0.0.0.0.0.0.0.0.0.0.0.0 eq substr $_[0], 0, 12) { | 
| 413 |  |  |  |  |  |  | # v4compatible | 
| 414 | 0 |  |  |  |  | 0 | return "::" . format_ipv4 substr $_[0], 12; | 
| 415 |  |  |  |  |  |  | } elsif (v0.0.0.0.0.0.0.0.0.0.255.255 eq substr $_[0], 0, 12) { | 
| 416 |  |  |  |  |  |  | # v4mapped | 
| 417 | 0 |  |  |  |  | 0 | return "::ffff:" . format_ipv4 substr $_[0], 12; | 
| 418 |  |  |  |  |  |  | } elsif (v0.0.0.0.0.0.0.0.255.255.0.0 eq substr $_[0], 0, 12) { | 
| 419 |  |  |  |  |  |  | # v4translated | 
| 420 | 0 |  |  |  |  | 0 | return "::ffff:0:" . format_ipv4 substr $_[0], 12; | 
| 421 |  |  |  |  |  |  | } | 
| 422 |  |  |  |  |  |  | } | 
| 423 |  |  |  |  |  |  |  | 
| 424 | 0 |  |  |  |  | 0 | my $ip = sprintf "%x:%x:%x:%x:%x:%x:%x:%x", unpack "n8", $_[0]; | 
| 425 |  |  |  |  |  |  |  | 
| 426 |  |  |  |  |  |  | # this is admittedly rather sucky | 
| 427 | 0 | 0 | 0 |  |  | 0 | $ip =~ s/(?:^|:) 0:0:0:0:0:0:0 (?:$|:)/::/x | 
|  |  |  | 0 |  |  |  |  | 
|  |  |  | 0 |  |  |  |  | 
|  |  |  | 0 |  |  |  |  | 
| 428 |  |  |  |  |  |  | or $ip =~ s/(?:^|:)   0:0:0:0:0:0 (?:$|:)/::/x | 
| 429 |  |  |  |  |  |  | or $ip =~ s/(?:^|:)     0:0:0:0:0 (?:$|:)/::/x | 
| 430 |  |  |  |  |  |  | or $ip =~ s/(?:^|:)       0:0:0:0 (?:$|:)/::/x | 
| 431 |  |  |  |  |  |  | or $ip =~ s/(?:^|:)         0:0:0 (?:$|:)/::/x | 
| 432 |  |  |  |  |  |  | or $ip =~ s/(?:^|:)           0:0 (?:$|:)/::/x; | 
| 433 |  |  |  |  |  |  |  | 
| 434 | 0 |  |  |  |  | 0 | $ip | 
| 435 |  |  |  |  |  |  | } | 
| 436 |  |  |  |  |  |  |  | 
| 437 |  |  |  |  |  |  | sub format_address($) { | 
| 438 | 20 | 50 |  | 20 | 1 | 62 | if (4 == length $_[0]) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 439 | 20 |  |  |  |  | 40 | return &format_ipv4; | 
| 440 |  |  |  |  |  |  | } elsif (16 == length $_[0]) { | 
| 441 | 0 | 0 |  |  |  | 0 | return $_[0] =~ /^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff(....)$/s | 
| 442 |  |  |  |  |  |  | ? format_ipv4 $1 | 
| 443 |  |  |  |  |  |  | : &format_ipv6; | 
| 444 |  |  |  |  |  |  | } elsif (AF_UNIX == address_family $_[0]) { | 
| 445 | 0 |  |  |  |  | 0 | return "unix/" | 
| 446 |  |  |  |  |  |  | } else { | 
| 447 |  |  |  |  |  |  | return undef | 
| 448 | 0 |  |  |  |  | 0 | } | 
| 449 |  |  |  |  |  |  | } | 
| 450 |  |  |  |  |  |  |  | 
| 451 |  |  |  |  |  |  | *ntoa = \&format_address; | 
| 452 |  |  |  |  |  |  |  | 
| 453 |  |  |  |  |  |  | =item inet_aton $name_or_address, $cb->(@addresses) | 
| 454 |  |  |  |  |  |  |  | 
| 455 |  |  |  |  |  |  | Works similarly to its Socket counterpart, except that it uses a | 
| 456 |  |  |  |  |  |  | callback. Use the length to distinguish between ipv4 and ipv6 (4 octets | 
| 457 |  |  |  |  |  |  | for IPv4, 16 for IPv6), or use C to convert it to a more | 
| 458 |  |  |  |  |  |  | readable format. | 
| 459 |  |  |  |  |  |  |  | 
| 460 |  |  |  |  |  |  | Note that C, while initially a more complex interface, | 
| 461 |  |  |  |  |  |  | resolves host addresses, IDNs, service names and SRV records and gives you | 
| 462 |  |  |  |  |  |  | an ordered list of socket addresses to try and should be preferred over | 
| 463 |  |  |  |  |  |  | C. | 
| 464 |  |  |  |  |  |  |  | 
| 465 |  |  |  |  |  |  | Example. | 
| 466 |  |  |  |  |  |  |  | 
| 467 |  |  |  |  |  |  | inet_aton "www.google.com", my $cv = AE::cv; | 
| 468 |  |  |  |  |  |  | say unpack "H*", $_ | 
| 469 |  |  |  |  |  |  | for $cv->recv; | 
| 470 |  |  |  |  |  |  | # => d155e363 | 
| 471 |  |  |  |  |  |  | # => d155e367 etc. | 
| 472 |  |  |  |  |  |  |  | 
| 473 |  |  |  |  |  |  | inet_aton "ipv6.google.com", my $cv = AE::cv; | 
| 474 |  |  |  |  |  |  | say unpack "H*", $_ | 
| 475 |  |  |  |  |  |  | for $cv->recv; | 
| 476 |  |  |  |  |  |  | # => 20014860a00300000000000000000068 | 
| 477 |  |  |  |  |  |  |  | 
| 478 |  |  |  |  |  |  | =cut | 
| 479 |  |  |  |  |  |  |  | 
| 480 |  |  |  |  |  |  | sub inet_aton { | 
| 481 | 0 |  |  | 0 | 1 | 0 | my ($name, $cb) = @_; | 
| 482 |  |  |  |  |  |  |  | 
| 483 | 0 | 0 |  |  |  | 0 | if (my $ipn = &parse_ipv4) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 484 | 0 |  |  |  |  | 0 | $cb->($ipn); | 
| 485 |  |  |  |  |  |  | } elsif (my $ipn = &parse_ipv6) { | 
| 486 | 0 |  |  |  |  | 0 | $cb->($ipn); | 
| 487 |  |  |  |  |  |  | } elsif ($name eq "localhost") { # rfc2606 et al. | 
| 488 | 0 |  |  |  |  | 0 | $cb->(v127.0.0.1, v0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1); | 
| 489 |  |  |  |  |  |  | } else { | 
| 490 | 0 | 0 |  |  |  | 0 | require AnyEvent::DNS unless $AnyEvent::DNS::VERSION; | 
| 491 |  |  |  |  |  |  |  | 
| 492 | 0 |  |  |  |  | 0 | my $ipv4 = $AnyEvent::PROTOCOL{ipv4}; | 
| 493 | 0 |  |  |  |  | 0 | my $ipv6 = $AnyEvent::PROTOCOL{ipv6}; | 
| 494 |  |  |  |  |  |  |  | 
| 495 | 0 |  |  |  |  | 0 | my @res; | 
| 496 |  |  |  |  |  |  |  | 
| 497 |  |  |  |  |  |  | my $cv = AE::cv { | 
| 498 | 0 |  |  | 0 |  | 0 | $cb->(map @$_, reverse @res); | 
| 499 | 0 |  |  |  |  | 0 | }; | 
| 500 |  |  |  |  |  |  |  | 
| 501 | 0 |  |  |  |  | 0 | $cv->begin; | 
| 502 |  |  |  |  |  |  |  | 
| 503 | 0 | 0 |  |  |  | 0 | if ($ipv4) { | 
| 504 | 0 |  |  |  |  | 0 | $cv->begin; | 
| 505 |  |  |  |  |  |  | AnyEvent::DNS::a ($name, sub { | 
| 506 | 0 |  |  | 0 |  | 0 | $res[$ipv4] = [map { parse_ipv4 $_ } @_]; | 
|  | 0 |  |  |  |  | 0 |  | 
| 507 | 0 |  |  |  |  | 0 | $cv->end; | 
| 508 | 0 |  |  |  |  | 0 | }); | 
| 509 |  |  |  |  |  |  | }; | 
| 510 |  |  |  |  |  |  |  | 
| 511 | 0 | 0 |  |  |  | 0 | if ($ipv6) { | 
| 512 | 0 |  |  |  |  | 0 | $cv->begin; | 
| 513 |  |  |  |  |  |  | AnyEvent::DNS::aaaa ($name, sub { | 
| 514 | 0 |  |  | 0 |  | 0 | $res[$ipv6] = [map { parse_ipv6 $_ } @_]; | 
|  | 0 |  |  |  |  | 0 |  | 
| 515 | 0 |  |  |  |  | 0 | $cv->end; | 
| 516 | 0 |  |  |  |  | 0 | }); | 
| 517 |  |  |  |  |  |  | }; | 
| 518 |  |  |  |  |  |  |  | 
| 519 | 0 |  |  |  |  | 0 | $cv->end; | 
| 520 |  |  |  |  |  |  | } | 
| 521 |  |  |  |  |  |  | } | 
| 522 |  |  |  |  |  |  |  | 
| 523 |  |  |  |  |  |  | BEGIN { | 
| 524 |  |  |  |  |  |  | *sockaddr_family = $Socket::VERSION >= 1.75 | 
| 525 |  |  |  |  |  |  | ? \&Socket::sockaddr_family | 
| 526 |  |  |  |  |  |  | : # for 5.6.x, we need to do something much more horrible | 
| 527 |  |  |  |  |  |  | (Socket::pack_sockaddr_in 0x5555, "\x55\x55\x55\x55" | 
| 528 | 0 |  |  |  |  | 0 | | eval { Socket::pack_sockaddr_un "U" }) =~ /^\x00/ | 
| 529 | 0 |  |  |  |  | 0 | ? sub { unpack "xC", $_[0] } | 
| 530 | 8 | 0 |  | 8 |  | 28631 | : sub { unpack "S" , $_[0] }; | 
|  | 0 | 50 |  |  |  | 0 |  | 
| 531 |  |  |  |  |  |  | } | 
| 532 |  |  |  |  |  |  |  | 
| 533 |  |  |  |  |  |  | # check for broken platforms with an extra field in sockaddr structure | 
| 534 |  |  |  |  |  |  | # kind of a rfc vs. bsd issue, as usual (ok, normally it's a | 
| 535 |  |  |  |  |  |  | # unix vs. bsd issue, a iso C vs. bsd issue or simply a | 
| 536 |  |  |  |  |  |  | # correctness vs. bsd issue.) | 
| 537 |  |  |  |  |  |  | my $pack_family = 0x55 == sockaddr_family ("\x55\x55") | 
| 538 |  |  |  |  |  |  | ? "xC" : "S"; | 
| 539 |  |  |  |  |  |  |  | 
| 540 |  |  |  |  |  |  | =item $sa = AnyEvent::Socket::pack_sockaddr $service, $host | 
| 541 |  |  |  |  |  |  |  | 
| 542 |  |  |  |  |  |  | Pack the given port/host combination into a binary sockaddr | 
| 543 |  |  |  |  |  |  | structure. Handles both IPv4 and IPv6 host addresses, as well as UNIX | 
| 544 |  |  |  |  |  |  | domain sockets (C<$host> == C and C<$service> == absolute | 
| 545 |  |  |  |  |  |  | pathname). | 
| 546 |  |  |  |  |  |  |  | 
| 547 |  |  |  |  |  |  | Example: | 
| 548 |  |  |  |  |  |  |  | 
| 549 |  |  |  |  |  |  | my $bind = AnyEvent::Socket::pack_sockaddr 43, v195.234.53.120; | 
| 550 |  |  |  |  |  |  | bind $socket, $bind | 
| 551 |  |  |  |  |  |  | or die "bind: $!"; | 
| 552 |  |  |  |  |  |  |  | 
| 553 |  |  |  |  |  |  | =cut | 
| 554 |  |  |  |  |  |  |  | 
| 555 |  |  |  |  |  |  | sub pack_sockaddr($$) { | 
| 556 | 20 |  |  | 20 | 1 | 55 | my $af = address_family $_[1]; | 
| 557 |  |  |  |  |  |  |  | 
| 558 | 20 | 100 |  |  |  | 52 | if ($af == AF_INET) { | 
|  |  | 50 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 559 | 19 |  |  |  |  | 185 | Socket::pack_sockaddr_in $_[0], $_[1] | 
| 560 |  |  |  |  |  |  | } elsif ($af == AF_INET6) { | 
| 561 | 1 |  |  |  |  | 8 | pack "$pack_family nL a16 L", | 
| 562 |  |  |  |  |  |  | AF_INET6, | 
| 563 |  |  |  |  |  |  | $_[0], # port | 
| 564 |  |  |  |  |  |  | 0,     # flowinfo | 
| 565 |  |  |  |  |  |  | $_[1], # addr | 
| 566 |  |  |  |  |  |  | 0      # scope id | 
| 567 |  |  |  |  |  |  | } elsif ($af == AF_UNIX) { | 
| 568 | 0 |  |  |  |  | 0 | Socket::pack_sockaddr_un $_[0] | 
| 569 |  |  |  |  |  |  | } else { | 
| 570 | 0 |  |  |  |  | 0 | Carp::croak "pack_sockaddr: invalid host"; | 
| 571 |  |  |  |  |  |  | } | 
| 572 |  |  |  |  |  |  | } | 
| 573 |  |  |  |  |  |  |  | 
| 574 |  |  |  |  |  |  | =item ($service, $host) = AnyEvent::Socket::unpack_sockaddr $sa | 
| 575 |  |  |  |  |  |  |  | 
| 576 |  |  |  |  |  |  | Unpack the given binary sockaddr structure (as used by bind, getpeername | 
| 577 |  |  |  |  |  |  | etc.) into a C<$service, $host> combination. | 
| 578 |  |  |  |  |  |  |  | 
| 579 |  |  |  |  |  |  | For IPv4 and IPv6, C<$service> is the port number and C<$host> the host | 
| 580 |  |  |  |  |  |  | address in network format (binary). | 
| 581 |  |  |  |  |  |  |  | 
| 582 |  |  |  |  |  |  | For UNIX domain sockets, C<$service> is the absolute pathname and C<$host> | 
| 583 |  |  |  |  |  |  | is a special token that is understood by the other functions in this | 
| 584 |  |  |  |  |  |  | module (C converts it to C). | 
| 585 |  |  |  |  |  |  |  | 
| 586 |  |  |  |  |  |  | =cut | 
| 587 |  |  |  |  |  |  |  | 
| 588 |  |  |  |  |  |  | # perl contains a bug (imho) where it requires that the kernel always returns | 
| 589 |  |  |  |  |  |  | # sockaddr_un structures of maximum length (which is not, AFAICS, required | 
| 590 |  |  |  |  |  |  | # by any standard). try to 0-pad structures for the benefit of those platforms. | 
| 591 |  |  |  |  |  |  | # unfortunately, the IO::Async author chose to break Socket again in version | 
| 592 |  |  |  |  |  |  | # 2.011 - it now contains a bogus length check, so we disable the workaround. | 
| 593 |  |  |  |  |  |  |  | 
| 594 |  |  |  |  |  |  | my $sa_un_zero = $Socket::VERSION >= 2.011 | 
| 595 |  |  |  |  |  |  | ? "" | 
| 596 |  |  |  |  |  |  | : eval { Socket::pack_sockaddr_un "" }; | 
| 597 |  |  |  |  |  |  |  | 
| 598 |  |  |  |  |  |  | $sa_un_zero ^= $sa_un_zero; | 
| 599 |  |  |  |  |  |  |  | 
| 600 |  |  |  |  |  |  | sub unpack_sockaddr($) { | 
| 601 | 25 |  |  | 25 | 1 | 119 | my $af = sockaddr_family $_[0]; | 
| 602 |  |  |  |  |  |  |  | 
| 603 | 25 | 50 |  |  |  | 72 | if ($af == AF_INET) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 604 | 25 |  |  |  |  | 135 | Socket::unpack_sockaddr_in $_[0] | 
| 605 |  |  |  |  |  |  | } elsif ($af == AF_INET6) { | 
| 606 | 0 |  |  |  |  | 0 | unpack "x2 n x4 a16", $_[0] | 
| 607 |  |  |  |  |  |  | } elsif ($af == AF_UNIX) { | 
| 608 | 0 |  |  |  |  | 0 | ((Socket::unpack_sockaddr_un $_[0] ^ $sa_un_zero), pack "S", AF_UNIX) | 
| 609 |  |  |  |  |  |  | } else { | 
| 610 | 0 |  |  |  |  | 0 | Carp::croak "unpack_sockaddr: unsupported protocol family $af"; | 
| 611 |  |  |  |  |  |  | } | 
| 612 |  |  |  |  |  |  | } | 
| 613 |  |  |  |  |  |  |  | 
| 614 |  |  |  |  |  |  | =item AnyEvent::Socket::resolve_sockaddr $node, $service, $proto, $family, $type, $cb->([$family, $type, $proto, $sockaddr], ...) | 
| 615 |  |  |  |  |  |  |  | 
| 616 |  |  |  |  |  |  | Tries to resolve the given nodename and service name into protocol families | 
| 617 |  |  |  |  |  |  | and sockaddr structures usable to connect to this node and service in a | 
| 618 |  |  |  |  |  |  | protocol-independent way. It works remotely similar to the getaddrinfo | 
| 619 |  |  |  |  |  |  | posix function. | 
| 620 |  |  |  |  |  |  |  | 
| 621 |  |  |  |  |  |  | For internet addresses, C<$node> is either an IPv4 or IPv6 address, an | 
| 622 |  |  |  |  |  |  | internet hostname (DNS domain name or IDN), and C<$service> is either | 
| 623 |  |  |  |  |  |  | a service name (port name from F) or a numerical port | 
| 624 |  |  |  |  |  |  | number. If both C<$node> and C<$service> are names, then SRV records | 
| 625 |  |  |  |  |  |  | will be consulted to find the real service, otherwise they will be | 
| 626 |  |  |  |  |  |  | used as-is. If you know that the service name is not in your services | 
| 627 |  |  |  |  |  |  | database, then you can specify the service in the format C | 
| 628 |  |  |  |  |  |  | (e.g. C). | 
| 629 |  |  |  |  |  |  |  | 
| 630 |  |  |  |  |  |  | If a host cannot be found via DNS, then it will be looked up in | 
| 631 |  |  |  |  |  |  | F (or the file specified via C<< $ENV{PERL_ANYEVENT_HOSTS} | 
| 632 |  |  |  |  |  |  | >>). If they are found, the addresses there will be used. The effect is as | 
| 633 |  |  |  |  |  |  | if entries from F would yield C and C records for the | 
| 634 |  |  |  |  |  |  | host name unless DNS already had records for them. | 
| 635 |  |  |  |  |  |  |  | 
| 636 |  |  |  |  |  |  | For UNIX domain sockets, C<$node> must be the string C and | 
| 637 |  |  |  |  |  |  | C<$service> must be the absolute pathname of the socket. In this case, | 
| 638 |  |  |  |  |  |  | C<$proto> will be ignored. | 
| 639 |  |  |  |  |  |  |  | 
| 640 |  |  |  |  |  |  | C<$proto> must be a protocol name, currently C, C or | 
| 641 |  |  |  |  |  |  | C. The default is currently C, but in the future, this function | 
| 642 |  |  |  |  |  |  | might try to use other protocols such as C, depending on the socket | 
| 643 |  |  |  |  |  |  | type and any SRV records it might find. | 
| 644 |  |  |  |  |  |  |  | 
| 645 |  |  |  |  |  |  | C<$family> must be either C<0> (meaning any protocol is OK), C<4> (use | 
| 646 |  |  |  |  |  |  | only IPv4) or C<6> (use only IPv6). The default is influenced by | 
| 647 |  |  |  |  |  |  | C<$ENV{PERL_ANYEVENT_PROTOCOLS}>. | 
| 648 |  |  |  |  |  |  |  | 
| 649 |  |  |  |  |  |  | C<$type> must be C, C or C (or | 
| 650 |  |  |  |  |  |  | C in which case it gets automatically chosen to be C | 
| 651 |  |  |  |  |  |  | unless C<$proto> is C). | 
| 652 |  |  |  |  |  |  |  | 
| 653 |  |  |  |  |  |  | The callback will receive zero or more array references that contain | 
| 654 |  |  |  |  |  |  | C<$family, $type, $proto> for use in C and a binary | 
| 655 |  |  |  |  |  |  | C<$sockaddr> for use in C (or C). | 
| 656 |  |  |  |  |  |  |  | 
| 657 |  |  |  |  |  |  | The application should try these in the order given. | 
| 658 |  |  |  |  |  |  |  | 
| 659 |  |  |  |  |  |  | Example: | 
| 660 |  |  |  |  |  |  |  | 
| 661 |  |  |  |  |  |  | resolve_sockaddr "google.com", "http", 0, undef, undef, sub { ... }; | 
| 662 |  |  |  |  |  |  |  | 
| 663 |  |  |  |  |  |  | =cut | 
| 664 |  |  |  |  |  |  |  | 
| 665 |  |  |  |  |  |  | our %HOSTS;          # $HOSTS{$nodename}[$ipv6] = [@aliases...] | 
| 666 |  |  |  |  |  |  | our @HOSTS_CHECKING; # callbacks to call when hosts have been loaded | 
| 667 |  |  |  |  |  |  | our $HOSTS_MTIME; | 
| 668 |  |  |  |  |  |  |  | 
| 669 |  |  |  |  |  |  | sub _parse_hosts($) { | 
| 670 | 1 |  |  | 1 |  | 4 | %HOSTS = (); | 
| 671 |  |  |  |  |  |  |  | 
| 672 | 1 |  |  |  |  | 6 | for (split /\n/, $_[0]) { | 
| 673 | 1 |  |  |  |  | 5 | s/#.*$//; | 
| 674 | 1 |  |  |  |  | 6 | s/^[ \t]+//; | 
| 675 | 1 |  |  |  |  | 4 | y/A-Z/a-z/; | 
| 676 |  |  |  |  |  |  |  | 
| 677 | 1 |  |  |  |  | 9 | my ($addr, @aliases) = split /[ \t]+/; | 
| 678 | 1 | 50 |  |  |  | 4 | next unless @aliases; | 
| 679 |  |  |  |  |  |  |  | 
| 680 | 1 | 50 |  |  |  | 4 | if (my $ip = parse_ipv4 $addr) { | 
|  |  | 0 |  |  |  |  |  | 
| 681 | 1 |  |  |  |  | 2 | ($ip) = $ip =~ /^(.*)$/s if AnyEvent::TAINT; | 
| 682 | 1 |  |  |  |  | 7 | push @{ $HOSTS{$_}[0] }, $ip | 
| 683 | 1 |  |  |  |  | 4 | for @aliases; | 
| 684 |  |  |  |  |  |  | } elsif (my $ip = parse_ipv6 $addr) { | 
| 685 | 0 |  |  |  |  | 0 | ($ip) = $ip =~ /^(.*)$/s if AnyEvent::TAINT; | 
| 686 | 0 |  |  |  |  | 0 | push @{ $HOSTS{$_}[1] }, $ip | 
| 687 | 0 |  |  |  |  | 0 | for @aliases; | 
| 688 |  |  |  |  |  |  | } | 
| 689 |  |  |  |  |  |  | } | 
| 690 |  |  |  |  |  |  | } | 
| 691 |  |  |  |  |  |  |  | 
| 692 |  |  |  |  |  |  | # helper function - unless dns delivered results, check and parse hosts, then call continuation code | 
| 693 |  |  |  |  |  |  | sub _load_hosts_unless(&$@) { | 
| 694 | 4 |  |  | 4 |  | 11 | my ($cont, $cv, @dns) = @_; | 
| 695 |  |  |  |  |  |  |  | 
| 696 | 4 | 50 |  |  |  | 12 | if (@dns) { | 
| 697 | 0 |  |  |  |  | 0 | $cv->end; | 
| 698 |  |  |  |  |  |  | } else { | 
| 699 |  |  |  |  |  |  | my $etc_hosts = length $ENV{PERL_ANYEVENT_HOSTS} ? $ENV{PERL_ANYEVENT_HOSTS} | 
| 700 | 4 | 50 |  |  |  | 18 | : AnyEvent::WIN32                ? "$ENV{SystemRoot}/system32/drivers/etc/hosts" | 
| 701 |  |  |  |  |  |  | :                                  "/etc/hosts"; | 
| 702 |  |  |  |  |  |  |  | 
| 703 |  |  |  |  |  |  | push @HOSTS_CHECKING, sub { | 
| 704 | 4 |  |  | 4 |  | 14 | $cont->(); | 
| 705 | 4 |  |  |  |  | 20 | $cv->end; | 
| 706 | 4 |  |  |  |  | 15 | }; | 
| 707 |  |  |  |  |  |  |  | 
| 708 | 4 | 50 |  |  |  | 20 | unless ($#HOSTS_CHECKING) { | 
| 709 |  |  |  |  |  |  | # we are not the first, so we actually have to do the work | 
| 710 | 4 |  |  |  |  | 40 | require AnyEvent::IO; | 
| 711 |  |  |  |  |  |  |  | 
| 712 |  |  |  |  |  |  | AnyEvent::IO::aio_stat ($etc_hosts, sub { | 
| 713 | 4 | 100 |  | 4 |  | 26 | if ((stat _)[9] ne $HOSTS_MTIME) { | 
| 714 | 1 |  |  |  |  | 9 | AE::log 8 => "(re)loading $etc_hosts."; | 
| 715 | 1 |  |  |  |  | 3 | $HOSTS_MTIME = (stat _)[9]; | 
| 716 |  |  |  |  |  |  | # we might load a newer version of hosts,but that's a harmless race, | 
| 717 |  |  |  |  |  |  | # as the next call will just load it again. | 
| 718 |  |  |  |  |  |  | AnyEvent::IO::aio_load ($etc_hosts, sub { | 
| 719 | 1 |  |  |  |  | 7 | _parse_hosts $_[0]; | 
| 720 | 1 |  |  |  |  | 19 | (shift @HOSTS_CHECKING)->() while @HOSTS_CHECKING; | 
| 721 | 1 |  |  |  |  | 7 | }); | 
| 722 |  |  |  |  |  |  | } else { | 
| 723 | 3 |  |  |  |  | 14 | (shift @HOSTS_CHECKING)->() while @HOSTS_CHECKING; | 
| 724 |  |  |  |  |  |  | } | 
| 725 | 4 |  |  |  |  | 45 | }); | 
| 726 |  |  |  |  |  |  | } | 
| 727 |  |  |  |  |  |  | } | 
| 728 |  |  |  |  |  |  | } | 
| 729 |  |  |  |  |  |  |  | 
| 730 |  |  |  |  |  |  | sub resolve_sockaddr($$$$$$) { | 
| 731 | 8 |  |  | 8 | 1 | 43 | my ($node, $service, $proto, $family, $type, $cb) = @_; | 
| 732 |  |  |  |  |  |  |  | 
| 733 | 8 | 50 |  |  |  | 28 | if ($node eq "unix/") { | 
| 734 | 0 | 0 | 0 |  |  | 0 | return $cb->() if $family || $service !~ /^\//; # no can do | 
| 735 |  |  |  |  |  |  |  | 
| 736 | 0 | 0 |  |  |  | 0 | return $cb->([AF_UNIX, defined $type ? $type : SOCK_STREAM, 0, Socket::pack_sockaddr_un $service]); | 
| 737 |  |  |  |  |  |  | } | 
| 738 |  |  |  |  |  |  |  | 
| 739 | 8 |  |  |  |  | 16 | unless (AF_INET6) { | 
| 740 |  |  |  |  |  |  | $family != 6 | 
| 741 |  |  |  |  |  |  | or return $cb->(); | 
| 742 |  |  |  |  |  |  |  | 
| 743 |  |  |  |  |  |  | $family = 4; | 
| 744 |  |  |  |  |  |  | } | 
| 745 |  |  |  |  |  |  |  | 
| 746 | 8 | 50 | 33 |  |  | 29 | $cb->() if $family == 4 && !$AnyEvent::PROTOCOL{ipv4}; | 
| 747 | 8 | 50 | 33 |  |  | 24 | $cb->() if $family == 6 && !$AnyEvent::PROTOCOL{ipv6}; | 
| 748 |  |  |  |  |  |  |  | 
| 749 | 8 | 50 | 0 |  |  | 30 | $family ||= 4 unless $AnyEvent::PROTOCOL{ipv6}; | 
| 750 | 8 | 50 | 0 |  |  | 20 | $family ||= 6 unless $AnyEvent::PROTOCOL{ipv4}; | 
| 751 |  |  |  |  |  |  |  | 
| 752 | 8 |  | 50 |  |  | 52 | $proto ||= "tcp"; | 
| 753 | 8 | 50 | 33 |  |  | 45 | $type  ||= $proto eq "udp" ? SOCK_DGRAM : SOCK_STREAM; | 
| 754 |  |  |  |  |  |  |  | 
| 755 | 8 | 50 |  |  |  | 37 | my $proton = AnyEvent::Socket::getprotobyname $proto | 
| 756 |  |  |  |  |  |  | or Carp::croak "$proto: protocol unknown"; | 
| 757 |  |  |  |  |  |  |  | 
| 758 | 8 |  |  |  |  | 19 | my $port; | 
| 759 |  |  |  |  |  |  |  | 
| 760 | 8 | 50 |  |  |  | 60 | if ($service =~ /^(\S+)=(\d+)$/) { | 
|  |  | 50 |  |  |  |  |  | 
| 761 | 0 |  |  |  |  | 0 | ($service, $port) = ($1, $2); | 
| 762 |  |  |  |  |  |  | } elsif ($service =~ /^\d+$/) { | 
| 763 | 8 |  |  |  |  | 28 | ($service, $port) = (undef, $service); | 
| 764 |  |  |  |  |  |  | } else { | 
| 765 | 0 | 0 |  |  |  | 0 | $port = (getservbyname $service, $proto)[2] | 
| 766 |  |  |  |  |  |  | or Carp::croak "$service/$proto: service unknown"; | 
| 767 |  |  |  |  |  |  | } | 
| 768 |  |  |  |  |  |  |  | 
| 769 |  |  |  |  |  |  | # resolve a records / provide sockaddr structures | 
| 770 |  |  |  |  |  |  | my $resolve = sub { | 
| 771 | 8 |  |  | 8 |  | 20 | my @target = @_; | 
| 772 |  |  |  |  |  |  |  | 
| 773 | 8 |  |  |  |  | 13 | my @res; | 
| 774 |  |  |  |  |  |  | my $cv = AE::cv { | 
| 775 |  |  |  |  |  |  | $cb->( | 
| 776 |  |  |  |  |  |  | map $_->[2], | 
| 777 |  |  |  |  |  |  | sort { | 
| 778 | 8 | 50 |  |  |  | 72 | $AnyEvent::PROTOCOL{$b->[1]} <=> $AnyEvent::PROTOCOL{$a->[1]} | 
|  | 1 |  |  |  |  | 17 |  | 
| 779 |  |  |  |  |  |  | or $a->[0] <=> $b->[0] | 
| 780 |  |  |  |  |  |  | } | 
| 781 |  |  |  |  |  |  | @res | 
| 782 |  |  |  |  |  |  | ) | 
| 783 | 8 |  |  |  |  | 214 | }; | 
| 784 |  |  |  |  |  |  |  | 
| 785 | 8 |  |  |  |  | 61 | $cv->begin; | 
| 786 | 8 |  |  |  |  | 28 | for my $idx (0 .. $#target) { | 
| 787 | 9 |  |  |  |  | 14 | my ($node, $port) = @{ $target[$idx] }; | 
|  | 9 |  |  |  |  | 27 |  | 
| 788 |  |  |  |  |  |  |  | 
| 789 | 9 | 100 |  |  |  | 37 | if (my $noden = parse_address $node) { | 
| 790 | 7 |  |  |  |  | 18 | my $af = address_family $noden; | 
| 791 |  |  |  |  |  |  |  | 
| 792 | 7 | 100 | 66 |  |  | 44 | if ($af == AF_INET && $family != 6) { | 
| 793 | 6 |  |  |  |  | 23 | push @res, [$idx, "ipv4", [AF_INET, $type, $proton, | 
| 794 |  |  |  |  |  |  | pack_sockaddr $port, $noden]] | 
| 795 |  |  |  |  |  |  | } | 
| 796 |  |  |  |  |  |  |  | 
| 797 | 7 | 100 | 66 |  |  | 34 | if ($af == AF_INET6 && $family != 4) { | 
| 798 | 1 |  |  |  |  | 4 | push @res, [$idx, "ipv6", [AF_INET6, $type, $proton, | 
| 799 |  |  |  |  |  |  | pack_sockaddr $port, $noden]] | 
| 800 |  |  |  |  |  |  | } | 
| 801 |  |  |  |  |  |  | } else { | 
| 802 | 2 |  |  |  |  | 6 | $node =~ y/A-Z/a-z/; | 
| 803 |  |  |  |  |  |  |  | 
| 804 |  |  |  |  |  |  | # a records | 
| 805 | 2 | 50 |  |  |  | 5 | if ($family != 6) { | 
| 806 | 2 |  |  |  |  | 9 | $cv->begin; | 
| 807 |  |  |  |  |  |  | AnyEvent::DNS::a $node, sub { | 
| 808 |  |  |  |  |  |  | push @res, [$idx, "ipv4", [AF_INET, $type, $proton, pack_sockaddr $port, parse_ipv4 $_]] | 
| 809 | 2 |  |  |  |  | 9 | for @_; | 
| 810 |  |  |  |  |  |  |  | 
| 811 |  |  |  |  |  |  | # dns takes precedence over hosts | 
| 812 |  |  |  |  |  |  | _load_hosts_unless { | 
| 813 |  |  |  |  |  |  | push @res, | 
| 814 |  |  |  |  |  |  | map [$idx, "ipv4", [AF_INET, $type, $proton, pack_sockaddr $port, $_]], | 
| 815 | 2 |  | 50 |  |  | 5 | @{ ($HOSTS{$node} || [])->[0] }; | 
|  | 2 |  |  |  |  | 18 |  | 
| 816 | 2 |  |  |  |  | 26 | } $cv, @_; | 
| 817 | 2 |  |  |  |  | 13 | }; | 
| 818 |  |  |  |  |  |  | } | 
| 819 |  |  |  |  |  |  |  | 
| 820 |  |  |  |  |  |  | # aaaa records | 
| 821 | 2 | 50 |  |  |  | 8 | if ($family != 4) { | 
| 822 | 2 |  |  |  |  | 9 | $cv->begin; | 
| 823 |  |  |  |  |  |  | AnyEvent::DNS::aaaa $node, sub { | 
| 824 |  |  |  |  |  |  | push @res, [$idx, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, parse_ipv6 $_]] | 
| 825 | 2 |  |  |  |  | 12 | for @_; | 
| 826 |  |  |  |  |  |  |  | 
| 827 |  |  |  |  |  |  | _load_hosts_unless { | 
| 828 |  |  |  |  |  |  | push @res, | 
| 829 |  |  |  |  |  |  | map [$idx + 0.5, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, $_]], | 
| 830 | 2 |  | 50 |  |  | 4 | @{ ($HOSTS{$node} || [])->[1] } | 
|  | 2 |  |  |  |  | 25 |  | 
| 831 | 2 |  |  |  |  | 23 | } $cv, @_; | 
| 832 | 2 |  |  |  |  | 16 | }; | 
| 833 |  |  |  |  |  |  | } | 
| 834 |  |  |  |  |  |  | } | 
| 835 |  |  |  |  |  |  | } | 
| 836 | 8 |  |  |  |  | 55 | $cv->end; | 
| 837 | 8 |  |  |  |  | 63 | }; | 
| 838 |  |  |  |  |  |  |  | 
| 839 | 8 | 50 |  |  |  | 40 | $node = AnyEvent::Util::idn_to_ascii $node | 
| 840 |  |  |  |  |  |  | if $node =~ /[^\x00-\x7f]/; | 
| 841 |  |  |  |  |  |  |  | 
| 842 |  |  |  |  |  |  | # try srv records, if applicable | 
| 843 | 8 | 100 | 33 |  |  | 59 | if ($node eq "localhost") { | 
|  |  | 50 |  |  |  |  |  | 
| 844 | 1 |  |  |  |  | 5 | $resolve->(["127.0.0.1", $port], ["::1", $port]); | 
| 845 |  |  |  |  |  |  | } elsif (defined $service && !parse_address $node) { | 
| 846 |  |  |  |  |  |  | AnyEvent::DNS::srv $service, $proto, $node, sub { | 
| 847 | 0 |  |  | 0 |  | 0 | my (@srv) = @_; | 
| 848 |  |  |  |  |  |  |  | 
| 849 | 0 | 0 |  |  |  | 0 | if (@srv) { | 
| 850 |  |  |  |  |  |  | # the only srv record has "." ("" here) => abort | 
| 851 | 0 | 0 | 0 |  |  | 0 | $srv[0][2] ne "" || $#srv | 
| 852 |  |  |  |  |  |  | or return $cb->(); | 
| 853 |  |  |  |  |  |  |  | 
| 854 |  |  |  |  |  |  | # use srv records then | 
| 855 | 0 |  |  |  |  | 0 | $resolve->( | 
| 856 |  |  |  |  |  |  | map ["$_->[3].", $_->[2]], | 
| 857 |  |  |  |  |  |  | grep $_->[3] ne ".", | 
| 858 |  |  |  |  |  |  | @srv | 
| 859 |  |  |  |  |  |  | ); | 
| 860 |  |  |  |  |  |  | } else { | 
| 861 |  |  |  |  |  |  | # no srv records, continue traditionally | 
| 862 | 0 |  |  |  |  | 0 | $resolve->([$node, $port]); | 
| 863 |  |  |  |  |  |  | } | 
| 864 | 0 |  |  |  |  | 0 | }; | 
| 865 |  |  |  |  |  |  | } else { | 
| 866 |  |  |  |  |  |  | # most common case | 
| 867 | 7 |  |  |  |  | 20 | $resolve->([$node, $port]); | 
| 868 |  |  |  |  |  |  | } | 
| 869 |  |  |  |  |  |  | } | 
| 870 |  |  |  |  |  |  |  | 
| 871 |  |  |  |  |  |  | =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb] | 
| 872 |  |  |  |  |  |  |  | 
| 873 |  |  |  |  |  |  | This is a convenience function that creates a TCP socket and makes a | 
| 874 |  |  |  |  |  |  | 100% non-blocking connect to the given C<$host> (which can be a DNS/IDN | 
| 875 |  |  |  |  |  |  | hostname or a textual IP address, or the string C for UNIX domain | 
| 876 |  |  |  |  |  |  | sockets) and C<$service> (which can be a numeric port number or a service | 
| 877 |  |  |  |  |  |  | name, or a C string, or the pathname to a UNIX | 
| 878 |  |  |  |  |  |  | domain socket). | 
| 879 |  |  |  |  |  |  |  | 
| 880 |  |  |  |  |  |  | If both C<$host> and C<$port> are names, then this function will use SRV | 
| 881 |  |  |  |  |  |  | records to locate the real target(s). | 
| 882 |  |  |  |  |  |  |  | 
| 883 |  |  |  |  |  |  | In either case, it will create a list of target hosts (e.g. for multihomed | 
| 884 |  |  |  |  |  |  | hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to | 
| 885 |  |  |  |  |  |  | each in turn. | 
| 886 |  |  |  |  |  |  |  | 
| 887 |  |  |  |  |  |  | After the connection is established, then the C<$connect_cb> will be | 
| 888 |  |  |  |  |  |  | invoked with the socket file handle (in non-blocking mode) as first, and | 
| 889 |  |  |  |  |  |  | the peer host (as a textual IP address) and peer port as second and third | 
| 890 |  |  |  |  |  |  | arguments, respectively. The fourth argument is a code reference that you | 
| 891 |  |  |  |  |  |  | can call if, for some reason, you don't like this connection, which will | 
| 892 |  |  |  |  |  |  | cause C to try the next one (or call your callback without | 
| 893 |  |  |  |  |  |  | any arguments if there are no more connections). In most cases, you can | 
| 894 |  |  |  |  |  |  | simply ignore this argument. | 
| 895 |  |  |  |  |  |  |  | 
| 896 |  |  |  |  |  |  | $cb->($filehandle, $host, $port, $retry) | 
| 897 |  |  |  |  |  |  |  | 
| 898 |  |  |  |  |  |  | If the connect is unsuccessful, then the C<$connect_cb> will be invoked | 
| 899 |  |  |  |  |  |  | without any arguments and C<$!> will be set appropriately (with C | 
| 900 |  |  |  |  |  |  | indicating a DNS resolution failure). | 
| 901 |  |  |  |  |  |  |  | 
| 902 |  |  |  |  |  |  | The callback will I be invoked before C returns, even | 
| 903 |  |  |  |  |  |  | if C was able to connect immediately (e.g. on unix domain | 
| 904 |  |  |  |  |  |  | sockets). | 
| 905 |  |  |  |  |  |  |  | 
| 906 |  |  |  |  |  |  | The file handle is perfect for being plugged into L, but | 
| 907 |  |  |  |  |  |  | can be used as a normal perl file handle as well. | 
| 908 |  |  |  |  |  |  |  | 
| 909 |  |  |  |  |  |  | Unless called in void context, C returns a guard object that | 
| 910 |  |  |  |  |  |  | will automatically cancel the connection attempt when it gets destroyed | 
| 911 |  |  |  |  |  |  | - in which case the callback will not be invoked. Destroying it does not | 
| 912 |  |  |  |  |  |  | do anything to the socket after the connect was successful - you cannot | 
| 913 |  |  |  |  |  |  | "uncall" a callback that has been invoked already. | 
| 914 |  |  |  |  |  |  |  | 
| 915 |  |  |  |  |  |  | Sometimes you need to "prepare" the socket before connecting, for example, | 
| 916 |  |  |  |  |  |  | to C it to some port, or you want a specific connect timeout that | 
| 917 |  |  |  |  |  |  | is lower than your kernel's default timeout. In this case you can specify | 
| 918 |  |  |  |  |  |  | a second callback, C<$prepare_cb>. It will be called with the file handle | 
| 919 |  |  |  |  |  |  | in not-yet-connected state as only argument and must return the connection | 
| 920 |  |  |  |  |  |  | timeout value (or C<0>, C or the empty list to indicate the default | 
| 921 |  |  |  |  |  |  | timeout is to be used). | 
| 922 |  |  |  |  |  |  |  | 
| 923 |  |  |  |  |  |  | Note to the poor Microsoft Windows users: Windows (of course) doesn't | 
| 924 |  |  |  |  |  |  | correctly signal connection errors, so unless your event library works | 
| 925 |  |  |  |  |  |  | around this, failed connections will simply hang. The only event libraries | 
| 926 |  |  |  |  |  |  | that handle this condition correctly are L and L. Additionally, | 
| 927 |  |  |  |  |  |  | AnyEvent works around this bug with L and in its pure-perl | 
| 928 |  |  |  |  |  |  | backend. All other libraries cannot correctly handle this condition. To | 
| 929 |  |  |  |  |  |  | lessen the impact of this windows bug, a default timeout of 30 seconds | 
| 930 |  |  |  |  |  |  | will be imposed on windows. Cygwin is not affected. | 
| 931 |  |  |  |  |  |  |  | 
| 932 |  |  |  |  |  |  | Simple Example: connect to localhost on port 22. | 
| 933 |  |  |  |  |  |  |  | 
| 934 |  |  |  |  |  |  | tcp_connect localhost => 22, sub { | 
| 935 |  |  |  |  |  |  | my $fh = shift | 
| 936 |  |  |  |  |  |  | or die "unable to connect: $!"; | 
| 937 |  |  |  |  |  |  | # do something | 
| 938 |  |  |  |  |  |  | }; | 
| 939 |  |  |  |  |  |  |  | 
| 940 |  |  |  |  |  |  | Complex Example: connect to www.google.com on port 80 and make a simple | 
| 941 |  |  |  |  |  |  | GET request without much error handling. Also limit the connection timeout | 
| 942 |  |  |  |  |  |  | to 15 seconds. | 
| 943 |  |  |  |  |  |  |  | 
| 944 |  |  |  |  |  |  | tcp_connect "www.google.com", "http", | 
| 945 |  |  |  |  |  |  | sub { | 
| 946 |  |  |  |  |  |  | my ($fh) = @_ | 
| 947 |  |  |  |  |  |  | or die "unable to connect: $!"; | 
| 948 |  |  |  |  |  |  |  | 
| 949 |  |  |  |  |  |  | my $handle; # avoid direct assignment so on_eof has it in scope. | 
| 950 |  |  |  |  |  |  | $handle = new AnyEvent::Handle | 
| 951 |  |  |  |  |  |  | fh     => $fh, | 
| 952 |  |  |  |  |  |  | on_error => sub { | 
| 953 |  |  |  |  |  |  | AE::log error => $_[2]; | 
| 954 |  |  |  |  |  |  | $_[0]->destroy; | 
| 955 |  |  |  |  |  |  | }, | 
| 956 |  |  |  |  |  |  | on_eof => sub { | 
| 957 |  |  |  |  |  |  | $handle->destroy; # destroy handle | 
| 958 |  |  |  |  |  |  | AE::log info => "Done."; | 
| 959 |  |  |  |  |  |  | }; | 
| 960 |  |  |  |  |  |  |  | 
| 961 |  |  |  |  |  |  | $handle->push_write ("GET / HTTP/1.0\015\012\015\012"); | 
| 962 |  |  |  |  |  |  |  | 
| 963 |  |  |  |  |  |  | $handle->push_read (line => "\015\012\015\012", sub { | 
| 964 |  |  |  |  |  |  | my ($handle, $line) = @_; | 
| 965 |  |  |  |  |  |  |  | 
| 966 |  |  |  |  |  |  | # print response header | 
| 967 |  |  |  |  |  |  | print "HEADER\n$line\n\nBODY\n"; | 
| 968 |  |  |  |  |  |  |  | 
| 969 |  |  |  |  |  |  | $handle->on_read (sub { | 
| 970 |  |  |  |  |  |  | # print response body | 
| 971 |  |  |  |  |  |  | print $_[0]->rbuf; | 
| 972 |  |  |  |  |  |  | $_[0]->rbuf = ""; | 
| 973 |  |  |  |  |  |  | }); | 
| 974 |  |  |  |  |  |  | }); | 
| 975 |  |  |  |  |  |  | }, sub { | 
| 976 |  |  |  |  |  |  | my ($fh) = @_; | 
| 977 |  |  |  |  |  |  | # could call $fh->bind etc. here | 
| 978 |  |  |  |  |  |  |  | 
| 979 |  |  |  |  |  |  | 15 | 
| 980 |  |  |  |  |  |  | }; | 
| 981 |  |  |  |  |  |  |  | 
| 982 |  |  |  |  |  |  | Example: connect to a UNIX domain socket. | 
| 983 |  |  |  |  |  |  |  | 
| 984 |  |  |  |  |  |  | tcp_connect "unix/", "/tmp/.X11-unix/X0", sub { | 
| 985 |  |  |  |  |  |  | ... | 
| 986 |  |  |  |  |  |  | } | 
| 987 |  |  |  |  |  |  |  | 
| 988 |  |  |  |  |  |  | =cut | 
| 989 |  |  |  |  |  |  |  | 
| 990 |  |  |  |  |  |  | sub tcp_connect($$$;$) { | 
| 991 | 6 |  |  | 6 | 1 | 20 | my ($host, $port, $connect, $prepare) = @_; | 
| 992 |  |  |  |  |  |  |  | 
| 993 |  |  |  |  |  |  | # see http://cr.yp.to/docs/connect.html for some tricky aspects | 
| 994 |  |  |  |  |  |  | # also http://advogato.org/article/672.html | 
| 995 |  |  |  |  |  |  |  | 
| 996 | 6 |  |  |  |  | 18 | my %state = ( fh => undef ); | 
| 997 |  |  |  |  |  |  |  | 
| 998 |  |  |  |  |  |  | # name/service to type/sockaddr resolution | 
| 999 |  |  |  |  |  |  | resolve_sockaddr $host, $port, 0, 0, undef, sub { | 
| 1000 | 6 |  |  | 6 |  | 18 | my @target = @_; | 
| 1001 |  |  |  |  |  |  |  | 
| 1002 |  |  |  |  |  |  | $state{next} = sub { | 
| 1003 | 6 | 50 |  |  |  | 19 | return unless exists $state{fh}; | 
| 1004 |  |  |  |  |  |  |  | 
| 1005 | 6 |  |  |  |  | 47 | my $errno = $!; | 
| 1006 |  |  |  |  |  |  | my $target = shift @target | 
| 1007 |  |  |  |  |  |  | or return AE::postpone { | 
| 1008 | 0 | 0 |  |  |  | 0 | return unless exists $state{fh}; | 
| 1009 | 0 |  |  |  |  | 0 | %state = (); | 
| 1010 | 0 |  |  |  |  | 0 | $! = $errno; | 
| 1011 | 0 |  |  |  |  | 0 | $connect->(); | 
| 1012 | 6 | 50 |  |  |  | 20 | }; | 
| 1013 |  |  |  |  |  |  |  | 
| 1014 | 6 |  |  |  |  | 20 | my ($domain, $type, $proto, $sockaddr) = @$target; | 
| 1015 |  |  |  |  |  |  |  | 
| 1016 |  |  |  |  |  |  | # socket creation | 
| 1017 |  |  |  |  |  |  | socket $state{fh}, $domain, $type, $proto | 
| 1018 | 6 | 50 |  |  |  | 238 | or return $state{next}(); | 
| 1019 |  |  |  |  |  |  |  | 
| 1020 | 6 |  |  |  |  | 37 | AnyEvent::fh_unblock $state{fh}; | 
| 1021 |  |  |  |  |  |  |  | 
| 1022 | 6 |  | 33 |  |  | 49 | my $timeout = $prepare && $prepare->($state{fh}); | 
| 1023 |  |  |  |  |  |  |  | 
| 1024 | 6 |  |  |  |  | 11 | $timeout ||= 30 if AnyEvent::WIN32; | 
| 1025 |  |  |  |  |  |  |  | 
| 1026 |  |  |  |  |  |  | $state{to} = AE::timer $timeout, 0, sub { | 
| 1027 | 0 |  |  |  |  | 0 | $! = Errno::ETIMEDOUT; | 
| 1028 | 0 |  |  |  |  | 0 | $state{next}(); | 
| 1029 | 6 | 50 |  |  |  | 22 | } if $timeout; | 
| 1030 |  |  |  |  |  |  |  | 
| 1031 |  |  |  |  |  |  | # now connect | 
| 1032 | 6 | 50 | 33 |  |  | 626 | if ( | 
|  |  |  | 33 |  |  |  |  | 
|  |  |  | 0 |  |  |  |  | 
|  |  |  | 33 |  |  |  |  | 
| 1033 |  |  |  |  |  |  | (connect $state{fh}, $sockaddr) | 
| 1034 |  |  |  |  |  |  | || ($! == Errno::EINPROGRESS # POSIX | 
| 1035 |  |  |  |  |  |  | || $! == Errno::EWOULDBLOCK | 
| 1036 |  |  |  |  |  |  | # WSAEINPROGRESS intentionally not checked - it means something else entirely | 
| 1037 |  |  |  |  |  |  | || $! == AnyEvent::Util::WSAEINVAL # not convinced, but doesn't hurt | 
| 1038 |  |  |  |  |  |  | || $! == AnyEvent::Util::WSAEWOULDBLOCK) | 
| 1039 |  |  |  |  |  |  | ) { | 
| 1040 |  |  |  |  |  |  | $state{ww} = AE::io $state{fh}, 1, sub { | 
| 1041 |  |  |  |  |  |  | # we are connected, or maybe there was an error | 
| 1042 | 6 | 50 |  |  |  | 83 | if (my $sin = getpeername $state{fh}) { | 
| 1043 | 6 |  |  |  |  | 21 | my ($port, $host) = unpack_sockaddr $sin; | 
| 1044 |  |  |  |  |  |  |  | 
| 1045 | 6 |  |  |  |  | 23 | delete $state{ww}; delete $state{to}; | 
|  | 6 |  |  |  |  | 13 |  | 
| 1046 |  |  |  |  |  |  |  | 
| 1047 | 6 |  |  |  |  | 40 | my $guard = guard { %state = () }; | 
|  | 6 |  |  |  |  | 1948 |  | 
| 1048 |  |  |  |  |  |  |  | 
| 1049 |  |  |  |  |  |  | $connect->(delete $state{fh}, format_address $host, $port, sub { | 
| 1050 | 0 |  |  |  |  | 0 | $guard->cancel; | 
| 1051 | 0 |  |  |  |  | 0 | $state{next}(); | 
| 1052 | 6 |  |  |  |  | 21 | }); | 
| 1053 |  |  |  |  |  |  | } else { | 
| 1054 | 0 | 0 |  |  |  | 0 | if ($! == Errno::ENOTCONN) { | 
| 1055 |  |  |  |  |  |  | # dummy read to fetch real error code if !cygwin | 
| 1056 | 0 |  |  |  |  | 0 | sysread $state{fh}, my $buf, 1; | 
| 1057 |  |  |  |  |  |  |  | 
| 1058 |  |  |  |  |  |  | # cygwin 1.5 continously reports "ready' but never delivers | 
| 1059 |  |  |  |  |  |  | # an error with getpeername or sysread. | 
| 1060 |  |  |  |  |  |  | # cygwin 1.7 only reports readyness *once*, but is otherwise | 
| 1061 |  |  |  |  |  |  | # the same, which is actually more broken. | 
| 1062 |  |  |  |  |  |  | # Work around both by using unportable SO_ERROR for cygwin. | 
| 1063 | 0 |  |  |  |  | 0 | $! = (unpack "l", getsockopt $state{fh}, Socket::SOL_SOCKET(), Socket::SO_ERROR()) || Errno::EAGAIN | 
| 1064 |  |  |  |  |  |  | if AnyEvent::CYGWIN && $! == Errno::EAGAIN; | 
| 1065 |  |  |  |  |  |  | } | 
| 1066 |  |  |  |  |  |  |  | 
| 1067 | 0 | 0 |  |  |  | 0 | return if $! == Errno::EAGAIN; # skip spurious wake-ups | 
| 1068 |  |  |  |  |  |  |  | 
| 1069 | 0 |  |  |  |  | 0 | delete $state{ww}; delete $state{to}; | 
|  | 0 |  |  |  |  | 0 |  | 
| 1070 |  |  |  |  |  |  |  | 
| 1071 | 0 |  |  |  |  | 0 | $state{next}(); | 
| 1072 |  |  |  |  |  |  | } | 
| 1073 | 6 |  |  |  |  | 95 | }; | 
| 1074 |  |  |  |  |  |  | } else { | 
| 1075 | 0 |  |  |  |  | 0 | $state{next}(); | 
| 1076 |  |  |  |  |  |  | } | 
| 1077 | 6 |  |  |  |  | 42 | }; | 
| 1078 |  |  |  |  |  |  |  | 
| 1079 | 6 |  |  |  |  | 18 | $! = Errno::ENXIO; | 
| 1080 | 6 |  |  |  |  | 32 | $state{next}(); | 
| 1081 | 6 |  |  |  |  | 47 | }; | 
| 1082 |  |  |  |  |  |  |  | 
| 1083 | 6 |  |  | 6 |  | 34 | defined wantarray && guard { %state = () } | 
| 1084 | 6 | 50 |  |  |  | 98 | } | 
| 1085 |  |  |  |  |  |  |  | 
| 1086 |  |  |  |  |  |  | =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb] | 
| 1087 |  |  |  |  |  |  |  | 
| 1088 |  |  |  |  |  |  | Create and bind a stream socket to the given host address and port, set | 
| 1089 |  |  |  |  |  |  | the SO_REUSEADDR flag (if applicable) and call C. Unlike the name | 
| 1090 |  |  |  |  |  |  | implies, this function can also bind on UNIX domain sockets. | 
| 1091 |  |  |  |  |  |  |  | 
| 1092 |  |  |  |  |  |  | For internet sockets, C<$host> must be an IPv4 or IPv6 address (or | 
| 1093 |  |  |  |  |  |  | C, in which case it binds either to C<0> or to C<::>, depending | 
| 1094 |  |  |  |  |  |  | on whether IPv4 or IPv6 is the preferred protocol, and maybe to both in | 
| 1095 |  |  |  |  |  |  | future versions, as applicable). | 
| 1096 |  |  |  |  |  |  |  | 
| 1097 |  |  |  |  |  |  | To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6 | 
| 1098 |  |  |  |  |  |  | wildcard address, use C<::>. | 
| 1099 |  |  |  |  |  |  |  | 
| 1100 |  |  |  |  |  |  | The port is specified by C<$service>, which must be either a service name | 
| 1101 |  |  |  |  |  |  | or a numeric port number (or C<0> or C, in which case an ephemeral | 
| 1102 |  |  |  |  |  |  | port will be used). | 
| 1103 |  |  |  |  |  |  |  | 
| 1104 |  |  |  |  |  |  | For UNIX domain sockets, C<$host> must be C and C<$service> must be | 
| 1105 |  |  |  |  |  |  | the absolute pathname of the socket. This function will try to C | 
| 1106 |  |  |  |  |  |  | the socket before it tries to bind to it, and will try to unlink it after | 
| 1107 |  |  |  |  |  |  | it stops using it. See SECURITY CONSIDERATIONS, below. | 
| 1108 |  |  |  |  |  |  |  | 
| 1109 |  |  |  |  |  |  | For each new connection that could be Ced, call the C<< | 
| 1110 |  |  |  |  |  |  | $accept_cb->($fh, $host, $port) >> with the file handle (in non-blocking | 
| 1111 |  |  |  |  |  |  | mode) as first, and the peer host and port as second and third arguments | 
| 1112 |  |  |  |  |  |  | (see C for details). | 
| 1113 |  |  |  |  |  |  |  | 
| 1114 |  |  |  |  |  |  | Croaks on any errors it can detect before the listen. | 
| 1115 |  |  |  |  |  |  |  | 
| 1116 |  |  |  |  |  |  | In non-void context, this function returns a guard object whose lifetime | 
| 1117 |  |  |  |  |  |  | it tied to the TCP server: If the object gets destroyed, the server will | 
| 1118 |  |  |  |  |  |  | be stopped and the listening socket will be cleaned up/unlinked (already | 
| 1119 |  |  |  |  |  |  | accepted connections will not be affected). | 
| 1120 |  |  |  |  |  |  |  | 
| 1121 |  |  |  |  |  |  | When called in void-context, AnyEvent will keep the listening socket alive | 
| 1122 |  |  |  |  |  |  | internally. In this case, there is no guarantee that the listening socket | 
| 1123 |  |  |  |  |  |  | will be cleaned up or unlinked. | 
| 1124 |  |  |  |  |  |  |  | 
| 1125 |  |  |  |  |  |  | In all cases, when the function returns to the caller, the socket is bound | 
| 1126 |  |  |  |  |  |  | and in listening state. | 
| 1127 |  |  |  |  |  |  |  | 
| 1128 |  |  |  |  |  |  | If you need more control over the listening socket, you can provide a | 
| 1129 |  |  |  |  |  |  | C<< $prepare_cb->($fh, $host, $port) >>, which is called just before the | 
| 1130 |  |  |  |  |  |  | C call, with the listen file handle as first argument, and IP | 
| 1131 |  |  |  |  |  |  | address and port number of the local socket endpoint as second and third | 
| 1132 |  |  |  |  |  |  | arguments. | 
| 1133 |  |  |  |  |  |  |  | 
| 1134 |  |  |  |  |  |  | It should return the length of the listen queue (or C<0> for the default). | 
| 1135 |  |  |  |  |  |  |  | 
| 1136 |  |  |  |  |  |  | Note to IPv6 users: RFC-compliant behaviour for IPv6 sockets listening on | 
| 1137 |  |  |  |  |  |  | C<::> is to bind to both IPv6 and IPv4 addresses by default on dual-stack | 
| 1138 |  |  |  |  |  |  | hosts. Unfortunately, only GNU/Linux seems to implement this properly, so | 
| 1139 |  |  |  |  |  |  | if you want both IPv4 and IPv6 listening sockets you should create the | 
| 1140 |  |  |  |  |  |  | IPv6 socket first and then attempt to bind on the IPv4 socket, but ignore | 
| 1141 |  |  |  |  |  |  | any C errors. | 
| 1142 |  |  |  |  |  |  |  | 
| 1143 |  |  |  |  |  |  | Example: bind on some TCP port on the local machine and tell each client | 
| 1144 |  |  |  |  |  |  | to go away. | 
| 1145 |  |  |  |  |  |  |  | 
| 1146 |  |  |  |  |  |  | tcp_server undef, undef, sub { | 
| 1147 |  |  |  |  |  |  | my ($fh, $host, $port) = @_; | 
| 1148 |  |  |  |  |  |  |  | 
| 1149 |  |  |  |  |  |  | syswrite $fh, "The internet is full, $host:$port. Go away!\015\012"; | 
| 1150 |  |  |  |  |  |  | }, sub { | 
| 1151 |  |  |  |  |  |  | my ($fh, $thishost, $thisport) = @_; | 
| 1152 |  |  |  |  |  |  | AE::log info => "Bound to $thishost, port $thisport."; | 
| 1153 |  |  |  |  |  |  | }; | 
| 1154 |  |  |  |  |  |  |  | 
| 1155 |  |  |  |  |  |  | Example: bind a server on a unix domain socket. | 
| 1156 |  |  |  |  |  |  |  | 
| 1157 |  |  |  |  |  |  | tcp_server "unix/", "/tmp/mydir/mysocket", sub { | 
| 1158 |  |  |  |  |  |  | my ($fh) = @_; | 
| 1159 |  |  |  |  |  |  | }; | 
| 1160 |  |  |  |  |  |  |  | 
| 1161 |  |  |  |  |  |  | =item $guard = AnyEvent::Socket::tcp_bind $host, $service, $done_cb[, $prepare_cb] | 
| 1162 |  |  |  |  |  |  |  | 
| 1163 |  |  |  |  |  |  | Same as C, except it doesn't call C in a loop for you | 
| 1164 |  |  |  |  |  |  | but simply passes the listen socket to the C<$done_cb>. This is useful | 
| 1165 |  |  |  |  |  |  | when you want to have a convenient set up for your listen socket, but want | 
| 1166 |  |  |  |  |  |  | to do the C'ing yourself, for example, in another process. | 
| 1167 |  |  |  |  |  |  |  | 
| 1168 |  |  |  |  |  |  | In case of an error, C either croaks, or passes C to the | 
| 1169 |  |  |  |  |  |  | C<$done_cb>. | 
| 1170 |  |  |  |  |  |  |  | 
| 1171 |  |  |  |  |  |  | In non-void context, a guard will be returned. It will clean up/unlink the | 
| 1172 |  |  |  |  |  |  | listening socket when destroyed. In void context, no automatic clean up | 
| 1173 |  |  |  |  |  |  | might be performed. | 
| 1174 |  |  |  |  |  |  |  | 
| 1175 |  |  |  |  |  |  | =cut | 
| 1176 |  |  |  |  |  |  |  | 
| 1177 |  |  |  |  |  |  | sub _tcp_bind($$$;$) { | 
| 1178 | 6 |  |  | 6 |  | 20 | my ($host, $service, $done, $prepare) = @_; | 
| 1179 |  |  |  |  |  |  |  | 
| 1180 | 6 | 50 | 50 |  |  | 22 | $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6 | 
|  |  | 100 |  |  |  |  |  | 
| 1181 |  |  |  |  |  |  | ? "::" : "0" | 
| 1182 |  |  |  |  |  |  | unless defined $host; | 
| 1183 |  |  |  |  |  |  |  | 
| 1184 | 6 | 50 |  |  |  | 20 | my $ipn = parse_address $host | 
| 1185 |  |  |  |  |  |  | or Carp::croak "tcp_bind: cannot parse '$host' as host address"; | 
| 1186 |  |  |  |  |  |  |  | 
| 1187 | 6 |  |  |  |  | 24 | my $af = address_family $ipn; | 
| 1188 |  |  |  |  |  |  |  | 
| 1189 | 6 |  |  |  |  | 11 | my %state; | 
| 1190 |  |  |  |  |  |  |  | 
| 1191 |  |  |  |  |  |  | # win32 perl is too stupid to get this right :/ | 
| 1192 | 6 |  |  |  |  | 10 | Carp::croak "tcp_bind: AF_UNIX address family not supported on win32" | 
| 1193 |  |  |  |  |  |  | if AnyEvent::WIN32 && $af == AF_UNIX; | 
| 1194 |  |  |  |  |  |  |  | 
| 1195 | 6 | 50 |  |  |  | 299 | socket my $fh, $af, SOCK_STREAM, 0 | 
| 1196 |  |  |  |  |  |  | or Carp::croak "tcp_bind: $!"; | 
| 1197 |  |  |  |  |  |  |  | 
| 1198 | 6 |  |  |  |  | 30 | $state{fh} = $fh; | 
| 1199 |  |  |  |  |  |  |  | 
| 1200 | 6 | 50 | 33 |  |  | 41 | if ($af == AF_INET || $af == AF_INET6) { | 
|  |  | 0 |  |  |  |  |  | 
| 1201 | 6 | 50 |  |  |  | 91 | setsockopt $fh, SOL_SOCKET, SO_REUSEADDR, 1 | 
| 1202 |  |  |  |  |  |  | or Carp::croak "tcp_bind: so_reuseaddr: $!" | 
| 1203 |  |  |  |  |  |  | unless AnyEvent::WIN32; # work around windows bug | 
| 1204 |  |  |  |  |  |  |  | 
| 1205 | 6 | 50 |  |  |  | 43 | unless ($service =~ /^\d*$/) { | 
| 1206 | 0 | 0 |  |  |  | 0 | $service = (getservbyname $service, "tcp")[2] | 
| 1207 |  |  |  |  |  |  | or Carp::croak "tcp_bind: unknown service '$service'" | 
| 1208 |  |  |  |  |  |  | } | 
| 1209 |  |  |  |  |  |  | } elsif ($af == AF_UNIX) { | 
| 1210 | 0 |  |  |  |  | 0 | unlink $service; | 
| 1211 |  |  |  |  |  |  | } | 
| 1212 |  |  |  |  |  |  |  | 
| 1213 | 6 | 50 |  |  |  | 25 | bind $fh, pack_sockaddr $service, $ipn | 
| 1214 |  |  |  |  |  |  | or Carp::croak "tcp_bind: $!"; | 
| 1215 |  |  |  |  |  |  |  | 
| 1216 | 6 | 50 | 33 |  |  | 36 | if ($af == AF_UNIX and defined wantarray) { | 
| 1217 |  |  |  |  |  |  | # this is racy, but is not designed to be foolproof, just best-effort | 
| 1218 | 0 |  |  |  |  | 0 | my $ino = (lstat $service)[1]; | 
| 1219 |  |  |  |  |  |  | $state{unlink} = guard { | 
| 1220 | 0 | 0 |  | 0 |  | 0 | unlink $service | 
| 1221 |  |  |  |  |  |  | if (lstat $service)[1] == $ino; | 
| 1222 | 0 |  |  |  |  | 0 | }; | 
| 1223 |  |  |  |  |  |  | } | 
| 1224 |  |  |  |  |  |  |  | 
| 1225 | 6 |  |  |  |  | 32 | AnyEvent::fh_unblock $fh; | 
| 1226 |  |  |  |  |  |  |  | 
| 1227 | 6 |  |  |  |  | 13 | my $len; | 
| 1228 |  |  |  |  |  |  |  | 
| 1229 | 6 | 50 |  |  |  | 19 | if ($prepare) { | 
| 1230 | 6 |  |  |  |  | 65 | my ($service, $host) = unpack_sockaddr getsockname $fh; | 
| 1231 | 6 |  | 33 |  |  | 38 | $len = $prepare && $prepare->($fh, format_address $host, $service); | 
| 1232 |  |  |  |  |  |  | } | 
| 1233 |  |  |  |  |  |  |  | 
| 1234 | 6 |  | 50 |  |  | 35 | $len ||= 128; | 
| 1235 |  |  |  |  |  |  |  | 
| 1236 | 6 | 50 |  |  |  | 70 | listen $fh, $len | 
| 1237 |  |  |  |  |  |  | or Carp::croak "tcp_bind: $!"; | 
| 1238 |  |  |  |  |  |  |  | 
| 1239 | 6 |  |  |  |  | 29 | $done->(\%state); | 
| 1240 |  |  |  |  |  |  |  | 
| 1241 |  |  |  |  |  |  | defined wantarray | 
| 1242 | 1 |  |  | 1 |  | 22 | ? guard { %state = () } # clear fh, unlink | 
| 1243 |  |  |  |  |  |  | : () | 
| 1244 | 6 | 100 |  |  |  | 39 | } | 
| 1245 |  |  |  |  |  |  |  | 
| 1246 |  |  |  |  |  |  | sub tcp_bind($$$;$) { | 
| 1247 | 0 |  |  | 0 | 1 | 0 | my ($host, $service, $done, $prepare) = @_; | 
| 1248 |  |  |  |  |  |  |  | 
| 1249 |  |  |  |  |  |  | _tcp_bind $host, $service, sub { | 
| 1250 | 0 |  |  | 0 |  | 0 | $done->(delete shift->{fh}); | 
| 1251 | 0 |  |  |  |  | 0 | }, $prepare | 
| 1252 |  |  |  |  |  |  | } | 
| 1253 |  |  |  |  |  |  |  | 
| 1254 |  |  |  |  |  |  | sub tcp_server($$$;$) { | 
| 1255 | 6 |  |  | 6 | 1 | 101 | my ($host, $service, $accept, $prepare) = @_; | 
| 1256 |  |  |  |  |  |  |  | 
| 1257 |  |  |  |  |  |  | _tcp_bind $host, $service, sub { | 
| 1258 | 6 |  |  | 6 |  | 10 | my $rstate = shift; | 
| 1259 |  |  |  |  |  |  |  | 
| 1260 |  |  |  |  |  |  | $rstate->{aw} = AE::io $rstate->{fh}, 0, sub { | 
| 1261 |  |  |  |  |  |  | # this closure keeps $state alive | 
| 1262 | 6 |  | 66 |  |  | 1047 | while ($rstate->{fh} && (my $peer = accept my $fh, $rstate->{fh})) { | 
| 1263 | 6 |  |  |  |  | 34 | AnyEvent::fh_unblock $fh; # POSIX requires inheritance, the outside world does not | 
| 1264 |  |  |  |  |  |  |  | 
| 1265 | 6 |  |  |  |  | 33 | my ($service, $host) = unpack_sockaddr $peer; | 
| 1266 | 6 |  |  |  |  | 21 | $accept->($fh, format_address $host, $service); | 
| 1267 |  |  |  |  |  |  | } | 
| 1268 | 6 |  |  |  |  | 67 | }; | 
| 1269 | 6 |  |  |  |  | 38 | }, $prepare | 
| 1270 |  |  |  |  |  |  | } | 
| 1271 |  |  |  |  |  |  |  | 
| 1272 |  |  |  |  |  |  | =item tcp_nodelay $fh, $enable | 
| 1273 |  |  |  |  |  |  |  | 
| 1274 |  |  |  |  |  |  | Enables (or disables) the C socket option (also known as | 
| 1275 |  |  |  |  |  |  | Nagle's algorithm). Returns false on error, true otherwise. | 
| 1276 |  |  |  |  |  |  |  | 
| 1277 |  |  |  |  |  |  | =cut | 
| 1278 |  |  |  |  |  |  |  | 
| 1279 |  |  |  |  |  |  | sub tcp_nodelay($$) { | 
| 1280 | 0 |  |  | 0 | 1 |  | my $onoff = int ! ! $_[1]; | 
| 1281 |  |  |  |  |  |  |  | 
| 1282 | 0 |  |  |  |  |  | setsockopt $_[0], Socket::IPPROTO_TCP (), Socket::TCP_NODELAY (), $onoff | 
| 1283 |  |  |  |  |  |  | } | 
| 1284 |  |  |  |  |  |  |  | 
| 1285 |  |  |  |  |  |  | =item tcp_congestion $fh, $algorithm | 
| 1286 |  |  |  |  |  |  |  | 
| 1287 |  |  |  |  |  |  | Sets the tcp congestion avoidance algorithm (via the C | 
| 1288 |  |  |  |  |  |  | socket option). The default is OS-specific, but is usually | 
| 1289 |  |  |  |  |  |  | C. Typical other available choices include C, C, C, | 
| 1290 |  |  |  |  |  |  | C, C, C, C, C, C, | 
| 1291 |  |  |  |  |  |  | C, C and C. | 
| 1292 |  |  |  |  |  |  |  | 
| 1293 |  |  |  |  |  |  | =cut | 
| 1294 |  |  |  |  |  |  |  | 
| 1295 |  |  |  |  |  |  | sub tcp_congestion($$) { | 
| 1296 | 0 | 0 |  | 0 | 1 |  | defined TCP_CONGESTION | 
| 1297 |  |  |  |  |  |  | ? setsockopt $_[0], Socket::IPPROTO_TCP (), TCP_CONGESTION, "$_[1]" | 
| 1298 |  |  |  |  |  |  | : undef | 
| 1299 |  |  |  |  |  |  | } | 
| 1300 |  |  |  |  |  |  |  | 
| 1301 |  |  |  |  |  |  | =back | 
| 1302 |  |  |  |  |  |  |  | 
| 1303 |  |  |  |  |  |  | =head1 SECURITY CONSIDERATIONS | 
| 1304 |  |  |  |  |  |  |  | 
| 1305 |  |  |  |  |  |  | This module is quite powerful, with with power comes the ability to abuse | 
| 1306 |  |  |  |  |  |  | as well: If you accept "hostnames" and ports from untrusted sources, | 
| 1307 |  |  |  |  |  |  | then note that this can be abused to delete files (host=C). This | 
| 1308 |  |  |  |  |  |  | is not really a problem with this module, however, as blindly accepting | 
| 1309 |  |  |  |  |  |  | any address and protocol and trying to bind a server or connect to it is | 
| 1310 |  |  |  |  |  |  | harmful in general. | 
| 1311 |  |  |  |  |  |  |  | 
| 1312 |  |  |  |  |  |  | =head1 AUTHOR | 
| 1313 |  |  |  |  |  |  |  | 
| 1314 |  |  |  |  |  |  | Marc Lehmann | 
| 1315 |  |  |  |  |  |  | http://anyevent.schmorp.de | 
| 1316 |  |  |  |  |  |  |  | 
| 1317 |  |  |  |  |  |  | =cut | 
| 1318 |  |  |  |  |  |  |  | 
| 1319 |  |  |  |  |  |  | 1 | 
| 1320 |  |  |  |  |  |  |  |