add checks for other Win32 POSIX substitutes
[spider.git] / perl / Msg.pm
index 45c0ab7c48b68f6bdd2f80d2a8fbd3c027ef0f57..a485718cd155bda80b42eab44cd140f1a66ff00b 100644 (file)
@@ -5,25 +5,20 @@
 #
 # I have modified it to suit my devious purposes (Dirk Koopman G1TLH)
 #
-# $Id$
+#
 #
 
 package Msg;
 
 use strict;
 
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
+use DXUtil;
 
 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);
+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 = ();
@@ -31,6 +26,7 @@ use vars qw(%rd_callbacks %wt_callbacks %er_callbacks $rd_handles $wt_handles $e
 $rd_handles   = IO::Select->new();
 $wt_handles   = IO::Select->new();
 $er_handles   = IO::Select->new();
+$total_in = $total_out = 0;
 
 $now = time;
 
@@ -40,12 +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) {
-#              print STDERR "POSIX Blocking *** NOT *** supported $@\n";
-               $blocking_supported = 0;
+               $blocking_supported = $io_socket->can('blocking') ? 2 : 0;
        } else {
-               $blocking_supported = 1;
-#              print STDERR "POSIX Blocking enabled\n";
+               $blocking_supported = $io_socket->can('blocking') ? 2 : 1;
        }
 
 
@@ -71,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 '*IPPROTO_TCP     = sub {     6 };' unless defined *IPPROTO_TCP;
+               eval '*TCP_NODELAY     = sub {     1 };' unless defined *TCP_NODELAY;
                $blocking_supported = 0;   # it appears that this DOESN'T work :-(
        } 
 }
@@ -138,12 +147,8 @@ sub blocking
        return unless $blocking_supported;
 
        # Make the handle stop blocking, the Windows way.
-       if ($main::is_win) { 
-         # 126 is FIONBIO (some docs say 0x7F << 16)
-               ioctl( $_[0],
-                          0x80000000 | (4 << 16) | (ord('f') << 8) | 126,
-                          "$_[1]"
-                        );
+       if ($blocking_supported) { 
+               $_[0]->blocking($_[1]);
        } else {
                my $flags = fcntl ($_[0], F_GETFL, 0);
                if ($_[1]) {
@@ -203,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');
@@ -216,7 +221,6 @@ sub connect {
        my $ip = gethostbyname($to_host);
        return undef unless $ip;
        
-#      my $r = $sock->connect($to_port, $ip);
        my $r = connect($sock, pack_sockaddr_in($to_port, $ip));
        return undef unless $r || _err_will_block($!);
        
@@ -235,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);
@@ -346,10 +350,10 @@ sub _send {
     # return to the event loop only after every message, or if it
     # is likely to block in the middle of a message.
 
-       if ($conn->{blocking} != $flush) {
-               blocking($sock, $flush);
-               $conn->{blocking} = $flush;
-       }
+#      if ($conn->{blocking} != $flush) {
+#              blocking($sock, $flush);
+#              $conn->{blocking} = $flush;
+#      }
     my $offset = (exists $conn->{send_offset}) ? $conn->{send_offset} : 0;
 
     while (@$rq) {
@@ -378,6 +382,7 @@ sub _send {
                                my $call = $conn->{call} || 'none';
                                dbgdump('raw', "$call send $bytes_written: ", $msg);
                        }
+                       $total_out      += $bytes_written;
             $offset         += $bytes_written;
             $bytes_to_write -= $bytes_written;
         }
@@ -433,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,
@@ -496,13 +501,14 @@ 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) {
+                       $total_in += $bytes_read;
                        if (isdbg('raw')) {
                                my $call = $conn->{call} || 'none';
                                dbgdump('raw', "$call read $bytes_read: ", $msg);