diff options
author | Christian Heimes <christian@python.org> | 2022-07-26 09:16:51 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-26 09:16:51 (GMT) |
commit | 0d35a59ce3242b7326890a8c8cc41b321192ec9a (patch) | |
tree | 0d165365dff1a2131594c209d16719aca25813eb /Modules | |
parent | e8f3e8f0ab8aa5d667229ce9694e6e1477e524fd (diff) | |
download | cpython-0d35a59ce3242b7326890a8c8cc41b321192ec9a.zip cpython-0d35a59ce3242b7326890a8c8cc41b321192ec9a.tar.gz cpython-0d35a59ce3242b7326890a8c8cc41b321192ec9a.tar.bz2 |
gh-95174: Handle missing dup() and constants in WASI (GH-95229)
- check for ``dup()`` libc function
- handle missing ``F_DUPFD`` in ``dup2()`` replacement function
- add workaround for WASI libc bug in MSG_TRUNC
- ESHUTDOWN is missing, use EPIPE instead
- POLLPRI is missing, define as 0 (no-op)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/clinic/posixmodule.c.h | 10 | ||||
-rw-r--r-- | Modules/errnomodule.c | 4 | ||||
-rw-r--r-- | Modules/posixmodule.c | 5 | ||||
-rw-r--r-- | Modules/selectmodule.c | 5 | ||||
-rw-r--r-- | Modules/socketmodule.c | 4 |
5 files changed, 26 insertions, 2 deletions
diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 1ce7d86..3847349 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -4685,6 +4685,8 @@ exit: return return_value; } +#if ((defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS))) + PyDoc_STRVAR(os_dup2__doc__, "dup2($module, /, fd, fd2, inheritable=True)\n" "--\n" @@ -4740,6 +4742,8 @@ exit: return return_value; } +#endif /* ((defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS))) */ + #if defined(HAVE_LOCKF) PyDoc_STRVAR(os_lockf__doc__, @@ -9105,6 +9109,10 @@ exit: #define OS_TCSETPGRP_METHODDEF #endif /* !defined(OS_TCSETPGRP_METHODDEF) */ +#ifndef OS_DUP2_METHODDEF + #define OS_DUP2_METHODDEF +#endif /* !defined(OS_DUP2_METHODDEF) */ + #ifndef OS_LOCKF_METHODDEF #define OS_LOCKF_METHODDEF #endif /* !defined(OS_LOCKF_METHODDEF) */ @@ -9352,4 +9360,4 @@ exit: #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=bae15f09a1b3d2e7 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=9ff792e207a18392 input=a9049054013a1b77]*/ diff --git a/Modules/errnomodule.c b/Modules/errnomodule.c index bf6766e..0516e73 100644 --- a/Modules/errnomodule.c +++ b/Modules/errnomodule.c @@ -280,6 +280,10 @@ errno_exec(PyObject *module) #ifdef ENOANO add_errcode("ENOANO", ENOANO, "No anode"); #endif +#if defined(__wasi__) && !defined(ESHUTDOWN) + // WASI SDK 16 does not have ESHUTDOWN, shutdown results in EPIPE. + #define ESHUTDOWN EPIPE +#endif #ifdef ESHUTDOWN add_errcode("ESHUTDOWN", ESHUTDOWN, "Cannot send after transport endpoint shutdown"); #else diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 40229bc..2e89e2f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -9316,7 +9316,9 @@ os_dup_impl(PyObject *module, int fd) return _Py_dup(fd); } - +// dup2() is either provided by libc or dup2.c with AC_REPLACE_FUNCS(). +// dup2.c provides working dup2() if and only if F_DUPFD is available. +#if (defined(HAVE_DUP3) || defined(F_DUPFD) || defined(MS_WINDOWS)) /*[clinic input] os.dup2 -> int fd: int @@ -9416,6 +9418,7 @@ os_dup2_impl(PyObject *module, int fd, int fd2, int inheritable) return res; } +#endif #ifdef HAVE_LOCKF diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 5c36eaa..4eea928 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -63,6 +63,11 @@ extern void bzero(void *, int); # define SOCKET int #endif +// WASI SDK 16 does not have POLLPRIO, define as no-op +#if defined(__wasi__) && !defined(POLLPRI) +# define POLLPRI 0 +#endif + typedef struct { PyObject *close; PyTypeObject *poll_Type; diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 9b4155e..5641613 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -7786,6 +7786,10 @@ PyInit__socket(void) PyModule_AddIntMacro(m, MSG_EOR); #endif #ifdef MSG_TRUNC + // workaround for https://github.com/WebAssembly/wasi-libc/issues/305 + #if defined(__wasi__) && !defined(__WASI_RIFLAGS_RECV_DATA_TRUNCATED) + # define __WASI_RIFLAGS_RECV_DATA_TRUNCATED 2 + #endif PyModule_AddIntMacro(m, MSG_TRUNC); #endif #ifdef MSG_CTRUNC |