--- loncom/cgi/decompress.pl	2003/12/13 00:20:47	1.11
+++ loncom/cgi/decompress.pl	2006/05/05 21:07:19	1.16
@@ -31,69 +31,65 @@
 ####
 use strict;
 use lib '/home/httpd/lib/perl';
-use LONCAPA::loncgi ();
-if(! &LONCAPA::loncgi::check_cookie_and_load_env()) {
-    print "Content-type: text/html\n\n";
-    print <<END;
+use LONCAPA::loncgi;
+
+my %location_of;
+foreach my $program ('tar','gunzip','bunzip2','unzip') {
+    foreach my $dir ('/bin/','/usr/bin/','/usr/local/bin/','/sbin/',
+		     '/usr/sbin/') {
+	if (-x $dir.$program) {
+	    $location_of{$program} = $dir.$program;
+	}
+    }
+}
+
+if (!&LONCAPA::loncgi::check_cookie_and_load_env()) {
+    print("Content-type: text/html\n\n");
+    print(<<END);
     <html><body>NO COOKIE!</body></html>
 END
 } else {
     print "Content-type: text/html\n\n";
-    if(! $ENV{'cgi.file'} || ! $ENV{'cgi.dir'}) {
-        print <<END;
+    my $file=$Apache::lonnet::env{'cgi.file'};
+    my $dir=$Apache::lonnet::env{'cgi.dir'}; 
+    if(! $file || ! $dir) {
+        print(<<END);
         <html><body>Bad Enviroment!</body></html>
 END
     } else {
-        print <<END;
-	<html><body><b>Output of decompress:</b><br /><br />
+        print(<<END);
+	<html><body><p><b>Output of decompress:</b></p>
 END
-        chdir $ENV{'cgi.dir'};
-        if ($ENV{'cgi.file'} =~ m|\.zip$|i) {
-            open(OUTPUT, "unzip -o $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
-        } elsif ($ENV{'cgi.file'} =~ m|\.tar\.gz$|i) {
-            open(OUTPUT, "tar -zxpvf $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
-        } elsif ($ENV{'cgi.file'} =~ m|\.tar\.bz2$|i) {
-            open(OUTPUT, "tar -jxpvf $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
-        } elsif ($ENV{'cgi.file'} =~ m|\.bz2$|i) {
-            open(OUTPUT, "bunzip2 $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
-        } elsif ($ENV{'cgi.file'} =~ m|\.tgz$|i) {
-            open(OUTPUT, "tar -zxpvf $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
-        } elsif ($ENV{'cgi.file'} =~ m|\.gz$|i) {
-            open(OUTPUT, "gunzip $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
-        } elsif ($ENV{'cgi.file'} =~ m|\.tar$|i) {
-            open(OUTPUT, "tar -xpvf $ENV{'cgi.file'} 2> /dev/null |");
-            while (<OUTPUT>) {
-                print "$_<br />";
-            }
-            close(OUTPUT);
+        chdir($dir);
+	my @cmd;
+        if ($file =~ m|\.zip$|) {
+            @cmd = ($location_of{'unzip'},"-o");
+        } elsif ($file =~ m|\.tar\.gz$|
+		 || $file =~ m|\.tgz$| ) {
+            @cmd = ($location_of{'tar'},"-zxpvf");
+        } elsif ($file =~ m|\.tar\.bz2$|) {
+            @cmd = ($location_of{'tar'},"-jxpvf");
+        } elsif ($file =~ m|\.bz2$|) {
+            @cmd = ($location_of{'bunzip2'});
+        } elsif ($file =~ m|\.gz$|) {
+	    @cmd = ($location_of{'gunzip'});
+        } elsif ($file =~ m|\.tar$|) {
+            @cmd = ($location_of{'tar'},"-xpvf");
         } else {
-            print "There has been an error in determining the file type of $ENV{'cgi.file'}, please check name";
+            print("There has been an error in determining the file type of $file, please check name");
         }
-        print "<br /><b>Decompress complete!</b><br /></body></html>";
+	if (@cmd) {
+	    undef($!);
+	    undef($@);
+	    open(OUTPUT,"-|", @cmd, $file);
+	    while (my $line = <OUTPUT>) { print("$line<br />"); }
+	    close(OUTPUT);
+	    print("<p><b>Decompress complete.</b></p>");
+	    if ($! || $@) {
+		print("<p><b>An error occurred</b></p><p>$!</p><p>$@</p>");
+	    }
+	    print("</body></html>");
+	}
     }
 }