# File lib/rpm/header.rb, line 20 def read # TODO(sissel): update the comments here to reflect learnings about rpm # internals # At this point assume we've read and consumed the lead and signature. #len = @rpm.signature.index_length + @rpm.signature # # header size is # ( @rpm.signature.index_length * size of a header entry ) # + @rpm.signature.data_length # # header 'entries' are an # int32 (tag id), int32 (tag type), int32 (offset), uint32 (count) # # See rpm's header.c, the headerLoad method function for reference. # Header always starts with HEADER_MAGIC + index_count(2bytes) + # data_length(2bytes) data = @rpm.file.read(16).unpack("a8NN") # TODO(sissel): @index_count is really a count, rename? @magic, @index_count, @data_length = data validate entry_size = 16 # tag id, type, offset, count == 16 bytes @index_size = @index_count * entry_size tag_data = @rpm.file.read(@index_size) data = @rpm.file.read(@data_length) #ap :data => data (0 ... @index_count).each do |i| offset = i * entry_size entry_data = tag_data[i * entry_size, entry_size] entry = entry_data.unpack("NNNN") entry << data tag = ::RPMFile::Tag.new(*entry) @tags << tag #ap tag.tag => { #:type => tag.type, #:offset => tag.offset, #:count => tag.count, #:value => (tag.value rescue "???"), #} end # each index @length = @magic.size + @index_size + @data_length end