ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.156
Committed: Wed Oct 31 15:26:23 2012 UTC (11 years, 8 months ago) by root
Branch: MAIN
Changes since 1.155: +3 -1 lines
Log Message:
*** empty log message ***

File Contents

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