try:
size = os.get_terminal_size()
except OSError as e:
- known_errnos = [errno.EINVAL, errno.ENOTTY]
- if sys.platform == "android":
- # The Android testbed redirects the native stdout to a pipe,
- # which returns a different error code.
- known_errnos.append(errno.EACCES)
- if sys.platform == "win32" or e.errno in known_errnos:
+ if sys.platform == "win32" or e.errno in (errno.EINVAL, errno.ENOTTY):
# Under win32 a generic OSError can be thrown if the
# handle cannot be retrieved
self.skipTest("failed to query terminal size")
#ifdef TERMSIZE_USE_IOCTL
{
+ // On Android, stdout is probably not connected, and calling TIOCGWINSZ
+ // on an invalid file descriptor causes a log message "avc: denied {
+ // ioctl }". Some common tools such as pytest call get_terminal_size
+ // very often, so check it's a TTY first to avoid cluttering the log.
+ if (!isatty(fd))
+ return PyErr_SetFromErrno(PyExc_OSError);
+
struct winsize w;
if (ioctl(fd, TIOCGWINSZ, &w))
return PyErr_SetFromErrno(PyExc_OSError);