| Class | Gem::Package::TarHeader |
| In: |
lib/rubygems/package/tar_header.rb
|
| Parent: | Object |
A header for a tar file
| FIELDS | = | [ :checksum, :devmajor, :devminor, :gid, :gname, :linkname, :magic, :mode, :mtime, :name, :prefix, :size, :typeflag, :uid, :uname, :version, ] | Fields in the tar header | |
| PACK_FORMAT | = | 'a100' + # name 'a8' + # mode 'a8' + # uid 'a8' + # gid 'a12' + # size 'a12' + # mtime 'a7a' + # chksum 'a' + # typeflag 'a100' + # linkname 'a6' + # magic 'a2' + # version 'a32' + # uname 'a32' + # gname 'a8' + # devmajor 'a8' + # devminor 'a155' | Pack format for a tar header | |
| UNPACK_FORMAT | = | 'A100' + # name 'A8' + # mode 'A8' + # uid 'A8' + # gid 'A12' + # size 'A12' + # mtime 'A8' + # checksum 'A' + # typeflag 'A100' + # linkname 'A6' + # magic 'A2' + # version 'A32' + # uname 'A32' + # gname 'A8' + # devmajor 'A8' + # devminor 'A155' | Unpack format for a tar header |
Creates a tar header from IO stream
# File lib/rubygems/package/tar_header.rb, line 99
99: def self.from(stream)
100: header = stream.read 512
101: empty = (header == "\0" * 512)
102:
103: fields = header.unpack UNPACK_FORMAT
104:
105: name = fields.shift
106: mode = strict_oct(fields.shift)
107: uid = strict_oct(fields.shift)
108: gid = strict_oct(fields.shift)
109: size = strict_oct(fields.shift)
110: mtime = strict_oct(fields.shift)
111: checksum = strict_oct(fields.shift)
112: typeflag = fields.shift
113: linkname = fields.shift
114: magic = fields.shift
115: version = strict_oct(fields.shift)
116: uname = fields.shift
117: gname = fields.shift
118: devmajor = strict_oct(fields.shift)
119: devminor = strict_oct(fields.shift)
120: prefix = fields.shift
121:
122: new :name => name,
123: :mode => mode,
124: :uid => uid,
125: :gid => gid,
126: :size => size,
127: :mtime => mtime,
128: :checksum => checksum,
129: :typeflag => typeflag,
130: :linkname => linkname,
131: :magic => magic,
132: :version => version,
133: :uname => uname,
134: :gname => gname,
135: :devmajor => devmajor,
136: :devminor => devminor,
137: :prefix => prefix,
138:
139: :empty => empty
140:
141: # HACK unfactor for Rubinius
142: #new :name => fields.shift,
143: # :mode => fields.shift.oct,
144: # :uid => fields.shift.oct,
145: # :gid => fields.shift.oct,
146: # :size => fields.shift.oct,
147: # :mtime => fields.shift.oct,
148: # :checksum => fields.shift.oct,
149: # :typeflag => fields.shift,
150: # :linkname => fields.shift,
151: # :magic => fields.shift,
152: # :version => fields.shift.oct,
153: # :uname => fields.shift,
154: # :gname => fields.shift,
155: # :devmajor => fields.shift.oct,
156: # :devminor => fields.shift.oct,
157: # :prefix => fields.shift,
158:
159: # :empty => empty
160: end
Creates a new TarHeader using vals
# File lib/rubygems/package/tar_header.rb, line 170
170: def initialize(vals)
171: unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode] then
172: raise ArgumentError, ":name, :size, :prefix and :mode required"
173: end
174:
175: vals[:uid] ||= 0
176: vals[:gid] ||= 0
177: vals[:mtime] ||= 0
178: vals[:checksum] ||= ""
179: vals[:typeflag] ||= "0"
180: vals[:magic] ||= "ustar"
181: vals[:version] ||= "00"
182: vals[:uname] ||= "wheel"
183: vals[:gname] ||= "wheel"
184: vals[:devmajor] ||= 0
185: vals[:devminor] ||= 0
186:
187: FIELDS.each do |name|
188: instance_variable_set "@#{name}", vals[name]
189: end
190:
191: @empty = vals[:empty]
192: end
# File lib/rubygems/package/tar_header.rb, line 162
162: def self.strict_oct(str)
163: return str.oct if str =~ /\A[0-7]*\z/
164: raise ArgumentError, "#{str.inspect} is not an octal string"
165: end