Am 31.12.2009 um 09:50 schrieb Kirill A. Shutemov:
2009/12/31 malc <av1...@comtv.ru>:
On Thu, 31 Dec 2009, Kirill A. Shutemov wrote:
On Thu, Dec 31, 2009 at 4:00 AM, malc <av1...@comtv.ru> wrote:
On Thu, 31 Dec 2009, Kirill A. Shutemov wrote:
A variant of write(2) which handles partial write.
Signed-off-by: Kirill A. Shutemov <kir...@shutemov.name>
---
osdep.c | 27 +++++++++++++++++++++++++++
qemu-common.h | 1 +
2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/osdep.c b/osdep.c
index e4836e7..d2406f2 100644
--- a/osdep.c
+++ b/osdep.c
@@ -243,6 +243,33 @@ int qemu_open(const char *name, int
flags, ...)
return ret;
}
+/*
+ * A variant of write(2) which handles partial write.
+ *
+ * Return the number of bytes transferred.
+ * Set errno if fewer than `count' bytes are written.
+ */
+ssize_t qemu_write_full(int fd, const void *buf, size_t count)
+{
+ ssize_t ret = 0;
+ ssize_t total = 0;
+
+ while (count) {
+ ret = write(fd, buf, count);
+ if (ret < 0) {
+ if (errno == EINTR)
+ continue;
+ break;
+ }
+
+ count -= ret;
+ buf += ret;
+ total += ret;
+ }
+
+ return total;
+}
This hides write errors.
Why do you think so? Return value < count indicates error.
It does not indicate _which_ error it was.
???
You can check errno.
So all callers need to compare count to the return value, to know when
to read errno.
Nitpick: count is size_t while total is ssize_t, so the required
comparison seems a little ugly (without having tested it).
Andreas