class Gem::Package::TarReader::Entry - Documentation for Ruby 3.2

# 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) click to toggle source

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

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

open(header, io) { |entry| ... } click to toggle source

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.

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

### Public Instance Methods

bytes_read() click to toggle source

Number of bytes read out of the tar entry

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

close() click to toggle source

Closes the tar entry

    # File lib/rubygems/package/tar_reader/entry.rb, line 57
    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

closed?() click to toggle source

Is the tar entry closed?

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

directory?() click to toggle source

Is this tar entry a directory?

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

eof?() click to toggle source

Are we at the end of the tar entry?

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

      @read >= @header.size
    end

file?() click to toggle source

Is this tar entry a file?

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

full_name() click to toggle source

Full name of the tar entry

    # File lib/rubygems/package/tar_reader/entry.rb, line 87
    def full_name
      if @header.prefix != ""
        File.join @header.prefix, @header.name
      else
        @header.name
      end
    rescue ArgumentError => e
      raise unless e.message == "string contains null byte"
      raise Gem::Package::TarInvalidError,
            "tar is corrupt, name contains null byte"
    end

getc() click to toggle source

Read one byte from the tar entry

    # File lib/rubygems/package/tar_reader/entry.rb, line 102
    def getc
      check_closed

      return nil if @read >= @header.size

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

      ret
    end

length()
Alias for: size
pos() click to toggle source

The position in the tar entry

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

      bytes_read
    end

pos=(new_pos) click to toggle source

Seek to the position in the tar entry

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

read(len = nil) click to toggle source

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

    # File lib/rubygems/package/tar_reader/entry.rb, line 161
    def read(len = nil)
      check_closed

      len ||= @header.size - @read

      return nil if len > 0 && @read >= @header.size

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

      ret = @io.read max_read
      @read += ret.size

      ret
    end

readpartial(maxlen = nil, outbuf = "".b) click to toggle source

    # File lib/rubygems/package/tar_reader/entry.rb, line 176
    def readpartial(maxlen = nil, outbuf = "".b)
      check_closed

      maxlen ||= @header.size - @read

      raise EOFError if maxlen > 0 && @read >= @header.size

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

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

      outbuf
    end

rewind() click to toggle source

Rewinds to the beginning of the tar file entry

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

seek(offset, whence = IO::SEEK_SET) click to toggle source

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

    # File lib/rubygems/package/tar_reader/entry.rb, line 195
    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

      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 UnexpectedEOF if @io.eof?
        pending -= size_read
      end

      @read = @io.pos - @orig_pos

      0
    end

size() click to toggle source

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

Also aliased as: length
symlink?() click to toggle source

Is this tar entry a symlink?

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