about summary refs log tree commit diff
path: root/src/unistd
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2018-09-13 14:23:42 -0700
committerRich Felker <dalias@aerifal.cx>2018-09-15 01:58:03 -0400
commitc84971995b3a6d5118f9357c040572f4c78bcd55 (patch)
tree36b663dffd83bc09199d01f34f77126167c71ccb /src/unistd
parente13063aad7aee341d278d2a879a76ec7b59b2ad8 (diff)
downloadmusl-c84971995b3a6d5118f9357c040572f4c78bcd55.tar.gz
musl-c84971995b3a6d5118f9357c040572f4c78bcd55.tar.xz
musl-c84971995b3a6d5118f9357c040572f4c78bcd55.zip
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.
Diffstat (limited to 'src/unistd')
-rw-r--r--src/unistd/isatty.c6
-rw-r--r--src/unistd/ttyname_r.c2
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);