diff -ur tar2rubyscript-none.tar.gz/tar2rubyscript/README tar2rubyscript-0.1.tar.gz/tar2rubyscript/README
--- tar2rubyscript-none.tar.gz/tar2rubyscript/README 2004-06-23 00:35:54.000000000 +0200
+++ tar2rubyscript-0.1.tar.gz/tar2rubyscript/README 2003-08-18 18:54:13.000000000 +0200
@@ -0,0 +1,5 @@
+Usage: ruby tar2rubyscript.rb tarrubyscript.rb application.tar application.rb [licence.txt]
+
+Just ignore the existance of init.rb ...
+
+For more information, see http://www.erikveen.dds.nl/tar2rubyscript/ .
diff -ur tar2rubyscript-none.tar.gz/tar2rubyscript/init.rb tar2rubyscript-0.1.tar.gz/tar2rubyscript/init.rb
--- tar2rubyscript-none.tar.gz/tar2rubyscript/init.rb 2004-06-23 00:35:54.000000000 +0200
+++ tar2rubyscript-0.1.tar.gz/tar2rubyscript/init.rb 2003-08-18 18:59:33.000000000 +0200
@@ -0,0 +1,17 @@
+scriptfile = "tarrubyscript.rb"
+tarfile = oldlocation(ARGV.shift)
+outfile = oldlocation(ARGV.shift)
+licensefile = oldlocation(ARGV.shift)
+
+script = File.new(scriptfile).read
+archive = [File.new(tarfile, "rb").read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")
+license = File.new(licensefile).read if not licensefile.nil?
+
+script = "# License, not of this script, but of the application it contains:\n\n" +license + "\n" + script if not licensefile.nil?
+
+script.gsub!(/%LINES%/, (script.split("\n", -1).length-1).to_s)
+
+File.open(outfile, "wb") do |f|
+ f.write script
+ f.write archive
+end
diff -ur tar2rubyscript-none.tar.gz/tar2rubyscript/tar2rubyscript.rb tar2rubyscript-0.1.tar.gz/tar2rubyscript/tar2rubyscript.rb
--- tar2rubyscript-none.tar.gz/tar2rubyscript/tar2rubyscript.rb 2004-06-23 00:35:54.000000000 +0200
+++ tar2rubyscript-0.1.tar.gz/tar2rubyscript/tar2rubyscript.rb 2003-08-18 18:59:33.000000000 +0200
@@ -0,0 +1,17 @@
+scriptfile = ARGV.shift
+tarfile = ARGV.shift
+outfile = ARGV.shift
+licensefile = ARGV.shift
+
+script = File.new(scriptfile).read
+archive = [File.new(tarfile, "rb").read].pack("m").split("\n").collect{|s| "# " + s}.join("\n")
+license = File.new(licensefile).read if not licensefile.nil?
+
+script = "# License, not of this script, but of the application it contains:\n\n" +license + "\n" + script if not licensefile.nil?
+
+script.gsub!(/%LINES%/, (script.split("\n", -1).length-1).to_s)
+
+File.open(outfile, "wb") do |f|
+ f.write script
+ f.write archive
+end
diff -ur tar2rubyscript-none.tar.gz/tar2rubyscript/tarrubyscript.rb tar2rubyscript-0.1.tar.gz/tar2rubyscript/tarrubyscript.rb
--- tar2rubyscript-none.tar.gz/tar2rubyscript/tarrubyscript.rb 2004-06-23 00:35:54.000000000 +0200
+++ tar2rubyscript-0.1.tar.gz/tar2rubyscript/tarrubyscript.rb 2003-08-18 18:59:33.000000000 +0200
@@ -0,0 +1,253 @@
+# License of this script, not of the application it contains:
+
+# Copyright Erik Veenstra <tar2rubyscript@erikveen.dds.nl>
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License,
+# version 2, as published by the Free Software Foundation.
+
+# This program is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public
+# License along with this program; if not, write to the Free
+# Software Foundation, Inc., 59 Temple Place, Suite 330,
+# Boston, MA 02111-1307 USA
+
+LINES = %LINES%
+
+BLOCKSIZE = 512
+
+NAMELEN = 100
+MODELEN = 8
+UIDLEN = 8
+GIDLEN = 8
+CHKSUMLEN = 8
+SIZELEN = 12
+MAGICLEN = 8
+MODTIMELEN = 12
+UNAMELEN = 32
+GNAMELEN = 32
+DEVLEN = 8
+TMAGIC = ´ustar´
+GNU_TMAGIC = ´ustar ´
+
+LF_OLDFILE = ´\0´
+LF_FILE = ´0´
+LF_LINK = ´1´
+LF_SYMLINK = ´2´
+LF_CHAR = ´3´
+LF_BLOCK = ´4´
+LF_DIR = ´5´
+LF_FIFO = ´6´
+LF_CONTIG = ´7´
+
+class Reader
+ def initialize(filehandle)
+ @fp = filehandle
+ end
+
+ def each
+ @fp.rewind
+
+ while entry = next_entry
+ yield(entry)
+ end
+ end
+
+ def next_entry
+ buf = @fp.read(BLOCKSIZE)
+
+ if buf == "\000" * BLOCKSIZE
+ entry = nil
+ else
+ entry = Entry.new(buf, @fp)
+ end
+
+ entry
+ end
+
+ def extract
+ each do |entry|
+ entry.extract
+ end
+ end
+end
+
+class Entry
+ attr_reader(:header, :data)
+
+ def initialize(header, fp)
+ @header = Header.new(header)
+
+ if @header.file?
+ #puts "File: #{@header.name}, #{@header.size} bytes"
+
+ padding = (BLOCKSIZE - (@header.size % BLOCKSIZE)) % BLOCKSIZE
+
+ @data = fp.read(@header.size) if @header.size > 0
+ dummy = fp.read(padding) if padding > 0
+ end
+ end
+
+ def extract
+ if not @header.name.empty?
+ if @header.dir?
+ begin
+ Dir.mkdir(@header.name, @header.mode)
+ rescue SystemCallError => e
+ puts "Couldn´t create dir: " + e.message
+ end
+ else
+ begin
+ File.open(@header.name, "wb") do |fp|
+ fp.write(@data)
+ fp.chmod(@header.mode)
+ end
+ rescue => e
+ puts "Couldn´t create file: " + e.message
+ end
+ end
+
+ #File.utime(@header.mtime, Time.new, @header.name) # ???
+ end
+ end
+end
+
+class Header
+ attr_reader(:name, :size, :mtime, :uname, :gname, :mode)
+
+ def initialize(header)
+ types = [´str´, ´oct´, ´oct´, ´oct´, ´oct´, ´time´, ´oct´, ´str´, ´str´, ´str´, ´str´, ´str´, ´oct´, ´oct´]
+ fields = header.unpack(´A100 A8 A8 A8 A12 A12 A8 A1 A100 A8 A32 A32 A8 A8´)
+ converted = []
+
+ begin
+ while field = fields.shift
+ type = types.shift
+
+ case type
+ when ´str´ then converted.push(field)
+ when ´oct´ then converted.push(field.oct)
+ when ´time´ then converted.push(Time::at(field.oct))
+ end
+ end
+
+ @name, @mode, @uid, @gid, @size, @mtime, @chksum, @linkflag, @linkname, @magic, @uname, @gname, @devmajor, @devminor = converted
+
+ @name.gsub!(/\.\//, "")
+
+ @raw = header
+ rescue ArgumentError => e
+ raise "Couldn´t determine a real value for a field (#{field})"
+ end
+
+ raise "Magic header value ´#{@magic}´ is invalid." if @magic != TMAGIC and @magic != GNU_TMAGIC
+
+ @linkflag = LF_FILE if @linkflag == LF_OLDFILE or @linkflag == LF_CONTIG
+ @linkflag = LF_DIR if @name[-1] == ´/´ and @linkflag == LF_FILE
+ @linkname = @linkname[1,-1] if @linkname[0] == ´/´
+ @size = 0 if @size < 0
+ @name = @linkname + ´/´ + @name if @linkname.size > 0
+ end
+
+ def file?
+ @linkflag == LF_FILE
+ end
+
+ def dir?
+ @linkflag == LF_DIR
+ end
+end
+
+class Jail
+ def initialize(code, ldir)
+ @ldir = ldir
+ @code = code
+ end
+
+ def eval
+ instance_eval(@code)
+ end
+
+ def oldlocation(file)
+ if not file.nil?
+ res = @ldir + "/" + file
+ res = file if file =~ /^\//
+ res = file if file =~ /^.:/
+ end
+
+ res
+ end
+end
+
+def rm(entry)
+ if FileTest.file?(entry)
+ File.delete(entry)
+ end
+
+ if FileTest.directory?(entry)
+ ldir = Dir.pwd
+
+ Dir.chdir(entry)
+ Dir.new(".").each do |e|
+ rm(e) if not [".", ".."].include?(e)
+ end
+ Dir.chdir(ldir)
+
+ Dir.rmdir(entry)
+ end
+end
+
+if FileTest.exists?("c:/")
+ WD = "c:/tmp"
+else
+ WD = "/tmp"
+end
+
+MF = "#{WD}/ear.f.#{Process.pid}"
+MP = "#{WD}/ear.d.#{Process.pid}"
+
+Dir.mkdir(WD) if not FileTest.exists?(WD)
+Dir.mkdir(MP)
+
+LDIR = Dir.pwd
+
+begin
+
+ archive = File.new($0, "rb").read.split(/\n/, LINES+1)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift
+
+ File.open(MF, "wb"){|f| f.write archive}
+
+ Dir.chdir(MP)
+
+ File.open(MF, "rb") do |fp|
+ Reader.new(fp).extract
+ end
+
+ entries = Dir.entries(".")
+ entries.delete(".")
+ entries.delete("..")
+
+ if entries.length == 1
+ entry = entries.shift
+ if FileTest.directory?(entry)
+ Dir.chdir(entry)
+ end
+ end
+
+ File.open("init.rb") do |f|
+ Jail.new(f.read, LDIR).eval
+ end
+
+ensure
+
+ Dir.chdir(LDIR)
+
+ rm(MF)
+ rm(MP)
+
+end
+