about summary refs log tree commit diff
path: root/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch')
-rw-r--r--nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch51
1 files changed, 51 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch b/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch
new file mode 100644
index 000000000000..06b108559e46
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch
@@ -0,0 +1,51 @@
+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
+