home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / perl / 5.8.8 / IO / Socket.pm < prev   
Encoding:
Perl POD Document  |  2006-07-07  |  6.5 KB  |  306 lines

  1. # IO::Socket.pm
  2. #
  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
  5. # modify it under the same terms as Perl itself.
  6.  
  7. package IO::Socket;
  8.  
  9. require 5.006;
  10.  
  11. use IO::Handle;
  12. use Socket 1.3;
  13. use Carp;
  14. use strict;
  15. our(@ISA, $VERSION, @EXPORT_OK);
  16. use Exporter;
  17. use Errno;
  18.  
  19. # legacy
  20.  
  21. require IO::Socket::INET;
  22. require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian');
  23.  
  24. @ISA = qw(IO::Handle);
  25.  
  26. $VERSION = "1.29";
  27.  
  28. @EXPORT_OK = qw(sockatmark);
  29.  
  30. sub import {
  31.     my $pkg = shift;
  32.     if (@_ && $_[0] eq 'sockatmark') { # not very extensible but for now, fast
  33.     Exporter::export_to_level('IO::Socket', 1, $pkg, 'sockatmark');
  34.     } else {
  35.     my $callpkg = caller;
  36.     Exporter::export 'Socket', $callpkg, @_;
  37.     }
  38. }
  39.  
  40. sub new {
  41.     my($class,%arg) = @_;
  42.     my $sock = $class->SUPER::new();
  43.  
  44.     $sock->autoflush(1);
  45.  
  46.     ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout};
  47.  
  48.     return scalar(%arg) ? $sock->configure(\%arg)
  49.             : $sock;
  50. }
  51.  
  52. my @domain2pkg;
  53.  
  54. sub register_domain {
  55.     my($p,$d) = @_;
  56.     $domain2pkg[$d] = $p;
  57. }
  58.  
  59. sub configure {
  60.     my($sock,$arg) = @_;
  61.     my $domain = delete $arg->{Domain};
  62.  
  63.     croak 'IO::Socket: Cannot configure a generic socket'
  64.     unless defined $domain;
  65.  
  66.     croak "IO::Socket: Unsupported socket domain"
  67.     unless defined $domain2pkg[$domain];
  68.  
  69.     croak "IO::Socket: Cannot configure socket in domain '$domain'"
  70.     unless ref($sock) eq "IO::Socket";
  71.  
  72.     bless($sock, $domain2pkg[$domain]);
  73.     $sock->configure($arg);
  74. }
  75.  
  76. sub socket {
  77.     @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)';
  78.     my($sock,$domain,$type,$protocol) = @_;
  79.  
  80.     socket($sock,$domain,$type,$protocol) or
  81.         return undef;
  82.  
  83.     ${*$sock}{'io_socket_domain'} = $domain;
  84.     ${*$sock}{'io_socket_type'}   = $type;
  85.     ${*$sock}{'io_socket_proto'}  = $protocol;
  86.  
  87.     $sock;
  88. }
  89.  
  90. sub socketpair {
  91.     @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)';
  92.     my($class,$domain,$type,$protocol) = @_;
  93.     my $sock1 = $class->new();
  94.     my $sock2 = $class->new();
  95.  
  96.     socketpair($sock1,$sock2,$domain,$type,$protocol) or
  97.         return ();
  98.  
  99.     ${*$sock1}{'io_socket_type'}  = ${*$sock2}{'io_socket_type'}  = $type;
  100.     ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol;
  101.  
  102.     ($sock1,$sock2);
  103. }
  104.  
  105. sub connect {
  106.     @_ == 2 or croak 'usage: $sock->connect(NAME)';
  107.     my $sock = shift;
  108.     my $addr = shift;
  109.     my $timeout = ${*$sock}{'io_socket_timeout'};
  110.     my $err;
  111.     my $blocking;
  112.  
  113.     $blocking = $sock->blocking(0) if $timeout;
  114.     if (!connect($sock, $addr)) {
  115.     if (defined $timeout && $!{EINPROGRESS}) {
  116.         require IO::Select;
  117.  
  118.         my $sel = new IO::Select $sock;
  119.  
  120.         if (!$sel->can_write($timeout)) {
  121.         $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
  122.         $@ = "connect: timeout";
  123.         }
  124.         elsif (!connect($sock,$addr) && not $!{EISCONN}) {
  125.         # Some systems refuse to re-connect() to
  126.         # an already open socket and set errno to EISCONN.
  127.         $err = $!;
  128.         $@ = "connect: $!";
  129.         }
  130.     }
  131.         elsif ($blocking || !$!{EINPROGRESS})  {
  132.         $err = $!;
  133.         $@ = "connect: $!";
  134.     }
  135.     }
  136.  
  137.     $sock->blocking(1) if $blocking;
  138.  
  139.     $! = $err if $err;
  140.  
  141.     $err ? undef : $sock;
  142. }
  143.  
  144. sub bind {
  145.     @_ == 2 or croak 'usage: $sock->bind(NAME)';
  146.     my $sock = shift;
  147.     my $addr = shift;
  148.  
  149.     return bind($sock, $addr) ? $sock
  150.                   : undef;
  151. }
  152.  
  153. sub listen {
  154.     @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])';
  155.     my($sock,$queue) = @_;
  156.     $queue = 5
  157.     unless $queue && $queue > 0;
  158.  
  159.     return listen($sock, $queue) ? $sock
  160.                  : undef;
  161. }
  162.  
  163. sub accept {
  164.     @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])';
  165.     my $sock = shift;
  166.     my $pkg = shift || $sock;
  167.     my $timeout = ${*$sock}{'io_socket_timeout'};
  168.     my $new = $pkg->new(Timeout => $timeout);
  169.     my $peer = undef;
  170.  
  171.     if(defined $timeout) {
  172.     require IO::Select;
  173.  
  174.     my $sel = new IO::Select $sock;
  175.  
  176.     unless ($sel->can_read($timeout)) {
  177.         $@ = 'accept: timeout';
  178.         $! = (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
  179.         return;
  180.     }
  181.     }
  182.  
  183.     $peer = accept($new,$sock)
  184.     or return;
  185.  
  186.     return wantarray ? ($new, $peer)
  187.                        : $new;
  188. }
  189.  
  190. sub sockname {
  191.     @_ == 1 or croak 'usage: $sock->sockname()';
  192.     getsockname($_[0]);
  193. }
  194.  
  195. sub peername {
  196.     @_ == 1 or croak 'usage: $sock->peername()';
  197.     my($sock) = @_;
  198.     getpeername($sock)
  199.       || ${*$sock}{'io_socket_peername'}
  200.       || undef;
  201. }
  202.  
  203. sub connected {
  204.     @_ == 1 or croak 'usage: $sock->connected()';
  205.     my($sock) = @_;
  206.     getpeername($sock);
  207. }
  208.  
  209. sub send {
  210.     @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])';
  211.     my $sock  = $_[0];
  212.     my $flags = $_[2] || 0;
  213.     my $peer  = $_[3] || $sock->peername;
  214.  
  215.     croak 'send: Cannot determine peer address'
  216.      unless($peer);
  217.  
  218.     my $r = defined(getpeername($sock))
  219.     ? send($sock, $_[1], $flags)
  220.     : send($sock, $_[1], $flags, $peer);
  221.  
  222.     # remember who we send to, if it was successful
  223.     ${*$sock}{'io_socket_peername'} = $peer
  224.     if(@_ == 4 && defined $r);
  225.  
  226.     $r;
  227. }
  228.  
  229. sub recv {
  230.     @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])';
  231.     my $sock  = $_[0];
  232.     my $len   = $_[2];
  233.     my $flags = $_[3] || 0;
  234.  
  235.     # remember who we recv'd from
  236.     ${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags);
  237. }
  238.  
  239. sub shutdown {
  240.     @_ == 2 or croak 'usage: $sock->shutdown(HOW)';
  241.     my($sock, $how) = @_;
  242.     shutdown($sock, $how);
  243. }
  244.  
  245. sub setsockopt {
  246.     @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME)';
  247.     setsockopt($_[0],$_[1],$_[2],$_[3]);
  248. }
  249.  
  250. my $intsize = length(pack("i",0));
  251.  
  252. sub getsockopt {
  253.     @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)';
  254.     my $r = getsockopt($_[0],$_[1],$_[2]);
  255.     # Just a guess
  256.     $r = unpack("i", $r)
  257.     if(defined $r && length($r) == $intsize);
  258.     $r;
  259. }
  260.  
  261. sub sockopt {
  262.     my $sock = shift;
  263.     @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_)
  264.         : $sock->setsockopt(SOL_SOCKET,@_);
  265. }
  266.  
  267. sub atmark {
  268.     @_ == 1 or croak 'usage: $sock->atmark()';
  269.     my($sock) = @_;
  270.     sockatmark($sock);
  271. }
  272.  
  273. sub timeout {
  274.     @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])';
  275.     my($sock,$val) = @_;
  276.     my $r = ${*$sock}{'io_socket_timeout'};
  277.  
  278.     ${*$sock}{'io_socket_timeout'} = defined $val ? 0 + $val : $val
  279.     if(@_ == 2);
  280.  
  281.     $r;
  282. }
  283.  
  284. sub sockdomain {
  285.     @_ == 1 or croak 'usage: $sock->sockdomain()';
  286.     my $sock = shift;
  287.     ${*$sock}{'io_socket_domain'};
  288. }
  289.  
  290. sub socktype {
  291.     @_ == 1 or croak 'usage: $sock->socktype()';
  292.     my $sock = shift;
  293.     ${*$sock}{'io_socket_type'}
  294. }
  295.  
  296. sub protocol {
  297.     @_ == 1 or croak 'usage: $sock->protocol()';
  298.     my($sock) = @_;
  299.     ${*$sock}{'io_socket_proto'};
  300. }
  301.  
  302. 1;
  303.  
  304. __END__
  305.  
  306.