X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FMsg.pm;h=850842810f034af6b7147ec3d94d8e5da7cb6d73;hb=dc888bd77fad283e988528b3fca9933605c134dd;hp=5ac71b428e44d793bc74f49e1dfb569bc4f04311;hpb=ad7e69f78ee4c0593e1d7576a7c1fd3b13931f84;p=spider.git diff --git a/perl/Msg.pm b/perl/Msg.pm index 5ac71b42..85084281 100644 --- a/perl/Msg.pm +++ b/perl/Msg.pm @@ -5,7 +5,7 @@ # # I have modified it to suit my devious purposes (Dirk Koopman G1TLH) # -# $Id$ +# # package Msg; @@ -14,15 +14,11 @@ use strict; use DXUtil; -use vars qw($VERSION $BRANCH); -($VERSION, $BRANCH) = dxver(q$Revision$); - use IO::Select; -use IO::Socket; use DXDebug; use Timer; -use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported $cnum $total_in $total_out); +use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $er_handles $now %conns $noconns $blocking_supported $cnum $total_in $total_out $io_socket); %rd_callbacks = (); %wt_callbacks = (); @@ -40,10 +36,25 @@ BEGIN { local $^W; require POSIX; POSIX->import(qw(O_NONBLOCK F_SETFL F_GETFL)) }; + + eval { + local $^W; + require IO::Socket::INET6; + }; + + if ($@) { + dbg($@); + require IO::Socket; + $io_socket = 'IO::Socket::INET'; + } else { + $io_socket = 'IO::Socket::INET6'; + } + $io_socket->import; + if ($@ || $main::is_win) { - $blocking_supported = IO::Socket->can('blocking') ? 2 : 0; + $blocking_supported = $io_socket->can('blocking') ? 2 : 0; } else { - $blocking_supported = IO::Socket->can('blocking') ? 2 : 1; + $blocking_supported = $io_socket->can('blocking') ? 2 : 1; } @@ -69,12 +80,12 @@ BEGIN { # defines EINPROGRESS as 10035. We provide it here because some # Win32 users report POSIX::EINPROGRESS is not vendor-supported. if ($^O eq 'MSWin32') { - eval '*EINPROGRESS = sub { 10036 };'; - eval '*EWOULDBLOCK = *EAGAIN = sub { 10035 };'; - eval '*F_GETFL = sub { 0 };'; - eval '*F_SETFL = sub { 0 };'; - eval '*IPPROTO_TCP = sub { 6 };'; - eval '*TCP_NODELAY = sub { 1 };'; + eval '*EINPROGRESS = sub { 10036 };' unless defined *EINPROGRESS; + eval '*EWOULDBLOCK = *EAGAIN = sub { 10035 };' unless defined *EWOULDBLOCK; + eval '*F_GETFL = sub { 0 };' unless defined *F_GETFL; + eval '*F_SETFL = sub { 0 };' unless defined *F_SETFL; + eval 'sub IPPROTO_TCP { 6 };' unless defined *IPPROTO_TCP; + eval 'sub TCP_NODELAY { 1 };' unless defined *TCP_NODELAY; $blocking_supported = 0; # it appears that this DOESN'T work :-( } } @@ -197,7 +208,7 @@ sub connect { $conn->{sort} = 'Outgoing'; # Create a new internet socket - my $sock = IO::Socket::INET->new(); + my $sock = $io_socket->new(); return undef unless $sock; my $proto = getprotobyname('tcp'); @@ -228,7 +239,7 @@ sub start_program my $pid; local $^F = 10000; # make sure it ain't closed on exec - my ($a, $b) = IO::Socket->socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC); + my ($a, $b) = $io_socket->socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC); if ($a && $b) { $a->autoflush(1); $b->autoflush(1); @@ -427,7 +438,7 @@ sub new_server { my ($pkg, $my_host, $my_port, $login_proc) = @_; my $self = $pkg->new($login_proc); - $self->{sock} = IO::Socket::INET->new ( + $self->{sock} = $io_socket->new ( LocalAddr => "$my_host:$my_port", # LocalPort => $my_port, Listen => SOMAXCONN, @@ -490,10 +501,10 @@ sub _rcv { # Complement to _send return unless defined($sock); my @lines; - if ($conn->{blocking}) { - blocking($sock, 0); - $conn->{blocking} = 0; - } +# if ($conn->{blocking}) { +# blocking($sock, 0); +# $conn->{blocking} = 0; +# } $bytes_read = sysread ($sock, $msg, 1024, 0); if (defined ($bytes_read)) { if ($bytes_read > 0) {