[LON-CAPA-cvs] cvs: loncom / loncnew

foxr lon-capa-cvs@mail.lon-capa.org
Mon, 09 Feb 2004 10:58:03 -0000


This is a MIME encoded message

--foxr1076324283
Content-Type: text/plain

foxr		Mon Feb  9 05:58:03 2004 EDT

  Modified files:              
    /loncom	loncnew 
  Log:
  Handle the additional states in LondConnection during connection setup.
  Get and log the version of our peer.
  
  
--foxr1076324283
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20040209055803.txt"

Index: loncom/loncnew
diff -u loncom/loncnew:1.39 loncom/loncnew:1.40
--- loncom/loncnew:1.39	Tue Jan 13 04:57:18 2004
+++ loncom/loncnew	Mon Feb  9 05:58:03 2004
@@ -2,7 +2,7 @@
 # The LearningOnline Network with CAPA
 # lonc maintains the connections to remote computers
 #
-# $Id: loncnew,v 1.39 2004/01/13 09:57:18 foxr Exp $
+# $Id: loncnew,v 1.40 2004/02/09 10:58:03 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -63,11 +63,6 @@
 use LONCAPA::HashIterator;
 
 
-#
-#   Disable all signals we might receive from outside for now.
-#
-
-
 # Read the httpd configuration file to get perl variables
 # normally set in apache modules:
 
@@ -107,6 +102,7 @@
 my $RecentLogEntry  = "";
 my $ConnectionRetries=2;	# Number of connection retries allowed.
 my $ConnectionRetriesLeft=2;	# Number of connection retries remaining.
+my $LondVersion     = "unknown"; # Version of lond we talk with.
 
 #
 #   The hash below gives the HTML format for log messages
@@ -695,6 +691,17 @@
 The challenge has been replied to.  The we are receiveing the 
 'ok' from the partner.
 
+=head3  State=ReadingVersionString
+
+We have requested the lond version and are reading the
+version back.  Upon completion, we'll store the version away
+for future use(?).
+
+=head3 State=HostSet
+
+We have selected the domain name of our peer (multhomed hosts)
+and are getting the reply (presumably ok) back.
+
 =head3 State=RequestingKey
 
 The ok has been received and we need to send the request for
