os_ttyname_impl(PyObject *module, int fd)
/*[clinic end generated code: output=c424d2e9d1cd636a input=9ff5a58b08115c55]*/
{
- char *ret;
- ret = ttyname(fd);
- if (ret == NULL) {
+ long size = sysconf(_SC_TTY_NAME_MAX);
+ if (size == -1) {
+ return posix_error();
+ }
+ char *buffer = (char *)PyMem_RawMalloc(size);
+ if (buffer == NULL) {
+ return PyErr_NoMemory();
+ }
+ int ret = ttyname_r(fd, buffer, size);
+ if (ret != 0) {
+ PyMem_RawFree(buffer);
+ errno = ret;
return posix_error();
}
- return PyUnicode_DecodeFSDefault(ret);
+ PyObject *res = PyUnicode_DecodeFSDefault(buffer);
+ PyMem_RawFree(buffer);
+ return res;
}
#endif