class OdinFlex::AR

Constants

AR_HEADER
HEADER_LENGTH
Info

Public Class Methods

is_ar?(io) click to toggle source
# File lib/odinflex/ar.rb, line 15
def self.is_ar? io
  pos = io.pos
  header = io.read(AR_HEADER.length)
  header == AR_HEADER
ensure
  io.seek pos, IO::SEEK_SET
end
new(fd) click to toggle source
# File lib/odinflex/ar.rb, line 23
def initialize fd
  @fd = fd
  @pos = fd.pos
end

Public Instance Methods

each() { |info| ... } click to toggle source
# File lib/odinflex/ar.rb, line 30
def each
  @fd.seek @pos, IO::SEEK_SET
  header = @fd.read(AR_HEADER.length)

  raise "Wrong Header" unless header == AR_HEADER

  loop do
    break if @fd.eof?

    identifier, timestamp, owner, group, mode, size, ending =
      @fd.read(HEADER_LENGTH).unpack('A16A12A6A6A8A10A2')

    raise "wrong ending #{ending}" unless ending.bytes == [0x60, 0x0A]
    pos = @fd.pos

    # Assume BSD for now
    fname_len = identifier[/\d+$/].to_i
    filename = @fd.read(fname_len).unpack1('A*')
    info = Info.new filename, timestamp, owner, group, mode, size.to_i - fname_len, @fd.pos

    yield info

    @fd.seek size.to_i + pos, IO::SEEK_SET
  end
end