Method: BugFix::Tempfile#initialize

Defined in:
lib/pik/contrib/zip/tempfile_bugfixed.rb

#initialize(basename, tmpdir = Dir::tmpdir) ⇒ Tempfile

Creates a temporary file of mode 0600 in the temporary directory whose name is basename.pid.n and opens with mode “w+”. A Tempfile object works just like a File object.

If tmpdir is omitted, the temporary directory is determined by Dir::tmpdir provided by ‘tmpdir.rb’. When $SAFE > 0 and the given tmpdir is tainted, it uses /tmp. (Note that ENV values are tainted by default)



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/pik/contrib/zip/tempfile_bugfixed.rb', line 26

def initialize(basename, tmpdir=Dir::tmpdir)
  if $SAFE > 0 and tmpdir.tainted?
    tmpdir = '/tmp'
  end

  lock = nil
  n = failure = 0
  
  begin
    Thread.critical = true

    begin
  tmpname = sprintf('%s/%s%d.%d', tmpdir, basename, $$, n)
  lock = tmpname + '.lock'
  n += 1
    end while @@cleanlist.include?(tmpname) or
  File.exist?(lock) or File.exist?(tmpname)

    Dir.mkdir(lock)
  rescue
    failure += 1
    retry if failure < MAX_TRY
    raise "cannot generate tempfile `%s'" % tmpname
  ensure
    Thread.critical = false
  end

  @data = [tmpname]
  @clean_proc = Tempfile.callback(@data)
  ObjectSpace.define_finalizer(self, @clean_proc)

  @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
  @tmpname = tmpname
  @@cleanlist << @tmpname
  @data[1] = @tmpfile
  @data[2] = @@cleanlist

  super(@tmpfile)

  # Now we have all the File/IO methods defined, you must not
  # carelessly put bare puts(), etc. after this.

  Dir.rmdir(lock)
end