+ssize_t writeall_nonblock(int fd, const void *buf, size_t count) {
+ size_t written = 0;
+
+ while (written < count) {
+ const ssize_t n = write(fd, ((char *)buf) + written, count - written);
+ if (n == -1) {
+ if (errno == EAGAIN) {
+ return written;
+ } else if (errno == EINTR) {
+ continue;
+ } else {
+ return n;
+ }
+ }
+ written += (size_t)n;
+ }
+ return written;
+}
+