From 72e0b10567bc33be27a7c609f885cf43c95ec845 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 16 Jan 1998 12:44:38 +0000 Subject: *** empty log message *** git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@17 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/tempfile.rb | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 lib/tempfile.rb diff --git a/lib/tempfile.rb b/lib/tempfile.rb new file mode 100644 index 0000000000..90d3a65c77 --- /dev/null +++ b/lib/tempfile.rb @@ -0,0 +1,64 @@ +# +# $Id$ +# Copyright (C) 1998 akira yamada. All rights reserved. +# This file can be distributed under the terms the Ruby. + +# The class for temporary files. +# o creates a temporary file, which name is "basename.pid.n" with mode "w+". +# o Tempfile objects can be used like IO object. +# o created temporary files are removed if it is closed or garbage collected, +# or script termination. +# o file mode of the temporary files are 0600. + +require 'delegate' + +class Tempfile < SimpleDelegater + Max_try = 10 + + def initialize(basename, tmpdir = '/tmp') + @tmpdir = tmpdir + + umask = File.umask(0177) + cwd = Dir.getwd + Dir.chdir(@tmpdir) + begin + n = 0 + while true + begin + @tmpname = sprintf('%s.%d.%d', basename, $$, n) + unless File.exist?(@tmpname) + File.symlink('.', @tmpname + '.lock') + break + end + rescue + raise "cannot generate tmpfile `%s'" % @tmpname if n >= Max_try + #sleep(1) + end + n += 1 + end + + @clean_files = proc {|id| + if File.exist?(@tmpdir + '/' + @tmpname) + File.unlink(@tmpdir + '/' + @tmpname) + end + if File.exist?(@tmpdir + '/' + @tmpname + '.lock') + File.unlink(@tmpdir + '/' + @tmpname + '.lock') + end + } + ObjectSpace.call_finalizer(self) + ObjectSpace.add_finalizer(@clean_files) + + @tmpfile = open(@tmpname, 'w+') + super(@tmpfile) + File.unlink(@tmpname + '.lock') + ensure + File.umask(umask) + Dir.chdir(cwd) + end + end + + def close + super + @clean_files.call + end +end -- cgit v1.2.3