10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""Temporary files.
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis module provides generic, low- and high-level interfaces for
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yicreating temporary files and directories.  The interfaces listed
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yias "safe" just below can be used without fear of race conditions.
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThose listed as "unsafe" cannot, and are provided for backward
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yicompatibility only.
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis module also provides some data items to the user:
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi  TMP_MAX  - maximum number of names that will be tried before
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             giving up.
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi  template - the default prefix for all temporary names.
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             You may change this to control the default prefix.
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi  tempdir  - If this is set to a string before the first use of
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             any routine from this module, it will be considered as
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             another candidate location to store temporary files.
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi__all__ = [
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    "SpooledTemporaryFile",
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    "mkstemp", "mkdtemp",                  # low level safe interfaces
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    "mktemp",                              # deprecated unsafe interface
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    "TMP_MAX", "gettempprefix",            # constants
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    "tempdir", "gettempdir"
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi   ]
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Imports.
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport io as _io
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os as _os
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport errno as _errno
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom random import Random as _Random
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    from cStringIO import StringIO as _StringIO
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    from StringIO import StringIO as _StringIO
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import fcntl as _fcntl
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _set_cloexec(fd):
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pass
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse:
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _set_cloexec(fd):
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except IOError:
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # flags read successfully, modify
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            flags |= _fcntl.FD_CLOEXEC
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitry:
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import thread as _thread
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiexcept ImportError:
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    import dummy_thread as _thread
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_allocate_lock = _thread.allocate_lock
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'O_NOINHERIT'):
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _text_openflags |= _os.O_NOINHERIT
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'O_NOFOLLOW'):
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _text_openflags |= _os.O_NOFOLLOW
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_bin_openflags = _text_openflags
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'O_BINARY'):
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _bin_openflags |= _os.O_BINARY
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, 'TMP_MAX'):
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    TMP_MAX = _os.TMP_MAX
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse:
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    TMP_MAX = 10000
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitemplate = "tmp"
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# Internal routines.
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_once_lock = _allocate_lock()
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif hasattr(_os, "lstat"):
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _stat = _os.lstat
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielif hasattr(_os, "stat"):
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _stat = _os.stat
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse:
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Fallback.  All we need is something that raises os.error if the
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # file doesn't exist.
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _stat(fn):
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f = open(fn)
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except IOError:
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise _os.error
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.close()
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _exists(fn):
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    try:
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        _stat(fn)
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    except _os.error:
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return False
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else:
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return True
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass _RandomNameSequence:
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """An instance of _RandomNameSequence generates an endless
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    sequence of unpredictable strings which can safely be incorporated
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    into file names.  Each string is six characters long.  Multiple
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    threads can safely use the same instance at the same time.
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _RandomNameSequence is an iterator."""
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    characters = ("abcdefghijklmnopqrstuvwxyz" +
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                  "0123456789_")
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self):
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.mutex = _allocate_lock()
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.normcase = _os.path.normcase
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @property
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def rng(self):
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cur_pid = _os.getpid()
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if cur_pid != getattr(self, '_rng_pid', None):
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._rng = _Random()
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self._rng_pid = cur_pid
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._rng
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __iter__(self):
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def next(self):
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = self.mutex
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = self.characters
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        choose = self.rng.choice
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m.acquire()
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            letters = [choose(c) for dummy in "123456"]
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        finally:
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            m.release()
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self.normcase(''.join(letters))
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _candidate_tempdir_list():
1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Generate a list of candidate temporary directories which
1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _get_default_tempdir will try."""
1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    dirlist = []
1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # First, try the environment.
1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    for envname in 'TMPDIR', 'TEMP', 'TMP':
1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dirname = _os.getenv(envname)
1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if dirname: dirlist.append(dirname)
1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Failing that, try OS-specific locations.
1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if _os.name == 'riscos':
1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dirname = _os.getenv('Wimp$ScrapDir')
1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if dirname: dirlist.append(dirname)
1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    elif _os.name == 'nt':
1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else:
1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # As a last resort, the current directory.
1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    try:
1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dirlist.append(_os.getcwd())
1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    except (AttributeError, _os.error):
1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dirlist.append(_os.curdir)
1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return dirlist
1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _get_default_tempdir():
1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Calculate the default directory to use for temporary files.
1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    This routine should be called exactly once.
1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    We determine whether or not a candidate temp dir is usable by
1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    trying to create and write to a file in that directory.  If this
1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    is successful, the test file is deleted.  To prevent denial of
1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    service, the name of the test file must be randomized."""
1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    namer = _RandomNameSequence()
1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    dirlist = _candidate_tempdir_list()
1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    flags = _text_openflags
1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    for dir in dirlist:
1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if dir != _os.curdir:
1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dir = _os.path.normcase(_os.path.abspath(dir))
1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Try only a few names per directory.
1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for seq in xrange(100):
1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            name = namer.next()
1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            filename = _os.path.join(dir, name)
1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                fd = _os.open(filename, flags, 0o600)
1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                try:
1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    try:
2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        with _io.open(fd, 'wb', closefd=False) as fp:
2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            fp.write(b'blat')
2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    finally:
2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        _os.close(fd)
2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                finally:
2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    _os.unlink(filename)
2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return dir
2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (OSError, IOError) as e:
2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if e.args[0] != _errno.EEXIST:
2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    break # no point trying more names in this directory
2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    raise IOError, (_errno.ENOENT,
2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ("No usable temporary directory found in %s" % dirlist))
2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi_name_sequence = None
2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _get_candidate_names():
2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Common setup sequence for all user-callable interfaces."""
2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    global _name_sequence
2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if _name_sequence is None:
2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        _once_lock.acquire()
2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if _name_sequence is None:
2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                _name_sequence = _RandomNameSequence()
2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        finally:
2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _once_lock.release()
2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return _name_sequence
2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef _mkstemp_inner(dir, pre, suf, flags):
2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    names = _get_candidate_names()
2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    for seq in xrange(TMP_MAX):
2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        name = names.next()
2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = _os.path.join(dir, pre + name + suf)
2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            fd = _os.open(file, flags, 0600)
2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _set_cloexec(fd)
2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return (fd, _os.path.abspath(file))
2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except OSError, e:
2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if e.errno == _errno.EEXIST:
2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                continue # try again
2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise
2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    raise IOError, (_errno.EEXIST, "No usable temporary file name found")
2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi# User visible interfaces.
2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef gettempprefix():
2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Accessor for tempdir.template."""
2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return template
2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yitempdir = None
2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef gettempdir():
2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Accessor for tempfile.tempdir."""
2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    global tempdir
2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if tempdir is None:
2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        _once_lock.acquire()
2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if tempdir is None:
2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                tempdir = _get_default_tempdir()
2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        finally:
2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _once_lock.release()
2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return tempdir
2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef mkstemp(suffix="", prefix=template, dir=None, text=False):
2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """User-callable function to create and return a unique temporary
2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    file.  The return value is a pair (fd, name) where fd is the
2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    file descriptor returned by os.open, and name is the filename.
2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    If 'suffix' is specified, the file name will end with that suffix,
2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    otherwise there will be no suffix.
2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    If 'prefix' is specified, the file name will begin with that prefix,
2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    otherwise a default prefix is used.
2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    If 'dir' is specified, the file will be created in that directory,
2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    otherwise a default directory is used.
2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    If 'text' is specified and true, the file is opened in text
2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    mode.  Else (the default) the file is opened in binary mode.  On
2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    some operating systems, this makes no difference.
2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    The file is readable and writable only by the creating user ID.
2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    If the operating system uses permission bits to indicate whether a
2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    file is executable, the file is executable by no one. The file
2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    descriptor is not inherited by children of this process.
2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Caller is responsible for deleting the file when done with it.
2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if dir is None:
2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dir = gettempdir()
2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if text:
3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        flags = _text_openflags
3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else:
3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        flags = _bin_openflags
3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return _mkstemp_inner(dir, prefix, suffix, flags)
3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef mkdtemp(suffix="", prefix=template, dir=None):
3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """User-callable function to create and return a unique temporary
3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    directory.  The return value is the pathname of the directory.
3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Arguments are as for mkstemp, except that the 'text' argument is
3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    not accepted.
3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    The directory is readable, writable, and searchable only by the
3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    creating user.
3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Caller is responsible for deleting the directory when done with it.
3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if dir is None:
3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dir = gettempdir()
3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    names = _get_candidate_names()
3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    for seq in xrange(TMP_MAX):
3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        name = names.next()
3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = _os.path.join(dir, prefix + name + suffix)
3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _os.mkdir(file, 0700)
3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return file
3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except OSError, e:
3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if e.errno == _errno.EEXIST:
3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                continue # try again
3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise
3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef mktemp(suffix="", prefix=template, dir=None):
3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """User-callable function to return a unique temporary file name.  The
3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    file is not created.
3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Arguments are as for mkstemp, except that the 'text' argument is
3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    not accepted.
3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    This function is unsafe and should not be used.  The file name
3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    refers to a file that did not exist at some point, but by the time
3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    you get around to creating it, someone else may have beaten you to
3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    the punch.
3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi##    from warnings import warn as _warn
3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi##    _warn("mktemp is a potential security risk to your program",
3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi##          RuntimeWarning, stacklevel=2)
3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if dir is None:
3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dir = gettempdir()
3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    names = _get_candidate_names()
3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    for seq in xrange(TMP_MAX):
3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        name = names.next()
3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = _os.path.join(dir, prefix + name + suffix)
3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if not _exists(file):
3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return file
3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    raise IOError, (_errno.EEXIST, "No usable temporary filename found")
3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass _TemporaryFileWrapper:
3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Temporary file wrapper
3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    This class provides a wrapper around files opened for
3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    temporary use.  In particular, it seeks to automatically
3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    remove the file when it is no longer needed.
3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, file, name, delete=True):
3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.file = file
3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.name = name
3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.close_called = False
3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.delete = delete
3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __getattr__(self, name):
3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Attribute lookups are delegated to the underlying file
3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # and cached for non-numeric results
3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # (i.e. methods are cached, closed and friends are not)
3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = self.__dict__['file']
3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = getattr(file, name)
3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if not issubclass(type(a), type(0)):
3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(self, name, a)
3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return a
3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # The underlying __enter__ method returns the wrong object
3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # (self.file) so override it to return the wrapper
3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __enter__(self):
3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.file.__enter__()
3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self
3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # NT provides delete-on-close as a primitive, so we don't need
3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # the wrapper to do anything special.  We still use it so that
4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if _os.name != 'nt':
4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Cache the unlinker so we don't get spurious errors at
4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # shutdown when the module-level "os" is None'd out.  Note
4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # that this must be referenced as self.unlink, because the
4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # name TemporaryFileWrapper may also get None'd out before
4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # __del__ is called.
4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unlink = _os.unlink
4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def close(self):
4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if not self.close_called:
4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.close_called = True
4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.file.close()
4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self.delete:
4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.unlink(self.name)
4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __del__(self):
4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.close()
4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Need to trap __exit__ as well to ensure the file gets
4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # deleted when used in a with statement
4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __exit__(self, exc, value, tb):
4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            result = self.file.__exit__(exc, value, tb)
4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.close()
4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return result
4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else:
4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __exit__(self, exc, value, tb):
4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.file.__exit__(exc, value, tb)
4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       prefix=template, dir=None, delete=True):
4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Create and return a temporary file.
4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Arguments:
4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    'prefix', 'suffix', 'dir' -- as for mkstemp.
4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    'mode' -- the mode argument to os.fdopen (default "w+b").
4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    'bufsize' -- the buffer size argument to os.fdopen (default -1).
4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    'delete' -- whether the file is deleted on close (default True).
4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    The file is created as mkstemp() would do it.
4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    Returns an object with a file-like interface; the name of the file
4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    is accessible as file.name.  The file will be automatically deleted
4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    when it is closed unless the 'delete' argument is set to False.
4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if dir is None:
4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dir = gettempdir()
4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if 'b' in mode:
4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        flags = _bin_openflags
4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    else:
4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        flags = _text_openflags
4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Setting O_TEMPORARY in the flags causes the OS to delete
4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # the file when it is closed.  This is only supported by Windows.
4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if _os.name == 'nt' and delete:
4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        flags |= _os.O_TEMPORARY
4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    file = _os.fdopen(fd, mode, bufsize)
4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    return _TemporaryFileWrapper(file, name, delete)
4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif _os.name != 'posix' or _os.sys.platform == 'cygwin':
4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # while it is open.
4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    TemporaryFile = NamedTemporaryFile
4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yielse:
4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      prefix=template, dir=None):
4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        """Create and return a temporary file.
4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Arguments:
4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'prefix', 'suffix', 'dir' -- as for mkstemp.
4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'mode' -- the mode argument to os.fdopen (default "w+b").
4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        'bufsize' -- the buffer size argument to os.fdopen (default -1).
4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        The file is created as mkstemp() would do it.
4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Returns an object with a file-like interface.  The file has no
4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        name, and will cease to exist when it is closed.
4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        """
4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if dir is None:
4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dir = gettempdir()
4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if 'b' in mode:
4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            flags = _bin_openflags
4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            flags = _text_openflags
4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _os.unlink(name)
4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return _os.fdopen(fd, mode, bufsize)
4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except:
4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _os.close(fd)
4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise
4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SpooledTemporaryFile:
4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """Temporary file wrapper, specialized to switch from
4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    StringIO to a real file when it exceeds a certain size or
5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    when a fileno is needed.
5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    _rolled = False
5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, max_size=0, mode='w+b', bufsize=-1,
5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                 suffix="", prefix=template, dir=None):
5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._file = _StringIO()
5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._max_size = max_size
5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._rolled = False
5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def _check(self, file):
5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self._rolled: return
5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        max_size = self._max_size
5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if max_size and file.tell() > max_size:
5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.rollover()
5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def rollover(self):
5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self._rolled: return
5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = self._file
5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del self._TemporaryFileArgs
5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        newfile.write(file.getvalue())
5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        newfile.seek(file.tell(), 0)
5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._rolled = True
5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # The method caching trick from NamedTemporaryFile
5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # won't work here, because _file may change from a
5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # _StringIO instance to a real file. So we list
5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # all the methods directly.
5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Context management protocol
5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __enter__(self):
5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if self._file.closed:
5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise ValueError("Cannot enter context with closed file")
5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self
5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __exit__(self, exc, value, tb):
5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._file.close()
5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # file protocol
5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __iter__(self):
5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.__iter__()
5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def close(self):
5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._file.close()
5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @property
5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def closed(self):
5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.closed
5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def fileno(self):
5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.rollover()
5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.fileno()
5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def flush(self):
5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._file.flush()
5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def isatty(self):
5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.isatty()
5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @property
5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def mode(self):
5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._file.mode
5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._TemporaryFileArgs[0]
5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @property
5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def name(self):
5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._file.name
5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return None
5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def next(self):
5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.next
5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def read(self, *args):
5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.read(*args)
5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def readline(self, *args):
5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.readline(*args)
5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def readlines(self, *args):
5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.readlines(*args)
5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def seek(self, *args):
5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._file.seek(*args)
5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @property
5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def softspace(self):
5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.softspace
5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def tell(self):
5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return self._file.tell()
5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def truncate(self):
6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._file.truncate()
6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def write(self, s):
6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = self._file
6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        rv = file.write(s)
6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._check(file)
6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return rv
6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def writelines(self, iterable):
6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        file = self._file
6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        rv = file.writelines(iterable)
6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self._check(file)
6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return rv
6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def xreadlines(self, *args):
6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self._file.xreadlines(*args)
6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return iter(self._file.readlines(*args))
619