fd = None
def opener(*args):
nonlocal fd
- flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
+ flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT & ~_os.O_EXCL
fd = _os.open(dir, flags2, 0o600)
return fd
try:
mock_close.assert_called()
self.assertEqual(os.listdir(dir), [])
+ @unittest.skipUnless(tempfile._O_TMPFILE_WORKS, 'need os.O_TMPFILE')
+ @unittest.skipUnless(os.path.exists('/proc/self/fd'),
+ 'need /proc/self/fd')
+ def test_link_tmpfile(self):
+ dir = tempfile.mkdtemp()
+ self.addCleanup(os_helper.rmtree, dir)
+ filename = os.path.join(dir, "link")
+
+ with tempfile.TemporaryFile('w', dir=dir) as tmp:
+ # the flag can become False on Linux <= 3.11
+ if not tempfile._O_TMPFILE_WORKS:
+ self.skipTest("O_TMPFILE doesn't work")
+
+ tmp.write("hello")
+ tmp.flush()
+ fd = tmp.fileno()
+
+ os.link(f'/proc/self/fd/{fd}',
+ filename,
+ follow_symlinks=True)
+ with open(filename) as fp:
+ self.assertEqual(fp.read(), "hello")
+
# Helper for test_del_on_shutdown
class NulledModules:
--- /dev/null
+:func:`tempfile.TemporaryFile` no longer uses :data:`os.O_EXCL` with
+:data:`os.O_TMPFILE`, so it's possible to use ``linkat()`` on the file
+descriptor. Patch by Victor Stinner.