--- loncom/lond	2010/11/02 10:20:35	1.462
+++ loncom/lond	2011/04/05 15:49:27	1.467.2.2
@@ -2,7 +2,7 @@
 # The LearningOnline Network
 # lond "LON Daemon" Server (port "LOND" 5663)
 #
-# $Id: lond,v 1.462 2010/11/02 10:20:35 foxr Exp $
+# $Id: lond,v 1.467.2.2 2011/04/05 15:49:27 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -53,12 +53,12 @@ use LONCAPA::lonssl;
 use Fcntl qw(:flock);
 use Apache::lonnet;
 
-my $DEBUG = 1;		       # Non zero to enable debug log entries.
+my $DEBUG = 0;		       # Non zero to enable debug log entries.
 
 my $status='';
 my $lastlog='';
 
-my $VERSION='$Revision: 1.462 $'; #' stupid emacs
+my $VERSION='$Revision: 1.467.2.2 $'; #' stupid emacs
 my $remoteVERSION;
 my $currenthostid="default";
 my $currentdomainid;
@@ -1121,6 +1121,8 @@ sub establish_key_handler {
 sub load_handler {
     my ($cmd, $tail, $replyfd) = @_;
 
+
+
    # Get the load average from /proc/loadavg and calculate it as a percentage of
    # the allowed load limit as set by the perl global variable lonLoadLim
 
@@ -2422,7 +2424,6 @@ sub user_has_session_handler {
 
     my ($udom, $uname) = map { &unescape($_) } (split(/:/, $tail));
     
-    &logthis("Looking for $udom $uname");
     opendir(DIR,$perlvar{'lonIDsDir'});
     my $filename;
     while ($filename=readdir(DIR)) {
@@ -4423,7 +4424,8 @@ sub get_id_handler {
 sub put_dcmail_handler {
     my ($cmd,$tail,$client) = @_;
     my $userinput = "$cmd:$tail";
-                                                                                
+
+
     my ($udom,$what)=split(/:/,$tail);
     chomp($what);
     my $hashref = &tie_domain_hash($udom, "nohist_dcmail", &GDBM_WRCREAT());
@@ -5005,10 +5007,11 @@ sub get_sections_handler {
 sub validate_course_owner_handler {
     my ($cmd, $tail, $client)  = @_;
     my $userinput = "$cmd:$tail";
-    my ($inst_course_id, $owner, $cdom) = split(/:/, $tail);
+    my ($inst_course_id, $owner, $cdom, $coowners) = split(/:/, $tail);
 
     $owner = &unescape($owner);
-    my $outcome = &localenroll::new_course($inst_course_id,$owner,$cdom);
+    $coowners = &unescape($coowners);
+    my $outcome = &localenroll::new_course($inst_course_id,$owner,$cdom,$coowners);
     &Reply($client, \$outcome, $userinput);
 
 
@@ -5996,7 +5999,7 @@ if (-e $pidfile) {
 $server = IO::Socket::INET->new(LocalPort => $perlvar{'londPort'},
                                 Type      => SOCK_STREAM,
                                 Proto     => 'tcp',
-                                Reuse     => 1,
+                                ReuseAddr => 1,
                                 Listen    => 10 )
   or die "making socket: $@\n";
 
@@ -6393,6 +6396,14 @@ sub make_new_child {
                                 #don't get intercepted
         $SIG{USR1}= \&logstatus;
         $SIG{ALRM}= \&timeout;
+
+        #
+        # Block sigpipe as it gets thrownon socket disconnect and we want to
+        # deal with that as a read faiure instead.
+        #
+        my $blockset = POSIX::SigSet->new(SIGPIPE);
+        sigprocmask(SIG_BLOCK, $blockset);
+
         $lastlog='Forked ';
         $status='Forked';
 
@@ -7348,6 +7359,8 @@ sub releasereqd_check {
                 my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'});
                 return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor));
             }
+        } else {
+            return;
         }
     }
     return 1;
@@ -7355,10 +7368,25 @@ sub releasereqd_check {
 
 sub get_courseinfo_hash {
     my ($cnum,$cdom,$home) = @_;
-    my $hashid = $cdom.':'.$cnum;
-    my %info = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,1,[$home],'.');
-    if (ref($info{$cdom.'_'.$cnum}) eq 'HASH') {
-        return &Apache::lonnet::do_cache_new('courseinfo',$hashid,$info{$cdom.'_'.$cnum},600);
+    my %info;
+    eval {
+        local($SIG{ALRM}) = sub { die "timeout\n"; };
+        local($SIG{__DIE__})='DEFAULT';
+        alarm(3);
+        %info = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,1,[$home],'.');
+        alarm(0);
+    };
+    if ($@) {
+        if ($@ eq "timeout\n") {
+            &logthis("<font color='blue'>WARNING courseiddump for $cnum:$cdom from $home timedout</font>");
+        } else {
+            &logthis("<font color='yellow'>WARNING unexpected error during eval of call for courseiddump from $home</font>");
+        }
+    } else {
+        if (ref($info{$cdom.'_'.$cnum}) eq 'HASH') {
+            my $hashid = $cdom.':'.$cnum;
+            return &Apache::lonnet::do_cache_new('courseinfo',$hashid,$info{$cdom.'_'.$cnum},600);
+        }
     }
     return;
 }
@@ -7402,7 +7430,10 @@ sub check_homecourses {
             return;
         }
         foreach my $hashid (keys(%recent)) {
-            &Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600);
+            my ($result,$cached)=&Apache::lonnet::is_cached_new('courseinfo',$hashid);
+            unless ($cached) {
+                &Apache::lonnet::do_cache_new('courseinfo',$hashid,$courseinfo{$hashid},600);
+            }
         }
         foreach my $hashid (keys(%{$homecourses})) {
             next if ($recent{$hashid});