From: nobu.nakada@... Date: 2003-04-01T13:33:23+09:00 Subject: [ruby-list:37483] Re: Tmpfile.newがデフォルトで/tmpを利用すること なかだです。 At Mon, 31 Mar 2003 22:24:09 +0900, Siena. / SHINAGAWA, Norihide wrote: > $SAFE > 0 の時のデフォルトの動作は、最初に /tmp で試して、例外が > 上がったら / を、更に例外が上がったら . を使う、という提案に修正します。 > ちょっと複雑になりますが、これはいかがでしょうか。 /と.の順序については違和感がないでもないですが、とりあえずこん なところでしょうか。 Index: tempfile.rb =================================================================== RCS file: //sharui/cvs/ruby/src/ruby/lib/tempfile.rb,v retrieving revision 1.17 diff -u -2 -p -r1.17 tempfile.rb --- tempfile.rb 20 Jan 2003 12:27:53 -0000 1.17 +++ tempfile.rb 1 Apr 2003 04:18:33 -0000 @@ -24,5 +24,8 @@ class Tempfile < SimpleDelegator def initialize(basename, tmpdir=ENV['TMPDIR']||ENV['TMP']||ENV['TEMP']||'/tmp') if $SAFE > 0 and tmpdir.tainted? - tmpdir = '/tmp' + tmplist = %w'/tmp / .' + tmpdir = tmplist.shift + else + tmplist = [] end @@ -34,5 +37,5 @@ class Tempfile < SimpleDelegator begin - tmpname = sprintf('%s/%s%d.%d', tmpdir, basename, $$, n) + tmpname = File.expand_path("#{basename}#{$$}.#{n}", tmpdir) lock = tmpname + '.lock' n += 1 @@ -41,8 +44,13 @@ class Tempfile < SimpleDelegator Dir.mkdir(lock) - rescue + rescue Errno::EEXIST failure += 1 retry if failure < MAX_TRY raise "cannot generate tempfile `%s'" % tmpname + rescue + tmpdir = tmplist.shift or + raise "no tmpdir for tempfile `%s'" % tmpname + n = failure = 0 + retry ensure Thread.critical = false -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