14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Temporary files.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis module provides generic, low- and high-level interfaces for
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocreating temporary files and directories.  The interfaces listed
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoas "safe" just below can be used without fear of race conditions.
64adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThose listed as "unsafe" cannot, and are provided for backward
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocompatibility only.
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis module also provides some data items to the user:
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  TMP_MAX  - maximum number of names that will be tried before
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             giving up.
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  template - the default prefix for all temporary names.
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             You may change this to control the default prefix.
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao  tempdir  - If this is set to a string before the first use of
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             any routine from this module, it will be considered as
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             another candidate location to store temporary files.
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = [
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "SpooledTemporaryFile",
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "mkstemp", "mkdtemp",                  # low level safe interfaces
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "mktemp",                              # deprecated unsafe interface
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "TMP_MAX", "gettempprefix",            # constants
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "tempdir", "gettempdir"
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao   ]
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Imports.
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport io as _io
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os as _os
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport errno as _errno
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom random import Random as _Random
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from cStringIO import StringIO as _StringIO
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from StringIO import StringIO as _StringIO
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import fcntl as _fcntl
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _set_cloexec(fd):
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _set_cloexec(fd):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IOError:
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # flags read successfully, modify
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flags |= _fcntl.FD_CLOEXEC
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotry:
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import thread as _thread
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoexcept ImportError:
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import dummy_thread as _thread
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_allocate_lock = _thread.allocate_lock
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif hasattr(_os, 'O_NOINHERIT'):
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _text_openflags |= _os.O_NOINHERIT
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif hasattr(_os, 'O_NOFOLLOW'):
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _text_openflags |= _os.O_NOFOLLOW
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_bin_openflags = _text_openflags
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif hasattr(_os, 'O_BINARY'):
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _bin_openflags |= _os.O_BINARY
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif hasattr(_os, 'TMP_MAX'):
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    TMP_MAX = _os.TMP_MAX
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    TMP_MAX = 10000
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotemplate = "tmp"
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Internal routines.
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_once_lock = _allocate_lock()
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif hasattr(_os, "lstat"):
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _stat = _os.lstat
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelif hasattr(_os, "stat"):
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _stat = _os.stat
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Fallback.  All we need is something that raises os.error if the
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # file doesn't exist.
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _stat(fn):
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f = open(fn)
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IOError:
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise _os.error
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f.close()
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _exists(fn):
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _stat(fn)
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except _os.error:
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return False
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return True
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _RandomNameSequence:
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """An instance of _RandomNameSequence generates an endless
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    sequence of unpredictable strings which can safely be incorporated
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    into file names.  Each string is six characters long.  Multiple
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    threads can safely use the same instance at the same time.
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _RandomNameSequence is an iterator."""
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    characters = ("abcdefghijklmnopqrstuvwxyz" +
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  "0123456789_")
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self):
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.mutex = _allocate_lock()
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.normcase = _os.path.normcase
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rng(self):
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cur_pid = _os.getpid()
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if cur_pid != getattr(self, '_rng_pid', None):
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._rng = _Random()
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._rng_pid = cur_pid
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._rng
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __iter__(self):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def next(self):
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m = self.mutex
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = self.characters
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        choose = self.rng.choice
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m.acquire()
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            letters = [choose(c) for dummy in "123456"]
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            m.release()
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.normcase(''.join(letters))
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _candidate_tempdir_list():
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Generate a list of candidate temporary directories which
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _get_default_tempdir will try."""
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirlist = []
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # First, try the environment.
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for envname in 'TMPDIR', 'TEMP', 'TMP':
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirname = _os.getenv(envname)
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if dirname: dirlist.append(dirname)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Failing that, try OS-specific locations.
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if _os.name == 'riscos':
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirname = _os.getenv('Wimp$ScrapDir')
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if dirname: dirlist.append(dirname)
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    elif _os.name == 'nt':
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # As a last resort, the current directory.
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirlist.append(_os.getcwd())
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except (AttributeError, _os.error):
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dirlist.append(_os.curdir)
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return dirlist
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _get_default_tempdir():
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Calculate the default directory to use for temporary files.
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This routine should be called exactly once.
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    We determine whether or not a candidate temp dir is usable by
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    trying to create and write to a file in that directory.  If this
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    is successful, the test file is deleted.  To prevent denial of
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    service, the name of the test file must be randomized."""
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    namer = _RandomNameSequence()
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    dirlist = _candidate_tempdir_list()
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    flags = _text_openflags
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for dir in dirlist:
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if dir != _os.curdir:
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dir = _os.path.normcase(_os.path.abspath(dir))
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Try only a few names per directory.
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for seq in xrange(100):
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            name = namer.next()
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            filename = _os.path.join(dir, name)
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                fd = _os.open(filename, flags, 0o600)
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    try:
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        with _io.open(fd, 'wb', closefd=False) as fp:
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            fp.write(b'blat')
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    finally:
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        _os.close(fd)
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                finally:
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    _os.unlink(filename)
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return dir
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except (OSError, IOError) as e:
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if e.args[0] != _errno.EEXIST:
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break # no point trying more names in this directory
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise IOError, (_errno.ENOENT,
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ("No usable temporary directory found in %s" % dirlist))
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_name_sequence = None
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _get_candidate_names():
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Common setup sequence for all user-callable interfaces."""
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    global _name_sequence
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if _name_sequence is None:
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _once_lock.acquire()
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if _name_sequence is None:
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                _name_sequence = _RandomNameSequence()
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _once_lock.release()
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return _name_sequence
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _mkstemp_inner(dir, pre, suf, flags):
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    names = _get_candidate_names()
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for seq in xrange(TMP_MAX):
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name = names.next()
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = _os.path.join(dir, pre + name + suf)
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fd = _os.open(file, flags, 0600)
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _set_cloexec(fd)
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return (fd, _os.path.abspath(file))
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except OSError, e:
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if e.errno == _errno.EEXIST:
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue # try again
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise IOError, (_errno.EEXIST, "No usable temporary file name found")
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# User visible interfaces.
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef gettempprefix():
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Accessor for tempdir.template."""
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return template
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotempdir = None
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef gettempdir():
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Accessor for tempfile.tempdir."""
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    global tempdir
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if tempdir is None:
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _once_lock.acquire()
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if tempdir is None:
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                tempdir = _get_default_tempdir()
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _once_lock.release()
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return tempdir
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef mkstemp(suffix="", prefix=template, dir=None, text=False):
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """User-callable function to create and return a unique temporary
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file.  The return value is a pair (fd, name) where fd is the
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file descriptor returned by os.open, and name is the filename.
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If 'suffix' is specified, the file name will end with that suffix,
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    otherwise there will be no suffix.
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If 'prefix' is specified, the file name will begin with that prefix,
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    otherwise a default prefix is used.
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If 'dir' is specified, the file will be created in that directory,
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    otherwise a default directory is used.
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If 'text' is specified and true, the file is opened in text
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mode.  Else (the default) the file is opened in binary mode.  On
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    some operating systems, this makes no difference.
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The file is readable and writable only by the creating user ID.
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    If the operating system uses permission bits to indicate whether a
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file is executable, the file is executable by no one. The file
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    descriptor is not inherited by children of this process.
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Caller is responsible for deleting the file when done with it.
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if dir is None:
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dir = gettempdir()
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if text:
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flags = _text_openflags
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flags = _bin_openflags
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return _mkstemp_inner(dir, prefix, suffix, flags)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef mkdtemp(suffix="", prefix=template, dir=None):
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """User-callable function to create and return a unique temporary
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    directory.  The return value is the pathname of the directory.
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Arguments are as for mkstemp, except that the 'text' argument is
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    not accepted.
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The directory is readable, writable, and searchable only by the
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    creating user.
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Caller is responsible for deleting the directory when done with it.
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if dir is None:
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dir = gettempdir()
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    names = _get_candidate_names()
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for seq in xrange(TMP_MAX):
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name = names.next()
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = _os.path.join(dir, prefix + name + suffix)
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _os.mkdir(file, 0700)
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return file
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except OSError, e:
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if e.errno == _errno.EEXIST:
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue # try again
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise IOError, (_errno.EEXIST, "No usable temporary directory name found")
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef mktemp(suffix="", prefix=template, dir=None):
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """User-callable function to return a unique temporary file name.  The
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file is not created.
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Arguments are as for mkstemp, except that the 'text' argument is
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    not accepted.
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This function is unsafe and should not be used.  The file name
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    refers to a file that did not exist at some point, but by the time
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    you get around to creating it, someone else may have beaten you to
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    the punch.
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##    from warnings import warn as _warn
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##    _warn("mktemp is a potential security risk to your program",
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##          RuntimeWarning, stacklevel=2)
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if dir is None:
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dir = gettempdir()
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    names = _get_candidate_names()
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for seq in xrange(TMP_MAX):
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name = names.next()
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = _os.path.join(dir, prefix + name + suffix)
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not _exists(file):
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return file
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    raise IOError, (_errno.EEXIST, "No usable temporary filename found")
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass _TemporaryFileWrapper:
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Temporary file wrapper
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    This class provides a wrapper around files opened for
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    temporary use.  In particular, it seeks to automatically
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    remove the file when it is no longer needed.
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, file, name, delete=True):
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.file = file
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.name = name
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.close_called = False
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.delete = delete
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __getattr__(self, name):
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Attribute lookups are delegated to the underlying file
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and cached for non-numeric results
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (i.e. methods are cached, closed and friends are not)
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = self.__dict__['file']
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = getattr(file, name)
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not issubclass(type(a), type(0)):
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            setattr(self, name, a)
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return a
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The underlying __enter__ method returns the wrong object
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # (self.file) so override it to return the wrapper
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __enter__(self):
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.file.__enter__()
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # NT provides delete-on-close as a primitive, so we don't need
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # the wrapper to do anything special.  We still use it so that
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if _os.name != 'nt':
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Cache the unlinker so we don't get spurious errors at
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # shutdown when the module-level "os" is None'd out.  Note
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # that this must be referenced as self.unlink, because the
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # name TemporaryFileWrapper may also get None'd out before
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # __del__ is called.
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        unlink = _os.unlink
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def close(self):
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not self.close_called:
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.close_called = True
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.file.close()
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if self.delete:
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.unlink(self.name)
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __del__(self):
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.close()
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Need to trap __exit__ as well to ensure the file gets
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # deleted when used in a with statement
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __exit__(self, exc, value, tb):
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            result = self.file.__exit__(exc, value, tb)
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.close()
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return result
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def __exit__(self, exc, value, tb):
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.file.__exit__(exc, value, tb)
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef NamedTemporaryFile(mode='w+b', bufsize=-1, suffix="",
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       prefix=template, dir=None, delete=True):
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Create and return a temporary file.
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Arguments:
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'prefix', 'suffix', 'dir' -- as for mkstemp.
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'mode' -- the mode argument to os.fdopen (default "w+b").
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'bufsize' -- the buffer size argument to os.fdopen (default -1).
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    'delete' -- whether the file is deleted on close (default True).
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    The file is created as mkstemp() would do it.
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Returns an object with a file-like interface; the name of the file
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    is accessible as file.name.  The file will be automatically deleted
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    when it is closed unless the 'delete' argument is set to False.
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if dir is None:
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dir = gettempdir()
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if 'b' in mode:
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flags = _bin_openflags
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flags = _text_openflags
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Setting O_TEMPORARY in the flags causes the OS to delete
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # the file when it is closed.  This is only supported by Windows.
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if _os.name == 'nt' and delete:
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        flags |= _os.O_TEMPORARY
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    file = _os.fdopen(fd, mode, bufsize)
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return _TemporaryFileWrapper(file, name, delete)
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif _os.name != 'posix' or _os.sys.platform == 'cygwin':
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # while it is open.
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    TemporaryFile = NamedTemporaryFile
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def TemporaryFile(mode='w+b', bufsize=-1, suffix="",
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      prefix=template, dir=None):
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Create and return a temporary file.
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Arguments:
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'prefix', 'suffix', 'dir' -- as for mkstemp.
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'mode' -- the mode argument to os.fdopen (default "w+b").
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        'bufsize' -- the buffer size argument to os.fdopen (default -1).
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        The file is created as mkstemp() would do it.
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns an object with a file-like interface.  The file has no
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        name, and will cease to exist when it is closed.
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if dir is None:
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            dir = gettempdir()
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if 'b' in mode:
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flags = _bin_openflags
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            flags = _text_openflags
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _os.unlink(name)
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return _os.fdopen(fd, mode, bufsize)
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            _os.close(fd)
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SpooledTemporaryFile:
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Temporary file wrapper, specialized to switch from
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    StringIO to a real file when it exceeds a certain size or
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    when a fileno is needed.
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    _rolled = False
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, max_size=0, mode='w+b', bufsize=-1,
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                 suffix="", prefix=template, dir=None):
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._file = _StringIO()
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._max_size = max_size
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._rolled = False
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._TemporaryFileArgs = (mode, bufsize, suffix, prefix, dir)
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _check(self, file):
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._rolled: return
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        max_size = self._max_size
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if max_size and file.tell() > max_size:
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.rollover()
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def rollover(self):
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._rolled: return
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = self._file
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        newfile = self._file = TemporaryFile(*self._TemporaryFileArgs)
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del self._TemporaryFileArgs
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        newfile.write(file.getvalue())
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        newfile.seek(file.tell(), 0)
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._rolled = True
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The method caching trick from NamedTemporaryFile
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # won't work here, because _file may change from a
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # _StringIO instance to a real file. So we list
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # all the methods directly.
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Context management protocol
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __enter__(self):
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._file.closed:
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("Cannot enter context with closed file")
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __exit__(self, exc, value, tb):
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._file.close()
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # file protocol
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __iter__(self):
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.__iter__()
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def close(self):
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._file.close()
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def closed(self):
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.closed
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fileno(self):
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.rollover()
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.fileno()
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def flush(self):
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._file.flush()
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def isatty(self):
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.isatty()
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def mode(self):
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._file.mode
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._TemporaryFileArgs[0]
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def name(self):
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._file.name
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return None
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def next(self):
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.next
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def read(self, *args):
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.read(*args)
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readline(self, *args):
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.readline(*args)
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def readlines(self, *args):
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.readlines(*args)
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def seek(self, *args):
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._file.seek(*args)
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @property
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def softspace(self):
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.softspace
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def tell(self):
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self._file.tell()
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def truncate(self):
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._file.truncate()
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def write(self, s):
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = self._file
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rv = file.write(s)
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._check(file)
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return rv
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def writelines(self, iterable):
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        file = self._file
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rv = file.writelines(iterable)
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._check(file)
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return rv
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def xreadlines(self, *args):
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self._file.xreadlines(*args)
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return iter(self._file.readlines(*args))
619