52 lines
1.5 KiB
Diff
52 lines
1.5 KiB
Diff
|
From c84971995b3a6d5118f9357c040572f4c78bcd55 Mon Sep 17 00:00:00 2001
|
||
|
From: Benjamin Peterson <benjamin@python.org>
|
||
|
Date: Thu, 13 Sep 2018 14:23:42 -0700
|
||
|
Subject: improve error handling of ttyname_r and isatty
|
||
|
|
||
|
POSIX allows ttyname(_r) and isatty to return EBADF if passed file
|
||
|
descriptor is invalid.
|
||
|
|
||
|
maintainer's note: these are optional ("may fail") errors, but it's
|
||
|
non-conforming for ttyname_r to return ENOTTY when it failed for a
|
||
|
different reason.
|
||
|
---
|
||
|
src/unistd/isatty.c | 6 +++++-
|
||
|
src/unistd/ttyname_r.c | 2 +-
|
||
|
2 files changed, 6 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/src/unistd/isatty.c b/src/unistd/isatty.c
|
||
|
index c8badaf5..75a9c186 100644
|
||
|
--- a/src/unistd/isatty.c
|
||
|
+++ b/src/unistd/isatty.c
|
||
|
@@ -1,9 +1,13 @@
|
||
|
#include <unistd.h>
|
||
|
+#include <errno.h>
|
||
|
#include <sys/ioctl.h>
|
||
|
#include "syscall.h"
|
||
|
|
||
|
int isatty(int fd)
|
||
|
{
|
||
|
struct winsize wsz;
|
||
|
- return !__syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz);
|
||
|
+ unsigned long r = syscall(SYS_ioctl, fd, TIOCGWINSZ, &wsz);
|
||
|
+ if (r == 0) return 1;
|
||
|
+ if (errno != EBADF) errno = ENOTTY;
|
||
|
+ return 0;
|
||
|
}
|
||
|
diff --git a/src/unistd/ttyname_r.c b/src/unistd/ttyname_r.c
|
||
|
index cb364c29..82acb75e 100644
|
||
|
--- a/src/unistd/ttyname_r.c
|
||
|
+++ b/src/unistd/ttyname_r.c
|
||
|
@@ -9,7 +9,7 @@ int ttyname_r(int fd, char *name, size_t size)
|
||
|
char procname[sizeof "/proc/self/fd/" + 3*sizeof(int) + 2];
|
||
|
ssize_t l;
|
||
|
|
||
|
- if (!isatty(fd)) return ENOTTY;
|
||
|
+ if (!isatty(fd)) return errno;
|
||
|
|
||
|
__procfdname(procname, fd);
|
||
|
l = readlink(procname, name, size);
|
||
|
--
|
||
|
cgit v1.2.1
|
||
|
|