2 # Copyright (C) 2004 Mauricio Julio Fernández Pradier
3 # See LICENSE.txt for additional licensing information.
6 require 'rubygems/package'
8 class Gem::Package::TarReader
12 class UnexpectedEOF < StandardError; end
17 return reader unless block_given?
40 header = Gem::Package::TarHeader.from @io
41 return if header.empty?
43 entry = Gem::Package::TarReader::Entry.new header, @io
44 size = entry.header.size
48 skip = (512 - (size % 512)) % 512
50 if @io.respond_to? :seek then
52 @io.seek(size - entry.bytes_read, IO::SEEK_CUR)
54 pending = size - entry.bytes_read
57 bread = @io.read([pending, 4096].min).size
58 raise UnexpectedEOF if @io.eof?
63 @io.read skip # discard trailing zeros
65 # make sure nobody can use #read, #getc or #rewind anymore
73 # NOTE: Do not call #rewind during #each
76 if @init_pos == 0 then
77 raise Gem::Package::NonSeekableIO unless @io.respond_to? :rewind
80 raise Gem::Package::NonSeekableIO unless @io.respond_to? :pos=