1. put some extra checks and balances in to message send routine in Msg.pm to
[spider.git] / perl / Msg.pm
index 20e000334ca5d72d103d51e63f17694ea643bc88..33a0af80786bab83e44bf12b1bbc26324a1d1f97 100644 (file)
@@ -67,7 +67,8 @@ sub disconnect {
     my $sock = delete $conn->{sock};
     return unless defined($sock);
     set_event_handler ($sock, "read" => undef, "write" => undef);
-    close($sock);
+    shutdown($sock, 3);
+       close($sock);
 }
 
 sub send_now {
@@ -109,9 +110,11 @@ sub _send {
 
     while (@$rq) {
         my $msg            = $rq->[0];
-        my $bytes_to_write = length($msg) - $offset;
+               my $mlth           = length($msg);
+        my $bytes_to_write = $mlth - $offset;
         my $bytes_written  = 0;
-        while ($bytes_to_write) {
+               confess("Negative Length! msg: '$msg' lth: $mlth offset: $offset") if $bytes_to_write < 0;
+        while ($bytes_to_write > 0) {
             $bytes_written = syswrite ($sock, $msg,
                                        $bytes_to_write, $offset);
             if (!defined($bytes_written)) {
@@ -123,6 +126,7 @@ sub _send {
                     # be called back eventually, and will resume sending
                     return 1;
                 } else {    # Uh, oh
+                                       delete $conn->{send_offset};
                     $conn->handle_send_err($!);
                     return 0; # fail. Message remains in queue ..
                 }
@@ -165,6 +169,7 @@ sub set_blocking {
         fcntl ($_[0], F_SETFL(), $flags);
     }
 }
+
 sub handle_send_err {
    # For more meaningful handling of send errors, subclass Msg and
    # rebless $conn.  
@@ -277,6 +282,13 @@ sub _new_client {
     }
 }
 
+sub close_server
+{
+       set_event_handler ($main_socket, "read" => undef);
+       $main_socket->close;
+       $main_socket = 0;
+}
+
 #----------------------------------------------------
 # Event loop routines used by both client and server