class Archive::Ar::Format::BSD

Public Class Methods

build_header(file) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 39
def build_header(file)
  header = read_file_header(file)
  header_to_s(header)
end
extract_file(dest_dir, header, data, options = {}) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 12
def extract_file(dest_dir, header, data, options = {})
  file = File.join(dest_dir, header[:name])

  File.open(file, "w") do |f|
    f.write(data)
  end

  File.chmod(header[:mode], file)
  #FileUtils.chown(header[:owner], header[:group], file)

  true
end
read_global_header(io) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 6
def read_global_header(io)
  io.read(8).tap do |global_header|
    raise "Invalid header" unless global_header == Archive::Ar::MAGIC
  end
end
read_header(io) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 25
def read_header(io)
  block = io.read(60)
  header = parse_header(block)
  header.merge! :start => io.tell

  if header[:name].start_with? "#1/"
    long_size = header[:name][3..-1].to_i
    header[:start] += long_size
    header[:name] = io.read(long_size).strip
  end

  header
end

Private Class Methods

header_to_s(header) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 58
def header_to_s(header)
  data = ""
  namebuf = header[:name]
  if namebuf.length > 16
    namebuf += "\0" * (4 - namebuf.length % 4) if (namebuf.length % 4) != 0
    data += "%-16s" % "#1/#{namebuf.length}"
    header[:size] += namebuf.length
  else
    data += "%-16s" % header[:name]
  end
  data += "%-12s" % header[:modified]
  data += "%-6s" % header[:owner]
  data += "%-6s" % header[:group]
  data += "%-8s" % header[:mode].to_s(8)
  data += "%-10s" % header[:size]
  data += "%2s" % header[:magic]
  data += namebuf if header[:name].length > 16
  data
end
parse_header(data) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 78
def parse_header(data)
  h = data.unpack("A16 Z12 a6 a6 A8 Z10 Z2")
  {
    :name => h.shift.chomp("/"), # Remove trailing slash. Some archives have this...
    :modified => Time.at(h.shift.to_i),
    :owner => h.shift.to_i,
    :group => h.shift.to_i,
    :mode => h.shift.to_i(8),
    :size => h.shift.to_i,
    :magic => h.shift,
  }
end
read_file_header(file) click to toggle source
# File lib/archive/ar/format/bsd.rb, line 46
def read_file_header(file)
  {
    :name => File.basename(file),
    :modified => File.mtime(file).to_i,
    :owner => File.stat(file).uid,
    :group => File.stat(file).gid,
    :mode => File.stat(file).mode,
    :size => File.size(file),
    :magic => "`\n"
  }
end