class RPM::File::Header
Constants
- HEADER_HEADER_LENGTH
magic +
index_count
+data_length
- HEADER_MAGIC
- HEADER_SIGNED_TYPE
- TAG_ENTRY_SIZE
Attributes
data_length[RW]
index_count[RW]
length[R]
magic[RW]
Public Class Methods
new(file)
click to toggle source
# File lib/arr-pm/file/header.rb, line 19 def initialize(file) @file = file @inspectables = [:@length, :@index_count, :@data_length] @tags = [] end
Public Instance Methods
read()
click to toggle source
# File lib/arr-pm/file/header.rb, line 26 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) # # len = sizeof(il) + sizeof(dl) + (il * sizeof(struct entryInfo_s)) + dl; # See rpm's header.c, the headerLoad method function for reference. # Header always starts with HEADER_MAGIC + index_count(2bytes) + # data_length(2bytes) data = @file.read(HEADER_HEADER_LENGTH).unpack("a8NN") # TODO(sissel): @index_count is really a count, rename? @magic, @index_count, @data_length = data validate @index_size = @index_count * TAG_ENTRY_SIZE tag_data = @file.read(@index_size) data = @file.read(@data_length) (0 ... @index_count).each do |i| offset = i * TAG_ENTRY_SIZE entry_data = tag_data[i * TAG_ENTRY_SIZE, TAG_ENTRY_SIZE] entry = entry_data.unpack("NNNN") entry << data tag = ::RPM::File::Tag.new(*entry) @tags << tag end # each index @length = HEADER_HEADER_LENGTH + @index_size + @data_length end
validate()
click to toggle source
# File lib/arr-pm/file/header.rb, line 72 def validate # TODO(sissel): raise real exceptions if @magic != ::RPM::File::Header::HEADER_MAGIC raise "Header magic did not match; got #{@magic.inspect}, " \ "expected #{::RPM::File::Header::HEADER_MAGIC.inspect}" end #if !(0..32).include?(@index_count) #raise "Invalid 'index_count' value #{@index_count}, expected to be in range [0..32]" #end #if !(0..8192).include?(@data_length) #raise "Invalid 'data_length' value #{@data_length}, expected to be in range [0..8192]" #end end
write()
click to toggle source
# File lib/arr-pm/file/header.rb, line 65 def write raise "not implemented yet" # Sort tags by type (integer value) # emit all tags in order # then emit all data segments in same order end