Parent

Archive::Tar::PosixHeader

Archive::Tar::PosixHeader

Implements the POSIX tar header as a Ruby class. The structure of the POSIX tar header is:

struct tarfile_entry_posix
{                      //                               pack/unpack
   char name[100];     // ASCII (+ Z unless filled)     a100/Z100
   char mode[8];       // 0 padded, octal, null         a8  /A8
   char uid[8];        // ditto                         a8  /A8
   char gid[8];        // ditto                         a8  /A8
   char size[12];      // 0 padded, octal, null         a12 /A12
   char mtime[12];     // 0 padded, octal, null         a12 /A12
   char checksum[8];   // 0 padded, octal, null, space  a8  /A8
   char typeflag[1];   // see below                     a   /a
   char linkname[100]; // ASCII + (Z unless filled)     a100/Z100
   char magic[6];      // "ustar\0"                     a6  /A6
   char version[2];    // "00"                          a2  /A2
   char uname[32];     // ASCIIZ                        a32 /Z32
   char gname[32];     // ASCIIZ                        a32 /Z32
   char devmajor[8];   // 0 padded, octal, null         a8  /A8
   char devminor[8];   // 0 padded, octal, null         a8  /A8
   char prefix[155];   // ASCII (+ Z unless filled)     a155/Z155
};

The typeflag may be one of the following known values:

"0"

Regular file. NULL should be treated as a synonym, for compatibility purposes.

"1"

Hard link.

"2"

Symbolic link.

"3"

Character device node.

"4"

Block device node.

"5"

Directory.

"6"

FIFO node.

"7"

Reserved.

POSIX indicates that "A POSIX-compliant implementation must treat any unrecognized typeflag value as a regular file."

Public Class Methods

new(vals) click to toggle source

Creates a new PosixHeader. A PosixHeader cannot be created unless the name, size, prefix, and mode are provided.

# File lib/archive/tar/minitar.rb, line 97
def initialize(vals)
  unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode]
    raise ArgumentError
  end

  vals[:mtime]    ||= 0
  vals[:checksum] ||= ""
  vals[:typeflag] ||= "0"
  vals[:magic]    ||= "ustar"
  vals[:version]  ||= "00"

  FIELDS.each do |field|
    instance_variable_set("@#{field}", vals[field.intern])
  end
  @empty = vals[:empty]
end
new_from_stream(stream) click to toggle source

Creates a new PosixHeader from a data stream.

# File lib/archive/tar/minitar.rb, line 66
def self.new_from_stream(stream)
  data = stream.read(512)
  fields    = data.unpack(HEADER_UNPACK_FORMAT)
  name      = fields.shift
  mode      = fields.shift.oct
  uid       = fields.shift.oct
  gid       = fields.shift.oct
  size      = fields.shift.oct
  mtime     = fields.shift.oct
  checksum  = fields.shift.oct
  typeflag  = fields.shift
  linkname  = fields.shift
  magic     = fields.shift
  version   = fields.shift.oct
  uname     = fields.shift
  gname     = fields.shift
  devmajor  = fields.shift.oct
  devminor  = fields.shift.oct
  prefix    = fields.shift

  empty = (data == "\00"" * 512)

  new(:name => name, :mode => mode, :uid => uid, :gid => gid,
      :size => size, :mtime => mtime, :checksum => checksum,
      :typeflag => typeflag, :magic => magic, :version => version,
      :uname => uname, :gname => gname, :devmajor => devmajor,
      :devminor => devminor, :prefix => prefix, :empty => empty)
end

Public Instance Methods

empty?() click to toggle source
# File lib/archive/tar/minitar.rb, line 114
def empty?
  @empty
end
to_s() click to toggle source
# File lib/archive/tar/minitar.rb, line 118
def to_s
  update_checksum
  header(@checksum)
end
update_checksum() click to toggle source

Update the checksum field.

# File lib/archive/tar/minitar.rb, line 124
def update_checksum
  hh = header(" " * 8)
  @checksum = oct(calculate_checksum(hh), 6)
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.