--- loncom/Attic/lonc	2002/04/04 21:55:55	1.37
+++ loncom/Attic/lonc	2002/09/09 14:04:02	1.42
@@ -5,7 +5,7 @@
 # provides persistent TCP connections to the other servers in the network
 # through multiplexed domain sockets
 #
-# $Id: lonc,v 1.37 2002/04/04 21:55:55 foxr Exp $
+# $Id: lonc,v 1.42 2002/09/09 14:04:02 harris41 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -48,6 +48,10 @@
 # 3/07/02 Ron Fox 
 # based on nonforker from Perl Cookbook
 # - server who multiplexes without forking
+# 5/11/2002 Scott Harrison
+
+use lib '/home/httpd/lib/perl/';
+use LONCAPA::Configuration;
 
 use POSIX;
 use IO::Socket;
@@ -71,18 +75,11 @@ $DEBUG = 0;			# Set to 1 for annoyingly
 $SIG{QUIT}=\&catchexception;
 $SIG{__DIE__}=\&catchexception;
 
-# ------------------------------------ Read httpd access.conf and get variables
-&status("Read access.conf");
-open (CONFIG,"/etc/httpd/conf/access.conf") || die "Can't read access.conf";
-
-while ($configline=<CONFIG>) {
-    if ($configline =~ /PerlSetVar/) {
-	my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
-        chomp($varvalue);
-        $perlvar{$varname}=$varvalue;
-    }
-}
-close(CONFIG);
+# ---------------------------------- Read loncapa_apache.conf and loncapa.conf
+&status("Read loncapa.conf and loncapa_apache.conf");
+my $perlvarref=LONCAPA::Configuration::read_conf('loncapa.conf');
+my %perlvar=%{$perlvarref};
+undef $perlvarref;
 
 # ----------------------------- Make sure this process is running from user=www
 &status("Check user ID");
@@ -175,7 +172,14 @@ $SIG{USR1} = \&USRMAN;
 # And maintain the population.
 while (1) {
     my $deadpid = wait;		# Wait for the next child to die.
-                                    # See who died and start new one
+                                # See who died and start new one
+                                # or a signal (e.g. USR1 for restart).
+                                # if a signal, the wait will fail
+                                # This is ordinarily detected by
+                                # checking for the existence of the
+                                # pid index inthe children hash since
+                                # the return value from a failed wait is -1
+                                # which is an impossible PID.
     &status("Woke up");
     my $skipping='';
 
@@ -512,7 +516,9 @@ sub HandleInput
     my $ready   = shift;
     my $sock;
 
-    &logthis("Entered HandleInput\n");
+    if($DEBUG) {
+	&logthis("Entered HandleInput\n");
+    }
     foreach $sock (keys %$sockets) {
 	my $socket = $sockets->{$sock};
 	if(vec($selvec, $sock, 1)) { # Socket which is readable.
@@ -868,8 +874,25 @@ sub checkchildren {
 
 sub USRMAN {
     &logthis("USR1: Trying to establish connections again");
-    %childatt=();
-    &checkchildren();
+    #
+    #  It is really important not to just clear the childatt hash or we will
+    #  lose all memory of the children.  What we really want to do is this:
+    #  For each index where childatt is >= $childmaxattempts
+    #  Zero the associated counter and do a make_child for the host.
+    #  Regardles, the childatt entry is zeroed:
+    my $host;
+    foreach $host (keys %childatt) {
+	if ($childatt{$host} >= $childmaxattempts) {
+	    $childatt{$host} = 0;
+	    &logthis("<font color=green>INFO: Restarting child for server: "
+		     .$host."</font>\n");
+	    make_new_child($host);
+	}
+	else {
+	    $childatt{$host} = 0;
+	}
+    }
+    &checkchildren();		# See if any children are still dead...
 }
 
 # -------------------------------------------------- Non-critical communication