diff --git a/pkgs/os-specific/linux/musl/0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch b/pkgs/os-specific/linux/musl/0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch deleted file mode 100644 index 5e691ae99e6e..000000000000 --- a/pkgs/os-specific/linux/musl/0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 4e4a162d9af283cf71f7310c497672e0c2b8ca3b Mon Sep 17 00:00:00 2001 -From: Rich Felker -Date: Tue, 4 Sep 2018 21:28:38 -0400 -Subject: [PATCH 1/3] in pthread_mutex_trylock, EBUSY out more directly when - possible - -avoid gratuitously setting up and tearing down the robust list pending -slot. ---- - src/thread/pthread_mutex_trylock.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c -index 54876a61..783ca0c4 100644 ---- a/src/thread/pthread_mutex_trylock.c -+++ b/src/thread/pthread_mutex_trylock.c -@@ -15,6 +15,7 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m) - return 0; - } - if (own == 0x7fffffff) return ENOTRECOVERABLE; -+ if (own && (!(own & 0x40000000) || !(type & 4))) return EBUSY; - - if (m->_m_type & 128) { - if (!self->robust_list.off) { -@@ -25,8 +26,7 @@ int __pthread_mutex_trylock_owner(pthread_mutex_t *m) - self->robust_list.pending = &m->_m_next; - } - -- if ((own && (!(own & 0x40000000) || !(type & 4))) -- || a_cas(&m->_m_lock, old, tid) != old) { -+ if (a_cas(&m->_m_lock, old, tid) != old) { - self->robust_list.pending = 0; - return EBUSY; - } --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch b/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch deleted file mode 100644 index 2f611fc467e7..000000000000 --- a/pkgs/os-specific/linux/musl/0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch +++ /dev/null @@ -1,41 +0,0 @@ -From d1fa28860634af4f0efd70d533a756b51a45f83e Mon Sep 17 00:00:00 2001 -From: Rich Felker -Date: Tue, 4 Sep 2018 21:31:47 -0400 -Subject: [PATCH 2/3] in pthread_mutex_timedlock, avoid repeatedly reading - mutex type field - -compiler cannot cache immutable fields of the mutex object across -external calls it can't see, much less across atomics. ---- - src/thread/pthread_mutex_timedlock.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/src/thread/pthread_mutex_timedlock.c b/src/thread/pthread_mutex_timedlock.c -index 0a240e79..f91f4a61 100644 ---- a/src/thread/pthread_mutex_timedlock.c -+++ b/src/thread/pthread_mutex_timedlock.c -@@ -6,7 +6,8 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec - && !a_cas(&m->_m_lock, 0, EBUSY)) - return 0; - -- int r, t, priv = (m->_m_type & 128) ^ 128; -+ int type = m->_m_type; -+ int r, t, priv = (type & 128) ^ 128; - - r = pthread_mutex_trylock(m); - if (r != EBUSY) return r; -@@ -15,9 +16,9 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec - while (spins-- && m->_m_lock && !m->_m_waiters) a_spin(); - - while ((r=pthread_mutex_trylock(m)) == EBUSY) { -- if (!(r=m->_m_lock) || ((r&0x40000000) && (m->_m_type&4))) -+ if (!(r=m->_m_lock) || ((r&0x40000000) && (type&4))) - continue; -- if ((m->_m_type&3) == PTHREAD_MUTEX_ERRORCHECK -+ if ((type&3) == PTHREAD_MUTEX_ERRORCHECK - && (r&0x7fffffff) == __pthread_self()->tid) - return EDEADLK; - --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/0003-fix-namespace-violation-for-c11-mutex-functions.patch b/pkgs/os-specific/linux/musl/0003-fix-namespace-violation-for-c11-mutex-functions.patch deleted file mode 100644 index 783873732afd..000000000000 --- a/pkgs/os-specific/linux/musl/0003-fix-namespace-violation-for-c11-mutex-functions.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 2de29bc994029b903a366b8a4a9f8c3c3ee2be90 Mon Sep 17 00:00:00 2001 -From: Rich Felker -Date: Tue, 4 Sep 2018 22:56:57 -0400 -Subject: [PATCH 3/3] fix namespace violation for c11 mutex functions - -__pthread_mutex_timedlock is used to implement c11 mutex functions, -and therefore cannot call pthread_mutex_trylock by name. ---- - src/thread/pthread_mutex_timedlock.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/thread/pthread_mutex_timedlock.c b/src/thread/pthread_mutex_timedlock.c -index f91f4a61..d2bd1960 100644 ---- a/src/thread/pthread_mutex_timedlock.c -+++ b/src/thread/pthread_mutex_timedlock.c -@@ -1,5 +1,7 @@ - #include "pthread_impl.h" - -+int __pthread_mutex_trylock(pthread_mutex_t *); -+ - int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec *restrict at) - { - if ((m->_m_type&15) == PTHREAD_MUTEX_NORMAL -@@ -15,7 +17,7 @@ int __pthread_mutex_timedlock(pthread_mutex_t *restrict m, const struct timespec - int spins = 100; - while (spins-- && m->_m_lock && !m->_m_waiters) a_spin(); - -- while ((r=pthread_mutex_trylock(m)) == EBUSY) { -+ while ((r=__pthread_mutex_trylock(m)) == EBUSY) { - if (!(r=m->_m_lock) || ((r&0x40000000) && (type&4))) - continue; - if ((type&3) == PTHREAD_MUTEX_ERRORCHECK --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/default.nix b/pkgs/os-specific/linux/musl/default.nix index 6137a5942c26..9835a0c96db8 100644 --- a/pkgs/os-specific/linux/musl/default.nix +++ b/pkgs/os-specific/linux/musl/default.nix @@ -28,12 +28,12 @@ let in stdenv.mkDerivation rec { - name = "musl-${version}"; - version = "1.1.20"; + pname = "musl"; + version = "1.1.21"; src = fetchurl { - url = "https://www.musl-libc.org/releases/musl-${version}.tar.gz"; - sha256 = "0q8dsjxl41dccscv9a0r78bs7jap57mn4mni5pwbbip6s1qqggj4"; + url = "https://www.musl-libc.org/releases/${pname}-${version}.tar.gz"; + sha256 = "0i2z52zgc86af1n1gjiz43hgd85mxjgvgn345zsybja9dxpvchn7"; }; enableParallelBuilding = true; @@ -56,29 +56,7 @@ stdenv.mkDerivation rec { url = https://raw.githubusercontent.com/openwrt/openwrt/87606e25afac6776d1bbc67ed284434ec5a832b4/toolchain/musl/patches/300-relative.patch; sha256 = "0hfadrycb60sm6hb6by4ycgaqc9sgrhh42k39v8xpmcvdzxrsq2n"; }) - # Upstream bugfix, see: https://git.musl-libc.org/cgit/musl/commit/?id=0db393d3a77bb9f300a356c6a5484fc2dddb161d - # Explicitly flagged for inclusion by distributions using musl - ./fix-file-locking-race.patch - # More specific error reporting - ./tty-more-precise-errors.patch - # Use execveat to impl fexecve when avail (useful for containers) - ./fexecve-execveat.patch - # improve behavior in few cases - ./0001-in-pthread_mutex_trylock-EBUSY-out-more-directly-whe.patch - ./0002-in-pthread_mutex_timedlock-avoid-repeatedly-reading-.patch - ./0003-fix-namespace-violation-for-c11-mutex-functions.patch - # Fix getaddrinfo usage encountered sometimes in containers - ./fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch - # name_to_handle_at - ./name-to-handle-at.patch - ./max-handle-sz-for-name-to-handle-at.patch - # stacksize bump (upstream) - ./stacksize-bump.patch ]; - preConfigure = '' - configureFlagsArray+=("--syslibdir=$out/lib") - ''; - CFLAGS = [ "-fstack-protector-strong" ] ++ lib.optional stdenv.hostPlatform.isPower "-mlong-double-64"; @@ -87,6 +65,7 @@ stdenv.mkDerivation rec { "--enable-static" "--enable-debug" "--enable-wrapper=all" + "--syslibdir=${placeholder "out"}/lib" ]; outputs = [ "out" "dev" ]; diff --git a/pkgs/os-specific/linux/musl/fexecve-execveat.patch b/pkgs/os-specific/linux/musl/fexecve-execveat.patch deleted file mode 100644 index 6b3894a916c8..000000000000 --- a/pkgs/os-specific/linux/musl/fexecve-execveat.patch +++ /dev/null @@ -1,33 +0,0 @@ -From e36f80cba6d5eefcc1ee664f16c2c72054b83134 Mon Sep 17 00:00:00 2001 -From: "Joseph C. Sible" -Date: Sun, 2 Sep 2018 13:42:26 -0400 -Subject: implement fexecve in terms of execveat when it exists - -This lets fexecve work even when /proc isn't mounted. ---- - src/process/fexecve.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/process/fexecve.c b/src/process/fexecve.c -index 6507b429..8be3f760 100644 ---- a/src/process/fexecve.c -+++ b/src/process/fexecve.c -@@ -1,10 +1,15 @@ -+#define _GNU_SOURCE - #include - #include -+#include -+#include "syscall.h" - - void __procfdname(char *, unsigned); - - int fexecve(int fd, char *const argv[], char *const envp[]) - { -+ int r = __syscall(SYS_execveat, fd, "", argv, envp, AT_EMPTY_PATH); -+ if (r != -ENOSYS) return __syscall_ret(r); - char buf[15 + 3*sizeof(int)]; - __procfdname(buf, fd); - execve(buf, argv, envp); --- -cgit v1.2.1 - diff --git a/pkgs/os-specific/linux/musl/fix-file-locking-race.patch b/pkgs/os-specific/linux/musl/fix-file-locking-race.patch deleted file mode 100644 index 2ef91390a691..000000000000 --- a/pkgs/os-specific/linux/musl/fix-file-locking-race.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 0db393d3a77bb9f300a356c6a5484fc2dddb161d Mon Sep 17 00:00:00 2001 -From: Kaarle Ritvanen -Date: Tue, 18 Sep 2018 10:03:27 +0300 -Subject: fix race condition in file locking - -The condition occurs when -- thread #1 is holding the lock -- thread #2 is waiting for it on __futexwait -- thread #1 is about to release the lock and performs a_swap -- thread #3 enters the __lockfile function and manages to grab the lock - before thread #1 calls __wake, resetting the MAYBE_WAITERS flag -- thread #1 calls __wake -- thread #2 wakes up but goes again to __futexwait as the lock is - held by thread #3 -- thread #3 releases the lock but does not call __wake as the - MAYBE_WAITERS flag is not set - -This condition results in thread #2 not being woken up. This patch fixes -the problem by making the woken up thread ensure that the flag is -properly set before going to sleep again. - -Mainainer's note: This fixes a regression introduced in commit -c21f750727515602a9e84f2a190ee8a0a2aeb2a1. ---- - src/stdio/__lockfile.c | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/src/stdio/__lockfile.c b/src/stdio/__lockfile.c -index 2ff75d8a..0dcb2a42 100644 ---- a/src/stdio/__lockfile.c -+++ b/src/stdio/__lockfile.c -@@ -8,13 +8,13 @@ int __lockfile(FILE *f) - int owner = f->lock, tid = __pthread_self()->tid; - if ((owner & ~MAYBE_WAITERS) == tid) - return 0; -- for (;;) { -- owner = a_cas(&f->lock, 0, tid); -- if (!owner) return 1; -- if (a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner) break; -+ owner = a_cas(&f->lock, 0, tid); -+ if (!owner) return 1; -+ while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) { -+ if ((owner & MAYBE_WAITERS) || -+ a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner) -+ __futexwait(&f->lock, owner|MAYBE_WAITERS, 1); - } -- while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) -- __futexwait(&f->lock, owner, 1); - return 1; - } - --- -cgit v1.2.1 - diff --git a/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch b/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch deleted file mode 100644 index d603c16f8062..000000000000 --- a/pkgs/os-specific/linux/musl/fix-getaddrinfo-regression-with-AI_ADDRCONFIG.patch +++ /dev/null @@ -1,52 +0,0 @@ -From f381c118b2d4f7d914481d3cdc830ce41369b002 Mon Sep 17 00:00:00 2001 -From: Rich Felker -Date: Wed, 19 Sep 2018 18:03:22 -0400 -Subject: [PATCH] fix getaddrinfo regression with AI_ADDRCONFIG on some - configurations - -despite not being documented to do so in the standard or Linux -documentation, attempts to udp connect to 127.0.0.1 or ::1 generate -EADDRNOTAVAIL when the loopback device is not configured and there is -no default route for IPv6. this caused getaddrinfo with AI_ADDRCONFIG -to fail with EAI_SYSTEM and EADDRNOTAVAIL on some no-IPv6 -configurations, rather than the intended behavior of detecting IPv6 as -unsuppported and producing IPv4-only results. - -previously, only EAFNOSUPPORT was treated as unavailability of the -address family being probed. instead, treat all errors related to -inability to get an address or route as conclusive that the family -being probed is unsupported, and only fail with EAI_SYSTEM on other -errors. - -further improvements may be desirable, such as reporting EAI_AGAIN -instead of EAI_SYSTEM for errors which are expected to be transient, -but this patch should suffice to fix the serious regression. ---- - src/network/getaddrinfo.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c -index ba26847a..e33bfa28 100644 ---- a/src/network/getaddrinfo.c -+++ b/src/network/getaddrinfo.c -@@ -76,7 +76,16 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru - close(s); - if (!r) continue; - } -- if (errno != EAFNOSUPPORT) return EAI_SYSTEM; -+ switch (errno) { -+ case EADDRNOTAVAIL: -+ case EAFNOSUPPORT: -+ case EHOSTUNREACH: -+ case ENETDOWN: -+ case ENETUNREACH: -+ break; -+ default: -+ return EAI_SYSTEM; -+ } - if (family == tf[i]) return EAI_NONAME; - family = tf[1-i]; - } --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch b/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch deleted file mode 100644 index aa00b4619f86..000000000000 --- a/pkgs/os-specific/linux/musl/max-handle-sz-for-name-to-handle-at.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 7d7f44253f2d8cfd0a7adf9f918d88aa24d4e012 Mon Sep 17 00:00:00 2001 -From: Khem Raj -Date: Thu, 13 Sep 2018 07:00:05 -0700 -Subject: [PATCH] define MAX_HANDLE_SZ for use with name_to_handle_at - -MAX_HANDLE_SZ is described in name_to_handle_at() to contain maximum -expected size for a file handle ---- - include/fcntl.h | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/include/fcntl.h b/include/fcntl.h -index 99b21759..4d91338b 100644 ---- a/include/fcntl.h -+++ b/include/fcntl.h -@@ -166,6 +166,7 @@ struct f_owner_ex { - }; - #define FALLOC_FL_KEEP_SIZE 1 - #define FALLOC_FL_PUNCH_HOLE 2 -+#define MAX_HANDLE_SZ 128 - #define SYNC_FILE_RANGE_WAIT_BEFORE 1 - #define SYNC_FILE_RANGE_WRITE 2 - #define SYNC_FILE_RANGE_WAIT_AFTER 4 --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/name-to-handle-at.patch b/pkgs/os-specific/linux/musl/name-to-handle-at.patch deleted file mode 100644 index 10cd8a9947c8..000000000000 --- a/pkgs/os-specific/linux/musl/name-to-handle-at.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 3e14bbcd1979376b188bfabb816ff828608fb5d7 Mon Sep 17 00:00:00 2001 -From: Khem Raj -Date: Wed, 12 Sep 2018 18:02:11 -0700 -Subject: [PATCH] wireup linux/name_to_handle_at and name_to_handle_at syscalls - ---- - include/fcntl.h | 7 +++++++ - src/linux/name_to_handle_at.c | 10 ++++++++++ - src/linux/open_by_handle_at.c | 8 ++++++++ - 3 files changed, 25 insertions(+) - create mode 100644 src/linux/name_to_handle_at.c - create mode 100644 src/linux/open_by_handle_at.c - -diff --git a/include/fcntl.h b/include/fcntl.h -index 6d8edcd1..99b21759 100644 ---- a/include/fcntl.h -+++ b/include/fcntl.h -@@ -155,6 +155,11 @@ int lockf(int, int, off_t); - #define F_OWNER_PID 1 - #define F_OWNER_PGRP 2 - #define F_OWNER_GID 2 -+struct file_handle { -+ unsigned handle_bytes; -+ int handle_type; -+ unsigned char f_handle[]; -+}; - struct f_owner_ex { - int type; - pid_t pid; -@@ -170,6 +175,8 @@ struct f_owner_ex { - #define SPLICE_F_GIFT 8 - int fallocate(int, int, off_t, off_t); - #define fallocate64 fallocate -+int name_to_handle_at(int, const char *, struct file_handle *, int *, int); -+int open_by_handle_at(int, struct file_handle *, int); - ssize_t readahead(int, off_t, size_t); - int sync_file_range(int, off_t, off_t, unsigned); - ssize_t vmsplice(int, const struct iovec *, size_t, unsigned); -diff --git a/src/linux/name_to_handle_at.c b/src/linux/name_to_handle_at.c -new file mode 100644 -index 00000000..cd4075bd ---- /dev/null -+++ b/src/linux/name_to_handle_at.c -@@ -0,0 +1,10 @@ -+#define _GNU_SOURCE -+#include -+#include "syscall.h" -+ -+int name_to_handle_at(int dirfd, const char *pathname, -+ struct file_handle *handle, int *mount_id, int flags) -+{ -+ return syscall(SYS_name_to_handle_at, dirfd, -+ pathname, handle, mount_id, flags); -+} -diff --git a/src/linux/open_by_handle_at.c b/src/linux/open_by_handle_at.c -new file mode 100644 -index 00000000..1c9b6a2b ---- /dev/null -+++ b/src/linux/open_by_handle_at.c -@@ -0,0 +1,8 @@ -+#define _GNU_SOURCE -+#include -+#include "syscall.h" -+ -+int open_by_handle_at(int mount_fd, struct file_handle *handle, int flags) -+{ -+ return syscall(SYS_open_by_handle_at, mount_fd, handle, flags); -+} --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/stacksize-bump.patch b/pkgs/os-specific/linux/musl/stacksize-bump.patch deleted file mode 100644 index fb5373005cbf..000000000000 --- a/pkgs/os-specific/linux/musl/stacksize-bump.patch +++ /dev/null @@ -1,36 +0,0 @@ -From c0058ab465e950c2c3302d2b62e21cc0b494224b Mon Sep 17 00:00:00 2001 -From: Rich Felker -Date: Tue, 18 Sep 2018 23:11:49 -0400 -Subject: [PATCH 3/4] increase default thread stack/guard size - -stack size default is increased from 80k to 128k. this coincides with -Linux's hard-coded default stack for the main thread (128k is -initially committed; growth beyond that up to ulimit is contingent on -additional allocation succeeding) and GNU ld's default PT_GNU_STACK -size for FDPIC, at least on sh. - -guard size default is increased from 4k to 8k to reduce the risk of -guard page jumping on overflow, since use of just over 4k of stack is -common (PATH_MAX buffers, etc.). ---- - src/internal/pthread_impl.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h -index e73a251f..d491f975 100644 ---- a/src/internal/pthread_impl.h -+++ b/src/internal/pthread_impl.h -@@ -185,8 +185,8 @@ hidden void __inhibit_ptc(void); - extern hidden unsigned __default_stacksize; - extern hidden unsigned __default_guardsize; - --#define DEFAULT_STACK_SIZE 81920 --#define DEFAULT_GUARD_SIZE 4096 -+#define DEFAULT_STACK_SIZE 131072 -+#define DEFAULT_GUARD_SIZE 8192 - - #define DEFAULT_STACK_MAX (8<<20) - #define DEFAULT_GUARD_MAX (1<<20) --- -2.19.0 - diff --git a/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch b/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch deleted file mode 100644 index 06b108559e46..000000000000 --- a/pkgs/os-specific/linux/musl/tty-more-precise-errors.patch +++ /dev/null @@ -1,51 +0,0 @@ -From c84971995b3a6d5118f9357c040572f4c78bcd55 Mon Sep 17 00:00:00 2001 -From: Benjamin Peterson -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 -+#include - #include - #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 -