summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2022-07-26 09:16:51 (GMT)
committerGitHub <noreply@github.com>2022-07-26 09:16:51 (GMT)
commit0d35a59ce3242b7326890a8c8cc41b321192ec9a (patch)
tree0d165365dff1a2131594c209d16719aca25813eb /Modules
parente8f3e8f0ab8aa5d667229ce9694e6e1477e524fd (diff)
downloadcpython-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.h10
-rw-r--r--Modules/errnomodule.c4
-rw-r--r--Modules/posixmodule.c5
-rw-r--r--Modules/selectmodule.c5
-rw-r--r--Modules/socketmodule.c4
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