From f3e70ab389879db5b250bab29f14acb543bfd11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= Date: Wed, 22 Jun 2022 19:25:30 +0200 Subject: Write full buffer Retry writing after a short write. --- CRT.c | 2 +- XUtils.c | 23 +++++++++++++++++++++++ XUtils.h | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CRT.c b/CRT.c index 95f8cc13..c8935add 100644 --- a/CRT.c +++ b/CRT.c @@ -834,7 +834,7 @@ static void dumpStderr(void) { fprintf(stderr, ">>>>>>>>>> stderr output >>>>>>>>>>\n"); header = true; } - (void)! write(STDERR_FILENO, buffer, res); + full_write(STDERR_FILENO, buffer, res); } } diff --git a/XUtils.c b/XUtils.c index 2012b6c6..5d84e137 100644 --- a/XUtils.c +++ b/XUtils.c @@ -313,3 +313,26 @@ ssize_t xReadfileat(openat_arg_t dirfd, const char* pathname, void* buffer, size return readfd_internal(fd, buffer, count); } + +ssize_t full_write(int fd, const void *buf, size_t count) { + ssize_t written = 0; + + while (count > 0) { + ssize_t r = write(fd, buf, count); + if (r < 0) { + if (errno == EINTR) + continue; + + return r; + } + + if (r == 0) + break; + + written += r; + buf = (const unsigned char*)buf + r; + count -= (size_t)r; + } + + return written; +} diff --git a/XUtils.h b/XUtils.h index 2522a71f..bb80cb23 100644 --- a/XUtils.h +++ b/XUtils.h @@ -73,4 +73,6 @@ char* xStrndup(const char* str, size_t len) ATTR_NONNULL ATTR_MALLOC; ssize_t xReadfile(const char* pathname, void* buffer, size_t count); ssize_t xReadfileat(openat_arg_t dirfd, const char* pathname, void* buffer, size_t count); +ssize_t full_write(int fd, const void *buf, size_t count); + #endif -- cgit v1.2.3