# class Gem::Package::TarReader::Entry

Class for reading entries out of a tar file

### Attributes

header [R]

Header for this tar entry

### Public Class Methods

new (header, io)
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 36
    def initialize(header, io)
      @closed = false
      @header = header
      @io = io
      @orig_pos = @io.pos
      @end_pos = @orig_pos + @header.size
      @read = 0
    end

Creates a new tar entry for `header` that will be read from `io`

open (header, io) { |entry| ... }
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 18
    def self.open(header, io, &block)
      entry = new header, io
      return entry unless block_given?
      begin
        yield entry
      ensure
        entry.close
      end
    end

Creates a new tar entry for `header` that will be read from `io` If a block is given, the entry is yielded and then closed.

### Public Instance Methods

bytes_read ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 52
    def bytes_read
      @read
    end

Number of bytes read out of the tar entry

close ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 59
    def close
      return if closed?
      # Seek to the end of the entry if it wasn't fully read
      seek(0, IO::SEEK_END)
      # discard trailing zeros
      skip = (512 - (@header.size % 512)) % 512
      @io.read(skip)
      @closed = true
      nil
    end

Closes the tar entry

closed? ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 73
    def closed?
      @closed
    end

Is the tar entry closed?

directory? ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 112
    def directory?
      @header.typeflag == "5"
    end

Is this tar entry a directory?

eof? ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 80
    def eof?
      check_closed

      @read >= @header.size
    end

Are we at the end of the tar entry?

file? ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 119
    def file?
      @header.typeflag == "0"
    end

Is this tar entry a file?

full_name ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 89
    def full_name
      @header.full_name.force_encoding(Encoding::UTF_8)
    rescue ArgumentError => e
      raise unless e.message == "string contains null byte"
      raise Gem::Package::TarInvalidError,
            "tar is corrupt, name contains null byte"
    end

Full name of the tar entry

getc ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 100
    def getc
      return nil if eof?

      ret = @io.getc
      @read += 1 if ret

      ret
    end

Read one byte from the tar entry

length ()
Alias for: size
pos ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 133
    def pos
      check_closed

      bytes_read
    end

The position in the tar entry

pos= (new_pos)
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 142
    def pos=(new_pos)
      seek(new_pos, IO::SEEK_SET)
    end

Seek to the position in the tar entry

read (maxlen = nil)
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 155
    def read(maxlen = nil)
      if eof?
        return maxlen.to_i.zero? ? "" : nil
      end

      max_read = [maxlen, @header.size - @read].compact.min

      ret = @io.read max_read
      if ret.nil?
        return maxlen ? nil : "" # IO.read returns nil on EOF with len argument
      end
      @read += ret.size

      ret
    end

Reads `maxlen` bytes from the tar file entry, or the rest of the entry if nil

readpartial (maxlen, outbuf = "".b)
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 171
    def readpartial(maxlen, outbuf = "".b)
      if eof? && maxlen > 0
        raise EOFError, "end of file reached"
      end

      max_read = [maxlen, @header.size - @read].min

      @io.readpartial(max_read, outbuf)
      @read += outbuf.size

      outbuf
    end

rewind ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 240
    def rewind
      check_closed
      seek(0, IO::SEEK_SET)
    end

Rewinds to the beginning of the tar file entry

seek (offset, whence = IO::SEEK_SET)
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 188
    def seek(offset, whence = IO::SEEK_SET)
      check_closed

      new_pos =
        case whence
        when IO::SEEK_SET then @orig_pos + offset
        when IO::SEEK_CUR then @io.pos + offset
        when IO::SEEK_END then @end_pos + offset
        else
          raise ArgumentError, "invalid whence"
        end

      if new_pos < @orig_pos
        new_pos = @orig_pos
      elsif new_pos > @end_pos
        new_pos = @end_pos
      end

      pending = new_pos - @io.pos

      return 0 if pending == 0

      if @io.respond_to?(:seek)
        begin
          # avoid reading if the @io supports seeking
          @io.seek new_pos, IO::SEEK_SET
          pending = 0
        rescue Errno::EINVAL
        end
      end

      # if seeking isn't supported or failed
      # negative seek requires that we rewind and read
      if pending < 0
        @io.rewind
        pending = new_pos
      end

      while pending > 0 do
        size_read = @io.read([pending, 4096].min)&.size
        raise(EOFError, "end of file reached") if size_read.nil?
        pending -= size_read
      end

      @read = @io.pos - @orig_pos

      0
    end

Seeks to `offset` bytes into the tar file entry `whence` can be IO::SEEK_SET, IO::SEEK_CUR, or IO::SEEK_END

size ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 146
    def size
      @header.size
    end

Also aliased as: length
symlink? ()
Source

    # File lib/rubygems/package/tar_reader/entry.rb, line 126
    def symlink?
      @header.typeflag == "2"
    end

Is this tar entry a symlink?