line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
# Copyright (C) 2000-2016 Hajimu UMEMOTO . |
2
|
|
|
|
|
|
|
# All rights reserved. |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# This module is based on perl5.005_55-v6-19990721 written by KAME |
5
|
|
|
|
|
|
|
# Project. |
6
|
|
|
|
|
|
|
# |
7
|
|
|
|
|
|
|
# Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project. |
8
|
|
|
|
|
|
|
# All rights reserved. |
9
|
|
|
|
|
|
|
# |
10
|
|
|
|
|
|
|
# Redistribution and use in source and binary forms, with or without |
11
|
|
|
|
|
|
|
# modification, are permitted provided that the following conditions |
12
|
|
|
|
|
|
|
# are met: |
13
|
|
|
|
|
|
|
# 1. Redistributions of source code must retain the above copyright |
14
|
|
|
|
|
|
|
# notice, this list of conditions and the following disclaimer. |
15
|
|
|
|
|
|
|
# 2. Redistributions in binary form must reproduce the above copyright |
16
|
|
|
|
|
|
|
# notice, this list of conditions and the following disclaimer in the |
17
|
|
|
|
|
|
|
# documentation and/or other materials provided with the distribution. |
18
|
|
|
|
|
|
|
# 3. Neither the name of the project nor the names of its contributors |
19
|
|
|
|
|
|
|
# may be used to endorse or promote products derived from this software |
20
|
|
|
|
|
|
|
# without specific prior written permission. |
21
|
|
|
|
|
|
|
# |
22
|
|
|
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND |
23
|
|
|
|
|
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
24
|
|
|
|
|
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
25
|
|
|
|
|
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE |
26
|
|
|
|
|
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
27
|
|
|
|
|
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
28
|
|
|
|
|
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
29
|
|
|
|
|
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30
|
|
|
|
|
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
31
|
|
|
|
|
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
32
|
|
|
|
|
|
|
# SUCH DAMAGE. |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
# $Id: Socket6.pm 664 2016-03-22 16:11:41Z ume $ |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
package Socket6; |
37
|
|
|
|
|
|
|
|
38
|
1
|
|
|
1
|
|
7426
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
29
|
|
39
|
1
|
|
|
1
|
|
4
|
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
97
|
|
40
|
|
|
|
|
|
|
$VERSION = "0.27"; |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=head1 NAME |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
Socket6 - IPv6 related part of the C socket.h defines and structure manipulators |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
=head1 SYNOPSIS |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
use Socket; |
49
|
|
|
|
|
|
|
use Socket6; |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
@res = getaddrinfo('hishost.com', 'daytime', AF_UNSPEC, SOCK_STREAM); |
52
|
|
|
|
|
|
|
$family = -1; |
53
|
|
|
|
|
|
|
while (scalar(@res) >= 5) { |
54
|
|
|
|
|
|
|
($family, $socktype, $proto, $saddr, $canonname, @res) = @res; |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); |
57
|
|
|
|
|
|
|
print STDERR "Trying to connect to $host port $port...\n"; |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
socket(Socket_Handle, $family, $socktype, $proto) || next; |
60
|
|
|
|
|
|
|
connect(Socket_Handle, $saddr) && last; |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
close(Socket_Handle); |
63
|
|
|
|
|
|
|
$family = -1; |
64
|
|
|
|
|
|
|
} |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
if ($family != -1) { |
67
|
|
|
|
|
|
|
print STDERR "connected to $host port $port\n"; |
68
|
|
|
|
|
|
|
} else { |
69
|
|
|
|
|
|
|
die "connect attempt failed\n"; |
70
|
|
|
|
|
|
|
} |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
=head1 DESCRIPTION |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
This module provides glue routines to the various IPv6 functions. |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
If you use the Socket6 module, |
77
|
|
|
|
|
|
|
be sure to specify "use Socket" as well as "use Socket6". |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
Functions supplied are: |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=over |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=item inet_pton FAMILY, TEXT_ADDRESS |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
This function takes an IP address in presentation (or string) format |
86
|
|
|
|
|
|
|
and converts it into numeric (or binary) format. |
87
|
|
|
|
|
|
|
The type of IP address conversion (IPv4 versus IPv6) is controlled |
88
|
|
|
|
|
|
|
by the FAMILY argument. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=item inet_ntop FAMILY, BINARY_ADDRESS |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
This function takes an IP address in numeric (or binary) format |
93
|
|
|
|
|
|
|
and converts it into presentation (or string) format |
94
|
|
|
|
|
|
|
The type of IP address conversion (IPv4 versus IPv6) is controlled |
95
|
|
|
|
|
|
|
by the FAMILY argument. |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
=item pack_sockaddr_in6 PORT, ADDR |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
This function takes two arguments: a port number, and a 16-octet |
100
|
|
|
|
|
|
|
IPv6 address structure (as returned by inet_pton()). |
101
|
|
|
|
|
|
|
It returns the sockaddr_in6 structure with these arguments packed |
102
|
|
|
|
|
|
|
into their correct fields, as well as the AF_INET6 family. |
103
|
|
|
|
|
|
|
The other fields are not set and their values should not be relied upon. |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
=item pack_sockaddr_in6_all PORT, FLOWINFO, ADDR, SCOPEID |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
This function takes four arguments: a port number, a 16-octet |
108
|
|
|
|
|
|
|
IPv6 address structure (as returned by inet_pton), any |
109
|
|
|
|
|
|
|
special flow information, and any specific scope information. |
110
|
|
|
|
|
|
|
It returns a complete sockaddr_in6 structure with these arguments packed |
111
|
|
|
|
|
|
|
into their correct fields, as well as the AF_INET6 family. |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
=item unpack_sockaddr_in6 NAME |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
This function takes a sockaddr_in6 structure (as returned by |
116
|
|
|
|
|
|
|
pack_sockaddr_in6()) and returns a list of two elements: |
117
|
|
|
|
|
|
|
the port number and the 16-octet IP address. |
118
|
|
|
|
|
|
|
This function will croak if it determines it has not been |
119
|
|
|
|
|
|
|
passed an IPv6 structure. |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
=item unpack_sockaddr_in6_all NAME |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
This function takes a sockaddr_in6 structure (as returned by |
124
|
|
|
|
|
|
|
pack_sockaddr_in6()) and returns a list of four elements: |
125
|
|
|
|
|
|
|
the port number, the flow information, the 16-octet IP address, |
126
|
|
|
|
|
|
|
and the scope information. |
127
|
|
|
|
|
|
|
This function will croak if it determines it has not been |
128
|
|
|
|
|
|
|
passed an IPv6 structure. |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
=item gethostbyname2 HOSTNAME, FAMILY |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
=item getaddrinfo NODENAME, SERVICENAME, [FAMILY, SOCKTYPE, PROTOCOL, FLAGS] |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
This function converts node names to addresses and service names |
135
|
|
|
|
|
|
|
to port numbers. |
136
|
|
|
|
|
|
|
If the NODENAME argument is not a false value, |
137
|
|
|
|
|
|
|
then a nodename to address lookup is performed; |
138
|
|
|
|
|
|
|
otherwise a service name to port number lookup is performed. |
139
|
|
|
|
|
|
|
At least one of NODENAME and SERVICENAME must have a true value. |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
If the lookup is successful, a list consisting of multiples of |
142
|
|
|
|
|
|
|
five elements is returned. |
143
|
|
|
|
|
|
|
Each group of five elements consists of the address family, |
144
|
|
|
|
|
|
|
socket type, protocol, 16-octet IP address, and the canonical |
145
|
|
|
|
|
|
|
name (undef if the node name passed is already the canonical name). |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
The arguments FAMILY, SOCKTYPE, PROTOCOL, and FLAGS are all optional. |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
This function will croak if it determines it has not been |
150
|
|
|
|
|
|
|
passed an IPv6 structure. |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
If the lookup is unsuccessful, the function returns a single scalar. |
153
|
|
|
|
|
|
|
This will contain the string version of that error in string context, |
154
|
|
|
|
|
|
|
and the numeric value in numeric context. |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
=item getnameinfo NAME, [FLAGS] |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
This function takes a socket address structure. If successful, it returns |
159
|
|
|
|
|
|
|
two strings containing the node name and service name. |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
The optional FLAGS argument controls what kind of lookup is performed. |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
If the lookup is unsuccessful, the function returns a single scalar. |
164
|
|
|
|
|
|
|
This will contain the string version of that error in string context, |
165
|
|
|
|
|
|
|
and the numeric value in numeric context. |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
=item getipnodebyname HOST, [FAMILY, FLAGS] |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
This function takes either a node name or an IP address string |
170
|
|
|
|
|
|
|
and performs a lookup on that name (or conversion of the string). |
171
|
|
|
|
|
|
|
It returns a list of five elements: the canonical host name, |
172
|
|
|
|
|
|
|
the address family, the length in octets of the IP addresses |
173
|
|
|
|
|
|
|
returned, a reference to a list of IP address structures, and |
174
|
|
|
|
|
|
|
a reference to a list of aliases for the host name. |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
The arguments FAMILY and FLAGS are optional. |
177
|
|
|
|
|
|
|
Note: This function does not handle IPv6 scope identifiers, |
178
|
|
|
|
|
|
|
and should be used with care. |
179
|
|
|
|
|
|
|
And, this function was deprecated in RFC3493. |
180
|
|
|
|
|
|
|
The getnameinfo function should be used instead. |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=item getipnodebyaddr FAMILY, ADDRESS |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
This function takes an IP address family and an IP address structure |
185
|
|
|
|
|
|
|
and performs a reverse lookup on that address. |
186
|
|
|
|
|
|
|
It returns a list of five elements: the canonical host name, |
187
|
|
|
|
|
|
|
the address family, the length in octets of the IP addresses |
188
|
|
|
|
|
|
|
returned, a reference to a list of IP address structures, and |
189
|
|
|
|
|
|
|
a reference to a list of aliases for the host name. |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
Note: This function does not handle IPv6 scope identifiers, |
192
|
|
|
|
|
|
|
and should be used with care. |
193
|
|
|
|
|
|
|
And, this function was deprecated in RFC3493. |
194
|
|
|
|
|
|
|
The getaddrinfo function should be used instead. |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
=item gai_strerror ERROR_NUMBER |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
This function returns a string corresponding to the error number |
199
|
|
|
|
|
|
|
passed in as an argument. |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=item in6addr_any |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
This function returns the 16-octet wildcard address. |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
=item in6addr_loopback |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
This function returns the 16-octet loopback address. |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
=back |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
=cut |
212
|
|
|
|
|
|
|
|
213
|
1
|
|
|
1
|
|
4
|
use Carp; |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
46
|
|
214
|
|
|
|
|
|
|
|
215
|
1
|
|
|
1
|
|
3
|
use base qw(Exporter DynaLoader); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
315
|
|
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
@EXPORT = qw( |
218
|
|
|
|
|
|
|
inet_pton inet_ntop pack_sockaddr_in6 pack_sockaddr_in6_all |
219
|
|
|
|
|
|
|
unpack_sockaddr_in6 unpack_sockaddr_in6_all sockaddr_in6 |
220
|
|
|
|
|
|
|
gethostbyname2 getaddrinfo getnameinfo |
221
|
|
|
|
|
|
|
in6addr_any in6addr_loopback |
222
|
|
|
|
|
|
|
gai_strerror getipnodebyname getipnodebyaddr |
223
|
|
|
|
|
|
|
AI_ADDRCONFIG |
224
|
|
|
|
|
|
|
AI_ALL |
225
|
|
|
|
|
|
|
AI_CANONNAME |
226
|
|
|
|
|
|
|
AI_NUMERICHOST |
227
|
|
|
|
|
|
|
AI_NUMERICSERV |
228
|
|
|
|
|
|
|
AI_DEFAULT |
229
|
|
|
|
|
|
|
AI_MASK |
230
|
|
|
|
|
|
|
AI_PASSIVE |
231
|
|
|
|
|
|
|
AI_V4MAPPED |
232
|
|
|
|
|
|
|
AI_V4MAPPED_CFG |
233
|
|
|
|
|
|
|
EAI_ADDRFAMILY |
234
|
|
|
|
|
|
|
EAI_AGAIN |
235
|
|
|
|
|
|
|
EAI_BADFLAGS |
236
|
|
|
|
|
|
|
EAI_FAIL |
237
|
|
|
|
|
|
|
EAI_FAMILY |
238
|
|
|
|
|
|
|
EAI_MEMORY |
239
|
|
|
|
|
|
|
EAI_NODATA |
240
|
|
|
|
|
|
|
EAI_NONAME |
241
|
|
|
|
|
|
|
EAI_SERVICE |
242
|
|
|
|
|
|
|
EAI_SOCKTYPE |
243
|
|
|
|
|
|
|
EAI_SYSTEM |
244
|
|
|
|
|
|
|
EAI_BADHINTS |
245
|
|
|
|
|
|
|
EAI_PROTOCOL |
246
|
|
|
|
|
|
|
IP_AUTH_TRANS_LEVEL |
247
|
|
|
|
|
|
|
IP_AUTH_NETWORK_LEVEL |
248
|
|
|
|
|
|
|
IP_ESP_TRANS_LEVEL |
249
|
|
|
|
|
|
|
IP_ESP_NETWORK_LEVEL |
250
|
|
|
|
|
|
|
IPPROTO_IP |
251
|
|
|
|
|
|
|
IPPROTO_IPV6 |
252
|
|
|
|
|
|
|
IPSEC_LEVEL_AVAIL |
253
|
|
|
|
|
|
|
IPSEC_LEVEL_BYPASS |
254
|
|
|
|
|
|
|
IPSEC_LEVEL_DEFAULT |
255
|
|
|
|
|
|
|
IPSEC_LEVEL_NONE |
256
|
|
|
|
|
|
|
IPSEC_LEVEL_REQUIRE |
257
|
|
|
|
|
|
|
IPSEC_LEVEL_UNIQUE |
258
|
|
|
|
|
|
|
IPSEC_LEVEL_USE |
259
|
|
|
|
|
|
|
IPV6_AUTH_TRANS_LEVEL |
260
|
|
|
|
|
|
|
IPV6_AUTH_NETWORK_LEVEL |
261
|
|
|
|
|
|
|
IPV6_ESP_NETWORK_LEVEL |
262
|
|
|
|
|
|
|
IPV6_ESP_TRANS_LEVEL |
263
|
|
|
|
|
|
|
NI_NOFQDN |
264
|
|
|
|
|
|
|
NI_NUMERICHOST |
265
|
|
|
|
|
|
|
NI_NAMEREQD |
266
|
|
|
|
|
|
|
NI_NUMERICSERV |
267
|
|
|
|
|
|
|
NI_DGRAM |
268
|
|
|
|
|
|
|
NI_WITHSCOPEID |
269
|
|
|
|
|
|
|
); |
270
|
|
|
|
|
|
|
push @EXPORT, qw(AF_INET6) unless defined eval {Socket::AF_INET6()}; |
271
|
|
|
|
|
|
|
push @EXPORT, qw(PF_INET6) unless defined eval {Socket::PF_INET6()}; |
272
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
@EXPORT_OK = qw(AF_INET6 PF_INET6); |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
%EXPORT_TAGS = ( |
276
|
|
|
|
|
|
|
all => [@EXPORT], |
277
|
|
|
|
|
|
|
); |
278
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
sub sockaddr_in6 { |
280
|
0
|
0
|
|
0
|
0
|
0
|
if (wantarray) { |
281
|
0
|
0
|
|
|
|
0
|
croak "usage: (port,iaddr) = sockaddr_in6(sin_sv)" unless @_ == 1; |
282
|
0
|
|
|
|
|
0
|
unpack_sockaddr_in6(@_); |
283
|
|
|
|
|
|
|
} else { |
284
|
0
|
0
|
|
|
|
0
|
croak "usage: sin_sv = sockaddr_in6(port,iaddr))" unless @_ == 2; |
285
|
0
|
|
|
|
|
0
|
pack_sockaddr_in6(@_); |
286
|
|
|
|
|
|
|
} |
287
|
|
|
|
|
|
|
} |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
sub AUTOLOAD { |
290
|
2
|
|
|
2
|
|
722
|
my($constname); |
291
|
2
|
|
|
|
|
10
|
($constname = $AUTOLOAD) =~ s/.*:://o; |
292
|
2
|
|
|
|
|
3
|
$! = 0; |
293
|
2
|
50
|
|
|
|
11
|
my $val = constant($constname, @_ ? $_[0] : 0); |
294
|
2
|
50
|
|
|
|
8
|
if ($! != 0) { |
295
|
0
|
|
|
|
|
0
|
croak "Your vendor has not defined Socket macro $constname, used"; |
296
|
|
|
|
|
|
|
} |
297
|
2
|
|
|
1
|
0
|
81
|
eval "sub $AUTOLOAD { $val }"; |
|
1
|
|
|
1
|
0
|
7
|
|
|
1
|
|
|
|
|
12
|
|
298
|
2
|
|
|
|
|
45
|
goto &$AUTOLOAD; |
299
|
|
|
|
|
|
|
} |
300
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
bootstrap Socket6 $VERSION; |
302
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
1; |