summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-01-16 12:44:38 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-01-16 12:44:38 +0000
commit72e0b10567bc33be27a7c609f885cf43c95ec845 (patch)
tree99f481799c569bf033d5cce33c4d64172c222a75 /lib
parent1cbebd9c51977dc26b228fb88dbea05950eea09b (diff)
*** empty log message ***
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@17 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/tempfile.rb64
1 files changed, 64 insertions, 0 deletions
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