372: def add_file(name, opts = {})
373: raise Archive::Tar::Minitar::BlockRequired unless block_given?
374: raise Archive::Tar::Minitar::ClosedStream if @closed
375: raise Archive::Tar::Minitar::NonSeekableStream unless @io.respond_to?(:pos=)
376:
377: name, prefix = split_name(name)
378: init_pos = @io.pos
379: @io.write("\0" * 512)
380:
381: yield RestrictedStream.new(@io), opts
382:
383:
384: size = @io.pos - (init_pos + 512)
385: remainder = (512 - (size % 512)) % 512
386: @io.write("\0" * remainder)
387:
388: final_pos = @io.pos
389: @io.pos = init_pos
390:
391: header = { :name => name, :mode => opts[:mode], :mtime => opts[:mtime],
392: :size => size, :gid => opts[:gid], :uid => opts[:uid],
393: :prefix => prefix }
394: header = Archive::Tar::PosixHeader.new(header).to_s
395: @io.write(header)
396: @io.pos = final_pos
397: end