diff options
-rw-r--r-- | CRT.c | 2 | ||||
-rw-r--r-- | XUtils.c | 23 | ||||
-rw-r--r-- | XUtils.h | 2 |
3 files changed, 26 insertions, 1 deletions
@@ -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); } } @@ -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; +} @@ -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 |