summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 124d608..51e34b5 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -125,6 +125,7 @@
# define HAVE_PWRITEV_RUNTIME __builtin_available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
# define HAVE_MKFIFOAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
# define HAVE_MKNODAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 16.0, watchOS 9.0, *)
+# define HAVE_PTSNAME_R_RUNTIME __builtin_available(macOS 10.13.4, iOS 11.3, tvOS 11.3, watchOS 4.3, *)
# define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *)
@@ -206,6 +207,10 @@
# define HAVE_MKNODAT_RUNTIME (mknodat != NULL)
# endif
+# ifdef HAVE_PTSNAME_R
+# define HAVE_PTSNAME_R_RUNTIME (ptsname_r != NULL)
+# endif
+
#endif
#ifdef HAVE_FUTIMESAT
@@ -231,6 +236,7 @@
# define HAVE_PWRITEV_RUNTIME 1
# define HAVE_MKFIFOAT_RUNTIME 1
# define HAVE_MKNODAT_RUNTIME 1
+# define HAVE_PTSNAME_R_RUNTIME 1
#endif
@@ -8635,6 +8641,19 @@ os_unlockpt_impl(PyObject *module, int fd)
#endif /* HAVE_UNLOCKPT */
#if defined(HAVE_PTSNAME) || defined(HAVE_PTSNAME_R)
+static PyObject *
+py_ptsname(int fd)
+{
+ // POSIX manpage: Upon failure, ptsname() shall return a null pointer
+ // and may set errno. Always initialize errno to avoid undefined behavior.
+ errno = 0;
+ char *name = ptsname(fd);
+ if (name == NULL) {
+ return posix_error();
+ }
+ return PyUnicode_DecodeFSDefault(name);
+}
+
/*[clinic input]
os.ptsname
@@ -8656,22 +8675,22 @@ os_ptsname_impl(PyObject *module, int fd)
int ret;
char name[MAXPATHLEN+1];
- ret = ptsname_r(fd, name, sizeof(name));
+ if (HAVE_PTSNAME_R_RUNTIME) {
+ ret = ptsname_r(fd, name, sizeof(name));
+ }
+ else {
+ // fallback to ptsname() if ptsname_r() is not available in runtime.
+ return py_ptsname(fd);
+ }
if (ret != 0) {
errno = ret;
return posix_error();
}
-#else
- char *name;
-
- name = ptsname(fd);
- /* POSIX manpage: Upon failure, ptsname() shall return a null pointer and may set errno.
- *MAY* set errno? Hmm... */
- if (name == NULL)
- return posix_error();
-#endif /* HAVE_PTSNAME_R */
return PyUnicode_DecodeFSDefault(name);
+#else
+ return py_ptsname(fd);
+#endif /* HAVE_PTSNAME_R */
}
#endif /* defined(HAVE_PTSNAME) || defined(HAVE_PTSNAME_R) */
@@ -17739,6 +17758,9 @@ PROBE(probe_futimens, HAVE_FUTIMENS_RUNTIME)
PROBE(probe_utimensat, HAVE_UTIMENSAT_RUNTIME)
#endif
+#ifdef HAVE_PTSNAME_R
+PROBE(probe_ptsname_r, HAVE_PTSNAME_R_RUNTIME)
+#endif
@@ -17879,6 +17901,10 @@ static const struct have_function {
{ "HAVE_UTIMENSAT", probe_utimensat },
#endif
+#ifdef HAVE_PTSNAME_R
+ { "HAVE_PTSNAME_R", probe_ptsname_r },
+#endif
+
#ifdef MS_WINDOWS
{ "MS_WINDOWS", NULL },
#endif