@@ -389,6 +389,19 @@ extern char *ctermid_r(char *);
389389#define HAVE_STRUCT_STAT_ST_FSTYPE 1
390390#endif
391391
392+ /* memfd_create is either defined in sys/mman.h or sys/memfd.h
393+ * linux/memfd.h defines additional flags
394+ */
395+ #ifdef HAVE_SYS_MMAN_H
396+ #include <sys/mman.h>
397+ #endif
398+ #ifdef HAVE_SYS_MEMFD_H
399+ #include <sys/memfd.h>
400+ #endif
401+ #ifdef HAVE_LINUX_MEMFD_H
402+ #include <linux/memfd.h>
403+ #endif
404+
392405#ifdef _Py_MEMORY_SANITIZER
393406# include <sanitizer/msan_interface.h>
394407#endif
@@ -11897,6 +11910,31 @@ os_urandom_impl(PyObject *module, Py_ssize_t size)
1189711910 return bytes ;
1189811911}
1189911912
11913+ #ifdef HAVE_MEMFD_CREATE
11914+ /*[clinic input]
11915+ os.memfd_create
11916+
11917+ name: FSConverter
11918+ flags: unsigned_int(bitwise=True, c_default="MFD_CLOEXEC") = MFD_CLOEXEC
11919+
11920+ [clinic start generated code]*/
11921+
11922+ static PyObject *
11923+ os_memfd_create_impl (PyObject * module , PyObject * name , unsigned int flags )
11924+ /*[clinic end generated code: output=6681ede983bdb9a6 input=a42cfc199bcd56e9]*/
11925+ {
11926+ int fd ;
11927+ const char * bytes = PyBytes_AS_STRING (name );
11928+ Py_BEGIN_ALLOW_THREADS
11929+ fd = memfd_create (bytes , flags );
11930+ Py_END_ALLOW_THREADS
11931+ if (fd == -1 ) {
11932+ return PyErr_SetFromErrno (PyExc_OSError );
11933+ }
11934+ return PyLong_FromLong (fd );
11935+ }
11936+ #endif
11937+
1190011938/* Terminal size querying */
1190111939
1190211940static PyTypeObject * TerminalSizeType ;
@@ -13554,6 +13592,7 @@ static PyMethodDef posix_methods[] = {
1355413592 OS_SCANDIR_METHODDEF
1355513593 OS_FSPATH_METHODDEF
1355613594 OS_GETRANDOM_METHODDEF
13595+ OS_MEMFD_CREATE_METHODDEF
1355713596#ifdef MS_WINDOWS
1355813597 OS__ADD_DLL_DIRECTORY_METHODDEF
1355913598 OS__REMOVE_DLL_DIRECTORY_METHODDEF
@@ -14003,6 +14042,27 @@ all_ins(PyObject *m)
1400314042 if (PyModule_AddIntMacro (m , GRND_RANDOM )) return -1 ;
1400414043 if (PyModule_AddIntMacro (m , GRND_NONBLOCK )) return -1 ;
1400514044#endif
14045+ #ifdef HAVE_MEMFD_CREATE
14046+ if (PyModule_AddIntMacro (m , MFD_CLOEXEC )) return -1 ;
14047+ if (PyModule_AddIntMacro (m , MFD_ALLOW_SEALING )) return -1 ;
14048+ #ifdef MFD_HUGETLB
14049+ if (PyModule_AddIntMacro (m , MFD_HUGETLB )) return -1 ;
14050+ if (PyModule_AddIntMacro (m , MFD_HUGE_SHIFT )) return -1 ;
14051+ if (PyModule_AddIntMacro (m , MFD_HUGE_MASK )) return -1 ;
14052+ if (PyModule_AddIntMacro (m , MFD_HUGE_64KB )) return -1 ;
14053+ if (PyModule_AddIntMacro (m , MFD_HUGE_512KB )) return -1 ;
14054+ if (PyModule_AddIntMacro (m , MFD_HUGE_1MB )) return -1 ;
14055+ if (PyModule_AddIntMacro (m , MFD_HUGE_2MB )) return -1 ;
14056+ if (PyModule_AddIntMacro (m , MFD_HUGE_8MB )) return -1 ;
14057+ if (PyModule_AddIntMacro (m , MFD_HUGE_16MB )) return -1 ;
14058+ if (PyModule_AddIntMacro (m , MFD_HUGE_32MB )) return -1 ;
14059+ if (PyModule_AddIntMacro (m , MFD_HUGE_256MB )) return -1 ;
14060+ if (PyModule_AddIntMacro (m , MFD_HUGE_512MB )) return -1 ;
14061+ if (PyModule_AddIntMacro (m , MFD_HUGE_1GB )) return -1 ;
14062+ if (PyModule_AddIntMacro (m , MFD_HUGE_2GB )) return -1 ;
14063+ if (PyModule_AddIntMacro (m , MFD_HUGE_16GB )) return -1 ;
14064+ #endif
14065+ #endif
1400614066
1400714067#if defined(__APPLE__ )
1400814068 if (PyModule_AddIntConstant (m , "_COPYFILE_DATA" , COPYFILE_DATA )) return -1 ;
@@ -14119,6 +14179,10 @@ static const char * const have_functions[] = {
1411914179 "HAVE_LUTIMES" ,
1412014180#endif
1412114181
14182+ #ifdef HAVE_MEMFD_CREATE
14183+ "HAVE_MEMFD_CREATE" ,
14184+ #endif
14185+
1412214186#ifdef HAVE_MKDIRAT
1412314187 "HAVE_MKDIRAT" ,
1412414188#endif
0 commit comments