@@ -733,96 +740,119 @@
 
 sub LondReadable {
 
-    my $Event      = shift;
-    my $Watcher    = $Event->w;
-    my $Socket     = $Watcher->data;
-    my $client     = undef;
-
-    &Debug(6,"LondReadable called state = ".$Socket->GetState());
-
-
-    my $State = $Socket->GetState(); # All action depends on the state.
-
-    SocketDump(6, $Socket);
-    my $status = $Socket->Readable();
+   my $Event      = shift;
+   my $Watcher    = $Event->w;
+   my $Socket     = $Watcher->data;
+   my $client     = undef;
+
+   &Debug(6,"LondReadable called state = ".$Socket->GetState());
+
+
+   my $State = $Socket->GetState(); # All action depends on the state.
+
+   SocketDump(6, $Socket);
+   my $status = $Socket->Readable();
+
+   &Debug(2, "Socket->Readable returned: $status");
+
+   if($status != 0) {
+      # bad return from socket read. Currently this means that
+      # The socket has become disconnected. We fail the transaction.
+
+      Log("WARNING",
+         "Lond connection lost.");
+      if(exists($ActiveTransactions{$Socket})) {
+         FailTransaction($ActiveTransactions{$Socket});
+      }
+      $Watcher->cancel();
+      KillSocket($Socket);
+      $ConnectionRetriesLeft--;       # Counts as connection failure
+      return;
+   }
+   SocketDump(6,$Socket);
 
-    &Debug(2, "Socket->Readable returned: $status");
-
-    if($status != 0) {
-	 # bad return from socket read. Currently this means that
-	# The socket has become disconnected. We fail the transaction.
-
-	Log("WARNING",
-	    "Lond connection lost.");
-	if(exists($ActiveTransactions{$Socket})) {
-	    FailTransaction($ActiveTransactions{$Socket});
-	}
-	$Watcher->cancel();
-	KillSocket($Socket);
-	$ConnectionRetriesLeft--;       # Counts as connection failure
-	return;
-    }
-    SocketDump(6,$Socket);
-
-    $State = $Socket->GetState(); # Update in case of transition.
-    &Debug(6, "After read, state is ".$State);
+   $State = $Socket->GetState(); # Update in case of transition.
+   &Debug(6, "After read, state is ".$State);
 
    if($State eq "Initialized") {
 
 
-    } elsif ($State eq "ChallengeReceived") {
+   } elsif ($State eq "ChallengeReceived") {
 	#  The challenge must be echoed back;  The state machine
 	# in the connection takes care of setting that up.  Just
 	# need to transition to writable:
 
-	$Watcher->cb(\&LondWritable);
-	$Watcher->poll("w");
-
-    } elsif ($State eq "ChallengeReplied") {
+      $Watcher->cb(\&LondWritable);
+      $Watcher->poll("w");
 
+   } elsif ($State eq "ChallengeReplied") {
 
-    } elsif ($State eq "RequestingKey") {
+   } elsif ($State eq "RequestingVersion") {
+      # Need to ask for the version... that is writiability:
+      
+      $Watcher->cb(\&LondWritable);
+      $Watcher->poll("w");
+      
+   } elsif ($State eq "ReadingVersionString") {
+      # Read the rest of the version string... 
+   } elsif ($State eq "SetHost") {
+      # Need to request the actual domain get set...
+      
+      $Watcher->cb(\&LondWritable);
+      $Watcher->poll("w");
+   } elsif ($State eq "HostSet") {
+      # Reading the 'ok' from the peer.
+      
+   } elsif ($State eq "RequestingKey") {
 	#  The ok was received.  Now we need to request the key
 	#  That requires us to be writable:
 
-	$Watcher->cb(\&LondWritable);
-	$Watcher->poll("w");
+      $Watcher->cb(\&LondWritable);
+      $Watcher->poll("w");
 
-    } elsif ($State eq "ReceivingKey") {
+   } elsif ($State eq "ReceivingKey") {
 
-    } elsif ($State eq "Idle") {
+   } elsif ($State eq "Idle") {
+   
+   # This is as good a spot as any to get the peer version
+   # string:
+   
+   if($LondVersion eq "unknown") {
+      $LondVersion = $Socket->PeerVersion();
+      Log("INFO", "Connected to lond version: $LondVersion");
+   }
 	# If necessary, complete a transaction and then go into the
 	# idle queue.
 	#  Note that a trasition to idle indicates a live lond
 	# on the other end so reset the connection retries.
 	#
-	$ConnectionRetriesLeft = $ConnectionRetries; # success resets the count
-	$Watcher->cancel();
-	if(exists($ActiveTransactions{$Socket})) {
-	    Debug(5,"Completing transaction!!");
-	    CompleteTransaction($Socket, 
-				$ActiveTransactions{$Socket});
-	} else {
-	    Log("SUCCESS", "Connection ".$ConnectionCount." to "
-		.$RemoteHost." now ready for action");
-	}
-	ServerToIdle($Socket);	# Next work unit or idle.
+      $ConnectionRetriesLeft = $ConnectionRetries; # success resets the count
+      $Watcher->cancel();
+      if(exists($ActiveTransactions{$Socket})) {
+         Debug(5,"Completing transaction!!");
+         CompleteTransaction($Socket, 
+                             $ActiveTransactions{$Socket});
+      } else {
+         Log("SUCCESS", "Connection ".$ConnectionCount." to "
+            .$RemoteHost." now ready for action");
+      }
+      ServerToIdle($Socket);	# Next work unit or idle.
 	
-    } elsif ($State eq "SendingRequest") {
+   } elsif ($State eq "SendingRequest") {
 	#  We need to be writable for this and probably don't belong
 	#  here inthe first place.
 
-	Deubg(6, "SendingRequest state encountered in readable");
-	$Watcher->poll("w");
-	$Watcher->cb(\&LondWritable);
+      Deubg(6, "SendingRequest state encountered in readable");
+      $Watcher->poll("w");
+      $Watcher->cb(\&LondWritable);
 
-    } elsif ($State eq "ReceivingReply") {
+   } elsif ($State eq "ReceivingReply") {
 
 
-    } else {
+   } else {
 	 # Invalid state.
-	Debug(4, "Invalid state in LondReadable");
-    }
+      Debug(4, "Invalid state in LondReadable");
+   }
 }
 
 =pod
@@ -902,100 +932,131 @@
 
     SocketDump(6,$Socket);
 
