On (Wed) May 05 2010 [08:15:19], Anthony Liguori wrote: > On 05/04/2010 04:39 PM, Amit Shah wrote: >> On writing errors, we just returned -1 even if some bytes were already >> written out. Ensure we return the number of bytes written before we >> return the error (on a subsequent call to qemu_chr_write()). >> >> Signed-off-by: Amit Shah<amit.s...@redhat.com> >> --- >> qemu-char.c | 12 +++++++++++- >> 1 files changed, 11 insertions(+), 1 deletions(-) >> >> diff --git a/qemu-char.c b/qemu-char.c >> index 76ad12c..decf687 100644 >> --- a/qemu-char.c >> +++ b/qemu-char.c >> @@ -507,6 +507,9 @@ int send_all(int fd, const void *buf, int len1) >> while (len> 0) { >> ret = send(fd, buf, len, 0); >> if (ret< 0) { >> + if (len1 - len) { >> + return len1 - len; >> + } >> errno = WSAGetLastError(); >> if (errno != WSAEWOULDBLOCK) { >> return -1; >> @@ -531,8 +534,15 @@ static int unix_write(int fd, const uint8_t *buf, int >> len1) >> while (len> 0) { >> ret = write(fd, buf, len); >> if (ret< 0) { >> - if (errno != EINTR&& errno != EAGAIN) >> + if (errno == EINTR) { >> + continue; >> + } >> + if (len1 - len) { >> + return len1 - len; >> + } >> + if (errno != EAGAIN) { >> return -1; >> + } >> } else if (ret == 0) { >> break; >> } else { >> > > This will break lots of things. The contract for send_all and > unix_write is that the transmit all data.
The current behaviour remains unchanged for all the users. Only callers of qemu_chr_write_nb() will get an -EAGAIN return. Amit