ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Socket.pm
Revision: 1.159
Committed: Thu Nov 15 01:17:29 2012 UTC (11 years, 7 months ago) by root
Branch: MAIN
CVS Tags: rel-7_03
Changes since 1.158: +1 -0 lines
Log Message:
7.03

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 call 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->[0] };
800 } $cv, @_;
801 };
802 }
803
804 # aaaa records
805 if ($family != 4) {
806 $cv->begin;
807 next;#d#
808 AnyEvent::DNS::aaaa $node, sub {
809 push @res, [$idx, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, parse_ipv6 $_]]
810 for @_;
811
812 _load_hosts_unless {
813 push @res,
814 map [$idx + 0.5, "ipv6", [AF_INET6, $type, $proton, pack_sockaddr $port, $_]],
815 @{ $hosts->[1] }
816 } $cv, @_;
817 };
818 }
819 }
820 }
821 $cv->end;
822 };
823
824 $node = AnyEvent::Util::idn_to_ascii $node
825 if $node =~ /[^\x00-\x7f]/;
826
827 # try srv records, if applicable
828 if ($node eq "localhost") {
829 $resolve->(["127.0.0.1", $port], ["::1", $port]);
830 } elsif (defined $service && !parse_address $node) {
831 AnyEvent::DNS::srv $service, $proto, $node, sub {
832 my (@srv) = @_;
833
834 if (@srv) {
835 # the only srv record has "." ("" here) => abort
836 $srv[0][2] ne "" || $#srv
837 or return $cb->();
838
839 # use srv records then
840 $resolve->(
841 map ["$_->[3].", $_->[2]],
842 grep $_->[3] ne ".",
843 @srv
844 );
845 } else {
846 # no srv records, continue traditionally
847 $resolve->([$node, $port]);
848 }
849 };
850 } else {
851 # most common case
852 $resolve->([$node, $port]);
853 }
854 }
855
856 =item $guard = tcp_connect $host, $service, $connect_cb[, $prepare_cb]
857
858 This is a convenience function that creates a TCP socket and makes a
859 100% non-blocking connect to the given C<$host> (which can be a DNS/IDN
860 hostname or a textual IP address, or the string C<unix/> for UNIX domain
861 sockets) and C<$service> (which can be a numeric port number or a service
862 name, or a C<servicename=portnumber> string, or the pathname to a UNIX
863 domain socket).
864
865 If both C<$host> and C<$port> are names, then this function will use SRV
866 records to locate the real target(s).
867
868 In either case, it will create a list of target hosts (e.g. for multihomed
869 hosts or hosts with both IPv4 and IPv6 addresses) and try to connect to
870 each in turn.
871
872 After the connection is established, then the C<$connect_cb> will be
873 invoked with the socket file handle (in non-blocking mode) as first, and
874 the peer host (as a textual IP address) and peer port as second and third
875 arguments, respectively. The fourth argument is a code reference that you
876 can call if, for some reason, you don't like this connection, which will
877 cause C<tcp_connect> to try the next one (or call your callback without
878 any arguments if there are no more connections). In most cases, you can
879 simply ignore this argument.
880
881 $cb->($filehandle, $host, $port, $retry)
882
883 If the connect is unsuccessful, then the C<$connect_cb> will be invoked
884 without any arguments and C<$!> will be set appropriately (with C<ENXIO>
885 indicating a DNS resolution failure).
886
887 The callback will I<never> be invoked before C<tcp_connect> returns, even
888 if C<tcp_connect> was able to connect immediately (e.g. on unix domain
889 sockets).
890
891 The file handle is perfect for being plugged into L<AnyEvent::Handle>, but
892 can be used as a normal perl file handle as well.
893
894 Unless called in void context, C<tcp_connect> returns a guard object that
895 will automatically cancel the connection attempt when it gets destroyed
896 - in which case the callback will not be invoked. Destroying it does not
897 do anything to the socket after the connect was successful - you cannot
898 "uncall" a callback that has been invoked already.
899
900 Sometimes you need to "prepare" the socket before connecting, for example,
901 to C<bind> it to some port, or you want a specific connect timeout that
902 is lower than your kernel's default timeout. In this case you can specify
903 a second callback, C<$prepare_cb>. It will be called with the file handle
904 in not-yet-connected state as only argument and must return the connection
905 timeout value (or C<0>, C<undef> or the empty list to indicate the default
906 timeout is to be used).
907
908 Note that the socket could be either a IPv4 TCP socket or an IPv6 TCP
909 socket (although only IPv4 is currently supported by this module).
910
911 Note to the poor Microsoft Windows users: Windows (of course) doesn't
912 correctly signal connection errors, so unless your event library works
913 around this, failed connections will simply hang. The only event libraries
914 that handle this condition correctly are L<EV> and L<Glib>. Additionally,
915 AnyEvent works around this bug with L<Event> and in its pure-perl
916 backend. All other libraries cannot correctly handle this condition. To
917 lessen the impact of this windows bug, a default timeout of 30 seconds
918 will be imposed on windows. Cygwin is not affected.
919
920 Simple Example: connect to localhost on port 22.
921
922 tcp_connect localhost => 22, sub {
923 my $fh = shift
924 or die "unable to connect: $!";
925 # do something
926 };
927
928 Complex Example: connect to www.google.com on port 80 and make a simple
929 GET request without much error handling. Also limit the connection timeout
930 to 15 seconds.
931
932 tcp_connect "www.google.com", "http",
933 sub {
934 my ($fh) = @_
935 or die "unable to connect: $!";
936
937 my $handle; # avoid direct assignment so on_eof has it in scope.
938 $handle = new AnyEvent::Handle
939 fh => $fh,
940 on_error => sub {
941 AE::log error => $_[2];
942 $_[0]->destroy;
943 },
944 on_eof => sub {
945 $handle->destroy; # destroy handle
946 AE::log info => "Done.";
947 };
948
949 $handle->push_write ("GET / HTTP/1.0\015\012\015\012");
950
951 $handle->push_read (line => "\015\012\015\012", sub {
952 my ($handle, $line) = @_;
953
954 # print response header
955 print "HEADER\n$line\n\nBODY\n";
956
957 $handle->on_read (sub {
958 # print response body
959 print $_[0]->rbuf;
960 $_[0]->rbuf = "";
961 });
962 });
963 }, sub {
964 my ($fh) = @_;
965 # could call $fh->bind etc. here
966
967 15
968 };
969
970 Example: connect to a UNIX domain socket.
971
972 tcp_connect "unix/", "/tmp/.X11-unix/X0", sub {
973 ...
974 }
975
976 =cut
977
978 sub tcp_connect($$$;$) {
979 my ($host, $port, $connect, $prepare) = @_;
980
981 # see http://cr.yp.to/docs/connect.html for some tricky aspects
982 # also http://advogato.org/article/672.html
983
984 my %state = ( fh => undef );
985
986 # name/service to type/sockaddr resolution
987 resolve_sockaddr $host, $port, 0, 0, undef, sub {
988 my @target = @_;
989
990 $state{next} = sub {
991 return unless exists $state{fh};
992
993 my $errno = $!;
994 my $target = shift @target
995 or return AE::postpone {
996 return unless exists $state{fh};
997 %state = ();
998 $! = $errno;
999 $connect->();
1000 };
1001
1002 my ($domain, $type, $proto, $sockaddr) = @$target;
1003
1004 # socket creation
1005 socket $state{fh}, $domain, $type, $proto
1006 or return $state{next}();
1007
1008 fh_nonblocking $state{fh}, 1;
1009
1010 my $timeout = $prepare && $prepare->($state{fh});
1011
1012 $timeout ||= 30 if AnyEvent::WIN32;
1013
1014 $state{to} = AE::timer $timeout, 0, sub {
1015 $! = Errno::ETIMEDOUT;
1016 $state{next}();
1017 } if $timeout;
1018
1019 # now connect
1020 if (
1021 (connect $state{fh}, $sockaddr)
1022 || ($! == Errno::EINPROGRESS # POSIX
1023 || $! == Errno::EWOULDBLOCK
1024 # WSAEINPROGRESS intentionally not checked - it means something else entirely
1025 || $! == AnyEvent::Util::WSAEINVAL # not convinced, but doesn't hurt
1026 || $! == AnyEvent::Util::WSAEWOULDBLOCK)
1027 ) {
1028 $state{ww} = AE::io $state{fh}, 1, sub {
1029 # we are connected, or maybe there was an error
1030 if (my $sin = getpeername $state{fh}) {
1031 my ($port, $host) = unpack_sockaddr $sin;
1032
1033 delete $state{ww}; delete $state{to};
1034
1035 my $guard = guard { %state = () };
1036
1037 $connect->(delete $state{fh}, format_address $host, $port, sub {
1038 $guard->cancel;
1039 $state{next}();
1040 });
1041 } else {
1042 if ($! == Errno::ENOTCONN) {
1043 # dummy read to fetch real error code if !cygwin
1044 sysread $state{fh}, my $buf, 1;
1045
1046 # cygwin 1.5 continously reports "ready' but never delivers
1047 # an error with getpeername or sysread.
1048 # cygwin 1.7 only reports readyness *once*, but is otherwise
1049 # the same, which is actually more broken.
1050 # Work around both by using unportable SO_ERROR for cygwin.
1051 $! = (unpack "l", getsockopt $state{fh}, Socket::SOL_SOCKET(), Socket::SO_ERROR()) || Errno::EAGAIN
1052 if AnyEvent::CYGWIN && $! == Errno::EAGAIN;
1053 }
1054
1055 return if $! == Errno::EAGAIN; # skip spurious wake-ups
1056
1057 delete $state{ww}; delete $state{to};
1058
1059 $state{next}();
1060 }
1061 };
1062 } else {
1063 $state{next}();
1064 }
1065 };
1066
1067 $! = Errno::ENXIO;
1068 $state{next}();
1069 };
1070
1071 defined wantarray && guard { %state = () }
1072 }
1073
1074 =item $guard = tcp_server $host, $service, $accept_cb[, $prepare_cb]
1075
1076 Create and bind a stream socket to the given host address and port, set
1077 the SO_REUSEADDR flag (if applicable) and call C<listen>. Unlike the name
1078 implies, this function can also bind on UNIX domain sockets.
1079
1080 For internet sockets, C<$host> must be an IPv4 or IPv6 address (or
1081 C<undef>, in which case it binds either to C<0> or to C<::>, depending
1082 on whether IPv4 or IPv6 is the preferred protocol, and maybe to both in
1083 future versions, as applicable).
1084
1085 To bind to the IPv4 wildcard address, use C<0>, to bind to the IPv6
1086 wildcard address, use C<::>.
1087
1088 The port is specified by C<$service>, which must be either a service name
1089 or a numeric port number (or C<0> or C<undef>, in which case an ephemeral
1090 port will be used).
1091
1092 For UNIX domain sockets, C<$host> must be C<unix/> and C<$service> must be
1093 the absolute pathname of the socket. This function will try to C<unlink>
1094 the socket before it tries to bind to it, and will try to unlink it after
1095 it stops using it. See SECURITY CONSIDERATIONS, below.
1096
1097 For each new connection that could be C<accept>ed, call the C<<
1098 $accept_cb->($fh, $host, $port) >> with the file handle (in non-blocking
1099 mode) as first, and the peer host and port as second and third arguments
1100 (see C<tcp_connect> for details).
1101
1102 Croaks on any errors it can detect before the listen.
1103
1104 If called in non-void context, then this function returns a guard object
1105 whose lifetime it tied to the TCP server: If the object gets destroyed,
1106 the server will be stopped (but existing accepted connections will
1107 not be affected).
1108
1109 Regardless, when the function returns to the caller, the socket is bound
1110 and in listening state.
1111
1112 If you need more control over the listening socket, you can provide a
1113 C<< $prepare_cb->($fh, $host, $port) >>, which is called just before the
1114 C<listen ()> call, with the listen file handle as first argument, and IP
1115 address and port number of the local socket endpoint as second and third
1116 arguments.
1117
1118 It should return the length of the listen queue (or C<0> for the default).
1119
1120 Note to IPv6 users: RFC-compliant behaviour for IPv6 sockets listening on
1121 C<::> is to bind to both IPv6 and IPv4 addresses by default on dual-stack
1122 hosts. Unfortunately, only GNU/Linux seems to implement this properly, so
1123 if you want both IPv4 and IPv6 listening sockets you should create the
1124 IPv6 socket first and then attempt to bind on the IPv4 socket, but ignore
1125 any C<EADDRINUSE> errors.
1126
1127 Example: bind on some TCP port on the local machine and tell each client
1128 to go away.
1129
1130 tcp_server undef, undef, sub {
1131 my ($fh, $host, $port) = @_;
1132
1133 syswrite $fh, "The internet is full, $host:$port. Go away!\015\012";
1134 }, sub {
1135 my ($fh, $thishost, $thisport) = @_;
1136 AE::log info => "Bound to $thishost, port $thisport.";
1137 };
1138
1139 Example: bind a server on a unix domain socket.
1140
1141 tcp_server "unix/", "/tmp/mydir/mysocket", sub {
1142 my ($fh) = @_;
1143 };
1144
1145 =cut
1146
1147 sub tcp_server($$$;$) {
1148 my ($host, $service, $accept, $prepare) = @_;
1149
1150 $host = $AnyEvent::PROTOCOL{ipv4} < $AnyEvent::PROTOCOL{ipv6} && AF_INET6
1151 ? "::" : "0"
1152 unless defined $host;
1153
1154 my $ipn = parse_address $host
1155 or Carp::croak "AnyEvent::Socket::tcp_server: cannot parse '$host' as host address";
1156
1157 my $af = address_family $ipn;
1158
1159 my %state;
1160
1161 # win32 perl is too stupid to get this right :/
1162 Carp::croak "tcp_server/socket: address family not supported"
1163 if AnyEvent::WIN32 && $af == AF_UNIX;
1164
1165 socket $state{fh}, $af, SOCK_STREAM, 0
1166 or Carp::croak "tcp_server/socket: $!";
1167
1168 if ($af == AF_INET || $af == AF_INET6) {
1169 setsockopt $state{fh}, SOL_SOCKET, SO_REUSEADDR, 1
1170 or Carp::croak "tcp_server/so_reuseaddr: $!"
1171 unless AnyEvent::WIN32; # work around windows bug
1172
1173 unless ($service =~ /^\d*$/) {
1174 $service = (getservbyname $service, "tcp")[2]
1175 or Carp::croak "$service: service unknown"
1176 }
1177 } elsif ($af == AF_UNIX) {
1178 unlink $service;
1179 }
1180
1181 bind $state{fh}, pack_sockaddr $service, $ipn
1182 or Carp::croak "bind: $!";
1183
1184 if ($af == AF_UNIX) {
1185 my $fh = $state{fh};
1186 my $ino = (stat $fh)[1];
1187 $state{unlink} = guard {
1188 # this is racy, but is not designed to be foolproof, just best-effort
1189 unlink $service
1190 if $ino == (stat $fh)[1];
1191 };
1192 }
1193
1194 fh_nonblocking $state{fh}, 1;
1195
1196 my $len;
1197
1198 if ($prepare) {
1199 my ($service, $host) = unpack_sockaddr getsockname $state{fh};
1200 $len = $prepare && $prepare->($state{fh}, format_address $host, $service);
1201 }
1202
1203 $len ||= 128;
1204
1205 listen $state{fh}, $len
1206 or Carp::croak "listen: $!";
1207
1208 $state{aw} = AE::io $state{fh}, 0, sub {
1209 # this closure keeps $state alive
1210 while ($state{fh} && (my $peer = accept my $fh, $state{fh})) {
1211 fh_nonblocking $fh, 1; # POSIX requires inheritance, the outside world does not
1212
1213 my ($service, $host) = unpack_sockaddr $peer;
1214 $accept->($fh, format_address $host, $service);
1215 }
1216 };
1217
1218 defined wantarray
1219 ? guard { %state = () } # clear fh and watcher, which breaks the circular dependency
1220 : ()
1221 }
1222
1223 =item tcp_nodelay $fh, $enable
1224
1225 Enables (or disables) the C<TCP_NODELAY> socket option (also known as
1226 Nagle's algorithm). Returns false on error, true otherwise.
1227
1228 =cut
1229
1230 sub tcp_nodelay($$) {
1231 my $onoff = int ! ! $_[1];
1232
1233 setsockopt $_[0], Socket::IPPROTO_TCP (), Socket::TCP_NODELAY (), $onoff
1234 }
1235
1236 =item tcp_congestion $fh, $algorithm
1237
1238 Sets the tcp congestion avoidance algorithm (via the C<TCP_CONGESTION>
1239 socket option). The default is OS-specific, but is usually
1240 C<reno>. Typical other available choices include C<cubic>, C<lp>, C<bic>,
1241 C<highspeed>, C<htcp>, C<hybla>, C<illinois>, C<scalable>, C<vegas>,
1242 C<veno>, C<westwood> and C<yeah>.
1243
1244 =cut
1245
1246 sub tcp_congestion($$) {
1247 defined TCP_CONGESTION
1248 ? setsockopt $_[0], Socket::IPPROTO_TCP (), TCP_CONGESTION, "$_[1]"
1249 : undef
1250 }
1251
1252 =back
1253
1254 =head1 SECURITY CONSIDERATIONS
1255
1256 This module is quite powerful, with with power comes the ability to abuse
1257 as well: If you accept "hostnames" and ports from untrusted sources,
1258 then note that this can be abused to delete files (host=C<unix/>). This
1259 is not really a problem with this module, however, as blindly accepting
1260 any address and protocol and trying to bind a server or connect to it is
1261 harmful in general.
1262
1263 =head1 AUTHOR
1264
1265 Marc Lehmann <schmorp@schmorp.de>
1266 http://anyevent.schmorp.de
1267
1268 =cut
1269
1270 1
1271