--- loncom/lonnet/perl/lonnet.pm	2000/11/28 02:48:25	1.73
+++ loncom/lonnet/perl/lonnet.pm	2000/12/06 19:58:31	1.76
@@ -45,7 +45,8 @@
 # EXT(name)          : value of a variable
 # symblist(map,hash) : Updates symbolic storage links
 # symbread([filename]) : returns the data handle (filename optional)
-# rndseed()          : returns a random seed  
+# rndseed()          : returns a random seed 
+# receipt()          : returns a receipt to be given out to users 
 # getfile(filename)  : returns the contents of filename, or a -1 if it can't
 #                      be found, replicates and subscribes to the file
 # filelocation(dir,file) : returns a farily clean absolute reference to file 
@@ -79,7 +80,8 @@
 # 10/04 Guy Albertelli
 # 10/06,10/09,10/10,10/11,10/14,10/20,10/23,10/25,10/26,10/27,10/28,10/29, 
 # 10/30,10/31,
-# 11/2,11/14,11/15,11/16,11/20,11/21,11/22,11/25,11/27 Gerd Kortemeyer
+# 11/2,11/14,11/15,11/16,11/20,11/21,11/22,11/25,11/27,
+# 12/02 Gerd Kortemeyer
 
 package Apache::lonnet;
 
@@ -88,7 +90,7 @@ use Apache::File;
 use LWP::UserAgent();
 use HTTP::Headers;
 use vars 
-qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp %fe %fd $readit %metacache);
+qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp %fe %fd $readit %metacache $unique);
 use IO::Socket;
 use GDBM_File;
 use Apache::Constants qw(:common :http);
@@ -382,7 +384,7 @@ sub idget {
           $idlist=~tr/A-Z/a-z/; 
 	  my $reply=&reply("idget:$udom:".$idlist,$tryserver);
           my @answer=();
-          if ($reply ne 'con_lost') {
+          if (($reply ne 'con_lost') && ($reply!~/^error\:/)) {
 	      @answer=split(/\&/,$reply);
           }                    ;
           my $i;
@@ -631,9 +633,12 @@ sub restore {
 	my ($name,$value)=split(/\=/,$_);
         $returnhash{&unescape($name)}=&unescape($value);
     } split(/\&/,$answer);
-    map {
-        $returnhash{$_}=$returnhash{$returnhash{'version'}.':'.$_};
-    } split(/\:/,$returnhash{$returnhash{'version'}.':keys'});
+    my $version;
+    for ($version=1;$version<=$returnhash{'version'};$version++) {
+       map {
+          $returnhash{$_}=$returnhash{$version.':'.$_};
+       } split(/\:/,$returnhash{$version.':keys'});
+    }
     return %returnhash;
 }
 
@@ -1149,7 +1154,7 @@ sub fileembstyle {
 
 # ------------------------------------------------------------ Description Text
 
-sub filedecription {
+sub filedescription {
     my $ending=shift;
     return $fd{$ending};
 }
@@ -1628,6 +1633,27 @@ sub rndseed {
                .$symbchck);
 }
 
+sub ireceipt {
+    my ($funame,$fudom,$fucourseid,$fusymb)=@_;
+    my $cuname=unpack("%32C*",$funame);
+    my $cudom=unpack("%32C*",$fudom);
+    my $cucourseid=unpack("%32C*",$fucourseid);
+    my $cusymb=unpack("%32C*",$fusymb);
+    my $cunique=unpack("%32C*",$unique);
+    return unpack("%32C*",$perlvar{'lonHostID'}).'-'.
+           ($cunique%$cuname+
+            $cunique%$cudom+
+            $cusymb%$cuname+
+            $cusymb%$cudom+
+            $cucourseid%$cuname+
+            $cucourseid%$cudom);
+}
+
+sub receipt {
+    return &ireceipt($ENV{'user.name'},$ENV{'user.domain'},
+                     $ENV{'request.course.id'},&symbread());
+}
+  
 # ------------------------------------------------------------ Serves up a file
 # returns either the contents of the file or a -1
 sub getfile {
@@ -1774,6 +1800,24 @@ if ($readit ne 'done') {
     }
 }
 
+# --------------------------------------------------- Get CPU data as unique ID
+{
+   my @contents;
+   {
+    my $fh=Apache::File->new('/proc/cpuinfo');
+    @contents=<$fh>;
+   }
+   $unique='';
+   map {
+       my ($name,$value)=split(/\s*\:\s*/,$_);
+       if (($name eq 'vendor_id') || ($name=~/^model/) ||
+           ($name=~/^cpu/) || ($name eq 'stepping')) {
+	   $unique.=$value;
+       } 
+   } @contents;
+   $unique=~s/\W//g;
+}
+
 %metacache=();
 
 $readit='done';