[ID 19991112.004] Bug in IO::Socket (patch included)
[p5sagit/p5-mst-13.2.git] / ext / IO / lib / IO / Socket.pm
CommitLineData
774d564b 1# IO::Socket.pm
8add82fc 2#
cf7fe8a2 3# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
4# This program is free software; you can redistribute it and/or
774d564b 5# modify it under the same terms as Perl itself.
8add82fc 6
7package IO::Socket;
8
8add82fc 9require 5.000;
10
8add82fc 11use IO::Handle;
12use Socket 1.3;
13use Carp;
14use strict;
7a4c00b4 15use vars qw(@ISA $VERSION);
8add82fc 16use Exporter;
17
cf7fe8a2 18# legacy
19
20require IO::Socket::INET;
21require IO::Socket::UNIX;
22
8add82fc 23@ISA = qw(IO::Handle);
24
c4be5b27 25$VERSION = "1.252";
8add82fc 26
27sub import {
28 my $pkg = shift;
29 my $callpkg = caller;
30 Exporter::export 'Socket', $callpkg, @_;
31}
32
33sub new {
34 my($class,%arg) = @_;
cf7fe8a2 35 my $sock = $class->SUPER::new();
36
37 $sock->autoflush(1);
8add82fc 38
cf7fe8a2 39 ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout};
8add82fc 40
cf7fe8a2 41 return scalar(%arg) ? $sock->configure(\%arg)
42 : $sock;
8add82fc 43}
44
cf7fe8a2 45my @domain2pkg;
27d4819a 46
47sub register_domain {
48 my($p,$d) = @_;
774d564b 49 $domain2pkg[$d] = $p;
27d4819a 50}
51
8add82fc 52sub configure {
cf7fe8a2 53 my($sock,$arg) = @_;
27d4819a 54 my $domain = delete $arg->{Domain};
55
56 croak 'IO::Socket: Cannot configure a generic socket'
57 unless defined $domain;
58
774d564b 59 croak "IO::Socket: Unsupported socket domain"
60 unless defined $domain2pkg[$domain];
27d4819a 61
7a4c00b4 62 croak "IO::Socket: Cannot configure socket in domain '$domain'"
cf7fe8a2 63 unless ref($sock) eq "IO::Socket";
27d4819a 64
cf7fe8a2 65 bless($sock, $domain2pkg[$domain]);
66 $sock->configure($arg);
8add82fc 67}
68
69sub socket {
cf7fe8a2 70 @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)';
71 my($sock,$domain,$type,$protocol) = @_;
8add82fc 72
cf7fe8a2 73 socket($sock,$domain,$type,$protocol) or
8add82fc 74 return undef;
75
cf7fe8a2 76 ${*$sock}{'io_socket_domain'} = $domain;
77 ${*$sock}{'io_socket_type'} = $type;
78 ${*$sock}{'io_socket_proto'} = $protocol;
774d564b 79
cf7fe8a2 80 $sock;
8add82fc 81}
82
83sub socketpair {
c4be5b27 84 @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)';
8add82fc 85 my($class,$domain,$type,$protocol) = @_;
cf7fe8a2 86 my $sock1 = $class->new();
87 my $sock2 = $class->new();
8add82fc 88
cf7fe8a2 89 socketpair($sock1,$sock2,$domain,$type,$protocol) or
8add82fc 90 return ();
91
cf7fe8a2 92 ${*$sock1}{'io_socket_type'} = ${*$sock2}{'io_socket_type'} = $type;
93 ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol;
8add82fc 94
cf7fe8a2 95 ($sock1,$sock2);
8add82fc 96}
97
98sub connect {
cf7fe8a2 99 @_ == 2 or croak 'usage: $sock->connect(NAME)';
100 my $sock = shift;
101 my $addr = shift;
102 my $timeout = ${*$sock}{'io_socket_timeout'};
103
00fdd80d 104 my $blocking;
105 $blocking = $sock->blocking(0) if $timeout;
cf7fe8a2 106
00fdd80d 107 eval {
8add82fc 108 croak 'connect: Bad address'
109 if(@_ == 2 && !defined $_[1]);
110
cf7fe8a2 111 unless(connect($sock, $addr)) {
112 if($timeout && ($! == &IO::EINPROGRESS)) {
113 require IO::Select;
8add82fc 114
cf7fe8a2 115 my $sel = new IO::Select $sock;
8add82fc 116
cf7fe8a2 117 unless($sel->can_write($timeout) && defined($sock->peername)) {
cf7fe8a2 118 croak "connect: timeout";
119 }
120 }
121 else {
cf7fe8a2 122 croak "connect: $!";
123 }
124 }
8add82fc 125 };
760ac839 126
00fdd80d 127 my $ret = $@ ? undef : $sock;
128
129 $sock->blocking($blocking) if $timeout;
130
131 $ret;
8add82fc 132}
133
134sub bind {
cf7fe8a2 135 @_ == 2 or croak 'usage: $sock->bind(NAME)';
136 my $sock = shift;
137 my $addr = shift;
8add82fc 138
cf7fe8a2 139 return bind($sock, $addr) ? $sock
140 : undef;
8add82fc 141}
142
143sub listen {
cf7fe8a2 144 @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])';
145 my($sock,$queue) = @_;
8add82fc 146 $queue = 5
147 unless $queue && $queue > 0;
148
cf7fe8a2 149 return listen($sock, $queue) ? $sock
150 : undef;
8add82fc 151}
152
153sub accept {
cf7fe8a2 154 @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])';
155 my $sock = shift;
156 my $pkg = shift || $sock;
157 my $timeout = ${*$sock}{'io_socket_timeout'};
8add82fc 158 my $new = $pkg->new(Timeout => $timeout);
159 my $peer = undef;
160
161 eval {
162 if($timeout) {
cf7fe8a2 163 require IO::Select;
164
165 my $sel = new IO::Select $sock;
166
8add82fc 167 croak "accept: timeout"
cf7fe8a2 168 unless $sel->can_read($timeout);
8add82fc 169 }
cf7fe8a2 170 $peer = accept($new,$sock) || undef;
8add82fc 171 };
6688c047 172 croak "$@"
173 if ($@ and $fh);
8add82fc 174
175 return wantarray ? defined $peer ? ($new, $peer)
176 : ()
177 : defined $peer ? $new
178 : undef;
179}
180
181sub sockname {
cf7fe8a2 182 @_ == 1 or croak 'usage: $sock->sockname()';
8add82fc 183 getsockname($_[0]);
184}
185
186sub peername {
cf7fe8a2 187 @_ == 1 or croak 'usage: $sock->peername()';
188 my($sock) = @_;
189 getpeername($sock)
190 || ${*$sock}{'io_socket_peername'}
8add82fc 191 || undef;
192}
193
cf7fe8a2 194sub connected {
195 @_ == 1 or croak 'usage: $sock->connected()';
196 my($sock) = @_;
197 getpeername($sock);
198}
199
8add82fc 200sub send {
cf7fe8a2 201 @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])';
202 my $sock = $_[0];
8add82fc 203 my $flags = $_[2] || 0;
cf7fe8a2 204 my $peer = $_[3] || $sock->peername;
8add82fc 205
206 croak 'send: Cannot determine peer address'
207 unless($peer);
208
cf7fe8a2 209 my $r = defined(getpeername($sock))
210 ? send($sock, $_[1], $flags)
211 : send($sock, $_[1], $flags, $peer);
8add82fc 212
213 # remember who we send to, if it was sucessful
cf7fe8a2 214 ${*$sock}{'io_socket_peername'} = $peer
8add82fc 215 if(@_ == 4 && defined $r);
216
217 $r;
218}
219
220sub recv {
cf7fe8a2 221 @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])';
8add82fc 222 my $sock = $_[0];
223 my $len = $_[2];
224 my $flags = $_[3] || 0;
225
226 # remember who we recv'd from
227 ${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags);
228}
229
cf7fe8a2 230sub shutdown {
231 @_ == 2 or croak 'usage: $sock->shutdown(HOW)';
232 my($sock, $how) = @_;
233 shutdown($sock, $how);
234}
8add82fc 235
236sub setsockopt {
cf7fe8a2 237 @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME)';
8add82fc 238 setsockopt($_[0],$_[1],$_[2],$_[3]);
239}
240
241my $intsize = length(pack("i",0));
242
243sub getsockopt {
cf7fe8a2 244 @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)';
8add82fc 245 my $r = getsockopt($_[0],$_[1],$_[2]);
246 # Just a guess
247 $r = unpack("i", $r)
248 if(defined $r && length($r) == $intsize);
249 $r;
250}
251
252sub sockopt {
cf7fe8a2 253 my $sock = shift;
254 @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_)
255 : $sock->setsockopt(SOL_SOCKET,@_);
8add82fc 256}
257
258sub timeout {
cf7fe8a2 259 @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])';
260 my($sock,$val) = @_;
261 my $r = ${*$sock}{'io_socket_timeout'} || undef;
8add82fc 262
cf7fe8a2 263 ${*$sock}{'io_socket_timeout'} = 0 + $val
8add82fc 264 if(@_ == 2);
265
266 $r;
267}
268
27d4819a 269sub sockdomain {
cf7fe8a2 270 @_ == 1 or croak 'usage: $sock->sockdomain()';
271 my $sock = shift;
272 ${*$sock}{'io_socket_domain'};
27d4819a 273}
274
8add82fc 275sub socktype {
cf7fe8a2 276 @_ == 1 or croak 'usage: $sock->socktype()';
277 my $sock = shift;
278 ${*$sock}{'io_socket_type'}
8add82fc 279}
280
27d4819a 281sub protocol {
cf7fe8a2 282 @_ == 1 or croak 'usage: $sock->protocol()';
283 my($sock) = @_;
8fd73a68 284 ${*$sock}{'io_socket_proto'};
27d4819a 285}
286
cf7fe8a2 2871;
8add82fc 288
cf7fe8a2 289__END__
27d4819a 290
cf7fe8a2 291=head1 NAME
e713eafe 292
cf7fe8a2 293IO::Socket - Object interface to socket communications
8add82fc 294
cf7fe8a2 295=head1 SYNOPSIS
7a4c00b4 296
cf7fe8a2 297 use IO::Socket;
7a4c00b4 298
cf7fe8a2 299=head1 DESCRIPTION
7a4c00b4 300
cf7fe8a2 301C<IO::Socket> provides an object interface to creating and using sockets. It
302is built upon the L<IO::Handle> interface and inherits all the methods defined
303by L<IO::Handle>.
8add82fc 304
cf7fe8a2 305C<IO::Socket> only defines methods for those operations which are common to all
306types of socket. Operations which are specified to a socket in a particular
307domain have methods defined in sub classes of C<IO::Socket>
e713eafe 308
cf7fe8a2 309C<IO::Socket> will export all functions (and constants) defined by L<Socket>.
e713eafe 310
cf7fe8a2 311=head1 CONSTRUCTOR
8add82fc 312
27d4819a 313=over 4
314
cf7fe8a2 315=item new ( [ARGS] )
27d4819a 316
cf7fe8a2 317Creates an C<IO::Socket>, which is a reference to a
318newly created symbol (see the C<Symbol> package). C<new>
319optionally takes arguments, these arguments are in key-value pairs.
320C<new> only looks for one key C<Domain> which tells new which domain
321the socket will be in. All other arguments will be passed to the
322configuration method of the package for that domain, See below.
8add82fc 323
cf7fe8a2 324 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
325
326As of VERSION 1.18 all IO::Socket objects have autoflush turned on
327by default. This was not the case with earlier releases.
27d4819a 328
cf7fe8a2 329 NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
27d4819a 330
331=back
8add82fc 332
cf7fe8a2 333=head1 METHODS
8add82fc 334
cf7fe8a2 335See L<perlfunc> for complete descriptions of each of the following
336supported C<IO::Socket> methods, which are just front ends for the
337corresponding built-in functions:
8add82fc 338
cf7fe8a2 339 socket
340 socketpair
341 bind
342 listen
343 accept
344 send
345 recv
346 peername (getpeername)
347 sockname (getsockname)
348 shutdown
8add82fc 349
cf7fe8a2 350Some methods take slightly different arguments to those defined in L<perlfunc>
351in attempt to make the interface more flexible. These are
8add82fc 352
cf7fe8a2 353=over 4
8add82fc 354
cf7fe8a2 355=item accept([PKG])
8add82fc 356
cf7fe8a2 357perform the system call C<accept> on the socket and return a new object. The
358new object will be created in the same class as the listen socket, unless
359C<PKG> is specified. This object can be used to communicate with the client
360that was trying to connect. In a scalar context the new socket is returned,
361or undef upon failure. In an array context a two-element array is returned
c4be5b27 362containing the new socket and the peer address; the list will
cf7fe8a2 363be empty upon failure.
8add82fc 364
c4be5b27 365=item socketpair(DOMAIN, TYPE, PROTOCOL)
366
367Call C<socketpair> and return a list of two sockets created, or an
368empty list on failure.
369
370=back
371
372Additional methods that are provided are:
373
374=over 4
8add82fc 375
cf7fe8a2 376=item timeout([VAL])
8add82fc 377
cf7fe8a2 378Set or get the timeout value associated with this socket. If called without
379any arguments then the current setting is returned. If called with an argument
380the current setting is changed and the previous value returned.
8add82fc 381
cf7fe8a2 382=item sockopt(OPT [, VAL])
27d4819a 383
cf7fe8a2 384Unified method to both set and get options in the SOL_SOCKET level. If called
385with one argument then getsockopt is called, otherwise setsockopt is called.
8add82fc 386
cf7fe8a2 387=item sockdomain
8add82fc 388
cf7fe8a2 389Returns the numerical number for the socket domain type. For example, for
390a AF_INET socket the value of &AF_INET will be returned.
8add82fc 391
cf7fe8a2 392=item socktype
8add82fc 393
cf7fe8a2 394Returns the numerical number for the socket type. For example, for
395a SOCK_STREAM socket the value of &SOCK_STREAM will be returned.
27d4819a 396
cf7fe8a2 397=item protocol
8add82fc 398
cf7fe8a2 399Returns the numerical number for the protocol being used on the socket, if
400known. If the protocol is unknown, as with an AF_UNIX socket, zero
401is returned.
8add82fc 402
cf7fe8a2 403=item connected
8add82fc 404
cf7fe8a2 405If the socket is in a connected state the the peer address is returned.
406If the socket is not in a connected state then undef will be returned.
27d4819a 407
408=back
8add82fc 409
7a4c00b4 410=head1 SEE ALSO
8add82fc 411
cf7fe8a2 412L<Socket>, L<IO::Handle>, L<IO::Socket::INET>, L<IO::Socket::UNIX>
8add82fc 413
7a4c00b4 414=head1 AUTHOR
8add82fc 415
854822f1 416Graham Barr. Currently maintained by the Perl Porters. Please report all
417bugs to <perl5-porters@perl.org>.
760ac839 418
8add82fc 419=head1 COPYRIGHT
420
cf7fe8a2 421Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
422This program is free software; you can redistribute it and/or
423modify it under the same terms as Perl itself.
8add82fc 424
425=cut