Diff for /loncom/LondConnection.pm between versions 1.26 and 1.27

version 1.26, 2004/02/27 18:32:21 version 1.27, 2004/03/02 11:14:38
Line 216  sub new { Line 216  sub new {
                      Cipher             => undef};                       Cipher             => undef};
     bless($self, $class);      bless($self, $class);
     unless ($self->{Socket} = IO::Socket::INET->new(PeerHost => $self->{Host},      unless ($self->{Socket} = IO::Socket::INET->new(PeerHost => $self->{Host},
     PeerPort => $self->{Port},         PeerPort => $self->{Port},
     Type     => SOCK_STREAM,         Type     => SOCK_STREAM,
     Proto    => "tcp",         Proto    => "tcp",
     Timeout  => 3)) {         Timeout  => 3)) {
  return undef; # Inidicates the socket could not be made.   return undef; # Inidicates the socket could not be made.
     }      }
     #      #
Line 279  sub Readable { Line 279  sub Readable {
     my $self    = shift;      my $self    = shift;
     my $socket  = $self->{Socket};      my $socket  = $self->{Socket};
     my $data    = '';      my $data    = '';
     my $rv      = $socket->recv($data, POSIX::BUFSIZ,  0);      my $rv;
       if ($socket) {
    eval {
       $rv = $socket->recv($data, POSIX::BUFSIZ, 0);
    }
       } else {
    $self->Transition("Disconnected");
    return -1;
       }
     my $errno   = $! + 0;             # Force numeric context.      my $errno   = $! + 0;             # Force numeric context.
   
     unless (defined($rv) && length $data) {# Read failed,      unless (defined($rv) && length $data) {# Read failed,
Line 309  sub Readable { Line 317  sub Readable {
  $socket->close();   $socket->close();
  return -1;   return -1;
     }      }
       
     &Debug(8," Transition out of Initialized");      &Debug(8," Transition out of Initialized");
     $self->{TransactionRequest} = $self->{TransactionReply};      $self->{TransactionRequest} = $self->{TransactionReply};
     $self->{InformWritable}     = 1;      $self->{InformWritable}     = 1;
Line 317  sub Readable { Line 325  sub Readable {
     $self->Transition("ChallengeReceived");      $self->Transition("ChallengeReceived");
     $self->{TimeoutRemaining}   = $self->{TimeoutValue};      $self->{TimeoutRemaining}   = $self->{TimeoutValue};
     return 0;      return 0;
  }  elsif ($self->{State} eq "ChallengeReplied") {     }  elsif ($self->{State} eq "ChallengeReplied") {
     if($self->{TransactionReply} ne "ok\n") {        if($self->{TransactionReply} ne "ok\n") {
  $self->Transition("Disconnected");           $self->Transition("Disconnected");
  $socket->close();           $socket->close();
  return -1;           return -1;
     }        }
     $self->Transition("RequestingVersion");        $self->Transition("RequestingVersion");
     $self->{InformReadable}   = 0;        $self->{InformReadable}   = 0;
     $self->{InformWritable}   = 1;        $self->{InformWritable}   = 1;
     $self->{TransactionRequest} = "version\n";        $self->{TransactionRequest} = "version\n";
     return 0;        return 0;
  } elsif ($self->{State} eq "ReadingVersionString") {     } elsif ($self->{State} eq "ReadingVersionString") {
     $self->{LondVersion}       = chomp($self->{TransactionReply});        $self->{LondVersion}       = chomp($self->{TransactionReply});
     $self->Transition("SetHost");        $self->Transition("SetHost");
     $self->{InformReadable}    = 0;        $self->{InformReadable}    = 0;
     $self->{InformWritable}    = 1;        $self->{InformWritable}    = 1;
     my $peer = $self->{LoncapaHim};        my $peer = $self->{LoncapaHim};
     $self->{TransactionRequest}= "sethost:$peer\n";        $self->{TransactionRequest}= "sethost:$peer\n";
     return 0;        return 0;
  } elsif ($self->{State} eq "HostSet") { # should be ok.   } elsif ($self->{State} eq "HostSet") { # should be ok.
     if($self->{TransactionReply} ne "ok\n") {        if($self->{TransactionReply} ne "ok\n") {
  $self->Transition("Disconnected");           $self->Transition("Disconnected");
  $socket->close();           $socket->close();
  return -1;           return -1;
     }        }
     $self->Transition("RequestingKey");     $self->Transition("RequestingKey");
     $self->{InformReadable}  = 0;     $self->{InformReadable}  = 0;
     $self->{InformWritable}  = 1;     $self->{InformWritable}  = 1;
     $self->{TransactionRequest} = "ekey\n";     $self->{TransactionRequest} = "ekey\n";
     return 0;     return 0;
  } elsif ($self->{State}  eq "ReceivingKey") {   } elsif ($self->{State}  eq "ReceivingKey") {
     my $buildkey = $self->{TransactionReply};      my $buildkey = $self->{TransactionReply};
     my $key = $self->{LoncapaHim}.$perlvar{'lonHostID'};      my $key = $self->{LoncapaHim}.$perlvar{'lonHostID'};
Line 395  sub Readable { Line 403  sub Readable {
     }      }
   
     return 0;      return 0;
       
 }  }
   
   
Line 410  mark the object as waiting for readabili Line 418  mark the object as waiting for readabili
 Returns  0 if successful, or -1 if not.  Returns  0 if successful, or -1 if not.
   
 =cut  =cut
   
 sub Writable {  sub Writable {
     my $self     = shift; # Get reference to the object.      my $self     = shift; # Get reference to the object.
     my $socket   = $self->{Socket};      my $socket   = $self->{Socket};
Line 419  sub Writable { Line 426  sub Writable {
  eval {   eval {
     $nwritten = $socket->send($self->{TransactionRequest}, 0);      $nwritten = $socket->send($self->{TransactionRequest}, 0);
  }   }
       } else {
    # For whatever reason, there's no longer a socket left.
   
   
    $self->Transition("Disconnected");
    return -1;
     }      }
     my $errno    = $! + 0;      my $errno    = $! + 0;
     unless (defined $nwritten) {      unless (defined $nwritten) {
Line 434  sub Writable { Line 447  sub Writable {
  ($errno == POSIX::EINTR)          ||   ($errno == POSIX::EINTR)          ||
  ($errno ==  0)) {   ($errno ==  0)) {
  substr($self->{TransactionRequest}, 0, $nwritten) = ""; # rmv written part   substr($self->{TransactionRequest}, 0, $nwritten) = ""; # rmv written part
  if(length $self->{TransactionRequest} == 0) {        if(length $self->{TransactionRequest} == 0) {
     $self->{InformWritable} = 0;           $self->{InformWritable} = 0;
     $self->{InformReadable} = 1;           $self->{InformReadable} = 1;
     $self->{TransactionReply} = '';           $self->{TransactionReply} = '';
     #           #
     # Figure out the next state:           # Figure out the next state:
     #           #
     if($self->{State} eq "Connected") {           if($self->{State} eq "Connected") {
  $self->Transition("Initialized");              $self->Transition("Initialized");
     } elsif($self->{State} eq "ChallengeReceived") {           } elsif($self->{State} eq "ChallengeReceived") {
  $self->Transition("ChallengeReplied");              $self->Transition("ChallengeReplied");
     } elsif($self->{State} eq "RequestingVersion") {           } elsif($self->{State} eq "RequestingVersion") {
  $self->Transition("ReadingVersionString");              $self->Transition("ReadingVersionString");
     } elsif ($self->{State} eq "SetHost") {           } elsif ($self->{State} eq "SetHost") {
  $self->Transition("HostSet");              $self->Transition("HostSet");
     } elsif($self->{State} eq "RequestingKey") {           } elsif($self->{State} eq "RequestingKey") {
  $self->Transition("ReceivingKey");              $self->Transition("ReceivingKey");
 #            $self->{InformWritable} = 0;  #            $self->{InformWritable} = 0;
 #            $self->{InformReadable} = 1;  #            $self->{InformReadable} = 1;
 #            $self->{TransactionReply} = '';  #            $self->{TransactionReply} = '';
     } elsif ($self->{State} eq "SendingRequest") {           } elsif ($self->{State} eq "SendingRequest") {
  $self->Transition("ReceivingReply");              $self->Transition("ReceivingReply");
  $self->{TimeoutRemaining} = $self->{TimeoutValue};              $self->{TimeoutRemaining} = $self->{TimeoutValue};
     } elsif ($self->{State} eq "Disconnected") {           } elsif ($self->{State} eq "Disconnected") {
  return -1;              return -1;
     }           }
     return 0;           return 0;
  }        }
     } else { # The write failed (e.g. partner disconnected).     } else { # The write failed (e.g. partner disconnected).
  $self->Transition("Disconnected");        $self->Transition("Disconnected");
  $socket->close();        $socket->close();
  return -1;        return -1;
     }     }
   
 }  }
   
 =pod  =pod
   
 =head2 Tick  =head2 Tick

Removed from v.1.26  
changed lines
  Added in v.1.27


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>