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