summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/fcntl.rst4
-rw-r--r--Lib/test/test_fcntl.py6
-rw-r--r--Misc/NEWS.d/next/Library/2019-08-27-21-19-28.bpo-37964.SxdnsF.rst1
-rw-r--r--Modules/fcntlmodule.c3
4 files changed, 14 insertions, 0 deletions
diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst
index 2db9674..6a66f5b 100644
--- a/Doc/library/fcntl.rst
+++ b/Doc/library/fcntl.rst
@@ -33,6 +33,10 @@ descriptor.
``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file
descriptors.
+.. versionchanged:: 3.9
+ On macOS, the fcntl module exposes the ``F_GETPATH`` constant, which obtains
+ the path of a file from a file descriptor.
+
The module defines the following functions:
diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
index 5d4abe3..38097db 100644
--- a/Lib/test/test_fcntl.py
+++ b/Lib/test/test_fcntl.py
@@ -144,6 +144,12 @@ class TestFcntl(unittest.TestCase):
self.assertRaises(OverflowError, fcntl.flock, _testcapi.INT_MAX+1,
fcntl.LOCK_SH)
+ @unittest.skipIf(sys.platform != 'darwin', "F_GETPATH is only available on macos")
+ def test_fcntl_f_getpath(self):
+ self.f = open(TESTFN, 'wb')
+ abspath = os.path.abspath(TESTFN)
+ res = fcntl.fcntl(self.f.fileno(), fcntl.F_GETPATH, bytes(len(abspath)))
+ self.assertEqual(abspath, res.decode('utf-8'))
def test_main():
run_unittest(TestFcntl)
diff --git a/Misc/NEWS.d/next/Library/2019-08-27-21-19-28.bpo-37964.SxdnsF.rst b/Misc/NEWS.d/next/Library/2019-08-27-21-19-28.bpo-37964.SxdnsF.rst
new file mode 100644
index 0000000..c25e643
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-08-27-21-19-28.bpo-37964.SxdnsF.rst
@@ -0,0 +1 @@
+Add ``F_GETPATH`` command to :mod:`fcntl`.
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 0fbf787..cfa1225 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -501,6 +501,9 @@ all_ins(PyObject* m)
#ifdef F_SETOWN
if (PyModule_AddIntMacro(m, F_SETOWN)) return -1;
#endif
+#ifdef F_GETPATH
+ if (PyModule_AddIntMacro(m, F_GETPATH)) return -1;
+#endif
#ifdef F_GETSIG
if (PyModule_AddIntMacro(m, F_GETSIG)) return -1;
#endif