class Gem::Package::TarReader

def each

def each
  return enum_for __method__ unless block_given?
  until @io.eof? do
    header = Gem::Package::TarHeader.from @io
    return if header.empty?
    entry = Gem::Package::TarReader::Entry.new header, @io
    size = entry.header.size
    yield entry
    skip = (512 - (size % 512)) % 512
    pending = size - entry.bytes_read
    begin
      # avoid reading...
      @io.seek pending, IO::SEEK_CUR
      pending = 0
    rescue Errno::EINVAL, NameError
      while pending > 0 do
        bytes_read = @io.read([pending, 4096].min).size
        raise UnexpectedEOF if @io.eof?
        pending -= bytes_read
      end
    end
    @io.read skip # discard trailing zeros
    # make sure nobody can use #read, #getc or #rewind anymore
    entry.close
  end
end