--- loncom/lonnet/perl/lonnet.pm	2003/05/08 21:35:48	1.369
+++ loncom/lonnet/perl/lonnet.pm	2003/05/21 19:57:46	1.376
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.369 2003/05/08 21:35:48 albertel Exp $
+# $Id: lonnet.pm,v 1.376 2003/05/21 19:57:46 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -243,6 +243,26 @@ sub critical {
     }
     return $answer;
 }
+ 
+# ------------------------------------------- Transfer profile into environment
+
+sub transfer_profile_to_env {
+    my ($lonidsdir,$handle)=@_;
+    my @profile;
+    {
+	my $idf=Apache::File->new("$lonidsdir/$handle.id");
+	flock($idf,LOCK_SH);
+	@profile=<$idf>;
+	$idf->close();
+    }
+    my $envi;
+    for ($envi=0;$envi<=$#profile;$envi++) {
+	chomp($profile[$envi]);
+	my ($envname,$envvalue)=split(/=/,$profile[$envi]);
+	$ENV{$envname} = $envvalue;
+    }
+    $ENV{'user.environment'} = "$lonidsdir/$handle.id";
+}
 
 # ---------------------------------------------------------- Append Environment
 
@@ -358,15 +378,16 @@ sub userload {
 	while ($filename=readdir(LONIDS)) {
 	    if ($filename eq '.' || $filename eq '..') {next;}
 	    my ($atime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[8];
-	    if ($curtime-$atime < 3600) { $num_users++; }
+	    if ($curtime-$atime < 3600) { $numusers++; }
 	}
 	closedir(LONIDS);
     }
     my $userloadpercent=0;
     my $maxuserload=$perlvar{'lonUserLoadLim'};
     if ($maxuserload) {
-	$userloadpercent=100*$num_users/$maxuserload;
+	$userloadpercent=100*$numusers/$maxuserload;
     }
+    $userloadpercent=sprintf("%.2f",$userloadpercent);
     return $userloadpercent;
 }
 
@@ -396,17 +417,23 @@ sub overloaderror {
 # ------------------------------ Find server with least workload from spare.tab
 
 sub spareserver {
-    my $loadpercent = shift;
+    my ($loadpercent,$userloadpercent) = @_;
     my $tryserver;
     my $spareserver='';
-    my $lowestserver=$loadpercent; 
+    if ($userloadpercent !~ /\d/) { $userloadpercent=0; }
+    my $lowestserver=$loadpercent > $userloadpercent?
+	             $loadpercent :  $userloadpercent;
     foreach $tryserver (keys %spareid) {
-       my $answer=reply('load',$tryserver);
+       my $loadans=reply('load',$tryserver);
+       my $userloadans=reply('userload',$tryserver);
+       if ($userloadans !~ /\d/) { $userloadans=0; }
+       my $answer=$loadans > $userloadans?
+                  $loadans :  $userloadans;
        if (($answer =~ /\d/) && ($answer<$lowestserver)) {
 	   $spareserver="http://$hostname{$tryserver}";
            $lowestserver=$answer;
        }
-    }    
+    }
     return $spareserver;
 }
 
@@ -1253,8 +1280,8 @@ sub get_course_adv_roles {
         } else {
             $returnhash{$key}=$username.':'.$domain;
         }
-    }
-    return sort %returnhash;
+     }
+    return %returnhash;
 }
 
 # ---------------------------------------------------------- Course ID routines
@@ -2634,7 +2661,7 @@ sub assignrole {
     } else {
         my $cwosec=$url;
         $cwosec=~s/^\/(\w+)\/(\w+)\/.*/$1\/$2/;
-        unless (&allowed('c'.$role,$cwosec)) { 
+        unless ((&allowed('c'.$role,$cwosec)) || &allowed('c'.$role,$udom)) { 
            &logthis('Refused assignrole: '.
              $udom.' '.$uname.' '.$url.' '.$role.' '.$end.' '.$start.' by '.
 		    $ENV{'user.name'}.' at '.$ENV{'user.domain'});
@@ -2654,10 +2681,11 @@ sub assignrole {
     }
 # actually delete
     if ($deleteflag) {
-	if (&allowed('dro',$udom)) {
+	if ((&allowed('dro',$udom)) || (&allowed('dro',$url))) {
 # modify command to delete the role
            $command="encrypt:rolesdel:$ENV{'user.domain'}:$ENV{'user.name'}:".
                 "$udom:$uname:$url".'_'."$mrole";
+	   &logthis("$ENV{'user.name'} at $ENV{'user.domain'} deletes $mrole in $url for $uname at $udom"); 
 # set start and finish to negative values for userrolelog
            $start=-1;
            $end=-1;
@@ -3056,12 +3084,12 @@ sub GetFileTimestamp {
     $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
     my $proname="$studentDomain/$subdir/$studentName";
     $proname .= '/'.$filename;
-    my @dir = &Apache::lonnet::dirlist($proname, $studentDomain, $studentName,
-                                       $root);
-    my $fileStat = $dir[0];
+    my ($fileStat) = &Apache::lonnet::dirlist($proname, $studentDomain, 
+                                              $studentName, $root);
     my @stats = split('&', $fileStat);
     if($stats[0] ne 'empty' && $stats[0] ne 'no_such_dir') {
-        return $stats[9];
+        # @stats contains first the filename, then the stat output
+        return $stats[10]; # so this is 10 instead of 9.
     } else {
         return -1;
     }
@@ -3246,7 +3274,7 @@ sub EXT {
     } elsif ($realm eq 'query') {
 # ---------------------------------------------- pull stuff out of query string
         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},[$space]);
-	return $ENV{'form.'.$space}; 
+	return $ENV{'form.'.$spacequalifierrest}; 
    } elsif ($realm eq 'request') {
 # ------------------------------------------------------------- request.browser
         if ($space eq 'browser') {