[REPATCH] Re: [PATCH] new test lib/blib.t
[p5sagit/p5-mst-13.2.git] / ext / Socket / Socket.pm
1 package Socket;
2
3 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
4 $VERSION = "1.74";
5
6 =head1 NAME
7
8 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h defines and structure manipulators 
9
10 =head1 SYNOPSIS
11
12     use Socket;
13
14     $proto = getprotobyname('udp');
15     socket(Socket_Handle, PF_INET, SOCK_DGRAM, $proto);
16     $iaddr = gethostbyname('hishost.com');
17     $port = getservbyname('time', 'udp');
18     $sin = sockaddr_in($port, $iaddr);
19     send(Socket_Handle, 0, 0, $sin);
20
21     $proto = getprotobyname('tcp');
22     socket(Socket_Handle, PF_INET, SOCK_STREAM, $proto);
23     $port = getservbyname('smtp', 'tcp');
24     $sin = sockaddr_in($port,inet_aton("127.1"));
25     $sin = sockaddr_in(7,inet_aton("localhost"));
26     $sin = sockaddr_in(7,INADDR_LOOPBACK);
27     connect(Socket_Handle,$sin);
28
29     ($port, $iaddr) = sockaddr_in(getpeername(Socket_Handle));
30     $peer_host = gethostbyaddr($iaddr, AF_INET);
31     $peer_addr = inet_ntoa($iaddr);
32
33     $proto = getprotobyname('tcp');
34     socket(Socket_Handle, PF_UNIX, SOCK_STREAM, $proto);
35     unlink('/tmp/usock');
36     $sun = sockaddr_un('/tmp/usock');
37     connect(Socket_Handle,$sun);
38
39 =head1 DESCRIPTION
40
41 This module is just a translation of the C F<socket.h> file.
42 Unlike the old mechanism of requiring a translated F<socket.ph>
43 file, this uses the B<h2xs> program (see the Perl source distribution)
44 and your native C compiler.  This means that it has a 
45 far more likely chance of getting the numbers right.  This includes
46 all of the commonly used pound-defines like AF_INET, SOCK_STREAM, etc.
47
48 Also, some common socket "newline" constants are provided: the
49 constants C<CR>, C<LF>, and C<CRLF>, as well as C<$CR>, C<$LF>, and
50 C<$CRLF>, which map to C<\015>, C<\012>, and C<\015\012>.  If you do
51 not want to use the literal characters in your programs, then use
52 the constants provided here.  They are not exported by default, but can
53 be imported individually, and with the C<:crlf> export tag:
54
55     use Socket qw(:DEFAULT :crlf);
56
57 In addition, some structure manipulation functions are available:
58
59 =over 4
60
61 =item inet_aton HOSTNAME
62
63 Takes a string giving the name of a host, and translates that
64 to an opaque string (struct in_adrr). Takes arguments of both
65 the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
66 cannot be resolved, returns undef. For multi-homed hosts (hosts
67 with more than one address), the first address found is returned.
68
69 For portability do not assume that the result of inet_aton() is 32
70 bits wide, that it would contain only the IPv4 address in network
71 order.
72
73 =item inet_ntoa IP_ADDRESS
74
75 Takes a string (an opaque string as returned by inet_aton(), or
76 a v-string representing the four octets of the IPv4 address in
77 network order) and translates it into a string of the form 'd.d.d.d'
78 where the 'd's are numbers less than 256 (the normal readable four
79 dotted number notation for internet addresses).
80
81 =item INADDR_ANY
82
83 Note: does not return a number, but a packed string.
84
85 Returns the 4-byte wildcard ip address which specifies any
86 of the hosts ip addresses. (A particular machine can have
87 more than one ip address, each address corresponding to
88 a particular network interface. This wildcard address
89 allows you to bind to all of them simultaneously.)
90 Normally equivalent to inet_aton('0.0.0.0').
91
92 =item INADDR_BROADCAST
93
94 Note: does not return a number, but a packed string.
95
96 Returns the 4-byte 'this-lan' ip broadcast address.
97 This can be useful for some protocols to solicit information
98 from all servers on the same LAN cable.
99 Normally equivalent to inet_aton('255.255.255.255').
100
101 =item INADDR_LOOPBACK
102
103 Note - does not return a number.
104
105 Returns the 4-byte loopback address. Normally equivalent
106 to inet_aton('localhost').
107
108 =item INADDR_NONE
109
110 Note - does not return a number.
111
112 Returns the 4-byte 'invalid' ip address. Normally equivalent
113 to inet_aton('255.255.255.255').
114
115 =item sockaddr_in PORT, ADDRESS
116
117 =item sockaddr_in SOCKADDR_IN
118
119 In a list context, unpacks its SOCKADDR_IN argument and returns an array
120 consisting of (PORT, ADDRESS).  In a scalar context, packs its (PORT,
121 ADDRESS) arguments as a SOCKADDR_IN and returns it.  If this is confusing,
122 use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
123
124 =item pack_sockaddr_in PORT, IP_ADDRESS
125
126 Takes two arguments, a port number and a 4 byte IP_ADDRESS (as returned by
127 inet_aton()). Returns the sockaddr_in structure with those arguments
128 packed in with AF_INET filled in.  For internet domain sockets, this
129 structure is normally what you need for the arguments in bind(),
130 connect(), and send(), and is also returned by getpeername(),
131 getsockname() and recv().
132
133 =item unpack_sockaddr_in SOCKADDR_IN
134
135 Takes a sockaddr_in structure (as returned by pack_sockaddr_in()) and
136 returns an array of two elements: the port and the 4-byte ip-address.
137 Will croak if the structure does not have AF_INET in the right place.
138
139 =item sockaddr_un PATHNAME
140
141 =item sockaddr_un SOCKADDR_UN
142
143 In a list context, unpacks its SOCKADDR_UN argument and returns an array
144 consisting of (PATHNAME).  In a scalar context, packs its PATHNAME
145 arguments as a SOCKADDR_UN and returns it.  If this is confusing, use
146 pack_sockaddr_un() and unpack_sockaddr_un() explicitly.
147 These are only supported if your system has E<lt>F<sys/un.h>E<gt>.
148
149 =item pack_sockaddr_un PATH
150
151 Takes one argument, a pathname. Returns the sockaddr_un structure with
152 that path packed in with AF_UNIX filled in. For unix domain sockets, this
153 structure is normally what you need for the arguments in bind(),
154 connect(), and send(), and is also returned by getpeername(),
155 getsockname() and recv().
156
157 =item unpack_sockaddr_un SOCKADDR_UN
158
159 Takes a sockaddr_un structure (as returned by pack_sockaddr_un())
160 and returns the pathname.  Will croak if the structure does not
161 have AF_UNIX in the right place.
162
163 =back
164
165 =cut
166
167 use Carp;
168 use warnings::register;
169
170 require Exporter;
171 use XSLoader ();
172 @ISA = qw(Exporter);
173 @EXPORT = qw(
174         inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in
175         pack_sockaddr_un unpack_sockaddr_un
176         sockaddr_in sockaddr_un
177         INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
178         AF_802
179         AF_APPLETALK
180         AF_CCITT
181         AF_CHAOS
182         AF_DATAKIT
183         AF_DECnet
184         AF_DLI
185         AF_ECMA
186         AF_GOSIP
187         AF_HYLINK
188         AF_IMPLINK
189         AF_INET
190         AF_LAT
191         AF_MAX
192         AF_NBS
193         AF_NIT
194         AF_NS
195         AF_OSI
196         AF_OSINET
197         AF_PUP
198         AF_SNA
199         AF_UNIX
200         AF_UNSPEC
201         AF_X25
202         IOV_MAX
203         MSG_BCAST
204         MSG_CTLFLAGS
205         MSG_CTLIGNORE
206         MSG_CTRUNC
207         MSG_DONTROUTE
208         MSG_DONTWAIT
209         MSG_EOF
210         MSG_EOR
211         MSG_ERRQUEUE
212         MSG_FIN
213         MSG_MAXIOVLEN
214         MSG_MCAST
215         MSG_NOSIGNAL
216         MSG_OOB
217         MSG_PEEK
218         MSG_PROXY
219         MSG_RST
220         MSG_SYN
221         MSG_TRUNC
222         MSG_URG
223         MSG_WAITALL
224         PF_802
225         PF_APPLETALK
226         PF_CCITT
227         PF_CHAOS
228         PF_DATAKIT
229         PF_DECnet
230         PF_DLI
231         PF_ECMA
232         PF_GOSIP
233         PF_HYLINK
234         PF_IMPLINK
235         PF_INET
236         PF_LAT
237         PF_MAX
238         PF_NBS
239         PF_NIT
240         PF_NS
241         PF_OSI
242         PF_OSINET
243         PF_PUP
244         PF_SNA
245         PF_UNIX
246         PF_UNSPEC
247         PF_X25
248         SCM_CONNECT
249         SCM_CREDENTIALS
250         SCM_CREDS
251         SCM_RIGHTS
252         SCM_TIMESTAMP
253         SHUT_RD
254         SHUT_RDWR
255         SHUT_WR
256         SOCK_DGRAM
257         SOCK_RAW
258         SOCK_RDM
259         SOCK_SEQPACKET
260         SOCK_STREAM
261         SOL_SOCKET
262         SOMAXCONN
263         SO_ACCEPTCONN
264         SO_BROADCAST
265         SO_DEBUG
266         SO_DONTLINGER
267         SO_DONTROUTE
268         SO_ERROR
269         SO_KEEPALIVE
270         SO_LINGER
271         SO_OOBINLINE
272         SO_RCVBUF
273         SO_RCVLOWAT
274         SO_RCVTIMEO
275         SO_REUSEADDR
276         SO_REUSEPORT
277         SO_SNDBUF
278         SO_SNDLOWAT
279         SO_SNDTIMEO
280         SO_TYPE
281         SO_USELOOPBACK
282         UIO_MAXIOV
283 );
284
285 @EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF
286
287                IPPROTO_TCP
288                TCP_KEEPALIVE
289                TCP_MAXRT
290                TCP_MAXSEG
291                TCP_NODELAY
292                TCP_STDURG);
293
294 %EXPORT_TAGS = (
295     crlf    => [qw(CR LF CRLF $CR $LF $CRLF)],
296     all     => [@EXPORT, @EXPORT_OK],
297 );
298
299 BEGIN {
300     sub CR   () {"\015"}
301     sub LF   () {"\012"}
302     sub CRLF () {"\015\012"}
303 }
304
305 *CR   = \CR();
306 *LF   = \LF();
307 *CRLF = \CRLF();
308
309 sub sockaddr_in {
310     if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die
311         my($af, $port, @quad) = @_;
312         warnings::warn "6-ARG sockaddr_in call is deprecated" 
313             if warnings::enabled();
314         pack_sockaddr_in($port, inet_aton(join('.', @quad)));
315     } elsif (wantarray) {
316         croak "usage:   (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1;
317         unpack_sockaddr_in(@_);
318     } else {
319         croak "usage:   sin_sv = sockaddr_in(port,iaddr))" unless @_ == 2;
320         pack_sockaddr_in(@_);
321     }
322 }
323
324 sub sockaddr_un {
325     if (wantarray) {
326         croak "usage:   (filename) = sockaddr_un(sun_sv)" unless @_ == 1;
327         unpack_sockaddr_un(@_);
328     } else {
329         croak "usage:   sun_sv = sockaddr_un(filename)" unless @_ == 1;
330         pack_sockaddr_un(@_);
331     }
332 }
333
334 sub AUTOLOAD {
335     my($constname);
336     ($constname = $AUTOLOAD) =~ s/.*:://;
337     croak "&Socket::constant not defined" if $constname eq 'constant';
338     my ($error, $val) = constant($constname);
339     if ($error) {
340         croak $error;
341     }
342     *$AUTOLOAD = sub { $val };
343     goto &$AUTOLOAD;
344 }
345
346 XSLoader::load 'Socket', $VERSION;
347
348 1;