-    if      ($State eq "Connected")         {
-
-	if ($Socket->Writable() != 0) {
-	    #  The write resulted in an error.
-	    # We'll treat this as if the socket got disconnected:
-	    Log("WARNING", "Connection to ".$RemoteHost.
-		" has been disconnected");
-	    FailTransaction($ActiveTransactions{$Socket});
-	    $Watcher->cancel();
-	    KillSocket($Socket);
-	    return;
-	}
-	#  "init" is being sent...
+   if      ($State eq "Connected")         {
 
-	
-    } elsif ($State eq "Initialized")       {
+      if ($Socket->Writable() != 0) {
+         #  The write resulted in an error.
+         # We'll treat this as if the socket got disconnected:
+         Log("WARNING", "Connection to ".$RemoteHost.
+                        " has been disconnected");
+         FailTransaction($ActiveTransactions{$Socket});
+         $Watcher->cancel();
+         KillSocket($Socket);
+         return;
+      }
+      
+   #  "init" is being sent...
+   
+   } elsif ($State eq "Initialized")       {
 
-	# Now that init was sent, we switch 
-	# to watching for readability:
+      # Now that init was sent, we switch 
+      # to watching for readability:
 
-	$Watcher->cb(\&LondReadable);
-	$Watcher->poll("r");
+      $Watcher->cb(\&LondReadable);
+      $Watcher->poll("r");
 
-    } elsif ($State eq "ChallengeReceived") {
-	# We received the challenge, now we 
-	# are echoing it back. This is a no-op,
-	# we're waiting for the state to change
+   } elsif ($State eq "ChallengeReceived") {
+      # We received the challenge, now we 
+      # are echoing it back. This is a no-op,
+      # we're waiting for the state to change
 	
-	if($Socket->Writable() != 0) {
+      if($Socket->Writable() != 0) {
 
-	    $Watcher->cancel();
-	    KillSocket($Socket);
-	    return;
-	}
+         $Watcher->cancel();
+         KillSocket($Socket);
+         return;
+      }
 	
-    } elsif ($State eq "ChallengeReplied")  {
-	# The echo was sent back, so we switch
-	# to watching readability.
-
-	$Watcher->cb(\&LondReadable);
-	$Watcher->poll("r");
-
-    } elsif ($State eq "RequestingKey")     {
-	# At this time we're requesting the key.
-	# again, this is essentially a no-op.
-	# we'll write the next chunk until the
-	# state changes.
-
-	if($Socket->Writable() != 0) {
-	    # Write resulted in an error.
+   } elsif ($State eq "ChallengeReplied")  {
+      # The echo was sent back, so we switch
+      # to watching readability.
+
+      $Watcher->cb(\&LondReadable);
+      $Watcher->poll("r");
+   } elsif ($State eq "RequestingVersion") {
+      # Sending the peer a version request...
+      
+      if($Socket->Writable() != 0) {
+         $Watcher->cancel();
+         KillSocket($Socket);
+         return;
+      }
+   } elsif ($State eq "ReadingVersionString") {
+      # Transition to read since we have sent the
+      # version command and now just need to read the
+      # version string from the peer:
+      
+      $Watcher->cb(\&LondReadable);
+      $Watcher->poll("r");
+      
+   } elsif ($State eq "SetHost") {
+      #  Setting the remote domain...
+      
+      if($Socket->Writable() != 0) {
+         $Watcher->cancel();
+         KillSocket($Socket);
+         return;
+      }
+   } elsif ($State eq "HostSet") {
+      # Back to readable to get the ok.
+      
+      $Watcher->cb(\&LondReadable);
+      $Watcher->poll("r");
+      
+
+   } elsif ($State eq "RequestingKey")     {
+      # At this time we're requesting the key.
+      # again, this is essentially a no-op.
+      # we'll write the next chunk until the
+      # state changes.
+
+      if($Socket->Writable() != 0) {
+         # Write resulted in an error.
+
+         $Watcher->cancel();
+         KillSocket($Socket);
+         return;
+
+      }
+   } elsif ($State eq "ReceivingKey")      {
+      # Now we need to wait for the key
+      # to come back from the peer:
 
-	    $Watcher->cancel();
-	    KillSocket($Socket);
-	    return;
-
-	}
-    } elsif ($State eq "ReceivingKey")      {
-	# Now we need to wait for the key
-	# to come back from the peer:
+      $Watcher->cb(\&LondReadable);
+      $Watcher->poll("r");
 
-	$Watcher->cb(\&LondReadable);
-	$Watcher->poll("r");
-
-    } elsif ($State eq "SendingRequest")    {
-	# At this time we are sending a request to the
+   } elsif ($State eq "SendingRequest")    {
+ 
+   # At this time we are sending a request to the
 	# peer... write the next chunk:
 
-	if($Socket->Writable() != 0) {
+      if($Socket->Writable() != 0) {
 
-	    if(exists($ActiveTransactions{$Socket})) {
-		Debug(3, "Lond connection lost, failing transactions");
-		FailTransaction($ActiveTransactions{$Socket});
-	    }
-	    $Watcher->cancel();
-	    KillSocket($Socket);
-	    return;
+         if(exists($ActiveTransactions{$Socket})) {
+            Debug(3, "Lond connection lost, failing transactions");
+            FailTransaction($ActiveTransactions{$Socket});
+         }
+	      $Watcher->cancel();
+         KillSocket($Socket);
+         return;
 	    
-	}
+      }
 
-    } elsif ($State eq "ReceivingReply")    {
-	# The send has completed.  Wait for the
-	# data to come in for a reply.
-	Debug(8,"Writable sent request/receiving reply");
-	$Watcher->cb(\&LondReadable);
-	$Watcher->poll("r");
+   } elsif ($State eq "ReceivingReply")    {
+      # The send has completed.  Wait for the
+      # data to come in for a reply.
+      Debug(8,"Writable sent request/receiving reply");
+      $Watcher->cb(\&LondReadable);
+      $Watcher->poll("r");
+
+   } else {
+      #  Control only passes here on an error: 
+      #  the socket state does not match any
+      #  of the known states... so an error
+      #  must be logged.
 
-    } else {
-	#  Control only passes here on an error: 
-	#  the socket state does not match any
-	#  of the known states... so an error
-	#  must be logged.
-
-	&Debug(4, "Invalid socket state ".$State."\n");
-    }
+      &Debug(4, "Invalid socket state ".$State."\n");
+   }
     
 }
 =pod

--foxr1076324283--