From 3cafd4613c5ca05209be9e1c72bf0b47a2c254ea Mon Sep 17 00:00:00 2001 From: Hu Jialun Date: Wed, 29 Jan 2025 04:50:12 +0800 Subject: [PATCH] gh-103510: Support os.mkfifo on Windows Make os.mkfifo return an open fd on Windows and the original path object on Unix. The user would then pass the return value into open, which accepts both path and fd as file. --- Modules/clinic/posixmodule.c.h | 6 +++--- Modules/posixmodule.c | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index abeb9c3e3e12b1..e20946b5590a9c 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -8766,7 +8766,7 @@ os_splice(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k #endif /* ((defined(HAVE_SPLICE) && !defined(_AIX))) */ -#if defined(HAVE_MKFIFO) +#if (defined(HAVE_MKFIFO) || defined(MS_WINDOWS)) PyDoc_STRVAR(os_mkfifo__doc__, "mkfifo($module, /, path, mode=438, *, dir_fd=None)\n" @@ -8857,7 +8857,7 @@ os_mkfifo(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k return return_value; } -#endif /* defined(HAVE_MKFIFO) */ +#endif /* (defined(HAVE_MKFIFO) || defined(MS_WINDOWS)) */ #if (defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)) @@ -13196,4 +13196,4 @@ os__emscripten_debugger(PyObject *module, PyObject *Py_UNUSED(ignored)) #ifndef OS__EMSCRIPTEN_DEBUGGER_METHODDEF #define OS__EMSCRIPTEN_DEBUGGER_METHODDEF #endif /* !defined(OS__EMSCRIPTEN_DEBUGGER_METHODDEF) */ -/*[clinic end generated code: output=8318c26fc2cd236c input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1df8579d03303ee6 input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index a35a848a7ca4b8..75864a04be544a 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -12523,7 +12523,7 @@ os_splice_impl(PyObject *module, int src, int dst, Py_ssize_t count, } #endif /* HAVE_SPLICE*/ -#ifdef HAVE_MKFIFO +#if defined(HAVE_MKFIFO) || defined(MS_WINDOWS) /*[clinic input] os.mkfifo @@ -12544,6 +12544,21 @@ static PyObject * os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd) /*[clinic end generated code: output=ce41cfad0e68c940 input=73032e98a36e0e19]*/ { +#ifdef MS_WINDOWS + HANDLE h; + int fd; + Py_BEGIN_ALLOW_THREADS + h = CreateNamedPipeW(path->wide, + PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, + 1, 1024, 1024, 0, NULL + ); + Py_END_ALLOW_THREADS + if (INVALID_HANDLE_VALUE == h) + return win32_error_object("CreateNamedPipeW", path->object); + fd = _Py_open_osfhandle(h, _O_RDWR); + return PyLong_FromLong(fd); +#else int result; int async_err = 0; #ifdef HAVE_MKFIFOAT @@ -12578,7 +12593,8 @@ os_mkfifo_impl(PyObject *module, path_t *path, int mode, int dir_fd) if (result != 0) return (!async_err) ? posix_error() : NULL; - Py_RETURN_NONE; + return Py_NewRef(path->object); +#endif } #endif /* HAVE_MKFIFO */