55: def self.mktmpdir(prefix_suffix=nil, tmpdir=nil)
56: case prefix_suffix
57: when nil
58: prefix = "d"
59: suffix = ""
60: when String
61: prefix = prefix_suffix
62: suffix = ""
63: when Array
64: prefix = prefix_suffix[0]
65: suffix = prefix_suffix[1]
66: else
67: raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
68: end
69: tmpdir ||= Dir.tmpdir
70: t = Time.now.strftime("%Y%m%d")
71: n = nil
72: begin
73: path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
74: path << "-#{n}" if n
75: path << suffix
76: Dir.mkdir(path, 0700)
77: rescue Errno::EEXIST
78: n ||= 0
79: n += 1
80: retry
81: end
82:
83: if block_given?
84: begin
85: yield path
86: ensure
87: FileUtils.remove_entry_secure path
88: end
89: else
90: path
91: end
92: end