PHP 8.2.31
Preview: tempfile.rb Size: 4.86 KB
/proc/thread-self/root/opt/alt/ruby18/lib64/ruby/1.8/tempfile.rb

#
# tempfile - manipulates temporary files
#
# $Id: tempfile.rb 16127 2008-04-21 09:43:44Z knu $
#

require 'delegate'
require 'tmpdir'

# A class for managing temporary files.  This library is written to be
# thread safe.
class Tempfile < DelegateClass(File)
  MAX_TRY = 10
  @@cleanlist = []

  # Creates a temporary file of mode 0600 in the temporary directory,
  # opens it with mode "w+", and returns a Tempfile object which
  # represents the created temporary file.  A Tempfile object can be
  # treated just like a normal File object.
  #
  # The basename parameter is used to determine the name of a
  # temporary file.  If an Array is given, the first element is used
  # as prefix string and the second as suffix string, respectively.
  # Otherwise it is treated as prefix string.
  #
  # 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)
  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 = File.join(tmpdir, make_tmpname(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

  def make_tmpname(basename, n)
    case basename
    when Array
      prefix, suffix = *basename
    else
      prefix, suffix = basename, ''
    end
 
    t = Time.now.strftime("%Y%m%d")
    path = "#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}-#{n}#{suffix}"
  end
  private :make_tmpname

  # Opens or reopens the file with mode "r+".
  def open
    @tmpfile.close if @tmpfile
    @tmpfile = File.open(@tmpname, 'r+')
    @data[1] = @tmpfile
    __setobj__(@tmpfile)
  end

  def _close	# :nodoc:
    @tmpfile.close if @tmpfile
    @tmpfile = nil
    @data[1] = nil if @data
  end    
  protected :_close

  # Closes the file.  If the optional flag is true, unlinks the file
  # after closing.
  #
  # If you don't explicitly unlink the temporary file, the removal
  # will be delayed until the object is finalized.
  def close(unlink_now=false)
    if unlink_now
      close!
    else
      _close
    end
  end

  # Closes and unlinks the file.
  def close!
    _close
    @clean_proc.call
    ObjectSpace.undefine_finalizer(self)
    @data = @tmpname = nil
  end

  # Unlinks the file.  On UNIX-like systems, it is often a good idea
  # to unlink a temporary file immediately after creating and opening
  # it, because it leaves other programs zero chance to access the
  # file.
  def unlink
    # keep this order for thread safeness
    begin
      File.unlink(@tmpname) if File.exist?(@tmpname)
      @@cleanlist.delete(@tmpname)
      @data = @tmpname = nil
      ObjectSpace.undefine_finalizer(self)
    rescue Errno::EACCES
      # may not be able to unlink on Windows; just ignore
    end
  end
  alias delete unlink

  # Returns the full path name of the temporary file.
  def path
    @tmpname
  end

  # Returns the size of the temporary file.  As a side effect, the IO
  # buffer is flushed before determining the size.
  def size
    if @tmpfile
      @tmpfile.flush
      @tmpfile.stat.size
    else
      0
    end
  end
  alias length size

  class << self
    def callback(data)	# :nodoc:
      pid = $$
      lambda{
	if pid == $$ 
	  path, tmpfile, cleanlist = *data

	  print "removing ", path, "..." if $DEBUG

	  tmpfile.close if tmpfile

	  # keep this order for thread safeness
	  File.unlink(path) if File.exist?(path)
	  cleanlist.delete(path) if cleanlist

	  print "done\n" if $DEBUG
	end
      }
    end

    # If no block is given, this is a synonym for new().
    #
    # If a block is given, it will be passed tempfile as an argument,
    # and the tempfile will automatically be closed when the block
    # terminates.  In this case, open() returns nil.
    def open(*args)
      tempfile = new(*args)

      if block_given?
	begin
	  yield(tempfile)
	ensure
	  tempfile.close
	end

	nil
      else
	tempfile
      end
    end
  end
end

if __FILE__ == $0
#  $DEBUG = true
  f = Tempfile.new("foo")
  f.print("foo\n")
  f.close
  f.open
  p f.gets # => "foo\n"
  f.close!
end

Directory Contents

Dirs: 27 × Files: 83

Name Size Perms Modified Actions
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
cgi DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
date DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
digest DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
dl DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
drb DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
io DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
irb DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
net DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
openssl DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
optparse DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
racc DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
rdoc DIR
- drwxr-xr-x 2024-03-03 22:48:17
Edit Download
rexml DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
rinda DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
rss DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
runit DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
shell DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
soap DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
test DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
uri DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
webrick DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
wsdl DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
- drwxr-xr-x 2024-03-03 22:50:34
Edit Download
xmlrpc DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
xsd DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
yaml DIR
- drwxr-xr-x 2024-03-03 22:48:14
Edit Download
2.50 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
3.37 KB lrw-r--r-- 2007-07-16 15:47:16
Edit Download
17.73 KB lrw-r--r-- 2008-02-10 15:24:56
Edit Download
6.89 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
73.74 KB lrw-r--r-- 2009-12-14 02:40:07
Edit Download
12.84 KB lrw-r--r-- 2009-08-03 05:59:38
Edit Download
24.46 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
53.02 KB lrw-r--r-- 2010-06-08 04:45:42
Edit Download
128 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
20.61 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
8.81 KB lrw-r--r-- 2009-07-16 00:35:14
Edit Download
1.12 KB lrw-r--r-- 2007-07-28 00:40:58
Edit Download
19 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
4.04 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
5.60 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
274 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
21.38 KB lrw-r--r-- 2009-02-23 17:44:50
Edit Download
487 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
633 B lrw-r--r-- 2008-02-18 01:17:44
Edit Download
42.23 KB lrw-r--r-- 2011-05-20 22:29:13
Edit Download
5.38 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
1.84 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
6.16 KB lrw-r--r-- 2008-06-06 08:05:24
Edit Download
6.17 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
8.10 KB lrw-r--r-- 2008-04-10 10:52:50
Edit Download
14.88 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
2.25 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
6.43 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
590 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
21.96 KB lrw-r--r-- 2008-07-12 15:08:29
Edit Download
7.43 KB lrw-r--r-- 2009-08-09 08:44:15
Edit Download
4.30 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
8.12 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
17.59 KB lrw-r--r-- 2011-05-30 02:08:57
Edit Download
1.28 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
5.42 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
27.21 KB lrw-r--r-- 2009-01-24 15:02:50
Edit Download
411 B lrw-r--r-- 2007-03-06 10:09:51
Edit Download
50.65 KB lrw-r--r-- 2010-12-04 06:34:10
Edit Download
7.93 KB lrw-r--r-- 2009-11-25 07:45:29
Edit Download
2.07 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
5.15 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
20.49 KB lrw-r--r-- 2007-10-08 11:16:54
Edit Download
2.10 KB lrw-r--r-- 2009-12-14 04:28:06
Edit Download
575 B lrw-r--r-- 2010-11-22 07:21:45
Edit Download
47.12 KB lrw-r--r-- 2009-02-20 11:43:35
Edit Download
3.35 KB lrw-r--r-- 2009-05-26 12:06:21
Edit Download
1.55 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
1.33 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
29.39 KB lrw-r--r-- 2010-11-23 08:21:08
Edit Download
1.48 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
15.97 KB lrw-r--r-- 2007-06-07 10:06:41
Edit Download
18.33 KB lrw-r--r-- 2007-02-16 19:53:09
Edit Download
90 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
1.59 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
11.15 KB lrw-r--r-- 2008-06-06 08:05:24
Edit Download
12.05 KB lrw-r--r-- 2010-06-08 05:02:31
Edit Download
835 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
1.55 KB lrw-r--r-- 2008-08-08 01:58:40
Edit Download
56.83 KB lrw-r--r-- 2010-12-23 03:22:57
Edit Download
504 B lrw-r--r-- 2007-10-21 12:19:43
Edit Download
180 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
20.63 KB lrw-r--r-- 2009-01-20 03:23:46
Edit Download
4.27 KB lrw-r--r-- 2011-12-10 12:17:33
Edit Download
27.08 KB lrw-r--r-- 2008-06-09 09:20:43
Edit Download
418 B lrw-r--r-- 2007-03-06 10:09:51
Edit Download
4.66 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
3.99 KB lrw-r--r-- 2008-03-21 12:16:15
Edit Download
8.08 KB lrw-r--r-- 2008-07-03 11:14:50
Edit Download
6.09 KB lrw-r--r-- 2009-02-19 16:41:12
Edit Download
4.86 KB lrw-r--r-- 2008-04-21 09:43:44
Edit Download
104 B lrw-r--r-- 2007-02-13 19:39:32
Edit Download
4.32 KB lrw-r--r-- 2010-06-08 07:08:15
Edit Download
31.58 KB lrw-r--r-- 2008-06-06 08:05:24
Edit Download
3.00 KB lrw-r--r-- 2010-06-08 06:24:25
Edit Download
3.69 KB lrw-r--r-- 2009-01-26 02:12:10
Edit Download
2.73 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
7.99 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
4.54 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
710 B lrw-r--r-- 2008-04-15 09:41:47
Edit Download
2.68 KB lrw-r--r-- 2007-02-12 23:01:19
Edit Download
811 B lrw-r--r-- 2007-02-12 23:01:19
Edit Download
12.36 KB lrw-r--r-- 2008-04-19 11:45:39
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).