diff options
Diffstat (limited to 'Modules/posixmodule.c')
| -rw-r--r-- | Modules/posixmodule.c | 64 | 
1 files changed, 64 insertions, 0 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index cd5b5ce082..a3d979c3bc 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -389,6 +389,19 @@ extern char        *ctermid_r(char *);  #define HAVE_STRUCT_STAT_ST_FSTYPE 1  #endif +/* memfd_create is either defined in sys/mman.h or sys/memfd.h + * linux/memfd.h defines additional flags + */ +#ifdef HAVE_SYS_MMAN_H +#include <sys/mman.h> +#endif +#ifdef HAVE_SYS_MEMFD_H +#include <sys/memfd.h> +#endif +#ifdef HAVE_LINUX_MEMFD_H +#include <linux/memfd.h> +#endif +  #ifdef _Py_MEMORY_SANITIZER  # include <sanitizer/msan_interface.h>  #endif @@ -11897,6 +11910,31 @@ os_urandom_impl(PyObject *module, Py_ssize_t size)      return bytes;  } +#ifdef HAVE_MEMFD_CREATE +/*[clinic input] +os.memfd_create + +    name: FSConverter +    flags: unsigned_int(bitwise=True, c_default="MFD_CLOEXEC") = MFD_CLOEXEC + +[clinic start generated code]*/ + +static PyObject * +os_memfd_create_impl(PyObject *module, PyObject *name, unsigned int flags) +/*[clinic end generated code: output=6681ede983bdb9a6 input=a42cfc199bcd56e9]*/ +{ +    int fd; +    const char *bytes = PyBytes_AS_STRING(name); +    Py_BEGIN_ALLOW_THREADS +    fd = memfd_create(bytes, flags); +    Py_END_ALLOW_THREADS +    if (fd == -1) { +        return PyErr_SetFromErrno(PyExc_OSError); +    } +    return PyLong_FromLong(fd); +} +#endif +  /* Terminal size querying */  static PyTypeObject* TerminalSizeType; @@ -13554,6 +13592,7 @@ static PyMethodDef posix_methods[] = {      OS_SCANDIR_METHODDEF      OS_FSPATH_METHODDEF      OS_GETRANDOM_METHODDEF +    OS_MEMFD_CREATE_METHODDEF  #ifdef MS_WINDOWS      OS__ADD_DLL_DIRECTORY_METHODDEF      OS__REMOVE_DLL_DIRECTORY_METHODDEF @@ -14003,6 +14042,27 @@ all_ins(PyObject *m)      if (PyModule_AddIntMacro(m, GRND_RANDOM)) return -1;      if (PyModule_AddIntMacro(m, GRND_NONBLOCK)) return -1;  #endif +#ifdef HAVE_MEMFD_CREATE +    if (PyModule_AddIntMacro(m, MFD_CLOEXEC)) return -1; +    if (PyModule_AddIntMacro(m, MFD_ALLOW_SEALING)) return -1; +#ifdef MFD_HUGETLB +    if (PyModule_AddIntMacro(m, MFD_HUGETLB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_SHIFT)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_MASK)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_64KB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_512KB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_1MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_2MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_8MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_16MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_32MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_256MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_512MB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_1GB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_2GB)) return -1; +    if (PyModule_AddIntMacro(m, MFD_HUGE_16GB)) return -1; +#endif +#endif  #if defined(__APPLE__)      if (PyModule_AddIntConstant(m, "_COPYFILE_DATA", COPYFILE_DATA)) return -1; @@ -14119,6 +14179,10 @@ static const char * const have_functions[] = {      "HAVE_LUTIMES",  #endif +#ifdef HAVE_MEMFD_CREATE +    "HAVE_MEMFD_CREATE", +#endif +  #ifdef HAVE_MKDIRAT      "HAVE_MKDIRAT",  #endif  | 
