diff -ur tar2rubyscript-0.1.2.tar.gz/tar2rubyscript/tarrubyscript.rb tar2rubyscript-0.1.3.tar.gz/tar2rubyscript/tarrubyscript.rb
--- tar2rubyscript-0.1.2.tar.gz/tar2rubyscript/tarrubyscript.rb	2003-08-27 23:12:20.000000000 +0200
+++ tar2rubyscript-0.1.3.tar.gz/tar2rubyscript/tarrubyscript.rb	2003-08-29 00:57:09.000000000 +0200
@@ -162,97 +162,103 @@
   end
 end
 
-class Jail
-  def initialize(ldir)
-    @ldir	= ldir
+class TempSpace
+  def initialize
+    @archive	= File.new($0, "rb").read.split(/\n/, LINES+1)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift
+    @orgdir	= Dir.pwd
+    @workdir	= "/tmp"
+    @workdir	= "c:/tmp"	if FileTest.exists?("c:/")
+    @tempdir	= "#{@workdir}/tar2rubyscript.d.#{Process.pid}"
+    @tempfile	= "#{@workdir}/tar2rubyscript.f.#{Process.pid}"
   end
 
   def eval
-    File.open("init.rb") do |f|
-      instance_eval(f.read)
-    end
+    begin
 
-    ObjectSpace::each_object(IO) do |obj|
-      obj.close	rescue nil
-    end
-  end
+		# Create the temp environment.
 
-  def oldlocation(file)
-    if not file.nil?
-      res	= @ldir + "/" + file
-      res	= file	if file =~ /^\//
-      res	= file	if file =~ /^.:/
-    end
+      Dir.mkdir(@workdir)	if not FileTest.exists?(@workdir)
+      Dir.mkdir(@tempdir)	if not FileTest.exists?(@tempdir)
 
-    res
-  end
-end
+      Dir.chdir(@tempdir)
 
-def rm(entry)
-  if FileTest.file?(entry)
-    File.delete(entry)
-  end
+      File.open(@tempfile, "wb")	{|f| f.write @archive}
+      File.open(@tempfile, "rb")	{|f| Reader.new(f).extract}
 
-  if FileTest.directory?(entry)
-    ldir = Dir.pwd
+		# Eventually look for a subdirectory.
 
-    Dir.chdir(entry)
-      Dir.new(".").each do |e|
-        rm(e)	if not [".", ".."].include?(e)
+      entries	= Dir.entries(".")
+      entries.delete(".")
+      entries.delete("..")
+
+      if entries.length == 1
+        entry	= entries.shift
+        if FileTest.directory?(entry)
+          Dir.chdir(entry)
+        end
       end
-    Dir.chdir(ldir)
 
-    Dir.rmdir(entry)
-  end
-end
+		# Remember all IO objects.
 
-if FileTest.exists?("c:/")
-  WD	= "c:/tmp"
-else
-  WD	= "/tmp"
-end
+      ioobjects	= []
+      ObjectSpace::each_object(IO) do |obj|
+        ioobjects << obj.id
+      end
 
-MF	= "#{WD}/tar2rubyscript.f.#{Process.pid}"
-MP	= "#{WD}/tar2rubyscript.d.#{Process.pid}"
+		# Execute init.rb .
 
-Dir.mkdir(WD)	if not FileTest.exists?(WD)
-Dir.mkdir(MP)	if not FileTest.exists?(MP)
+      File.open("init.rb") do |f|
+        instance_eval(f.read)
+      end
 
-LDIR	= Dir.pwd
+    ensure
 
-begin
+		# Close all IO objects, opened in init.rb .
 
-  archive	= nil
+      ObjectSpace::each_object(IO) do |obj|
+        obj.close	rescue nil	if not ioobjects.include?(obj.id)
+      end
 
-  File.open($0, "rb"){|f| archive = f.read.split(/\n/, LINES+1)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift}
+		# Remove the temp environment.
 
-  File.open(MF, "wb"){|f| f.write archive}
+      Dir.chdir(@orgdir)
 
-  Dir.chdir(MP)
+      recursivedelete(@tempfile)
+      recursivedelete(@tempdir)
 
-    File.open(MF, "rb") do |fp|
-      Reader.new(fp).extract
     end
+  end
 
-    entries	= Dir.entries(".")
-    entries.delete(".")
-    entries.delete("..")
-
-    if entries.length == 1
-      entry	= entries.shift
-      if FileTest.directory?(entry)
-        Dir.chdir(entry)
-      end
+  def recursivedelete(entry)
+    if FileTest.file?(entry)
+      File.delete(entry)
     end
 
-    Jail.new(LDIR).eval
+    if FileTest.directory?(entry)
+      pdir = Dir.pwd
+
+      Dir.chdir(entry)
+        Dir.new(".").each do |e|
+          recursivedelete(e)	if not [".", ".."].include?(e)
+        end
+      Dir.chdir(pdir)
 
-ensure
+      Dir.rmdir(entry)
+    end
+  end
 
-  Dir.chdir(LDIR)
+  def oldlocation(file)
+    res	= file
 
-  rm(MF)
-  rm(MP)
+    if not file.nil?
+      res	= @orgdir + "/" + file
+      res	= file	if file =~ /^\//
+      res	= file	if file =~ /^.:/
+    end
 
+    res
+  end
 end
 
+TempSpace.new.eval
+