--- loncom/lonnet/perl/lonnet.pm 2001/01/05 20:45:09 1.87 +++ loncom/lonnet/perl/lonnet.pm 2001/01/09 22:27:07 1.91 @@ -83,7 +83,7 @@ # 11/2,11/14,11/15,11/16,11/20,11/21,11/22,11/25,11/27, # 12/02,12/12,12/13,12/14,12/28,12/29 Gerd Kortemeyer # 05/01/01 Guy Albertelli -# 05/01 Gerd Kortemeyer +# 05/01,06/01,09/01 Gerd Kortemeyer package Apache::lonnet; @@ -97,6 +97,7 @@ use IO::Socket; use GDBM_File; use Apache::Constants qw(:common :http); use HTML::TokeParser; +use Fcntl qw(:flock); # --------------------------------------------------------------------- Logging @@ -179,6 +180,11 @@ sub reconlonc { sub critical { my ($cmd,$server)=@_; + unless ($hostname{$server}) { + &logthis("WARNING:". + " Critical message to unknown server ($server)"); + return 'no_such_host'; + } my $answer=reply($cmd,$server); if ($answer eq 'con_lost') { my $pingreply=reply('ping',$server); @@ -228,6 +234,7 @@ sub critical { sub appenv { my %newenv=@_; + my ($in,$out); map { if (($newenv{$_}=~/^user\.role/) || ($newenv{$_}=~/^user\.priv/)) { &logthis("WARNING: ". @@ -243,8 +250,19 @@ sub appenv { unless ($fh=Apache::File->new("$ENV{'user.environment'}")) { return 'error'; } + unless (flock($fh,LOCK_SH)) { + &logthis("WARNING: ". + 'Could not obtain shared lock in appenv: '.$!); + $fh->close(); + return 'error: '.$!; + } + &logthis("appenv LOCK_SH gotten"); @oldenv=<$fh>; + $in=$#oldenv+1; + &logthis("appenv LOCK_SH to be closed"); + $fh->close(); } + &logthis("Number of elements read appenv: ".$in."from".join(" ",caller)); for (my $i=0; $i<=$#oldenv; $i++) { chomp($oldenv[$i]); if ($oldenv[$i] ne '') { @@ -260,12 +278,22 @@ sub appenv { return 'error'; } my $newname; - flock($fh,'LOCK_EX'); - foreach $newname (keys %newenv) { + unless (flock($fh,LOCK_EX)) { + &logthis("WARNING: ". + 'Could not obtain exclusive lock in appenv: '.$!); + $fh->close(); + return 'error: '.$!; + } + &logthis("appenv LOCK_EX gotten"); + $out=0; + foreach $newname (sort keys %newenv) { print $fh "$newname=$newenv{$newname}\n"; + $out++; } + &logthis("appenv LOCK_EX to be closed"); $fh->close(); } + &logthis("Number of elements read appenv: ".$in." number out:".$out."from".join(" ",caller)); return 'ok'; } # ----------------------------------------------------- Delete from Environment @@ -284,14 +312,26 @@ sub delenv { unless ($fh=Apache::File->new("$ENV{'user.environment'}")) { return 'error'; } + unless (flock($fh,LOCK_SH)) { + &logthis("WARNING: ". + 'Could not obtain shared lock in delenv: '.$!); + $fh->close(); + return 'error: '.$!; + } @oldenv=<$fh>; + $fh->close(); } { my $fh; unless ($fh=Apache::File->new(">$ENV{'user.environment'}")) { return 'error'; } - flock($fh,'LOCK_EX'); + unless (flock($fh,LOCK_EX)) { + &logthis("WARNING: ". + 'Could not obtain exclusive lock in delenv: '.$!); + $fh->close(); + return 'error: '.$!; + } map { unless ($_=~/^$delthis/) { print $fh $_; } } @oldenv;